# zidane-ui/chat/sidebar

Import: `import { … } from 'zidane-ui/chat/sidebar'`. Source: [ui/src/chat/sidebar/index.ts](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/index.ts).

## Components

### `EnvironmentChip`

Component.

Where a non-local session runs: the kind's glyph and a short name (the branch for a worktree, else the
kind or machine). A spinner while provisioning, a red warning when setup failed; the tooltip has the
details.

```ts
function EnvironmentChip(props: EnvironmentChipProps): Element | null
```

**Parameters**

- `props` (`EnvironmentChipProps`): The `environment`, `className` and `style`.

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra classes on the chip.
- `environment` (`SessionEnvironmentSummary | undefined`): Where the session runs; nothing renders without one (a local session).
- `style?` (`CSSProperties`): Inline styles on the chip.

Source: [ui/src/chat/sidebar/RowChips.tsx:33](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/RowChips.tsx#L33)

### `IconPicker`

Component.

The emoji / image picker body — directory icons here, space icons in
Settings › General › Spaces. Hosts own the popover and the persistence.

```ts
function IconPicker(props: IconPickerProps): Element
```

**Parameters**

- `props` (`IconPickerProps`): The [`IconPickerProps`](https://zidane.si/docs/reference/ui-chat-sidebar.md#IconPickerProps).

**Returns** `Element`

**Props**

- `hasIcon` (`boolean`): An icon is set: the reset row shows.
- `onPick` (`(icon: ProjectIcon | null) => void`): `null` = reset to the default glyph.
- `resetLabel?` (`string`): Label of the reset row (shown when an icon is set).

Source: [ui/src/chat/sidebar/ProjectIcon.tsx:322](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/ProjectIcon.tsx#L322)

### `MainSessionRow`

Component.

The pinned row of the orchestration main session, above every group.

```ts
function MainSessionRow<K extends string>(props: MainSessionRowProps<K>): Element
```

**Type parameters**

- `K` (`extends string`)

**Parameters**

- `props` (`MainSessionRowProps<K>`): The [`MainSessionRowProps`](https://zidane.si/docs/reference/ui-chat-sidebar.md#MainSessionRowProps).

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the row's `<li>`.
- `icon?` (`ProjectIcon`): Custom icon from the shared project-icon map (`MAIN_SESSION_ICON_KEY`).
- `isActive` (`boolean`): The main session is the open one.
- `onAssignIcon` (`(key: string, icon: ProjectIcon | null) => void`): Assigns (or, with `null`, resets) the icon under `key`.
- `onSelect` (`(sessionId: K) => void`): Opens the main session.
- `sessionId` (`K`): The main session's id (put on the row as `data-session-id`).
- `style?` (`CSSProperties`): Inline styles on the row's `<li>`.

Source: [ui/src/chat/sidebar/MainSessionRow.tsx:102](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/MainSessionRow.tsx#L102)

### `NewSessionButton`

Component.

The New session row: the same grid as a session row (an 18px glyph column, `text-sm`), raised while no
session is open, its ⌘N hint fading in on hover or focus.

```ts
function NewSessionButton(props: NewSessionButtonProps): Element
```

**Parameters**

- `props` (`NewSessionButtonProps`): What it starts, whether it is the current selection, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the wrapper.
- `isActive` (`boolean`): No session is open: the button is the current selection (the raised chip).
- `onNewSession` (`() => void`): Starts a new session.
- `style?` (`CSSProperties`): Inline styles on the wrapper.

Source: [ui/src/chat/sidebar/SessionSidebar.tsx:282](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SessionSidebar.tsx#L282)

### `ProjectChip`

Component.

A session's project as a chip: its icon (picked, else git or folder) and its name.

```ts
function ProjectChip(props: ProjectChipProps): Element
```

**Parameters**

- `props` (`ProjectChipProps`): The `project`, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the chip.
- `project` (`RowProject`): The project.
- `style?` (`CSSProperties`): Inline styles on the chip.

Source: [ui/src/chat/sidebar/RowChips.tsx:82](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/RowChips.tsx#L82)

### `ProjectIconButton`

Component.

The 18×18 icon slot on a project group header. Rendered as a SIBLING
of the collapse button (never nested — button-in-button is invalid),
so clicking it opens the picker without toggling the group; the
`stopPropagation` is belt-and-braces against ancestor click handlers.

```ts
function ProjectIconButton(props: ProjectIconButtonProps): Element
```

**Parameters**

- `props` (`ProjectIconButtonProps`): The [`ProjectIconButtonProps`](https://zidane.si/docs/reference/ui-chat-sidebar.md#ProjectIconButtonProps).

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the trigger (or the plain slot).
- `defaultGlyph?` (`string`): Default glyph class when nothing is assigned. Overrides the folder /
  git-branch choice — the pinned Main row uses a home icon here.
- `fullPath?` (`string`): Full directory path keying the icon map. Absent for the "No folder"
  bucket — renders the default glyph as a plain non-interactive slot.
- `icon?` (`ProjectIcon`): The icon assigned to the folder, if any.
- `isGitRepo?` (`boolean`): Directory is a git repository — the DEFAULT glyph (no custom icon
  assigned, or after Reset) becomes a git branch instead of a folder.
- `label` (`string`): Basename shown in the header — used for the trigger's aria-label.
- `onAssign` (`(fullPath: string, icon: ProjectIcon | null) => void`): Assigns (or, with `null`, resets) the folder's icon.
- `style?` (`CSSProperties`): Inline styles on the trigger (or the plain slot).
- `title?` (`string`): Tooltip on the trigger; defaults to the project wording.

Source: [ui/src/chat/sidebar/ProjectIcon.tsx:220](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/ProjectIcon.tsx#L220)

### `ProjectIconGlyph`

Component.

A project's icon, display only: the same picked icon or default glyph its sidebar header shows.

```ts
function ProjectIconGlyph(props: ProjectIconGlyphProps): Element
```

**Parameters**

- `props` (`ProjectIconGlyphProps`): The [`ProjectIconGlyphProps`](https://zidane.si/docs/reference/ui-chat-sidebar.md#ProjectIconGlyphProps).

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the slot.
- `defaultGlyph?` (`string`): Default glyph class when nothing is assigned; overrides the folder / git-branch choice.
- `icon?` (`ProjectIcon`): The icon assigned to the folder, if any.
- `isGitRepo?` (`boolean`): No icon assigned: a git branch for a repository, else a folder.
- `size?` (`'sm' | 'lg'`): `sm`: the sidebar's 18px slot. `lg`: a heading's 28px slot (the project home).
- `style?` (`CSSProperties`): Inline styles on the slot.

Source: [ui/src/chat/sidebar/ProjectIcon.tsx:122](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/ProjectIcon.tsx#L122)

### `SessionSidebar`

Component.

Renders the session sidebar.

```ts
function SessionSidebar<S extends SidebarRowSession>(
  props: SessionSidebarProps<S>,
): Element | null
```

**Type parameters**

- `S` (`extends SidebarRowSession`)

**Parameters**

- `props` (`SessionSidebarProps<S>`): The directory's view, the app's actions, the live row parts, the footer and the frame.

**Returns** `Element | null`

**Props**

- `activeSessionId` (`S['id'] | null`): The open session.
- `agentNames?` (`Readonly<Record<string, string>>`): Agent names by id: the agent grouping's headers. Default: the composer host's agent catalog. An agent left out shows its id.
- `archiveFilter` (`SessionArchiveFilter`): The archive axis, for the content search.
- `ariaLabel?` (`string`): Names the aside's landmark (several sidebars on one page each need their own).
- `artifactBadges?` (`boolean`): Artifacts on a second line. Default: true.
- `chatsOpen?` (`boolean`): A new chat with no folder shows: the Chats header wears the active chip.
- `chromeInset?` (`SidebarChromeInset`): A drag strip clearing the window's native controls.
- `className?` (`string`): Extra classes on the aside.
- `collapsed` (`boolean`): The user collapsed the sidebar.
- `filter?` (`ReactNode`): Beside the search well: the filter menu.
- `footer?` (`ReactNode`): Under the list: the footer strip.
- `groupBy` (`SidebarGroupBy`): How the rows group.
- `hosts` (`readonly HostView[]`): This machine and the remote hosts (their sections and chips).
- `keyboardBlocked?` (`() => boolean`): The keys belong elsewhere now (a modal is open).
- `listSpaceId` (`string`): The space the list shows (`listSpaceId`).
- `live` (`SidebarLive`): The rows' live parts (`createSidebarLive`, built once).
- `onActivate` (`(sessionId: S['id'] | null) => void`): Opens a session (`null`: the new-session surface).
- `onArchiveProject` (`(project: SidebarProject, label: string) => void`): Archives a project's conversations (`useProjectSessionActions`).
- `onDelete` (`(session: { environment?: SessionEnvironmentSummary; id: S['id']; title: string }) => void`): Deletes a session (ask first: `useConfirmDeleteSession`).
- `onDeleteProject` (`(project: SidebarProject, label: string, onRemoved: () => void) => void`): Deletes a project's conversations; `onRemoved` unpins it once they are gone.
- `onMoveProjectToSpace?` (`(project: SidebarProject, spaceId: string) => Promise<unknown>`): Moves a project to a space. Absent: no move rows on the headers.
- `onMoveSession?` (`(sessionId: S['id']) => void`): Moves a session to another environment of its host (`useMoveSession`, `zidane-ui/git`). Absent: no "Move to…".
- `onMoveToSpace?` (`(sessionId: S['id'], spaceId: string) => Promise<unknown>`): Moves a session to a space. Absent: no move rows.
- `onNewSession` (`() => void`): Starts a new session.
- `onNewSessionIn` (`(path: string) => void`): Starts a new session in a project's folder.
- `onOpenChats?` (`() => void`): Starts a new chat with no folder (the Chats name clicked). Present: the Chats collapse moves to a chevron.
- `onOpenItem?` (`(open: NonNullable<SidebarRowOpen | undefined>, item: ExtensionItem<'sidebar-row'>) => void`): Opens an extension item's target. Default: a session opens, a command runs through the extensions
  host with the item's `args`, a panel focuses in the workspace, a screen opens on the modal layer.
  The wire's ids are already full (`SidebarRowWire`): they are used as they are.
- `onOpenProject?` (`(project: SidebarProjectRef) => void`): Opens a project's home (its name clicked; a server's project too). Present: project names open it and
  their collapse moves to a chevron after their buttons. Absent: names toggle collapse.
- `onRename` (`(sessionId: S['id'], title: string) => Promise<void>`): Renames a session.
- `onSetArchived` (`(sessionId: S['id'], archived: boolean) => Promise<void>`): Archives or restores a session.
- `onSetFavorite` (`(sessionId: S['id'], favorite: boolean) => Promise<void>`): Stars or unstars a session.
- `onViewChange?` (`(patch: Partial<SidebarView>) => void`): Changes the shown space's view: the empty list's reset turns its filters off with it, when
  filters hid every session (needs `query`). Absent: the empty list offers no reset.
- `onWidthCommit` (`(width: number) => void`): A resize ended at this width.
- `openProject?` (`SidebarProjectRef | null`): The project whose home shows: its header wears the active chip.
- `orchestration` (`boolean`): The orchestration Main is on: its session is pinned above the groups. Off: it is hidden.
- `query?` (`SidebarQueryLayer`): The shown space's query layer (`SessionDirectoryView.query`): the grouping and sort that apply
  (a space's, an extension's, the agents'), the row decorations and the extension items. Absent:
  the built-in grouping and sort, no decorations, no items.
- `runDetails?` (`boolean`): What runs are doing in the trailing slot. Default: true.
- `search?` (`SessionContentSearch`): Content search. Absent: titles only.
- `sessions` (`readonly S[]`): The sessions the list shows (the shown space's filters applied).
- `sortBy` (`SidebarSortBy`): How the rows sort inside a group.
- `spaces` (`readonly Space[]`): The spaces.
- `spaceSlide` (`SidebarSpaceSlide | null`): The last user switch of space; the list slides when it showed `listSpaceId`.
- `spacesOn` (`boolean`): Spaces are on.
- `style?` (`CSSProperties`): Inline styles on the aside.
- `width` (`number`): The width the user wants (px).

Source: [ui/src/chat/sidebar/SessionSidebar.tsx:322](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SessionSidebar.tsx#L322)

### `SidebarChip`

Component.

One chip of a decoration or an item: its icon and text in its tone.

```ts
function SidebarChip(props: SidebarChipProps): Element
```

**Parameters**

- `props` (`SidebarChipProps`): The chip, `className` and `style`.

**Returns** `Element`

**Props**

- `chip` (`SidebarRowChip`): The chip.
- `className?` (`string`): Extra classes on the chip.
- `style?` (`CSSProperties`): Inline styles on the chip.

Source: [ui/src/chat/sidebar/SidebarDecoration.tsx:31](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarDecoration.tsx#L31)

### `SidebarCompactingIndicator`

Component.

"compacting…" with the Throbber's ellipsis, then a live `~12k` summary estimate and the elapsed time past
one second, so a long compaction reads as progress rather than a hang.

```ts
function SidebarCompactingIndicator(props: SidebarCompactingIndicatorProps): Element
```

**Parameters**

- `props` (`SidebarCompactingIndicatorProps`): The progress, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root.
- `progress` (`CompactionProgress | null`): The compaction's progress; `null` before it reports any.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/chat/sidebar/SidebarFooter.tsx:217](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFooter.tsx#L217)

### `SidebarDecoration`

Component.

The decorations' icon and chips on a session row; a component one of them names in place of that
decoration's own icon and chips, which are its fallback.

```ts
const SidebarDecoration: MemoExoticComponent<(__namedParameters: SidebarDecorationProps) => Element>
```

Source: [ui/src/chat/sidebar/SidebarDecoration.tsx:58](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarDecoration.tsx#L58)

### `SidebarFilterMenu`

Component.

The sidebar's filter axes in the kit's filter menu: view, status, project, activity, agent, origin, sort,
and what extensions contribute (filters, sorts, groupings), with Save view as space.

```ts
function SidebarFilterMenu(props: SidebarFilterMenuProps): Element
```

**Parameters**

- `props` (`SidebarFilterMenuProps`): The [`SidebarFilterMenuProps`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarFilterMenuProps).

**Returns** `Element`

**Props**

- `agentNames?` (`Readonly<Record<string, string>>`): Agent names by id. Default: the composer host's agent catalog. An agent left out shows its id.
- `agents?` (`readonly string[]`): The agents the space's sessions run (`AgentProfile.id`): the agent filter's choices. Absent or empty: no agent filter.
- `className?` (`string`): Extra classes on the trigger button.
- `hosts?` (`boolean`): Remote hosts are on: offer the per-host view.
- `onChange` (`(patch: Partial<SidebarView>) => void`): Change some axes of the view.
- `onSaveView?` (`() => void`): Saves the view as a space of its own. Absent: no such row.
- `origin?` (`boolean`): Offer the Origin filter: All, Scheduled (a reminder started the session), Not scheduled. Pass it while
  reminders are on. A view that has an origin picked shows the row anyway, so it can be cleared.
- `projects` (`readonly string[]`): Every project the listed sessions belong to (by folder name).
- `query?` (`Pick<SidebarQueryLayer, 'space' | 'groups' | 'filters' | 'sorts'>`): The space and what the extensions offer it (`SessionDirectoryView.query`): their filters, sorts
  and groupings join the menu, and the space's own grouping and sort are a choice.
- `view` (`SidebarView`): The shown space's view.

Source: [ui/src/chat/sidebar/SidebarFilterMenu.tsx:77](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFilterMenu.tsx#L77)

### `SidebarFooter`

Component.

Renders the sidebar's footer strip.

```ts
function SidebarFooter(props: SidebarFooterProps): Element
```

**Parameters**

- `props` (`SidebarFooterProps`): The status side, the spaces switcher, the settings gear, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the strip.
- `onOpenSettings` (`() => void`): Opens Settings.
- `sessionId?` (`string`): The session on screen: its extensions' `sidebar.footer` and `app.statusbar` items show too.
- `settingsNote?` (`SidebarSettingsNote`): Something waiting in Settings.
- `spaces?` (`ReactNode`): The center: the spaces switcher (Spaces on).
- `status?` (`ReactNode`): The status side, left: the app's indicators.
- `style?` (`CSSProperties`): Inline styles on the strip.

Source: [ui/src/chat/sidebar/SidebarFooter.tsx:62](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFooter.tsx#L62)

### `SidebarFrame`

Component.

Renders the sidebar's aside, sheet, drag strip and resize handle. Render it only while `frame.mounted`.

```ts
function SidebarFrame(props: SidebarFrameProps): Element
```

**Parameters**

- `props` (`SidebarFrameProps`): The frame state, the chrome inset, the content, its name, `className` and `style`.

**Returns** `Element`

**Props**

- `ariaLabel?` (`string`): Names the aside's landmark (several sidebars on one page each need their own). Absent: unnamed.
- `children` (`ReactNode`): The sheet's content, top to bottom.
- `chromeInset?` (`SidebarChromeInset`): A drag strip clearing the window's native controls. Absent: none.
- `className?` (`string`): Extra classes on the aside.
- `frame` (`SidebarFrameState`): The frame's state (`useSidebarFrame`).
- `style?` (`CSSProperties`): Inline styles on the aside.

Source: [ui/src/chat/sidebar/SidebarFrame.tsx:117](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFrame.tsx#L117)

### `SidebarGroupHeader`

Component.

Renders a group header of the sidebar list.

```ts
function SidebarGroupHeader(props: SidebarGroupHeaderProps): Element
```

**Parameters**

- `props` (`SidebarGroupHeaderProps`): The header row, the view, its icon and the project actions.

**Returns** `Element`

**Props**

- `canArchive` (`boolean`): Some of the project's listed conversations are not archived yet.
- `className?` (`string`): Extra classes on the header.
- `groupBy` (`SidebarGroupBy`): The view: which glyph a header shows, and whether its groups are folders.
- `icon?` (`ProjectIcon`): The project's picked icon.
- `onArchiveProject` (`(project: SidebarProject, label: string) => void`): Archives the project's conversations (after a confirmation).
- `onAssignIcon` (`(fullPath: string, icon: ProjectIcon | null) => void`): Picks (or, with `null`, resets) a project's icon.
- `onDeleteProject` (`(project: SidebarProject, label: string) => void`): Deletes the project's conversations (after a confirmation).
- `onMoveProject` (`(project: SidebarProject, spaceId: string) => void`): Moves the project to another space.
- `onNewSessionIn` (`(fullPath: string) => void`): Starts a session in the project's folder.
- `onOpenChats?` (`() => void`): Starts a new chat with no folder from the Chats name. Absent: the name toggles collapse.
- `onOpenProject?` (`(project: SidebarProjectRef) => void`): Opens a project folder's home. Absent: the name toggles collapse.
- `onSetPinned` (`(fullPath: string, pinned: boolean) => void`): Pins or unpins the project.
- `onToggle` (`(id: string) => void`): Collapses or expands the group.
- `open?` (`boolean`): This project's home, or for Chats a new chat with no folder, is the one shown.
- `pinned` (`boolean`): The project is pinned at the top of the list.
- `row` (`{ chats?: boolean; collapsed: boolean; favorites?: boolean; fullPath?: string; id: string; isGitRepo?: boolean; kind: 'header'; label: string; pinned?: boolean } & { hostId?: string; repoKey?: string }`): The header.
- `server?` (`HostView`): The remote host a server folder's header names, as a badge that opens the host's settings.
- `spaceId` (`string`): The space the list shows: where the project moves from.
- `spaces` (`readonly Space[] | null`): The spaces to move the project between while Spaces is on; `null` off.
- `style?` (`CSSProperties`): Inline styles on the header.

Source: [ui/src/chat/sidebar/SidebarGroupHeader.tsx:92](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarGroupHeader.tsx#L92)

### `SidebarHostProvider`

Component.

Provides a [`SidebarHost`](https://zidane.si/docs/reference/ui-chat-headless.md#SidebarHost) to the sidebar and the session menus below.

```ts
function SidebarHostProvider(props: SidebarHostProviderProps): Element
```

**Parameters**

- `props` (`SidebarHostProviderProps`): The `host`, an optional `notify` and the `children`.

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The app's components.
- `host` (`SidebarHost`): The platform's sidebar capabilities.
- `notify?` (`(message: string) => void`): Tells the user a command's outcome or failure. Default: the browser's `alert`.

Source: [ui/src/chat/sidebar/SidebarHostProvider.tsx:38](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarHostProvider.tsx#L38)

### `SidebarRowView`

Component.

Renders an extension item of the sidebar list. Memoized: keep every prop stable.

```ts
const SidebarRowView: MemoExoticComponent<(__namedParameters: SidebarRowViewProps) => Element>
```

Source: [ui/src/chat/sidebar/SidebarRowView.tsx:59](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarRowView.tsx#L59)

### `SidebarSearchRow`

Component.

The search well above the session list, with the filter menu beside it.

```ts
function SidebarSearchRow(props: SidebarSearchRowProps): Element
```

**Parameters**

- `props` (`SidebarSearchRowProps`): The [`SidebarSearchRowProps`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarSearchRowProps).

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the row.
- `filter?` (`ReactNode`): Beside the well: the filter menu.
- `onChange` (`(next: string) => void`): The query changed (cleared with Escape or the clear button).
- `style?` (`CSSProperties`): Inline styles on the row.
- `value` (`string`): The query typed so far.

Source: [ui/src/chat/sidebar/SidebarSearchRow.tsx:34](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarSearchRow.tsx#L34)

### `SidebarSessionRow`

Component.

Renders one session of the sidebar list. Memoized: keep every prop stable.

```ts
const SidebarSessionRow: MemoExoticComponent<(__namedParameters: SidebarSessionRowProps) => Element>
```

Source: [ui/src/chat/sidebar/SidebarSessionRow.tsx:138](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarSessionRow.tsx#L138)

### `SidebarSignInPrompt`

Component.

The "sign in" prompt, for while no provider credentials exist. The signed-in state has no footer presence.

```ts
function SidebarSignInPrompt(props: SidebarSignInPromptProps): Element
```

**Parameters**

- `props` (`SidebarSignInPromptProps`): What it opens, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the button.
- `onClick` (`() => void`): Opens the sign-in.
- `style?` (`CSSProperties`): Inline styles on the button.

Source: [ui/src/chat/sidebar/SidebarFooter.tsx:132](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFooter.tsx#L132)

### `SidebarToggleButton`

Component.

Renders the sidebar toggle.

```ts
function SidebarToggleButton(props: SidebarToggleButtonProps): Element
```

**Parameters**

- `props` (`SidebarToggleButtonProps`): The state, the toggle, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Positioning and drag-region classes.
- `collapsed` (`boolean`): The user collapsed the sidebar: the name says Expand.
- `onClick` (`() => void`): Toggles it.
- `style?` (`CSSProperties`): Inline positioning.

Source: [ui/src/chat/sidebar/SidebarToggleButton.tsx:30](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarToggleButton.tsx#L30)

### `SidebarUsageIndicator`

Component.

`▰ 5h 43%`: the open session's provider's most constrained subscription window, on the TUI footer's
helpers so both read the same number in the same color. Nothing when the provider reports no usage.

```ts
function SidebarUsageIndicator(props: SidebarUsageIndicatorProps): Element | null
```

**Parameters**

- `props` (`SidebarUsageIndicatorProps`): The snapshots, the session's provider and account, `className` and `style`.

**Returns** `Element | null`

**Props**

- `account?` (`string`): The account the session is pinned to, when it is.
- `className?` (`string`): Extra classes on the chip.
- `providerKey?` (`string`): The open session's provider. Absent: nothing renders.
- `snapshots` (`readonly ProviderUsageSnapshot[]`): The providers' usage snapshots (`useProviderUsage`, `zidane-ui/session`).
- `style?` (`CSSProperties`): Inline styles on the chip.

Source: [ui/src/chat/sidebar/SidebarFooter.tsx:168](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFooter.tsx#L168)

### `SpaceGlyph`

Component.

A space's glyph: its emoji or image, else the first letter of its name.

```ts
function SpaceGlyph(props: SpaceGlyphProps): Element
```

**Parameters**

- `props` (`SpaceGlyphProps`): The [`SpaceGlyphProps`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SpaceGlyphProps).

**Returns** `Element`

**Props**

- `size?` (`number`): Side of the square in px. Defaults to 18.
- `space` (`Pick<Space, 'icon' | 'name'> & Pick<SidebarSpace, 'glyph'>`): The space whose icon (an extension's icon class, its emoji or image, else its first letter) shows.

Source: [ui/src/chat/sidebar/SpaceSwitcher.tsx:48](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SpaceSwitcher.tsx#L48)

### `SpacesSection`

Component.

Renders the Spaces sections: the switch, then the list while it is on. Nothing until the settings are read.

```ts
function SpacesSection(props: SpacesSectionProps): Element | null
```

**Parameters**

- `props` (`SpacesSectionProps`): The per-space rows, `className` and `style`.

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra classes on the root.
- `renderDefaults?` (`(space: Space, update: (patch: (space: Space) => Space) => void) => ReactNode`): What a space shows under its name row (its defaults for new sessions). `update` patches the space in
  the list. Absent: nothing.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/chat/sidebar/SpacesSection.tsx:44](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SpacesSection.tsx#L44)

### `SpaceSwitcher`

Component.

The row of space icons: one raised chip slides to the shown space; arrows, Home and End move between them.

```ts
function SpaceSwitcher(props: SpaceSwitcherProps): Element
```

**Parameters**

- `props` (`SpaceSwitcherProps`): The [`SpaceSwitcherProps`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SpaceSwitcherProps).

**Returns** `Element`

**Props**

- `activeId` (`string`): The space shown.
- `className?` (`string`): Extra classes on the toolbar.
- `hidden?` (`readonly (SidebarSpace | Space)[]`): The spaces hidden from the switcher, offered in an icon's menu to show again.
- `onHide?` (`(spaceId: string, hidden: boolean) => void`): Hides a space or shows it again. Absent: no hide or show rows.
- `onMove?` (`(spaceId: string, delta: -1 | 1) => void`): Moves a space one place left (-1) or right (1). Absent: no move rows.
- `onSelect` (`(spaceId: string) => void`): Show another space.
- `spaces` (`readonly (SidebarSpace | Space)[]`): The spaces in switcher order (`SessionDirectoryState.switcherSpaces`).
- `style?` (`CSSProperties`): Inline styles on the toolbar.

Source: [ui/src/chat/sidebar/SpaceSwitcher.tsx:127](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SpaceSwitcher.tsx#L127)

## Functions

### `archiveProjectPrompt`

Function.

Confirms archiving every conversation of a project that is not archived yet.

```ts
function archiveProjectPrompt(
  project: string,
  count: number,
  labels: { activityCompacting: string; activityRetrying: string; activityThinking: string; activityWriting: string; addDiagnosticToChat: (message: string) => string; addFavorite: string; additionalInstructions: string; additionalInstructionsHint: string; additionalInstructionsPlaceholder: string; address: string; addressPlaceholder: string; addSpace: string; addToChat: string; agent: string; agentDraftNote: string; agentGroupDefault: string; agentProfiles: string; archive: string; archiveConfirmLabel: string; archived: string; archiveProjectMessage: (count: number) => 'It stays under Archived, where you can restore it.' | 'They stay under Archived, where you can restore them.'; archiveProjectTitle: (count: number, project: string) => string; attachFile: string; attachmentEmpty: (name: string) => string; attachmentExportPdf: (name: string) => string; attachmentNotices: string; attachmentReadFailed: (name: string) => string; attachments: string; attachmentTitle: (name: string, detail: string) => string; attachmentTooLarge: (name: string, size: string, limit: string) => string; attachmentUnreadableImage: (name: string) => string; attachmentUnsupported: (name: string) => string; authCancel: string; authCard: string; authCopied: string; authCopyDetails: string; authEnterCode: (code: string) => string; authFailed: (message: string) => string; authFixed: string; authHeadline: (auth: AuthFailure, label: string) => string; authOpeningBrowser: string; authOpenPage: string; authPaste: string; authPasteSend: string; authSettings: string; authSettingsHint: string; authSignedIn: string; authSignedInRetrying: string; authSignInAgain: string; authSwitching: (account: string) => string; authTryAgain: string; authUseAccount: (account: string) => string; authWaiting: string; autoDenied: string; back: string; badgeCopied: string; badgeNoComposer: string; badgeOpenIn: (app: string) => string; badgeOpenInBrowserPane: string; badgePathUnavailable: string; blockRunAgain: string; blockRunAttach: string; blockRunAttachmentName: string; blockRunCopy: string; blockRunFailed: (reason: string) => string; blockRunHere: string; blockRunInTerminal: string; blockRunMenu: string; blockRunNeedsTerminal: string; blockRunning: string; blockRunOutput: string; blockRunRemove: string; blockRunStop: string; blockRunStopped: string; blockRunTimedOut: string; blockRunTruncated: string; cancel: string; changeIconFor: (project: string) => string; changeMainIcon: string; changeProjectIcon: string; changeSpaceIcon: string; chats: string; chipBranch: (name: string) => string; chipChat: (name: string) => string; chipCommand: (name: string) => string; chipCommit: (sha: string) => string; chipFactAliases: string; chipFactBranch: string; chipFactChanges: string; chipFactContext: string; chipFactDate: string; chipFactModel: string; chipFactPrompts: string; chipFactSize: string; chipFactTurns: string; chipFactUpdated: string; chipLoading: string; chipNotAmongChats: string; chipNotFound: (title: string) => string; chipRemoteFile: (path: string, host: string) => string; chipSessionError: string; chipSessionRunning: string; chipSkill: (name: string) => string; chipTokens: (count: string) => string; chipUntitledChat: string; chooseImage: string; chooseModel: string; chooseProjectIcon: string; chooseSpaceIcon: string; clearSearch: string; clickToAnswer: string; close: string; closeTab: (name: string) => string; code: string; collapseGroup: (label: string) => string; collapseItem: (title: string) => string; collapseSidebar: string; commandDetail: string; commandSuggestions: string; compactingTitle: string; completionSuggestions: string; composerBadges: string; composerLabel: string; composerPlaceholder: string; composerPlaceholderQueue: string; composerPlaceholderSteer: string; confirm: string; confirmNo: string; confirmYes: string; contextActiveSkills: string; contextAutoCompact: (pct: number) => string; contextCacheRead: string; contextCacheWrite: string; contextClickToCopy: (hasDescription: boolean) => string; contextCopied: string; contextDeferred: string; contextDetail: string; contextEstimated: string; contextFreshInput: string; contextLastTurn: string; contextNoBreakdown: string; contextOutput: string; contextRunCount: (runs: number) => string; contextSessionCost: string; contextSummary: (used: string, window: string, pct: number) => string; contextSummaryCost: (summary: string, cost: string) => string; contextWindow: string; continue: string; continueHint: string; continueRun: string; copied: string; copy: string; copyCode: string; copyDiagramSource: string; copyImage: string; copyImageBase64: string; copyImageDataUrl: string; current: string; customEmoji: string; declineSecret: string; declineSecretHint: string; defaultAgent: string; defaultSpaceName: string; delete: string; deleteConfirmLabel: string; deleteProjectArchived: (archived: number) => string; deleteProjectCannotUndo: string; deleteProjectSandboxes: (sandboxed: number) => string; deleteProjectTitle: (count: number, project: string) => string; deleteSessionQuestion: (title: string) => string; deleteSessionSandbox: (kind: string) => string; deleteSpace: string; deleteSpaceMessage: (fallback: string) => string; deleteSpaceNamed: (name: string) => string; deleteSpaceQuestion: (name: string) => string; diagnosticsCheckedBy: (source: string) => string; diagnosticsChecking: string; diagnosticsNone: string; diagram: (type: string | null) => string; diagramError: (message: string, at: string) => string; diagramErrorAt: (line: number, column: number) => string; dismiss: string; dismissHint: string; dotAttached: string; dotAttention: string; dotCompleted: string; dotError: string; dotIdle: string; dotPending: string; dotRunning: string; earlierHistory: string; earlierLines: (count: number) => string; earlierMessages: (count: number) => string; editorConflict: string; editorConflictDetail: string; editorEmpty: string; editorOverwrite: string; editorReadFailed: (message: string) => string; editorReload: string; effortLevel: (level: string) => string; emojiPlaceholder: string; environmentActionFailed: (action: string, message: string) => string; environmentKept: (reason?: string) => string; environmentKinds: Readonly<Record<string, string>>; environmentOnBranch: (kind: string, branch: string) => string; environmentOnMachine: (kind: string, machine: string) => string; environmentPaused: (where: string) => string; environmentSettingUp: (where: string) => string; environmentSetupFailed: (where: string, error?: string) => string; environmentsKept: (count: number) => string; errorFailed: (region: string) => string; errorStack: string; errorTryAgain: string; estimateDue: string; estimateDueTitle: string; estimateOver: string; estimateOverTitle: string; estimatePausedTitle: (left: string) => string; estimateProblemTitle: (reason: string, message?: string) => string; estimateTitle: (left: string) => string; expandGroup: (label: string) => string; expandItem: (title: string) => string; expandSidebar: string; favorites: string; filePath: (path: string) => string; fileReadOnly: (path: string) => string; fileTree: string; fileUnsaved: string; fileUnsavedTitle: (path: string) => string; filterActivities: { '1d': string; '30d': string; '3d': string; '7d': string; all: string }; filterActivity: string; filterAgent: string; filterAllAgents: string; filterAllAgentsOption: string; filterAllProjects: string; filterAllProjectsOption: string; filterAny: string; filterNoAgents: string; filterNoProjects: string; filterOrigin: string; filterOrigins: { all: string; scheduled: string; unscheduled: string }; filterPicked: (count: number) => string; filterProject: string; filterSaveView: string; filterSessions: string; filterSort: string; filterSorts: { alphabetical: string; createdTime: string; recency: string }; filterSpaceDefault: string; filterStatus: string; filterStatuses: { active: string; all: string; archived: string }; filterView: string; filterViews: { agent: string; date: string; host: string; none: string; project: string; state: string }; findClose: string; findCloseHint: string; findInConversation: string; findInConversationClose: string; findInFile: string; findMatchCase: string; findNext: string; findNextHint: string; findNoResults: string; findPrevious: string; findPreviousHint: string; findReferences: string; fitDiagram: string; foldOutcomes: (ok: number, failed: number) => string; foldSteps: (count: number) => string; footerSettings: string; footerSettingsWithNote: (note: string) => string; footerSignIn: string; footerSignInTitle: string; generatedImage: string; generatingImage: (model: string | null) => string; generatingImages: (count: number, model: string | null) => string; goToDefinition: string; goToStep: (step: string) => string; hiddenSpaces: string; hideSpace: string; hostBadgeTitle: (host: string, status: string) => string; hostCollapse: (name: string) => string; hostExpand: (name: string) => string; hostOpenSettings: (host: string) => string; hostPicker: string; hostRunsOn: (name: string) => string; hostRunsOnSection: string; hostStatusError: (status: string, error: string) => string; hostStatuses: { 'auth-refused': string; connected: string; connecting: string; identity: string; local: string; offline: string; reconnecting: string; 'version-mismatch': string }; hostThisMachine: string; imageModelReferences: string; imageModelReferencesHint: string; imageModelsNone: string; imageModelsPill: string; imageModelTransparency: string; imageModelTransparencyHint: string; inboxEmpty: string; inboxInProgress: string; inboxNeedsYou: string; inboxPreviousSession: string; inboxRecent: string; inputCaption: string; interactionAnsweredBy: (who: string) => string; interactionApproved: string; interactionDismissed: string; interactionPlan: string; interactionQuestion: string; interactionRejected: string; interactionRevise: string; interactionsLabel: string; interactionWaitingAnswers: string; interactionWaitingDecision: string; itemActions: (title: string) => string; itemOpenFailed: (message: string) => string; justNow: string; loadEarlierHistory: string; loadFullOutput: string; loading: string; loadingEarlierHistory: string; loadingEarlierMessages: string; loadingFullOutput: string; mainSession: string; mentionSuggestions: string; menuAddFavorite: string; menuArchive: string; menuArchiveProject: string; menuCopyPath: string; menuDelete: string; menuDeleteProject: string; menuMoveProjectToSpace: string; menuMoveTo: string; menuMoveToSpace: string; menuOpenChatWindow: string; menuOpenPanelsWindow: string; menuOpenWindow: string; menuRemoveFavorite: string; menuRename: string; menuRetryEnvironment: string; menuReveal: string; menuUnarchive: string; modalBack: string; modalFailed: string; modelAccountBlocked: (provider: string) => string; modelChain: string; modelChainNoModel: string; modelChainOrderHint: string; modelFallback: string; modelFallbackHint: string; modelFallbackPosition: (n: number) => string; modelFeatures: string; modelForNextChat: string; modelInUse: string; modelKinds: string; modelLegacy: string; modelLegacyHint: string; modelNotInCatalog: string; modelNotInCatalogHint: string; modelOptions: string; modelOptionsEmpty: string; modelOptionsHint: string; modelPrimary: string; modelPrimaryHint: string; modelReasoning: string; modelReasoningHint: string; modelRemoveFallback: (n: number) => string; modelRemoveFromChain: string; modelRemovePrimary: string; modelsChatTab: string; modelsCustomId: string; modelServing: (picked: string, serving: string) => string; modelServingFallback: string; modelsImageTab: string; modelsInUse: string; modelsJumpHint: (provider: string, digit: number | null) => string; modelsJumpToProvider: string; modelsLegacy: string; modelsLegacyHidden: (count: number) => string; modelsLoadFailed: (error: string) => string; modelsLoading: string; modelsNoMatch: (query: string) => string; modelsNoProviders: string; modelsSelected: (count: number) => string; modelsShowLegacy: string; modelsShowLegacyHint: string; modelsShownOf: (shown: number, total: number) => string; modelsTypeAnId: string; modelUnavailable: string; modelVerdictTitle: (approved: boolean, model: string, confidence: string | null) => string; modelVia: string; modelViaHint: (modelId: string, provider: string) => string; months: readonly string[]; moreActions: string; moreAttachments: (count: number) => string; moveProjectFailed: (message: string) => string; moveSessionFailed: (message: string) => string; moveSpaceDown: (name: string) => string; moveSpaceLeft: string; moveSpaceRight: string; moveSpaceUp: (name: string) => string; newSession: string; newSessionIn: (project: string) => string; newSessionTitle: string; newSpaceName: (n: number) => string; next: string; noAnswer: string; noChatsMatchFilters: string; noChatsYet: string; noMatches: (query: string) => string; noReferences: string; noSessions: string; noSuggestions: string; of: (index: number, count: number) => string; openFiles: string; openGroup: (label: string) => string; openImageFile: (path: string) => string; openInNewTab: string; openNamedSession: (title: string) => string; openSecrets: string; openSession: string; outputCaption: string; paletteBack: string; paletteBackHint: string; paletteChoose: string; paletteEmpty: string; paletteFilter: string; paletteLabel: string; paletteLoading: string; paletteNoMatch: (query: string) => string; paletteOpen: string; paletteRun: string; paletteScopeHint: string; paletteTurnOff: string; paletteTurnOn: string; pickModel: string; pickOneOrMore: string; pinNamed: (project: string) => string; pinProject: string; planApprove: string; planReject: string; planRejectAndStop: string; planRejectNote: string; planRejectPlaceholder: string; planRevise: string; planReviseNote: string; planRevisePlaceholder: string; planSendRevision: string; previewFailed: (name: string) => string; previewTooLarge: (name: string, size: string) => string; previous: string; queryGroupOther: string; questionCount: (count: number) => string; queueHint: string; queueMessage: string; reasoningEffort: string; receiptAgent: string; receiptAgentSwitched: string; receiptCost: string; receiptDuration: string; receiptModel: string; receiptModelOthers: (others: number) => string; receiptSpeed: string; receiptTokens: (sent: string, received: string) => string; receiptTurns: (turns: number) => string; reload: string; removeAttachment: (name: string) => string; removeFavorite: string; rename: string; requiredHint: string; requiredMark: string; resetFilters: string; resetsAt: (time: string) => string; resetToFolder: string; resetToInitial: string; retry: string; retryEnvironmentFailed: (message: string) => string; retryHint: string; rowNeedsYou: string; rowRunning: string; rowScheduled: string; rowWorking: string; runningFor: (elapsed: string) => string; runReceipt: string; runRetrying: (attempt: number, max: number, source?: string) => string; runWaiting: string; savedViewName: (n: number) => string; saveSecurely: string; saveViewFailed: (message: string) => string; screenBack: (screen: string) => string; screenBackKey: string; scriptCallsDone: (done: number) => string; scriptCallsFailed: (failed: number) => string; scriptCallsOf: (done: number, total: number) => string; scriptCallsRunning: (running: number) => string; scriptLineCalls: (calls: number) => string; scriptLiveOutput: string; scriptLoop: string; scriptLoopRound: (round: number) => string; scriptLoopRounds: (rounds: number) => string; scriptLoopRuns: (runs: number) => string; scriptOptionOutput: string; scriptOptions: string; scriptOptionTimeout: string; scriptOptionTokens: (tokens: number) => string; scriptPercent: (percent: number) => string; scriptProgress: string; scriptWaitLeft: (seconds: number) => string; searchingSessions: string; searchModels: string; searchModelsPlaceholder: string; searchSessions: string; searchSessionsLabel: string; secretDeclined: (name: string) => string; secretNote: (ttl: SecretTtl) => string; secretReused: (name: string) => string; secretSaved: (name: string, left: SecretTimeLeft) => string; secretSent: (name: string) => string; secretTtlLabel: string; secretTtlName: (ttl: SecretTtl) => string; secretValueLabel: string; secretValuePlaceholder: string; selectTurnCopied: string; selectTurnCopy: string; selectTurnDetails: string; selectTurnExit: string; selectTurnFork: string; selectTurnForkFailed: string; selectTurnMove: string; selectTurnNothingToCopy: string; selectTurnSelecting: string; sendAnswers: (count: number) => string; sendHint: string; sendMessage: string; sessionActions: string; sessionEventLabel: (title: string, verb: string, needsAttention: boolean) => string; sessions: string; setModelOptions: string; shellCancelled: string; shellExit: (code: number) => string; shellKilled: string; showDiagram: string; showDiagramSource: string; showHiddenSpace: (name: string) => string; showMore: string; showMoreAttachments: (count: number) => string; showOutput: string; showSystemPrompt: string; sidebarNoMatches: string; signInCopyCode: string; signInDone: (account?: string) => string; signInEnterCode: (host: string) => string; signInFailed: string; signInInBrowser: (service: string) => string; signInNotOpened: string; signInOpenPage: string; signInPaste: string; signInStarting: string; signInSubmit: string; skip: string; spaceFromExtension: (extension: string) => string; spaceNamed: (name: string) => string; spaceNameOf: (name: string) => string; spaceOptions: (name: string) => string; spaces: string; spacesTitle: string; spawnResumes: (childId: string) => string; spawnTask: string; stateCompleted: string; stateError: string; stateIdle: string; stateRunning: string; steerHint: string; steerMessage: string; stepDone: string; stepFailed: string; stepOf: (index: number, count: number) => string; stepResuming: string; stepRunning: string; steps: string; stepWaiting: string; stopCommand: string; stopHint: string; stopped: string; stoppedByYou: string; stopRun: string; switchAgent: string; switchingAgent: string; switchModel: string; terminal: string; terminalExited: (code: number) => string; terminalLoadFailed: (message: string) => string; thinkingLive: string; thoughtFor: (seconds: number) => string; thoughts: string; thoughtTimes: (count: number) => string; today: string; toolAttachments: string; transcriptLoading: string; turnMenuCopy: string; turnMenuCopySelection: string; turnMenuCopySelectionFailed: string; turnMenuDelete: string; turnMenuEdit: string; turnMenuEditNeedsComposer: string; turnMenuFork: string; turnMenuRewind: string; turnMenuSent: (age: string) => string; turnMenuStopFirst: (label: string) => string; turnsCompacted: string; unarchive: string; unpinNamed: (project: string) => string; unpinProject: string; unsupportedInteraction: (tool: string) => string; usagePanelHint: string; usageWindow: (window: string, percent: string) => string; useSpaces: string; useSpacesDescription: string; viewAttachment: (name: string) => string; waitingForSlot: (max: number) => string; workerContinues: string; workerModel: string; workerSystemPrompt: string; workerSystemReplaced: string; workerType: string; working: string; wrapLines: string; yesterday: string; yourSpaces: string; zoomFit: string; zoomInDiagram: string; zoomOutDiagram: string; zoomPercent: (percent: number) => string },
): ConfirmOptions
```

**Parameters**

- `project` (`string`): The project's name.
- `count` (`number`): How many are not archived yet.
- `labels` (`{ activityCompacting: string; activityRetrying: string; activityThinking: string; activityWriting: string; addDiagnosticToChat: (message: string) => string; addFavorite: string; additionalInstructions: string; additionalInstructionsHint: string; additionalInstructionsPlaceholder: string; address: string; addressPlaceholder: string; addSpace: string; addToChat: string; agent: string; agentDraftNote: string; agentGroupDefault: string; agentProfiles: string; archive: string; archiveConfirmLabel: string; archived: string; archiveProjectMessage: (count: number) => 'It stays under Archived, where you can restore it.' | 'They stay under Archived, where you can restore them.'; archiveProjectTitle: (count: number, project: string) => string; attachFile: string; attachmentEmpty: (name: string) => string; attachmentExportPdf: (name: string) => string; attachmentNotices: string; attachmentReadFailed: (name: string) => string; attachments: string; attachmentTitle: (name: string, detail: string) => string; attachmentTooLarge: (name: string, size: string, limit: string) => string; attachmentUnreadableImage: (name: string) => string; attachmentUnsupported: (name: string) => string; authCancel: string; authCard: string; authCopied: string; authCopyDetails: string; authEnterCode: (code: string) => string; authFailed: (message: string) => string; authFixed: string; authHeadline: (auth: AuthFailure, label: string) => string; authOpeningBrowser: string; authOpenPage: string; authPaste: string; authPasteSend: string; authSettings: string; authSettingsHint: string; authSignedIn: string; authSignedInRetrying: string; authSignInAgain: string; authSwitching: (account: string) => string; authTryAgain: string; authUseAccount: (account: string) => string; authWaiting: string; autoDenied: string; back: string; badgeCopied: string; badgeNoComposer: string; badgeOpenIn: (app: string) => string; badgeOpenInBrowserPane: string; badgePathUnavailable: string; blockRunAgain: string; blockRunAttach: string; blockRunAttachmentName: string; blockRunCopy: string; blockRunFailed: (reason: string) => string; blockRunHere: string; blockRunInTerminal: string; blockRunMenu: string; blockRunNeedsTerminal: string; blockRunning: string; blockRunOutput: string; blockRunRemove: string; blockRunStop: string; blockRunStopped: string; blockRunTimedOut: string; blockRunTruncated: string; cancel: string; changeIconFor: (project: string) => string; changeMainIcon: string; changeProjectIcon: string; changeSpaceIcon: string; chats: string; chipBranch: (name: string) => string; chipChat: (name: string) => string; chipCommand: (name: string) => string; chipCommit: (sha: string) => string; chipFactAliases: string; chipFactBranch: string; chipFactChanges: string; chipFactContext: string; chipFactDate: string; chipFactModel: string; chipFactPrompts: string; chipFactSize: string; chipFactTurns: string; chipFactUpdated: string; chipLoading: string; chipNotAmongChats: string; chipNotFound: (title: string) => string; chipRemoteFile: (path: string, host: string) => string; chipSessionError: string; chipSessionRunning: string; chipSkill: (name: string) => string; chipTokens: (count: string) => string; chipUntitledChat: string; chooseImage: string; chooseModel: string; chooseProjectIcon: string; chooseSpaceIcon: string; clearSearch: string; clickToAnswer: string; close: string; closeTab: (name: string) => string; code: string; collapseGroup: (label: string) => string; collapseItem: (title: string) => string; collapseSidebar: string; commandDetail: string; commandSuggestions: string; compactingTitle: string; completionSuggestions: string; composerBadges: string; composerLabel: string; composerPlaceholder: string; composerPlaceholderQueue: string; composerPlaceholderSteer: string; confirm: string; confirmNo: string; confirmYes: string; contextActiveSkills: string; contextAutoCompact: (pct: number) => string; contextCacheRead: string; contextCacheWrite: string; contextClickToCopy: (hasDescription: boolean) => string; contextCopied: string; contextDeferred: string; contextDetail: string; contextEstimated: string; contextFreshInput: string; contextLastTurn: string; contextNoBreakdown: string; contextOutput: string; contextRunCount: (runs: number) => string; contextSessionCost: string; contextSummary: (used: string, window: string, pct: number) => string; contextSummaryCost: (summary: string, cost: string) => string; contextWindow: string; continue: string; continueHint: string; continueRun: string; copied: string; copy: string; copyCode: string; copyDiagramSource: string; copyImage: string; copyImageBase64: string; copyImageDataUrl: string; current: string; customEmoji: string; declineSecret: string; declineSecretHint: string; defaultAgent: string; defaultSpaceName: string; delete: string; deleteConfirmLabel: string; deleteProjectArchived: (archived: number) => string; deleteProjectCannotUndo: string; deleteProjectSandboxes: (sandboxed: number) => string; deleteProjectTitle: (count: number, project: string) => string; deleteSessionQuestion: (title: string) => string; deleteSessionSandbox: (kind: string) => string; deleteSpace: string; deleteSpaceMessage: (fallback: string) => string; deleteSpaceNamed: (name: string) => string; deleteSpaceQuestion: (name: string) => string; diagnosticsCheckedBy: (source: string) => string; diagnosticsChecking: string; diagnosticsNone: string; diagram: (type: string | null) => string; diagramError: (message: string, at: string) => string; diagramErrorAt: (line: number, column: number) => string; dismiss: string; dismissHint: string; dotAttached: string; dotAttention: string; dotCompleted: string; dotError: string; dotIdle: string; dotPending: string; dotRunning: string; earlierHistory: string; earlierLines: (count: number) => string; earlierMessages: (count: number) => string; editorConflict: string; editorConflictDetail: string; editorEmpty: string; editorOverwrite: string; editorReadFailed: (message: string) => string; editorReload: string; effortLevel: (level: string) => string; emojiPlaceholder: string; environmentActionFailed: (action: string, message: string) => string; environmentKept: (reason?: string) => string; environmentKinds: Readonly<Record<string, string>>; environmentOnBranch: (kind: string, branch: string) => string; environmentOnMachine: (kind: string, machine: string) => string; environmentPaused: (where: string) => string; environmentSettingUp: (where: string) => string; environmentSetupFailed: (where: string, error?: string) => string; environmentsKept: (count: number) => string; errorFailed: (region: string) => string; errorStack: string; errorTryAgain: string; estimateDue: string; estimateDueTitle: string; estimateOver: string; estimateOverTitle: string; estimatePausedTitle: (left: string) => string; estimateProblemTitle: (reason: string, message?: string) => string; estimateTitle: (left: string) => string; expandGroup: (label: string) => string; expandItem: (title: string) => string; expandSidebar: string; favorites: string; filePath: (path: string) => string; fileReadOnly: (path: string) => string; fileTree: string; fileUnsaved: string; fileUnsavedTitle: (path: string) => string; filterActivities: { '1d': string; '30d': string; '3d': string; '7d': string; all: string }; filterActivity: string; filterAgent: string; filterAllAgents: string; filterAllAgentsOption: string; filterAllProjects: string; filterAllProjectsOption: string; filterAny: string; filterNoAgents: string; filterNoProjects: string; filterOrigin: string; filterOrigins: { all: string; scheduled: string; unscheduled: string }; filterPicked: (count: number) => string; filterProject: string; filterSaveView: string; filterSessions: string; filterSort: string; filterSorts: { alphabetical: string; createdTime: string; recency: string }; filterSpaceDefault: string; filterStatus: string; filterStatuses: { active: string; all: string; archived: string }; filterView: string; filterViews: { agent: string; date: string; host: string; none: string; project: string; state: string }; findClose: string; findCloseHint: string; findInConversation: string; findInConversationClose: string; findInFile: string; findMatchCase: string; findNext: string; findNextHint: string; findNoResults: string; findPrevious: string; findPreviousHint: string; findReferences: string; fitDiagram: string; foldOutcomes: (ok: number, failed: number) => string; foldSteps: (count: number) => string; footerSettings: string; footerSettingsWithNote: (note: string) => string; footerSignIn: string; footerSignInTitle: string; generatedImage: string; generatingImage: (model: string | null) => string; generatingImages: (count: number, model: string | null) => string; goToDefinition: string; goToStep: (step: string) => string; hiddenSpaces: string; hideSpace: string; hostBadgeTitle: (host: string, status: string) => string; hostCollapse: (name: string) => string; hostExpand: (name: string) => string; hostOpenSettings: (host: string) => string; hostPicker: string; hostRunsOn: (name: string) => string; hostRunsOnSection: string; hostStatusError: (status: string, error: string) => string; hostStatuses: { 'auth-refused': string; connected: string; connecting: string; identity: string; local: string; offline: string; reconnecting: string; 'version-mismatch': string }; hostThisMachine: string; imageModelReferences: string; imageModelReferencesHint: string; imageModelsNone: string; imageModelsPill: string; imageModelTransparency: string; imageModelTransparencyHint: string; inboxEmpty: string; inboxInProgress: string; inboxNeedsYou: string; inboxPreviousSession: string; inboxRecent: string; inputCaption: string; interactionAnsweredBy: (who: string) => string; interactionApproved: string; interactionDismissed: string; interactionPlan: string; interactionQuestion: string; interactionRejected: string; interactionRevise: string; interactionsLabel: string; interactionWaitingAnswers: string; interactionWaitingDecision: string; itemActions: (title: string) => string; itemOpenFailed: (message: string) => string; justNow: string; loadEarlierHistory: string; loadFullOutput: string; loading: string; loadingEarlierHistory: string; loadingEarlierMessages: string; loadingFullOutput: string; mainSession: string; mentionSuggestions: string; menuAddFavorite: string; menuArchive: string; menuArchiveProject: string; menuCopyPath: string; menuDelete: string; menuDeleteProject: string; menuMoveProjectToSpace: string; menuMoveTo: string; menuMoveToSpace: string; menuOpenChatWindow: string; menuOpenPanelsWindow: string; menuOpenWindow: string; menuRemoveFavorite: string; menuRename: string; menuRetryEnvironment: string; menuReveal: string; menuUnarchive: string; modalBack: string; modalFailed: string; modelAccountBlocked: (provider: string) => string; modelChain: string; modelChainNoModel: string; modelChainOrderHint: string; modelFallback: string; modelFallbackHint: string; modelFallbackPosition: (n: number) => string; modelFeatures: string; modelForNextChat: string; modelInUse: string; modelKinds: string; modelLegacy: string; modelLegacyHint: string; modelNotInCatalog: string; modelNotInCatalogHint: string; modelOptions: string; modelOptionsEmpty: string; modelOptionsHint: string; modelPrimary: string; modelPrimaryHint: string; modelReasoning: string; modelReasoningHint: string; modelRemoveFallback: (n: number) => string; modelRemoveFromChain: string; modelRemovePrimary: string; modelsChatTab: string; modelsCustomId: string; modelServing: (picked: string, serving: string) => string; modelServingFallback: string; modelsImageTab: string; modelsInUse: string; modelsJumpHint: (provider: string, digit: number | null) => string; modelsJumpToProvider: string; modelsLegacy: string; modelsLegacyHidden: (count: number) => string; modelsLoadFailed: (error: string) => string; modelsLoading: string; modelsNoMatch: (query: string) => string; modelsNoProviders: string; modelsSelected: (count: number) => string; modelsShowLegacy: string; modelsShowLegacyHint: string; modelsShownOf: (shown: number, total: number) => string; modelsTypeAnId: string; modelUnavailable: string; modelVerdictTitle: (approved: boolean, model: string, confidence: string | null) => string; modelVia: string; modelViaHint: (modelId: string, provider: string) => string; months: readonly string[]; moreActions: string; moreAttachments: (count: number) => string; moveProjectFailed: (message: string) => string; moveSessionFailed: (message: string) => string; moveSpaceDown: (name: string) => string; moveSpaceLeft: string; moveSpaceRight: string; moveSpaceUp: (name: string) => string; newSession: string; newSessionIn: (project: string) => string; newSessionTitle: string; newSpaceName: (n: number) => string; next: string; noAnswer: string; noChatsMatchFilters: string; noChatsYet: string; noMatches: (query: string) => string; noReferences: string; noSessions: string; noSuggestions: string; of: (index: number, count: number) => string; openFiles: string; openGroup: (label: string) => string; openImageFile: (path: string) => string; openInNewTab: string; openNamedSession: (title: string) => string; openSecrets: string; openSession: string; outputCaption: string; paletteBack: string; paletteBackHint: string; paletteChoose: string; paletteEmpty: string; paletteFilter: string; paletteLabel: string; paletteLoading: string; paletteNoMatch: (query: string) => string; paletteOpen: string; paletteRun: string; paletteScopeHint: string; paletteTurnOff: string; paletteTurnOn: string; pickModel: string; pickOneOrMore: string; pinNamed: (project: string) => string; pinProject: string; planApprove: string; planReject: string; planRejectAndStop: string; planRejectNote: string; planRejectPlaceholder: string; planRevise: string; planReviseNote: string; planRevisePlaceholder: string; planSendRevision: string; previewFailed: (name: string) => string; previewTooLarge: (name: string, size: string) => string; previous: string; queryGroupOther: string; questionCount: (count: number) => string; queueHint: string; queueMessage: string; reasoningEffort: string; receiptAgent: string; receiptAgentSwitched: string; receiptCost: string; receiptDuration: string; receiptModel: string; receiptModelOthers: (others: number) => string; receiptSpeed: string; receiptTokens: (sent: string, received: string) => string; receiptTurns: (turns: number) => string; reload: string; removeAttachment: (name: string) => string; removeFavorite: string; rename: string; requiredHint: string; requiredMark: string; resetFilters: string; resetsAt: (time: string) => string; resetToFolder: string; resetToInitial: string; retry: string; retryEnvironmentFailed: (message: string) => string; retryHint: string; rowNeedsYou: string; rowRunning: string; rowScheduled: string; rowWorking: string; runningFor: (elapsed: string) => string; runReceipt: string; runRetrying: (attempt: number, max: number, source?: string) => string; runWaiting: string; savedViewName: (n: number) => string; saveSecurely: string; saveViewFailed: (message: string) => string; screenBack: (screen: string) => string; screenBackKey: string; scriptCallsDone: (done: number) => string; scriptCallsFailed: (failed: number) => string; scriptCallsOf: (done: number, total: number) => string; scriptCallsRunning: (running: number) => string; scriptLineCalls: (calls: number) => string; scriptLiveOutput: string; scriptLoop: string; scriptLoopRound: (round: number) => string; scriptLoopRounds: (rounds: number) => string; scriptLoopRuns: (runs: number) => string; scriptOptionOutput: string; scriptOptions: string; scriptOptionTimeout: string; scriptOptionTokens: (tokens: number) => string; scriptPercent: (percent: number) => string; scriptProgress: string; scriptWaitLeft: (seconds: number) => string; searchingSessions: string; searchModels: string; searchModelsPlaceholder: string; searchSessions: string; searchSessionsLabel: string; secretDeclined: (name: string) => string; secretNote: (ttl: SecretTtl) => string; secretReused: (name: string) => string; secretSaved: (name: string, left: SecretTimeLeft) => string; secretSent: (name: string) => string; secretTtlLabel: string; secretTtlName: (ttl: SecretTtl) => string; secretValueLabel: string; secretValuePlaceholder: string; selectTurnCopied: string; selectTurnCopy: string; selectTurnDetails: string; selectTurnExit: string; selectTurnFork: string; selectTurnForkFailed: string; selectTurnMove: string; selectTurnNothingToCopy: string; selectTurnSelecting: string; sendAnswers: (count: number) => string; sendHint: string; sendMessage: string; sessionActions: string; sessionEventLabel: (title: string, verb: string, needsAttention: boolean) => string; sessions: string; setModelOptions: string; shellCancelled: string; shellExit: (code: number) => string; shellKilled: string; showDiagram: string; showDiagramSource: string; showHiddenSpace: (name: string) => string; showMore: string; showMoreAttachments: (count: number) => string; showOutput: string; showSystemPrompt: string; sidebarNoMatches: string; signInCopyCode: string; signInDone: (account?: string) => string; signInEnterCode: (host: string) => string; signInFailed: string; signInInBrowser: (service: string) => string; signInNotOpened: string; signInOpenPage: string; signInPaste: string; signInStarting: string; signInSubmit: string; skip: string; spaceFromExtension: (extension: string) => string; spaceNamed: (name: string) => string; spaceNameOf: (name: string) => string; spaceOptions: (name: string) => string; spaces: string; spacesTitle: string; spawnResumes: (childId: string) => string; spawnTask: string; stateCompleted: string; stateError: string; stateIdle: string; stateRunning: string; steerHint: string; steerMessage: string; stepDone: string; stepFailed: string; stepOf: (index: number, count: number) => string; stepResuming: string; stepRunning: string; steps: string; stepWaiting: string; stopCommand: string; stopHint: string; stopped: string; stoppedByYou: string; stopRun: string; switchAgent: string; switchingAgent: string; switchModel: string; terminal: string; terminalExited: (code: number) => string; terminalLoadFailed: (message: string) => string; thinkingLive: string; thoughtFor: (seconds: number) => string; thoughts: string; thoughtTimes: (count: number) => string; today: string; toolAttachments: string; transcriptLoading: string; turnMenuCopy: string; turnMenuCopySelection: string; turnMenuCopySelectionFailed: string; turnMenuDelete: string; turnMenuEdit: string; turnMenuEditNeedsComposer: string; turnMenuFork: string; turnMenuRewind: string; turnMenuSent: (age: string) => string; turnMenuStopFirst: (label: string) => string; turnsCompacted: string; unarchive: string; unpinNamed: (project: string) => string; unpinProject: string; unsupportedInteraction: (tool: string) => string; usagePanelHint: string; usageWindow: (window: string, percent: string) => string; useSpaces: string; useSpacesDescription: string; viewAttachment: (name: string) => string; waitingForSlot: (max: number) => string; workerContinues: string; workerModel: string; workerSystemPrompt: string; workerSystemReplaced: string; workerType: string; working: string; wrapLines: string; yesterday: string; yourSpaces: string; zoomFit: string; zoomInDiagram: string; zoomOutDiagram: string; zoomPercent: (percent: number) => string }`): The sidebar labels.

**Returns** `ConfirmOptions`

Source: [ui/src/chat/sidebar/session-menu.ts:354](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L354)

### `createSidebarCollapsed`

Function.

Makes the store for one window's sidebar.

```ts
function createSidebarCollapsed(
  options: { key: string; pinned?: boolean },
): SidebarCollapsedStore
```

**Parameters**

- `options` (`{ key: string; pinned?: boolean }`): `key`: the localStorage key. `pinned`: always collapsed, nothing to toggle (a window with no sidebar).

**Returns** `SidebarCollapsedStore`: The store.

Source: [ui/src/chat/sidebar/collapsed.ts:31](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/collapsed.ts#L31)

### `createSidebarLive`

Function.

Builds the sidebar rows' live parts over the app's signals. Call it once, at module scope: the returned
components keep their identity, so the rows' memo holds.

```ts
function createSidebarLive(options: SidebarLiveOptions): SidebarLive
```

**Parameters**

- `options` (`SidebarLiveOptions`): The app's hooks and stores.

**Returns** `SidebarLive`

Source: [ui/src/chat/sidebar/sidebar-live.tsx:449](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/sidebar-live.tsx#L449)

### `deleteProjectPrompt`

Function.

Confirms deleting every conversation of a project, archived ones included.

```ts
function deleteProjectPrompt(
  project: string,
  sessions: readonly { archived?: boolean; environment?: SessionEnvironmentSummary }[],
  labels: { activityCompacting: string; activityRetrying: string; activityThinking: string; activityWriting: string; addDiagnosticToChat: (message: string) => string; addFavorite: string; additionalInstructions: string; additionalInstructionsHint: string; additionalInstructionsPlaceholder: string; address: string; addressPlaceholder: string; addSpace: string; addToChat: string; agent: string; agentDraftNote: string; agentGroupDefault: string; agentProfiles: string; archive: string; archiveConfirmLabel: string; archived: string; archiveProjectMessage: (count: number) => 'It stays under Archived, where you can restore it.' | 'They stay under Archived, where you can restore them.'; archiveProjectTitle: (count: number, project: string) => string; attachFile: string; attachmentEmpty: (name: string) => string; attachmentExportPdf: (name: string) => string; attachmentNotices: string; attachmentReadFailed: (name: string) => string; attachments: string; attachmentTitle: (name: string, detail: string) => string; attachmentTooLarge: (name: string, size: string, limit: string) => string; attachmentUnreadableImage: (name: string) => string; attachmentUnsupported: (name: string) => string; authCancel: string; authCard: string; authCopied: string; authCopyDetails: string; authEnterCode: (code: string) => string; authFailed: (message: string) => string; authFixed: string; authHeadline: (auth: AuthFailure, label: string) => string; authOpeningBrowser: string; authOpenPage: string; authPaste: string; authPasteSend: string; authSettings: string; authSettingsHint: string; authSignedIn: string; authSignedInRetrying: string; authSignInAgain: string; authSwitching: (account: string) => string; authTryAgain: string; authUseAccount: (account: string) => string; authWaiting: string; autoDenied: string; back: string; badgeCopied: string; badgeNoComposer: string; badgeOpenIn: (app: string) => string; badgeOpenInBrowserPane: string; badgePathUnavailable: string; blockRunAgain: string; blockRunAttach: string; blockRunAttachmentName: string; blockRunCopy: string; blockRunFailed: (reason: string) => string; blockRunHere: string; blockRunInTerminal: string; blockRunMenu: string; blockRunNeedsTerminal: string; blockRunning: string; blockRunOutput: string; blockRunRemove: string; blockRunStop: string; blockRunStopped: string; blockRunTimedOut: string; blockRunTruncated: string; cancel: string; changeIconFor: (project: string) => string; changeMainIcon: string; changeProjectIcon: string; changeSpaceIcon: string; chats: string; chipBranch: (name: string) => string; chipChat: (name: string) => string; chipCommand: (name: string) => string; chipCommit: (sha: string) => string; chipFactAliases: string; chipFactBranch: string; chipFactChanges: string; chipFactContext: string; chipFactDate: string; chipFactModel: string; chipFactPrompts: string; chipFactSize: string; chipFactTurns: string; chipFactUpdated: string; chipLoading: string; chipNotAmongChats: string; chipNotFound: (title: string) => string; chipRemoteFile: (path: string, host: string) => string; chipSessionError: string; chipSessionRunning: string; chipSkill: (name: string) => string; chipTokens: (count: string) => string; chipUntitledChat: string; chooseImage: string; chooseModel: string; chooseProjectIcon: string; chooseSpaceIcon: string; clearSearch: string; clickToAnswer: string; close: string; closeTab: (name: string) => string; code: string; collapseGroup: (label: string) => string; collapseItem: (title: string) => string; collapseSidebar: string; commandDetail: string; commandSuggestions: string; compactingTitle: string; completionSuggestions: string; composerBadges: string; composerLabel: string; composerPlaceholder: string; composerPlaceholderQueue: string; composerPlaceholderSteer: string; confirm: string; confirmNo: string; confirmYes: string; contextActiveSkills: string; contextAutoCompact: (pct: number) => string; contextCacheRead: string; contextCacheWrite: string; contextClickToCopy: (hasDescription: boolean) => string; contextCopied: string; contextDeferred: string; contextDetail: string; contextEstimated: string; contextFreshInput: string; contextLastTurn: string; contextNoBreakdown: string; contextOutput: string; contextRunCount: (runs: number) => string; contextSessionCost: string; contextSummary: (used: string, window: string, pct: number) => string; contextSummaryCost: (summary: string, cost: string) => string; contextWindow: string; continue: string; continueHint: string; continueRun: string; copied: string; copy: string; copyCode: string; copyDiagramSource: string; copyImage: string; copyImageBase64: string; copyImageDataUrl: string; current: string; customEmoji: string; declineSecret: string; declineSecretHint: string; defaultAgent: string; defaultSpaceName: string; delete: string; deleteConfirmLabel: string; deleteProjectArchived: (archived: number) => string; deleteProjectCannotUndo: string; deleteProjectSandboxes: (sandboxed: number) => string; deleteProjectTitle: (count: number, project: string) => string; deleteSessionQuestion: (title: string) => string; deleteSessionSandbox: (kind: string) => string; deleteSpace: string; deleteSpaceMessage: (fallback: string) => string; deleteSpaceNamed: (name: string) => string; deleteSpaceQuestion: (name: string) => string; diagnosticsCheckedBy: (source: string) => string; diagnosticsChecking: string; diagnosticsNone: string; diagram: (type: string | null) => string; diagramError: (message: string, at: string) => string; diagramErrorAt: (line: number, column: number) => string; dismiss: string; dismissHint: string; dotAttached: string; dotAttention: string; dotCompleted: string; dotError: string; dotIdle: string; dotPending: string; dotRunning: string; earlierHistory: string; earlierLines: (count: number) => string; earlierMessages: (count: number) => string; editorConflict: string; editorConflictDetail: string; editorEmpty: string; editorOverwrite: string; editorReadFailed: (message: string) => string; editorReload: string; effortLevel: (level: string) => string; emojiPlaceholder: string; environmentActionFailed: (action: string, message: string) => string; environmentKept: (reason?: string) => string; environmentKinds: Readonly<Record<string, string>>; environmentOnBranch: (kind: string, branch: string) => string; environmentOnMachine: (kind: string, machine: string) => string; environmentPaused: (where: string) => string; environmentSettingUp: (where: string) => string; environmentSetupFailed: (where: string, error?: string) => string; environmentsKept: (count: number) => string; errorFailed: (region: string) => string; errorStack: string; errorTryAgain: string; estimateDue: string; estimateDueTitle: string; estimateOver: string; estimateOverTitle: string; estimatePausedTitle: (left: string) => string; estimateProblemTitle: (reason: string, message?: string) => string; estimateTitle: (left: string) => string; expandGroup: (label: string) => string; expandItem: (title: string) => string; expandSidebar: string; favorites: string; filePath: (path: string) => string; fileReadOnly: (path: string) => string; fileTree: string; fileUnsaved: string; fileUnsavedTitle: (path: string) => string; filterActivities: { '1d': string; '30d': string; '3d': string; '7d': string; all: string }; filterActivity: string; filterAgent: string; filterAllAgents: string; filterAllAgentsOption: string; filterAllProjects: string; filterAllProjectsOption: string; filterAny: string; filterNoAgents: string; filterNoProjects: string; filterOrigin: string; filterOrigins: { all: string; scheduled: string; unscheduled: string }; filterPicked: (count: number) => string; filterProject: string; filterSaveView: string; filterSessions: string; filterSort: string; filterSorts: { alphabetical: string; createdTime: string; recency: string }; filterSpaceDefault: string; filterStatus: string; filterStatuses: { active: string; all: string; archived: string }; filterView: string; filterViews: { agent: string; date: string; host: string; none: string; project: string; state: string }; findClose: string; findCloseHint: string; findInConversation: string; findInConversationClose: string; findInFile: string; findMatchCase: string; findNext: string; findNextHint: string; findNoResults: string; findPrevious: string; findPreviousHint: string; findReferences: string; fitDiagram: string; foldOutcomes: (ok: number, failed: number) => string; foldSteps: (count: number) => string; footerSettings: string; footerSettingsWithNote: (note: string) => string; footerSignIn: string; footerSignInTitle: string; generatedImage: string; generatingImage: (model: string | null) => string; generatingImages: (count: number, model: string | null) => string; goToDefinition: string; goToStep: (step: string) => string; hiddenSpaces: string; hideSpace: string; hostBadgeTitle: (host: string, status: string) => string; hostCollapse: (name: string) => string; hostExpand: (name: string) => string; hostOpenSettings: (host: string) => string; hostPicker: string; hostRunsOn: (name: string) => string; hostRunsOnSection: string; hostStatusError: (status: string, error: string) => string; hostStatuses: { 'auth-refused': string; connected: string; connecting: string; identity: string; local: string; offline: string; reconnecting: string; 'version-mismatch': string }; hostThisMachine: string; imageModelReferences: string; imageModelReferencesHint: string; imageModelsNone: string; imageModelsPill: string; imageModelTransparency: string; imageModelTransparencyHint: string; inboxEmpty: string; inboxInProgress: string; inboxNeedsYou: string; inboxPreviousSession: string; inboxRecent: string; inputCaption: string; interactionAnsweredBy: (who: string) => string; interactionApproved: string; interactionDismissed: string; interactionPlan: string; interactionQuestion: string; interactionRejected: string; interactionRevise: string; interactionsLabel: string; interactionWaitingAnswers: string; interactionWaitingDecision: string; itemActions: (title: string) => string; itemOpenFailed: (message: string) => string; justNow: string; loadEarlierHistory: string; loadFullOutput: string; loading: string; loadingEarlierHistory: string; loadingEarlierMessages: string; loadingFullOutput: string; mainSession: string; mentionSuggestions: string; menuAddFavorite: string; menuArchive: string; menuArchiveProject: string; menuCopyPath: string; menuDelete: string; menuDeleteProject: string; menuMoveProjectToSpace: string; menuMoveTo: string; menuMoveToSpace: string; menuOpenChatWindow: string; menuOpenPanelsWindow: string; menuOpenWindow: string; menuRemoveFavorite: string; menuRename: string; menuRetryEnvironment: string; menuReveal: string; menuUnarchive: string; modalBack: string; modalFailed: string; modelAccountBlocked: (provider: string) => string; modelChain: string; modelChainNoModel: string; modelChainOrderHint: string; modelFallback: string; modelFallbackHint: string; modelFallbackPosition: (n: number) => string; modelFeatures: string; modelForNextChat: string; modelInUse: string; modelKinds: string; modelLegacy: string; modelLegacyHint: string; modelNotInCatalog: string; modelNotInCatalogHint: string; modelOptions: string; modelOptionsEmpty: string; modelOptionsHint: string; modelPrimary: string; modelPrimaryHint: string; modelReasoning: string; modelReasoningHint: string; modelRemoveFallback: (n: number) => string; modelRemoveFromChain: string; modelRemovePrimary: string; modelsChatTab: string; modelsCustomId: string; modelServing: (picked: string, serving: string) => string; modelServingFallback: string; modelsImageTab: string; modelsInUse: string; modelsJumpHint: (provider: string, digit: number | null) => string; modelsJumpToProvider: string; modelsLegacy: string; modelsLegacyHidden: (count: number) => string; modelsLoadFailed: (error: string) => string; modelsLoading: string; modelsNoMatch: (query: string) => string; modelsNoProviders: string; modelsSelected: (count: number) => string; modelsShowLegacy: string; modelsShowLegacyHint: string; modelsShownOf: (shown: number, total: number) => string; modelsTypeAnId: string; modelUnavailable: string; modelVerdictTitle: (approved: boolean, model: string, confidence: string | null) => string; modelVia: string; modelViaHint: (modelId: string, provider: string) => string; months: readonly string[]; moreActions: string; moreAttachments: (count: number) => string; moveProjectFailed: (message: string) => string; moveSessionFailed: (message: string) => string; moveSpaceDown: (name: string) => string; moveSpaceLeft: string; moveSpaceRight: string; moveSpaceUp: (name: string) => string; newSession: string; newSessionIn: (project: string) => string; newSessionTitle: string; newSpaceName: (n: number) => string; next: string; noAnswer: string; noChatsMatchFilters: string; noChatsYet: string; noMatches: (query: string) => string; noReferences: string; noSessions: string; noSuggestions: string; of: (index: number, count: number) => string; openFiles: string; openGroup: (label: string) => string; openImageFile: (path: string) => string; openInNewTab: string; openNamedSession: (title: string) => string; openSecrets: string; openSession: string; outputCaption: string; paletteBack: string; paletteBackHint: string; paletteChoose: string; paletteEmpty: string; paletteFilter: string; paletteLabel: string; paletteLoading: string; paletteNoMatch: (query: string) => string; paletteOpen: string; paletteRun: string; paletteScopeHint: string; paletteTurnOff: string; paletteTurnOn: string; pickModel: string; pickOneOrMore: string; pinNamed: (project: string) => string; pinProject: string; planApprove: string; planReject: string; planRejectAndStop: string; planRejectNote: string; planRejectPlaceholder: string; planRevise: string; planReviseNote: string; planRevisePlaceholder: string; planSendRevision: string; previewFailed: (name: string) => string; previewTooLarge: (name: string, size: string) => string; previous: string; queryGroupOther: string; questionCount: (count: number) => string; queueHint: string; queueMessage: string; reasoningEffort: string; receiptAgent: string; receiptAgentSwitched: string; receiptCost: string; receiptDuration: string; receiptModel: string; receiptModelOthers: (others: number) => string; receiptSpeed: string; receiptTokens: (sent: string, received: string) => string; receiptTurns: (turns: number) => string; reload: string; removeAttachment: (name: string) => string; removeFavorite: string; rename: string; requiredHint: string; requiredMark: string; resetFilters: string; resetsAt: (time: string) => string; resetToFolder: string; resetToInitial: string; retry: string; retryEnvironmentFailed: (message: string) => string; retryHint: string; rowNeedsYou: string; rowRunning: string; rowScheduled: string; rowWorking: string; runningFor: (elapsed: string) => string; runReceipt: string; runRetrying: (attempt: number, max: number, source?: string) => string; runWaiting: string; savedViewName: (n: number) => string; saveSecurely: string; saveViewFailed: (message: string) => string; screenBack: (screen: string) => string; screenBackKey: string; scriptCallsDone: (done: number) => string; scriptCallsFailed: (failed: number) => string; scriptCallsOf: (done: number, total: number) => string; scriptCallsRunning: (running: number) => string; scriptLineCalls: (calls: number) => string; scriptLiveOutput: string; scriptLoop: string; scriptLoopRound: (round: number) => string; scriptLoopRounds: (rounds: number) => string; scriptLoopRuns: (runs: number) => string; scriptOptionOutput: string; scriptOptions: string; scriptOptionTimeout: string; scriptOptionTokens: (tokens: number) => string; scriptPercent: (percent: number) => string; scriptProgress: string; scriptWaitLeft: (seconds: number) => string; searchingSessions: string; searchModels: string; searchModelsPlaceholder: string; searchSessions: string; searchSessionsLabel: string; secretDeclined: (name: string) => string; secretNote: (ttl: SecretTtl) => string; secretReused: (name: string) => string; secretSaved: (name: string, left: SecretTimeLeft) => string; secretSent: (name: string) => string; secretTtlLabel: string; secretTtlName: (ttl: SecretTtl) => string; secretValueLabel: string; secretValuePlaceholder: string; selectTurnCopied: string; selectTurnCopy: string; selectTurnDetails: string; selectTurnExit: string; selectTurnFork: string; selectTurnForkFailed: string; selectTurnMove: string; selectTurnNothingToCopy: string; selectTurnSelecting: string; sendAnswers: (count: number) => string; sendHint: string; sendMessage: string; sessionActions: string; sessionEventLabel: (title: string, verb: string, needsAttention: boolean) => string; sessions: string; setModelOptions: string; shellCancelled: string; shellExit: (code: number) => string; shellKilled: string; showDiagram: string; showDiagramSource: string; showHiddenSpace: (name: string) => string; showMore: string; showMoreAttachments: (count: number) => string; showOutput: string; showSystemPrompt: string; sidebarNoMatches: string; signInCopyCode: string; signInDone: (account?: string) => string; signInEnterCode: (host: string) => string; signInFailed: string; signInInBrowser: (service: string) => string; signInNotOpened: string; signInOpenPage: string; signInPaste: string; signInStarting: string; signInSubmit: string; skip: string; spaceFromExtension: (extension: string) => string; spaceNamed: (name: string) => string; spaceNameOf: (name: string) => string; spaceOptions: (name: string) => string; spaces: string; spacesTitle: string; spawnResumes: (childId: string) => string; spawnTask: string; stateCompleted: string; stateError: string; stateIdle: string; stateRunning: string; steerHint: string; steerMessage: string; stepDone: string; stepFailed: string; stepOf: (index: number, count: number) => string; stepResuming: string; stepRunning: string; steps: string; stepWaiting: string; stopCommand: string; stopHint: string; stopped: string; stoppedByYou: string; stopRun: string; switchAgent: string; switchingAgent: string; switchModel: string; terminal: string; terminalExited: (code: number) => string; terminalLoadFailed: (message: string) => string; thinkingLive: string; thoughtFor: (seconds: number) => string; thoughts: string; thoughtTimes: (count: number) => string; today: string; toolAttachments: string; transcriptLoading: string; turnMenuCopy: string; turnMenuCopySelection: string; turnMenuCopySelectionFailed: string; turnMenuDelete: string; turnMenuEdit: string; turnMenuEditNeedsComposer: string; turnMenuFork: string; turnMenuRewind: string; turnMenuSent: (age: string) => string; turnMenuStopFirst: (label: string) => string; turnsCompacted: string; unarchive: string; unpinNamed: (project: string) => string; unpinProject: string; unsupportedInteraction: (tool: string) => string; usagePanelHint: string; usageWindow: (window: string, percent: string) => string; useSpaces: string; useSpacesDescription: string; viewAttachment: (name: string) => string; waitingForSlot: (max: number) => string; workerContinues: string; workerModel: string; workerSystemPrompt: string; workerSystemReplaced: string; workerType: string; working: string; wrapLines: string; yesterday: string; yourSpaces: string; zoomFit: string; zoomInDiagram: string; zoomOutDiagram: string; zoomPercent: (percent: number) => string },
): ConfirmOptions
```

**Parameters**

- `project` (`string`): The project's name.
- `sessions` (`readonly { archived?: boolean; environment?: SessionEnvironmentSummary }[]`): Its conversations.
- `labels` (`{ activityCompacting: string; activityRetrying: string; activityThinking: string; activityWriting: string; addDiagnosticToChat: (message: string) => string; addFavorite: string; additionalInstructions: string; additionalInstructionsHint: string; additionalInstructionsPlaceholder: string; address: string; addressPlaceholder: string; addSpace: string; addToChat: string; agent: string; agentDraftNote: string; agentGroupDefault: string; agentProfiles: string; archive: string; archiveConfirmLabel: string; archived: string; archiveProjectMessage: (count: number) => 'It stays under Archived, where you can restore it.' | 'They stay under Archived, where you can restore them.'; archiveProjectTitle: (count: number, project: string) => string; attachFile: string; attachmentEmpty: (name: string) => string; attachmentExportPdf: (name: string) => string; attachmentNotices: string; attachmentReadFailed: (name: string) => string; attachments: string; attachmentTitle: (name: string, detail: string) => string; attachmentTooLarge: (name: string, size: string, limit: string) => string; attachmentUnreadableImage: (name: string) => string; attachmentUnsupported: (name: string) => string; authCancel: string; authCard: string; authCopied: string; authCopyDetails: string; authEnterCode: (code: string) => string; authFailed: (message: string) => string; authFixed: string; authHeadline: (auth: AuthFailure, label: string) => string; authOpeningBrowser: string; authOpenPage: string; authPaste: string; authPasteSend: string; authSettings: string; authSettingsHint: string; authSignedIn: string; authSignedInRetrying: string; authSignInAgain: string; authSwitching: (account: string) => string; authTryAgain: string; authUseAccount: (account: string) => string; authWaiting: string; autoDenied: string; back: string; badgeCopied: string; badgeNoComposer: string; badgeOpenIn: (app: string) => string; badgeOpenInBrowserPane: string; badgePathUnavailable: string; blockRunAgain: string; blockRunAttach: string; blockRunAttachmentName: string; blockRunCopy: string; blockRunFailed: (reason: string) => string; blockRunHere: string; blockRunInTerminal: string; blockRunMenu: string; blockRunNeedsTerminal: string; blockRunning: string; blockRunOutput: string; blockRunRemove: string; blockRunStop: string; blockRunStopped: string; blockRunTimedOut: string; blockRunTruncated: string; cancel: string; changeIconFor: (project: string) => string; changeMainIcon: string; changeProjectIcon: string; changeSpaceIcon: string; chats: string; chipBranch: (name: string) => string; chipChat: (name: string) => string; chipCommand: (name: string) => string; chipCommit: (sha: string) => string; chipFactAliases: string; chipFactBranch: string; chipFactChanges: string; chipFactContext: string; chipFactDate: string; chipFactModel: string; chipFactPrompts: string; chipFactSize: string; chipFactTurns: string; chipFactUpdated: string; chipLoading: string; chipNotAmongChats: string; chipNotFound: (title: string) => string; chipRemoteFile: (path: string, host: string) => string; chipSessionError: string; chipSessionRunning: string; chipSkill: (name: string) => string; chipTokens: (count: string) => string; chipUntitledChat: string; chooseImage: string; chooseModel: string; chooseProjectIcon: string; chooseSpaceIcon: string; clearSearch: string; clickToAnswer: string; close: string; closeTab: (name: string) => string; code: string; collapseGroup: (label: string) => string; collapseItem: (title: string) => string; collapseSidebar: string; commandDetail: string; commandSuggestions: string; compactingTitle: string; completionSuggestions: string; composerBadges: string; composerLabel: string; composerPlaceholder: string; composerPlaceholderQueue: string; composerPlaceholderSteer: string; confirm: string; confirmNo: string; confirmYes: string; contextActiveSkills: string; contextAutoCompact: (pct: number) => string; contextCacheRead: string; contextCacheWrite: string; contextClickToCopy: (hasDescription: boolean) => string; contextCopied: string; contextDeferred: string; contextDetail: string; contextEstimated: string; contextFreshInput: string; contextLastTurn: string; contextNoBreakdown: string; contextOutput: string; contextRunCount: (runs: number) => string; contextSessionCost: string; contextSummary: (used: string, window: string, pct: number) => string; contextSummaryCost: (summary: string, cost: string) => string; contextWindow: string; continue: string; continueHint: string; continueRun: string; copied: string; copy: string; copyCode: string; copyDiagramSource: string; copyImage: string; copyImageBase64: string; copyImageDataUrl: string; current: string; customEmoji: string; declineSecret: string; declineSecretHint: string; defaultAgent: string; defaultSpaceName: string; delete: string; deleteConfirmLabel: string; deleteProjectArchived: (archived: number) => string; deleteProjectCannotUndo: string; deleteProjectSandboxes: (sandboxed: number) => string; deleteProjectTitle: (count: number, project: string) => string; deleteSessionQuestion: (title: string) => string; deleteSessionSandbox: (kind: string) => string; deleteSpace: string; deleteSpaceMessage: (fallback: string) => string; deleteSpaceNamed: (name: string) => string; deleteSpaceQuestion: (name: string) => string; diagnosticsCheckedBy: (source: string) => string; diagnosticsChecking: string; diagnosticsNone: string; diagram: (type: string | null) => string; diagramError: (message: string, at: string) => string; diagramErrorAt: (line: number, column: number) => string; dismiss: string; dismissHint: string; dotAttached: string; dotAttention: string; dotCompleted: string; dotError: string; dotIdle: string; dotPending: string; dotRunning: string; earlierHistory: string; earlierLines: (count: number) => string; earlierMessages: (count: number) => string; editorConflict: string; editorConflictDetail: string; editorEmpty: string; editorOverwrite: string; editorReadFailed: (message: string) => string; editorReload: string; effortLevel: (level: string) => string; emojiPlaceholder: string; environmentActionFailed: (action: string, message: string) => string; environmentKept: (reason?: string) => string; environmentKinds: Readonly<Record<string, string>>; environmentOnBranch: (kind: string, branch: string) => string; environmentOnMachine: (kind: string, machine: string) => string; environmentPaused: (where: string) => string; environmentSettingUp: (where: string) => string; environmentSetupFailed: (where: string, error?: string) => string; environmentsKept: (count: number) => string; errorFailed: (region: string) => string; errorStack: string; errorTryAgain: string; estimateDue: string; estimateDueTitle: string; estimateOver: string; estimateOverTitle: string; estimatePausedTitle: (left: string) => string; estimateProblemTitle: (reason: string, message?: string) => string; estimateTitle: (left: string) => string; expandGroup: (label: string) => string; expandItem: (title: string) => string; expandSidebar: string; favorites: string; filePath: (path: string) => string; fileReadOnly: (path: string) => string; fileTree: string; fileUnsaved: string; fileUnsavedTitle: (path: string) => string; filterActivities: { '1d': string; '30d': string; '3d': string; '7d': string; all: string }; filterActivity: string; filterAgent: string; filterAllAgents: string; filterAllAgentsOption: string; filterAllProjects: string; filterAllProjectsOption: string; filterAny: string; filterNoAgents: string; filterNoProjects: string; filterOrigin: string; filterOrigins: { all: string; scheduled: string; unscheduled: string }; filterPicked: (count: number) => string; filterProject: string; filterSaveView: string; filterSessions: string; filterSort: string; filterSorts: { alphabetical: string; createdTime: string; recency: string }; filterSpaceDefault: string; filterStatus: string; filterStatuses: { active: string; all: string; archived: string }; filterView: string; filterViews: { agent: string; date: string; host: string; none: string; project: string; state: string }; findClose: string; findCloseHint: string; findInConversation: string; findInConversationClose: string; findInFile: string; findMatchCase: string; findNext: string; findNextHint: string; findNoResults: string; findPrevious: string; findPreviousHint: string; findReferences: string; fitDiagram: string; foldOutcomes: (ok: number, failed: number) => string; foldSteps: (count: number) => string; footerSettings: string; footerSettingsWithNote: (note: string) => string; footerSignIn: string; footerSignInTitle: string; generatedImage: string; generatingImage: (model: string | null) => string; generatingImages: (count: number, model: string | null) => string; goToDefinition: string; goToStep: (step: string) => string; hiddenSpaces: string; hideSpace: string; hostBadgeTitle: (host: string, status: string) => string; hostCollapse: (name: string) => string; hostExpand: (name: string) => string; hostOpenSettings: (host: string) => string; hostPicker: string; hostRunsOn: (name: string) => string; hostRunsOnSection: string; hostStatusError: (status: string, error: string) => string; hostStatuses: { 'auth-refused': string; connected: string; connecting: string; identity: string; local: string; offline: string; reconnecting: string; 'version-mismatch': string }; hostThisMachine: string; imageModelReferences: string; imageModelReferencesHint: string; imageModelsNone: string; imageModelsPill: string; imageModelTransparency: string; imageModelTransparencyHint: string; inboxEmpty: string; inboxInProgress: string; inboxNeedsYou: string; inboxPreviousSession: string; inboxRecent: string; inputCaption: string; interactionAnsweredBy: (who: string) => string; interactionApproved: string; interactionDismissed: string; interactionPlan: string; interactionQuestion: string; interactionRejected: string; interactionRevise: string; interactionsLabel: string; interactionWaitingAnswers: string; interactionWaitingDecision: string; itemActions: (title: string) => string; itemOpenFailed: (message: string) => string; justNow: string; loadEarlierHistory: string; loadFullOutput: string; loading: string; loadingEarlierHistory: string; loadingEarlierMessages: string; loadingFullOutput: string; mainSession: string; mentionSuggestions: string; menuAddFavorite: string; menuArchive: string; menuArchiveProject: string; menuCopyPath: string; menuDelete: string; menuDeleteProject: string; menuMoveProjectToSpace: string; menuMoveTo: string; menuMoveToSpace: string; menuOpenChatWindow: string; menuOpenPanelsWindow: string; menuOpenWindow: string; menuRemoveFavorite: string; menuRename: string; menuRetryEnvironment: string; menuReveal: string; menuUnarchive: string; modalBack: string; modalFailed: string; modelAccountBlocked: (provider: string) => string; modelChain: string; modelChainNoModel: string; modelChainOrderHint: string; modelFallback: string; modelFallbackHint: string; modelFallbackPosition: (n: number) => string; modelFeatures: string; modelForNextChat: string; modelInUse: string; modelKinds: string; modelLegacy: string; modelLegacyHint: string; modelNotInCatalog: string; modelNotInCatalogHint: string; modelOptions: string; modelOptionsEmpty: string; modelOptionsHint: string; modelPrimary: string; modelPrimaryHint: string; modelReasoning: string; modelReasoningHint: string; modelRemoveFallback: (n: number) => string; modelRemoveFromChain: string; modelRemovePrimary: string; modelsChatTab: string; modelsCustomId: string; modelServing: (picked: string, serving: string) => string; modelServingFallback: string; modelsImageTab: string; modelsInUse: string; modelsJumpHint: (provider: string, digit: number | null) => string; modelsJumpToProvider: string; modelsLegacy: string; modelsLegacyHidden: (count: number) => string; modelsLoadFailed: (error: string) => string; modelsLoading: string; modelsNoMatch: (query: string) => string; modelsNoProviders: string; modelsSelected: (count: number) => string; modelsShowLegacy: string; modelsShowLegacyHint: string; modelsShownOf: (shown: number, total: number) => string; modelsTypeAnId: string; modelUnavailable: string; modelVerdictTitle: (approved: boolean, model: string, confidence: string | null) => string; modelVia: string; modelViaHint: (modelId: string, provider: string) => string; months: readonly string[]; moreActions: string; moreAttachments: (count: number) => string; moveProjectFailed: (message: string) => string; moveSessionFailed: (message: string) => string; moveSpaceDown: (name: string) => string; moveSpaceLeft: string; moveSpaceRight: string; moveSpaceUp: (name: string) => string; newSession: string; newSessionIn: (project: string) => string; newSessionTitle: string; newSpaceName: (n: number) => string; next: string; noAnswer: string; noChatsMatchFilters: string; noChatsYet: string; noMatches: (query: string) => string; noReferences: string; noSessions: string; noSuggestions: string; of: (index: number, count: number) => string; openFiles: string; openGroup: (label: string) => string; openImageFile: (path: string) => string; openInNewTab: string; openNamedSession: (title: string) => string; openSecrets: string; openSession: string; outputCaption: string; paletteBack: string; paletteBackHint: string; paletteChoose: string; paletteEmpty: string; paletteFilter: string; paletteLabel: string; paletteLoading: string; paletteNoMatch: (query: string) => string; paletteOpen: string; paletteRun: string; paletteScopeHint: string; paletteTurnOff: string; paletteTurnOn: string; pickModel: string; pickOneOrMore: string; pinNamed: (project: string) => string; pinProject: string; planApprove: string; planReject: string; planRejectAndStop: string; planRejectNote: string; planRejectPlaceholder: string; planRevise: string; planReviseNote: string; planRevisePlaceholder: string; planSendRevision: string; previewFailed: (name: string) => string; previewTooLarge: (name: string, size: string) => string; previous: string; queryGroupOther: string; questionCount: (count: number) => string; queueHint: string; queueMessage: string; reasoningEffort: string; receiptAgent: string; receiptAgentSwitched: string; receiptCost: string; receiptDuration: string; receiptModel: string; receiptModelOthers: (others: number) => string; receiptSpeed: string; receiptTokens: (sent: string, received: string) => string; receiptTurns: (turns: number) => string; reload: string; removeAttachment: (name: string) => string; removeFavorite: string; rename: string; requiredHint: string; requiredMark: string; resetFilters: string; resetsAt: (time: string) => string; resetToFolder: string; resetToInitial: string; retry: string; retryEnvironmentFailed: (message: string) => string; retryHint: string; rowNeedsYou: string; rowRunning: string; rowScheduled: string; rowWorking: string; runningFor: (elapsed: string) => string; runReceipt: string; runRetrying: (attempt: number, max: number, source?: string) => string; runWaiting: string; savedViewName: (n: number) => string; saveSecurely: string; saveViewFailed: (message: string) => string; screenBack: (screen: string) => string; screenBackKey: string; scriptCallsDone: (done: number) => string; scriptCallsFailed: (failed: number) => string; scriptCallsOf: (done: number, total: number) => string; scriptCallsRunning: (running: number) => string; scriptLineCalls: (calls: number) => string; scriptLiveOutput: string; scriptLoop: string; scriptLoopRound: (round: number) => string; scriptLoopRounds: (rounds: number) => string; scriptLoopRuns: (runs: number) => string; scriptOptionOutput: string; scriptOptions: string; scriptOptionTimeout: string; scriptOptionTokens: (tokens: number) => string; scriptPercent: (percent: number) => string; scriptProgress: string; scriptWaitLeft: (seconds: number) => string; searchingSessions: string; searchModels: string; searchModelsPlaceholder: string; searchSessions: string; searchSessionsLabel: string; secretDeclined: (name: string) => string; secretNote: (ttl: SecretTtl) => string; secretReused: (name: string) => string; secretSaved: (name: string, left: SecretTimeLeft) => string; secretSent: (name: string) => string; secretTtlLabel: string; secretTtlName: (ttl: SecretTtl) => string; secretValueLabel: string; secretValuePlaceholder: string; selectTurnCopied: string; selectTurnCopy: string; selectTurnDetails: string; selectTurnExit: string; selectTurnFork: string; selectTurnForkFailed: string; selectTurnMove: string; selectTurnNothingToCopy: string; selectTurnSelecting: string; sendAnswers: (count: number) => string; sendHint: string; sendMessage: string; sessionActions: string; sessionEventLabel: (title: string, verb: string, needsAttention: boolean) => string; sessions: string; setModelOptions: string; shellCancelled: string; shellExit: (code: number) => string; shellKilled: string; showDiagram: string; showDiagramSource: string; showHiddenSpace: (name: string) => string; showMore: string; showMoreAttachments: (count: number) => string; showOutput: string; showSystemPrompt: string; sidebarNoMatches: string; signInCopyCode: string; signInDone: (account?: string) => string; signInEnterCode: (host: string) => string; signInFailed: string; signInInBrowser: (service: string) => string; signInNotOpened: string; signInOpenPage: string; signInPaste: string; signInStarting: string; signInSubmit: string; skip: string; spaceFromExtension: (extension: string) => string; spaceNamed: (name: string) => string; spaceNameOf: (name: string) => string; spaceOptions: (name: string) => string; spaces: string; spacesTitle: string; spawnResumes: (childId: string) => string; spawnTask: string; stateCompleted: string; stateError: string; stateIdle: string; stateRunning: string; steerHint: string; steerMessage: string; stepDone: string; stepFailed: string; stepOf: (index: number, count: number) => string; stepResuming: string; stepRunning: string; steps: string; stepWaiting: string; stopCommand: string; stopHint: string; stopped: string; stoppedByYou: string; stopRun: string; switchAgent: string; switchingAgent: string; switchModel: string; terminal: string; terminalExited: (code: number) => string; terminalLoadFailed: (message: string) => string; thinkingLive: string; thoughtFor: (seconds: number) => string; thoughts: string; thoughtTimes: (count: number) => string; today: string; toolAttachments: string; transcriptLoading: string; turnMenuCopy: string; turnMenuCopySelection: string; turnMenuCopySelectionFailed: string; turnMenuDelete: string; turnMenuEdit: string; turnMenuEditNeedsComposer: string; turnMenuFork: string; turnMenuRewind: string; turnMenuSent: (age: string) => string; turnMenuStopFirst: (label: string) => string; turnsCompacted: string; unarchive: string; unpinNamed: (project: string) => string; unpinProject: string; unsupportedInteraction: (tool: string) => string; usagePanelHint: string; usageWindow: (window: string, percent: string) => string; useSpaces: string; useSpacesDescription: string; viewAttachment: (name: string) => string; waitingForSlot: (max: number) => string; workerContinues: string; workerModel: string; workerSystemPrompt: string; workerSystemReplaced: string; workerType: string; working: string; wrapLines: string; yesterday: string; yourSpaces: string; zoomFit: string; zoomInDiagram: string; zoomOutDiagram: string; zoomPercent: (percent: number) => string }`): The sidebar labels.

**Returns** `ConfirmOptions`

Source: [ui/src/chat/sidebar/session-menu.ts:369](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L369)

### `sessionMenuItems`

Function.

The conversation's menu rows.

```ts
function sessionMenuItems(
  session: SessionMenuTarget,
  context: SessionMenuContext,
  actions: SessionMenuActions,
  labels: { activityCompacting: string; activityRetrying: string; activityThinking: string; activityWriting: string; addDiagnosticToChat: (message: string) => string; addFavorite: string; additionalInstructions: string; additionalInstructionsHint: string; additionalInstructionsPlaceholder: string; address: string; addressPlaceholder: string; addSpace: string; addToChat: string; agent: string; agentDraftNote: string; agentGroupDefault: string; agentProfiles: string; archive: string; archiveConfirmLabel: string; archived: string; archiveProjectMessage: (count: number) => 'It stays under Archived, where you can restore it.' | 'They stay under Archived, where you can restore them.'; archiveProjectTitle: (count: number, project: string) => string; attachFile: string; attachmentEmpty: (name: string) => string; attachmentExportPdf: (name: string) => string; attachmentNotices: string; attachmentReadFailed: (name: string) => string; attachments: string; attachmentTitle: (name: string, detail: string) => string; attachmentTooLarge: (name: string, size: string, limit: string) => string; attachmentUnreadableImage: (name: string) => string; attachmentUnsupported: (name: string) => string; authCancel: string; authCard: string; authCopied: string; authCopyDetails: string; authEnterCode: (code: string) => string; authFailed: (message: string) => string; authFixed: string; authHeadline: (auth: AuthFailure, label: string) => string; authOpeningBrowser: string; authOpenPage: string; authPaste: string; authPasteSend: string; authSettings: string; authSettingsHint: string; authSignedIn: string; authSignedInRetrying: string; authSignInAgain: string; authSwitching: (account: string) => string; authTryAgain: string; authUseAccount: (account: string) => string; authWaiting: string; autoDenied: string; back: string; badgeCopied: string; badgeNoComposer: string; badgeOpenIn: (app: string) => string; badgeOpenInBrowserPane: string; badgePathUnavailable: string; blockRunAgain: string; blockRunAttach: string; blockRunAttachmentName: string; blockRunCopy: string; blockRunFailed: (reason: string) => string; blockRunHere: string; blockRunInTerminal: string; blockRunMenu: string; blockRunNeedsTerminal: string; blockRunning: string; blockRunOutput: string; blockRunRemove: string; blockRunStop: string; blockRunStopped: string; blockRunTimedOut: string; blockRunTruncated: string; cancel: string; changeIconFor: (project: string) => string; changeMainIcon: string; changeProjectIcon: string; changeSpaceIcon: string; chats: string; chipBranch: (name: string) => string; chipChat: (name: string) => string; chipCommand: (name: string) => string; chipCommit: (sha: string) => string; chipFactAliases: string; chipFactBranch: string; chipFactChanges: string; chipFactContext: string; chipFactDate: string; chipFactModel: string; chipFactPrompts: string; chipFactSize: string; chipFactTurns: string; chipFactUpdated: string; chipLoading: string; chipNotAmongChats: string; chipNotFound: (title: string) => string; chipRemoteFile: (path: string, host: string) => string; chipSessionError: string; chipSessionRunning: string; chipSkill: (name: string) => string; chipTokens: (count: string) => string; chipUntitledChat: string; chooseImage: string; chooseModel: string; chooseProjectIcon: string; chooseSpaceIcon: string; clearSearch: string; clickToAnswer: string; close: string; closeTab: (name: string) => string; code: string; collapseGroup: (label: string) => string; collapseItem: (title: string) => string; collapseSidebar: string; commandDetail: string; commandSuggestions: string; compactingTitle: string; completionSuggestions: string; composerBadges: string; composerLabel: string; composerPlaceholder: string; composerPlaceholderQueue: string; composerPlaceholderSteer: string; confirm: string; confirmNo: string; confirmYes: string; contextActiveSkills: string; contextAutoCompact: (pct: number) => string; contextCacheRead: string; contextCacheWrite: string; contextClickToCopy: (hasDescription: boolean) => string; contextCopied: string; contextDeferred: string; contextDetail: string; contextEstimated: string; contextFreshInput: string; contextLastTurn: string; contextNoBreakdown: string; contextOutput: string; contextRunCount: (runs: number) => string; contextSessionCost: string; contextSummary: (used: string, window: string, pct: number) => string; contextSummaryCost: (summary: string, cost: string) => string; contextWindow: string; continue: string; continueHint: string; continueRun: string; copied: string; copy: string; copyCode: string; copyDiagramSource: string; copyImage: string; copyImageBase64: string; copyImageDataUrl: string; current: string; customEmoji: string; declineSecret: string; declineSecretHint: string; defaultAgent: string; defaultSpaceName: string; delete: string; deleteConfirmLabel: string; deleteProjectArchived: (archived: number) => string; deleteProjectCannotUndo: string; deleteProjectSandboxes: (sandboxed: number) => string; deleteProjectTitle: (count: number, project: string) => string; deleteSessionQuestion: (title: string) => string; deleteSessionSandbox: (kind: string) => string; deleteSpace: string; deleteSpaceMessage: (fallback: string) => string; deleteSpaceNamed: (name: string) => string; deleteSpaceQuestion: (name: string) => string; diagnosticsCheckedBy: (source: string) => string; diagnosticsChecking: string; diagnosticsNone: string; diagram: (type: string | null) => string; diagramError: (message: string, at: string) => string; diagramErrorAt: (line: number, column: number) => string; dismiss: string; dismissHint: string; dotAttached: string; dotAttention: string; dotCompleted: string; dotError: string; dotIdle: string; dotPending: string; dotRunning: string; earlierHistory: string; earlierLines: (count: number) => string; earlierMessages: (count: number) => string; editorConflict: string; editorConflictDetail: string; editorEmpty: string; editorOverwrite: string; editorReadFailed: (message: string) => string; editorReload: string; effortLevel: (level: string) => string; emojiPlaceholder: string; environmentActionFailed: (action: string, message: string) => string; environmentKept: (reason?: string) => string; environmentKinds: Readonly<Record<string, string>>; environmentOnBranch: (kind: string, branch: string) => string; environmentOnMachine: (kind: string, machine: string) => string; environmentPaused: (where: string) => string; environmentSettingUp: (where: string) => string; environmentSetupFailed: (where: string, error?: string) => string; environmentsKept: (count: number) => string; errorFailed: (region: string) => string; errorStack: string; errorTryAgain: string; estimateDue: string; estimateDueTitle: string; estimateOver: string; estimateOverTitle: string; estimatePausedTitle: (left: string) => string; estimateProblemTitle: (reason: string, message?: string) => string; estimateTitle: (left: string) => string; expandGroup: (label: string) => string; expandItem: (title: string) => string; expandSidebar: string; favorites: string; filePath: (path: string) => string; fileReadOnly: (path: string) => string; fileTree: string; fileUnsaved: string; fileUnsavedTitle: (path: string) => string; filterActivities: { '1d': string; '30d': string; '3d': string; '7d': string; all: string }; filterActivity: string; filterAgent: string; filterAllAgents: string; filterAllAgentsOption: string; filterAllProjects: string; filterAllProjectsOption: string; filterAny: string; filterNoAgents: string; filterNoProjects: string; filterOrigin: string; filterOrigins: { all: string; scheduled: string; unscheduled: string }; filterPicked: (count: number) => string; filterProject: string; filterSaveView: string; filterSessions: string; filterSort: string; filterSorts: { alphabetical: string; createdTime: string; recency: string }; filterSpaceDefault: string; filterStatus: string; filterStatuses: { active: string; all: string; archived: string }; filterView: string; filterViews: { agent: string; date: string; host: string; none: string; project: string; state: string }; findClose: string; findCloseHint: string; findInConversation: string; findInConversationClose: string; findInFile: string; findMatchCase: string; findNext: string; findNextHint: string; findNoResults: string; findPrevious: string; findPreviousHint: string; findReferences: string; fitDiagram: string; foldOutcomes: (ok: number, failed: number) => string; foldSteps: (count: number) => string; footerSettings: string; footerSettingsWithNote: (note: string) => string; footerSignIn: string; footerSignInTitle: string; generatedImage: string; generatingImage: (model: string | null) => string; generatingImages: (count: number, model: string | null) => string; goToDefinition: string; goToStep: (step: string) => string; hiddenSpaces: string; hideSpace: string; hostBadgeTitle: (host: string, status: string) => string; hostCollapse: (name: string) => string; hostExpand: (name: string) => string; hostOpenSettings: (host: string) => string; hostPicker: string; hostRunsOn: (name: string) => string; hostRunsOnSection: string; hostStatusError: (status: string, error: string) => string; hostStatuses: { 'auth-refused': string; connected: string; connecting: string; identity: string; local: string; offline: string; reconnecting: string; 'version-mismatch': string }; hostThisMachine: string; imageModelReferences: string; imageModelReferencesHint: string; imageModelsNone: string; imageModelsPill: string; imageModelTransparency: string; imageModelTransparencyHint: string; inboxEmpty: string; inboxInProgress: string; inboxNeedsYou: string; inboxPreviousSession: string; inboxRecent: string; inputCaption: string; interactionAnsweredBy: (who: string) => string; interactionApproved: string; interactionDismissed: string; interactionPlan: string; interactionQuestion: string; interactionRejected: string; interactionRevise: string; interactionsLabel: string; interactionWaitingAnswers: string; interactionWaitingDecision: string; itemActions: (title: string) => string; itemOpenFailed: (message: string) => string; justNow: string; loadEarlierHistory: string; loadFullOutput: string; loading: string; loadingEarlierHistory: string; loadingEarlierMessages: string; loadingFullOutput: string; mainSession: string; mentionSuggestions: string; menuAddFavorite: string; menuArchive: string; menuArchiveProject: string; menuCopyPath: string; menuDelete: string; menuDeleteProject: string; menuMoveProjectToSpace: string; menuMoveTo: string; menuMoveToSpace: string; menuOpenChatWindow: string; menuOpenPanelsWindow: string; menuOpenWindow: string; menuRemoveFavorite: string; menuRename: string; menuRetryEnvironment: string; menuReveal: string; menuUnarchive: string; modalBack: string; modalFailed: string; modelAccountBlocked: (provider: string) => string; modelChain: string; modelChainNoModel: string; modelChainOrderHint: string; modelFallback: string; modelFallbackHint: string; modelFallbackPosition: (n: number) => string; modelFeatures: string; modelForNextChat: string; modelInUse: string; modelKinds: string; modelLegacy: string; modelLegacyHint: string; modelNotInCatalog: string; modelNotInCatalogHint: string; modelOptions: string; modelOptionsEmpty: string; modelOptionsHint: string; modelPrimary: string; modelPrimaryHint: string; modelReasoning: string; modelReasoningHint: string; modelRemoveFallback: (n: number) => string; modelRemoveFromChain: string; modelRemovePrimary: string; modelsChatTab: string; modelsCustomId: string; modelServing: (picked: string, serving: string) => string; modelServingFallback: string; modelsImageTab: string; modelsInUse: string; modelsJumpHint: (provider: string, digit: number | null) => string; modelsJumpToProvider: string; modelsLegacy: string; modelsLegacyHidden: (count: number) => string; modelsLoadFailed: (error: string) => string; modelsLoading: string; modelsNoMatch: (query: string) => string; modelsNoProviders: string; modelsSelected: (count: number) => string; modelsShowLegacy: string; modelsShowLegacyHint: string; modelsShownOf: (shown: number, total: number) => string; modelsTypeAnId: string; modelUnavailable: string; modelVerdictTitle: (approved: boolean, model: string, confidence: string | null) => string; modelVia: string; modelViaHint: (modelId: string, provider: string) => string; months: readonly string[]; moreActions: string; moreAttachments: (count: number) => string; moveProjectFailed: (message: string) => string; moveSessionFailed: (message: string) => string; moveSpaceDown: (name: string) => string; moveSpaceLeft: string; moveSpaceRight: string; moveSpaceUp: (name: string) => string; newSession: string; newSessionIn: (project: string) => string; newSessionTitle: string; newSpaceName: (n: number) => string; next: string; noAnswer: string; noChatsMatchFilters: string; noChatsYet: string; noMatches: (query: string) => string; noReferences: string; noSessions: string; noSuggestions: string; of: (index: number, count: number) => string; openFiles: string; openGroup: (label: string) => string; openImageFile: (path: string) => string; openInNewTab: string; openNamedSession: (title: string) => string; openSecrets: string; openSession: string; outputCaption: string; paletteBack: string; paletteBackHint: string; paletteChoose: string; paletteEmpty: string; paletteFilter: string; paletteLabel: string; paletteLoading: string; paletteNoMatch: (query: string) => string; paletteOpen: string; paletteRun: string; paletteScopeHint: string; paletteTurnOff: string; paletteTurnOn: string; pickModel: string; pickOneOrMore: string; pinNamed: (project: string) => string; pinProject: string; planApprove: string; planReject: string; planRejectAndStop: string; planRejectNote: string; planRejectPlaceholder: string; planRevise: string; planReviseNote: string; planRevisePlaceholder: string; planSendRevision: string; previewFailed: (name: string) => string; previewTooLarge: (name: string, size: string) => string; previous: string; queryGroupOther: string; questionCount: (count: number) => string; queueHint: string; queueMessage: string; reasoningEffort: string; receiptAgent: string; receiptAgentSwitched: string; receiptCost: string; receiptDuration: string; receiptModel: string; receiptModelOthers: (others: number) => string; receiptSpeed: string; receiptTokens: (sent: string, received: string) => string; receiptTurns: (turns: number) => string; reload: string; removeAttachment: (name: string) => string; removeFavorite: string; rename: string; requiredHint: string; requiredMark: string; resetFilters: string; resetsAt: (time: string) => string; resetToFolder: string; resetToInitial: string; retry: string; retryEnvironmentFailed: (message: string) => string; retryHint: string; rowNeedsYou: string; rowRunning: string; rowScheduled: string; rowWorking: string; runningFor: (elapsed: string) => string; runReceipt: string; runRetrying: (attempt: number, max: number, source?: string) => string; runWaiting: string; savedViewName: (n: number) => string; saveSecurely: string; saveViewFailed: (message: string) => string; screenBack: (screen: string) => string; screenBackKey: string; scriptCallsDone: (done: number) => string; scriptCallsFailed: (failed: number) => string; scriptCallsOf: (done: number, total: number) => string; scriptCallsRunning: (running: number) => string; scriptLineCalls: (calls: number) => string; scriptLiveOutput: string; scriptLoop: string; scriptLoopRound: (round: number) => string; scriptLoopRounds: (rounds: number) => string; scriptLoopRuns: (runs: number) => string; scriptOptionOutput: string; scriptOptions: string; scriptOptionTimeout: string; scriptOptionTokens: (tokens: number) => string; scriptPercent: (percent: number) => string; scriptProgress: string; scriptWaitLeft: (seconds: number) => string; searchingSessions: string; searchModels: string; searchModelsPlaceholder: string; searchSessions: string; searchSessionsLabel: string; secretDeclined: (name: string) => string; secretNote: (ttl: SecretTtl) => string; secretReused: (name: string) => string; secretSaved: (name: string, left: SecretTimeLeft) => string; secretSent: (name: string) => string; secretTtlLabel: string; secretTtlName: (ttl: SecretTtl) => string; secretValueLabel: string; secretValuePlaceholder: string; selectTurnCopied: string; selectTurnCopy: string; selectTurnDetails: string; selectTurnExit: string; selectTurnFork: string; selectTurnForkFailed: string; selectTurnMove: string; selectTurnNothingToCopy: string; selectTurnSelecting: string; sendAnswers: (count: number) => string; sendHint: string; sendMessage: string; sessionActions: string; sessionEventLabel: (title: string, verb: string, needsAttention: boolean) => string; sessions: string; setModelOptions: string; shellCancelled: string; shellExit: (code: number) => string; shellKilled: string; showDiagram: string; showDiagramSource: string; showHiddenSpace: (name: string) => string; showMore: string; showMoreAttachments: (count: number) => string; showOutput: string; showSystemPrompt: string; sidebarNoMatches: string; signInCopyCode: string; signInDone: (account?: string) => string; signInEnterCode: (host: string) => string; signInFailed: string; signInInBrowser: (service: string) => string; signInNotOpened: string; signInOpenPage: string; signInPaste: string; signInStarting: string; signInSubmit: string; skip: string; spaceFromExtension: (extension: string) => string; spaceNamed: (name: string) => string; spaceNameOf: (name: string) => string; spaceOptions: (name: string) => string; spaces: string; spacesTitle: string; spawnResumes: (childId: string) => string; spawnTask: string; stateCompleted: string; stateError: string; stateIdle: string; stateRunning: string; steerHint: string; steerMessage: string; stepDone: string; stepFailed: string; stepOf: (index: number, count: number) => string; stepResuming: string; stepRunning: string; steps: string; stepWaiting: string; stopCommand: string; stopHint: string; stopped: string; stoppedByYou: string; stopRun: string; switchAgent: string; switchingAgent: string; switchModel: string; terminal: string; terminalExited: (code: number) => string; terminalLoadFailed: (message: string) => string; thinkingLive: string; thoughtFor: (seconds: number) => string; thoughts: string; thoughtTimes: (count: number) => string; today: string; toolAttachments: string; transcriptLoading: string; turnMenuCopy: string; turnMenuCopySelection: string; turnMenuCopySelectionFailed: string; turnMenuDelete: string; turnMenuEdit: string; turnMenuEditNeedsComposer: string; turnMenuFork: string; turnMenuRewind: string; turnMenuSent: (age: string) => string; turnMenuStopFirst: (label: string) => string; turnsCompacted: string; unarchive: string; unpinNamed: (project: string) => string; unpinProject: string; unsupportedInteraction: (tool: string) => string; usagePanelHint: string; usageWindow: (window: string, percent: string) => string; useSpaces: string; useSpacesDescription: string; viewAttachment: (name: string) => string; waitingForSlot: (max: number) => string; workerContinues: string; workerModel: string; workerSystemPrompt: string; workerSystemReplaced: string; workerType: string; working: string; wrapLines: string; yesterday: string; yourSpaces: string; zoomFit: string; zoomInDiagram: string; zoomOutDiagram: string; zoomPercent: (percent: number) => string },
): RowActionItem[]
```

**Parameters**

- `session` (`SessionMenuTarget`): The conversation.
- `context` (`SessionMenuContext`): The spaces, its environment's commands and the platform's members.
- `actions` (`SessionMenuActions`): What the rows do.
- `labels` (`{ activityCompacting: string; activityRetrying: string; activityThinking: string; activityWriting: string; addDiagnosticToChat: (message: string) => string; addFavorite: string; additionalInstructions: string; additionalInstructionsHint: string; additionalInstructionsPlaceholder: string; address: string; addressPlaceholder: string; addSpace: string; addToChat: string; agent: string; agentDraftNote: string; agentGroupDefault: string; agentProfiles: string; archive: string; archiveConfirmLabel: string; archived: string; archiveProjectMessage: (count: number) => 'It stays under Archived, where you can restore it.' | 'They stay under Archived, where you can restore them.'; archiveProjectTitle: (count: number, project: string) => string; attachFile: string; attachmentEmpty: (name: string) => string; attachmentExportPdf: (name: string) => string; attachmentNotices: string; attachmentReadFailed: (name: string) => string; attachments: string; attachmentTitle: (name: string, detail: string) => string; attachmentTooLarge: (name: string, size: string, limit: string) => string; attachmentUnreadableImage: (name: string) => string; attachmentUnsupported: (name: string) => string; authCancel: string; authCard: string; authCopied: string; authCopyDetails: string; authEnterCode: (code: string) => string; authFailed: (message: string) => string; authFixed: string; authHeadline: (auth: AuthFailure, label: string) => string; authOpeningBrowser: string; authOpenPage: string; authPaste: string; authPasteSend: string; authSettings: string; authSettingsHint: string; authSignedIn: string; authSignedInRetrying: string; authSignInAgain: string; authSwitching: (account: string) => string; authTryAgain: string; authUseAccount: (account: string) => string; authWaiting: string; autoDenied: string; back: string; badgeCopied: string; badgeNoComposer: string; badgeOpenIn: (app: string) => string; badgeOpenInBrowserPane: string; badgePathUnavailable: string; blockRunAgain: string; blockRunAttach: string; blockRunAttachmentName: string; blockRunCopy: string; blockRunFailed: (reason: string) => string; blockRunHere: string; blockRunInTerminal: string; blockRunMenu: string; blockRunNeedsTerminal: string; blockRunning: string; blockRunOutput: string; blockRunRemove: string; blockRunStop: string; blockRunStopped: string; blockRunTimedOut: string; blockRunTruncated: string; cancel: string; changeIconFor: (project: string) => string; changeMainIcon: string; changeProjectIcon: string; changeSpaceIcon: string; chats: string; chipBranch: (name: string) => string; chipChat: (name: string) => string; chipCommand: (name: string) => string; chipCommit: (sha: string) => string; chipFactAliases: string; chipFactBranch: string; chipFactChanges: string; chipFactContext: string; chipFactDate: string; chipFactModel: string; chipFactPrompts: string; chipFactSize: string; chipFactTurns: string; chipFactUpdated: string; chipLoading: string; chipNotAmongChats: string; chipNotFound: (title: string) => string; chipRemoteFile: (path: string, host: string) => string; chipSessionError: string; chipSessionRunning: string; chipSkill: (name: string) => string; chipTokens: (count: string) => string; chipUntitledChat: string; chooseImage: string; chooseModel: string; chooseProjectIcon: string; chooseSpaceIcon: string; clearSearch: string; clickToAnswer: string; close: string; closeTab: (name: string) => string; code: string; collapseGroup: (label: string) => string; collapseItem: (title: string) => string; collapseSidebar: string; commandDetail: string; commandSuggestions: string; compactingTitle: string; completionSuggestions: string; composerBadges: string; composerLabel: string; composerPlaceholder: string; composerPlaceholderQueue: string; composerPlaceholderSteer: string; confirm: string; confirmNo: string; confirmYes: string; contextActiveSkills: string; contextAutoCompact: (pct: number) => string; contextCacheRead: string; contextCacheWrite: string; contextClickToCopy: (hasDescription: boolean) => string; contextCopied: string; contextDeferred: string; contextDetail: string; contextEstimated: string; contextFreshInput: string; contextLastTurn: string; contextNoBreakdown: string; contextOutput: string; contextRunCount: (runs: number) => string; contextSessionCost: string; contextSummary: (used: string, window: string, pct: number) => string; contextSummaryCost: (summary: string, cost: string) => string; contextWindow: string; continue: string; continueHint: string; continueRun: string; copied: string; copy: string; copyCode: string; copyDiagramSource: string; copyImage: string; copyImageBase64: string; copyImageDataUrl: string; current: string; customEmoji: string; declineSecret: string; declineSecretHint: string; defaultAgent: string; defaultSpaceName: string; delete: string; deleteConfirmLabel: string; deleteProjectArchived: (archived: number) => string; deleteProjectCannotUndo: string; deleteProjectSandboxes: (sandboxed: number) => string; deleteProjectTitle: (count: number, project: string) => string; deleteSessionQuestion: (title: string) => string; deleteSessionSandbox: (kind: string) => string; deleteSpace: string; deleteSpaceMessage: (fallback: string) => string; deleteSpaceNamed: (name: string) => string; deleteSpaceQuestion: (name: string) => string; diagnosticsCheckedBy: (source: string) => string; diagnosticsChecking: string; diagnosticsNone: string; diagram: (type: string | null) => string; diagramError: (message: string, at: string) => string; diagramErrorAt: (line: number, column: number) => string; dismiss: string; dismissHint: string; dotAttached: string; dotAttention: string; dotCompleted: string; dotError: string; dotIdle: string; dotPending: string; dotRunning: string; earlierHistory: string; earlierLines: (count: number) => string; earlierMessages: (count: number) => string; editorConflict: string; editorConflictDetail: string; editorEmpty: string; editorOverwrite: string; editorReadFailed: (message: string) => string; editorReload: string; effortLevel: (level: string) => string; emojiPlaceholder: string; environmentActionFailed: (action: string, message: string) => string; environmentKept: (reason?: string) => string; environmentKinds: Readonly<Record<string, string>>; environmentOnBranch: (kind: string, branch: string) => string; environmentOnMachine: (kind: string, machine: string) => string; environmentPaused: (where: string) => string; environmentSettingUp: (where: string) => string; environmentSetupFailed: (where: string, error?: string) => string; environmentsKept: (count: number) => string; errorFailed: (region: string) => string; errorStack: string; errorTryAgain: string; estimateDue: string; estimateDueTitle: string; estimateOver: string; estimateOverTitle: string; estimatePausedTitle: (left: string) => string; estimateProblemTitle: (reason: string, message?: string) => string; estimateTitle: (left: string) => string; expandGroup: (label: string) => string; expandItem: (title: string) => string; expandSidebar: string; favorites: string; filePath: (path: string) => string; fileReadOnly: (path: string) => string; fileTree: string; fileUnsaved: string; fileUnsavedTitle: (path: string) => string; filterActivities: { '1d': string; '30d': string; '3d': string; '7d': string; all: string }; filterActivity: string; filterAgent: string; filterAllAgents: string; filterAllAgentsOption: string; filterAllProjects: string; filterAllProjectsOption: string; filterAny: string; filterNoAgents: string; filterNoProjects: string; filterOrigin: string; filterOrigins: { all: string; scheduled: string; unscheduled: string }; filterPicked: (count: number) => string; filterProject: string; filterSaveView: string; filterSessions: string; filterSort: string; filterSorts: { alphabetical: string; createdTime: string; recency: string }; filterSpaceDefault: string; filterStatus: string; filterStatuses: { active: string; all: string; archived: string }; filterView: string; filterViews: { agent: string; date: string; host: string; none: string; project: string; state: string }; findClose: string; findCloseHint: string; findInConversation: string; findInConversationClose: string; findInFile: string; findMatchCase: string; findNext: string; findNextHint: string; findNoResults: string; findPrevious: string; findPreviousHint: string; findReferences: string; fitDiagram: string; foldOutcomes: (ok: number, failed: number) => string; foldSteps: (count: number) => string; footerSettings: string; footerSettingsWithNote: (note: string) => string; footerSignIn: string; footerSignInTitle: string; generatedImage: string; generatingImage: (model: string | null) => string; generatingImages: (count: number, model: string | null) => string; goToDefinition: string; goToStep: (step: string) => string; hiddenSpaces: string; hideSpace: string; hostBadgeTitle: (host: string, status: string) => string; hostCollapse: (name: string) => string; hostExpand: (name: string) => string; hostOpenSettings: (host: string) => string; hostPicker: string; hostRunsOn: (name: string) => string; hostRunsOnSection: string; hostStatusError: (status: string, error: string) => string; hostStatuses: { 'auth-refused': string; connected: string; connecting: string; identity: string; local: string; offline: string; reconnecting: string; 'version-mismatch': string }; hostThisMachine: string; imageModelReferences: string; imageModelReferencesHint: string; imageModelsNone: string; imageModelsPill: string; imageModelTransparency: string; imageModelTransparencyHint: string; inboxEmpty: string; inboxInProgress: string; inboxNeedsYou: string; inboxPreviousSession: string; inboxRecent: string; inputCaption: string; interactionAnsweredBy: (who: string) => string; interactionApproved: string; interactionDismissed: string; interactionPlan: string; interactionQuestion: string; interactionRejected: string; interactionRevise: string; interactionsLabel: string; interactionWaitingAnswers: string; interactionWaitingDecision: string; itemActions: (title: string) => string; itemOpenFailed: (message: string) => string; justNow: string; loadEarlierHistory: string; loadFullOutput: string; loading: string; loadingEarlierHistory: string; loadingEarlierMessages: string; loadingFullOutput: string; mainSession: string; mentionSuggestions: string; menuAddFavorite: string; menuArchive: string; menuArchiveProject: string; menuCopyPath: string; menuDelete: string; menuDeleteProject: string; menuMoveProjectToSpace: string; menuMoveTo: string; menuMoveToSpace: string; menuOpenChatWindow: string; menuOpenPanelsWindow: string; menuOpenWindow: string; menuRemoveFavorite: string; menuRename: string; menuRetryEnvironment: string; menuReveal: string; menuUnarchive: string; modalBack: string; modalFailed: string; modelAccountBlocked: (provider: string) => string; modelChain: string; modelChainNoModel: string; modelChainOrderHint: string; modelFallback: string; modelFallbackHint: string; modelFallbackPosition: (n: number) => string; modelFeatures: string; modelForNextChat: string; modelInUse: string; modelKinds: string; modelLegacy: string; modelLegacyHint: string; modelNotInCatalog: string; modelNotInCatalogHint: string; modelOptions: string; modelOptionsEmpty: string; modelOptionsHint: string; modelPrimary: string; modelPrimaryHint: string; modelReasoning: string; modelReasoningHint: string; modelRemoveFallback: (n: number) => string; modelRemoveFromChain: string; modelRemovePrimary: string; modelsChatTab: string; modelsCustomId: string; modelServing: (picked: string, serving: string) => string; modelServingFallback: string; modelsImageTab: string; modelsInUse: string; modelsJumpHint: (provider: string, digit: number | null) => string; modelsJumpToProvider: string; modelsLegacy: string; modelsLegacyHidden: (count: number) => string; modelsLoadFailed: (error: string) => string; modelsLoading: string; modelsNoMatch: (query: string) => string; modelsNoProviders: string; modelsSelected: (count: number) => string; modelsShowLegacy: string; modelsShowLegacyHint: string; modelsShownOf: (shown: number, total: number) => string; modelsTypeAnId: string; modelUnavailable: string; modelVerdictTitle: (approved: boolean, model: string, confidence: string | null) => string; modelVia: string; modelViaHint: (modelId: string, provider: string) => string; months: readonly string[]; moreActions: string; moreAttachments: (count: number) => string; moveProjectFailed: (message: string) => string; moveSessionFailed: (message: string) => string; moveSpaceDown: (name: string) => string; moveSpaceLeft: string; moveSpaceRight: string; moveSpaceUp: (name: string) => string; newSession: string; newSessionIn: (project: string) => string; newSessionTitle: string; newSpaceName: (n: number) => string; next: string; noAnswer: string; noChatsMatchFilters: string; noChatsYet: string; noMatches: (query: string) => string; noReferences: string; noSessions: string; noSuggestions: string; of: (index: number, count: number) => string; openFiles: string; openGroup: (label: string) => string; openImageFile: (path: string) => string; openInNewTab: string; openNamedSession: (title: string) => string; openSecrets: string; openSession: string; outputCaption: string; paletteBack: string; paletteBackHint: string; paletteChoose: string; paletteEmpty: string; paletteFilter: string; paletteLabel: string; paletteLoading: string; paletteNoMatch: (query: string) => string; paletteOpen: string; paletteRun: string; paletteScopeHint: string; paletteTurnOff: string; paletteTurnOn: string; pickModel: string; pickOneOrMore: string; pinNamed: (project: string) => string; pinProject: string; planApprove: string; planReject: string; planRejectAndStop: string; planRejectNote: string; planRejectPlaceholder: string; planRevise: string; planReviseNote: string; planRevisePlaceholder: string; planSendRevision: string; previewFailed: (name: string) => string; previewTooLarge: (name: string, size: string) => string; previous: string; queryGroupOther: string; questionCount: (count: number) => string; queueHint: string; queueMessage: string; reasoningEffort: string; receiptAgent: string; receiptAgentSwitched: string; receiptCost: string; receiptDuration: string; receiptModel: string; receiptModelOthers: (others: number) => string; receiptSpeed: string; receiptTokens: (sent: string, received: string) => string; receiptTurns: (turns: number) => string; reload: string; removeAttachment: (name: string) => string; removeFavorite: string; rename: string; requiredHint: string; requiredMark: string; resetFilters: string; resetsAt: (time: string) => string; resetToFolder: string; resetToInitial: string; retry: string; retryEnvironmentFailed: (message: string) => string; retryHint: string; rowNeedsYou: string; rowRunning: string; rowScheduled: string; rowWorking: string; runningFor: (elapsed: string) => string; runReceipt: string; runRetrying: (attempt: number, max: number, source?: string) => string; runWaiting: string; savedViewName: (n: number) => string; saveSecurely: string; saveViewFailed: (message: string) => string; screenBack: (screen: string) => string; screenBackKey: string; scriptCallsDone: (done: number) => string; scriptCallsFailed: (failed: number) => string; scriptCallsOf: (done: number, total: number) => string; scriptCallsRunning: (running: number) => string; scriptLineCalls: (calls: number) => string; scriptLiveOutput: string; scriptLoop: string; scriptLoopRound: (round: number) => string; scriptLoopRounds: (rounds: number) => string; scriptLoopRuns: (runs: number) => string; scriptOptionOutput: string; scriptOptions: string; scriptOptionTimeout: string; scriptOptionTokens: (tokens: number) => string; scriptPercent: (percent: number) => string; scriptProgress: string; scriptWaitLeft: (seconds: number) => string; searchingSessions: string; searchModels: string; searchModelsPlaceholder: string; searchSessions: string; searchSessionsLabel: string; secretDeclined: (name: string) => string; secretNote: (ttl: SecretTtl) => string; secretReused: (name: string) => string; secretSaved: (name: string, left: SecretTimeLeft) => string; secretSent: (name: string) => string; secretTtlLabel: string; secretTtlName: (ttl: SecretTtl) => string; secretValueLabel: string; secretValuePlaceholder: string; selectTurnCopied: string; selectTurnCopy: string; selectTurnDetails: string; selectTurnExit: string; selectTurnFork: string; selectTurnForkFailed: string; selectTurnMove: string; selectTurnNothingToCopy: string; selectTurnSelecting: string; sendAnswers: (count: number) => string; sendHint: string; sendMessage: string; sessionActions: string; sessionEventLabel: (title: string, verb: string, needsAttention: boolean) => string; sessions: string; setModelOptions: string; shellCancelled: string; shellExit: (code: number) => string; shellKilled: string; showDiagram: string; showDiagramSource: string; showHiddenSpace: (name: string) => string; showMore: string; showMoreAttachments: (count: number) => string; showOutput: string; showSystemPrompt: string; sidebarNoMatches: string; signInCopyCode: string; signInDone: (account?: string) => string; signInEnterCode: (host: string) => string; signInFailed: string; signInInBrowser: (service: string) => string; signInNotOpened: string; signInOpenPage: string; signInPaste: string; signInStarting: string; signInSubmit: string; skip: string; spaceFromExtension: (extension: string) => string; spaceNamed: (name: string) => string; spaceNameOf: (name: string) => string; spaceOptions: (name: string) => string; spaces: string; spacesTitle: string; spawnResumes: (childId: string) => string; spawnTask: string; stateCompleted: string; stateError: string; stateIdle: string; stateRunning: string; steerHint: string; steerMessage: string; stepDone: string; stepFailed: string; stepOf: (index: number, count: number) => string; stepResuming: string; stepRunning: string; steps: string; stepWaiting: string; stopCommand: string; stopHint: string; stopped: string; stoppedByYou: string; stopRun: string; switchAgent: string; switchingAgent: string; switchModel: string; terminal: string; terminalExited: (code: number) => string; terminalLoadFailed: (message: string) => string; thinkingLive: string; thoughtFor: (seconds: number) => string; thoughts: string; thoughtTimes: (count: number) => string; today: string; toolAttachments: string; transcriptLoading: string; turnMenuCopy: string; turnMenuCopySelection: string; turnMenuCopySelectionFailed: string; turnMenuDelete: string; turnMenuEdit: string; turnMenuEditNeedsComposer: string; turnMenuFork: string; turnMenuRewind: string; turnMenuSent: (age: string) => string; turnMenuStopFirst: (label: string) => string; turnsCompacted: string; unarchive: string; unpinNamed: (project: string) => string; unpinProject: string; unsupportedInteraction: (tool: string) => string; usagePanelHint: string; usageWindow: (window: string, percent: string) => string; useSpaces: string; useSpacesDescription: string; viewAttachment: (name: string) => string; waitingForSlot: (max: number) => string; workerContinues: string; workerModel: string; workerSystemPrompt: string; workerSystemReplaced: string; workerType: string; working: string; wrapLines: string; yesterday: string; yourSpaces: string; zoomFit: string; zoomInDiagram: string; zoomOutDiagram: string; zoomPercent: (percent: number) => string }`): The sidebar labels.

**Returns** `RowActionItem[]`

Source: [ui/src/chat/sidebar/session-menu.ts:109](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L109)

### `spaceRows`

Function.

One row per space to move to; the one it is in is checked and can't be picked.

```ts
function spaceRows(
  spaces: readonly Space[],
  current: string,
  move: (spaceId: string) => void,
): RowActionItem[]
```

**Parameters**

- `spaces` (`readonly Space[]`): The space list.
- `current` (`string`): Id of the space it is in.
- `move` (`(spaceId: string) => void`): Runs with the picked space's id.

**Returns** `RowActionItem[]`

Source: [ui/src/chat/sidebar/session-menu.ts:85](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L85)

### `useArrival`

Function.

True while `at` (an arrival stamp, `Date.now()`; 0 for none) is under `ARRIVAL_MS` old. Read from the
clock at render, so it is already true on the render that brings the arrival; a timer re-renders once it
is over.

```ts
function useArrival(at: number): boolean
```

**Parameters**

- `at` (`number`): The arrival stamp.

**Returns** `boolean`

Source: [ui/src/chat/sidebar/sidebar-live.tsx:81](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/sidebar-live.tsx#L81)

### `useCompactionProgress`

Function.

The session's compaction in progress (what [`SidebarCompactingIndicator`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarCompactingIndicator) shows), `null` when none
or no session.

```ts
function useCompactionProgress(
  store: CompactionProgressStore,
  sessionId: string | null,
): CompactionProgress | null
```

**Parameters**

- `store` (`CompactionProgressStore`): The app's [`CompactionProgressStore`](https://zidane.si/docs/reference/ui-chat-headless.md#CompactionProgressStore).
- `sessionId` (`string | null`): The session to follow, `null` for none.

**Returns** `CompactionProgress | null`

Source: [ui/src/chat/sidebar/useCompactionProgress.ts:14](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useCompactionProgress.ts#L14)

### `useConfirmDeleteSession`

Function.

Delete a conversation once confirmed; the prompt says what goes with it (its environment).

```ts
function useConfirmDeleteSession(
  remove: (sessionId: string) => unknown,
): (session: Pick<SessionMenuTarget, 'id' | 'title' | 'environment'>) => void
```

**Parameters**

- `remove` (`(sessionId: string) => unknown`): Deletes the session.

**Returns** `(session: Pick<SessionMenuTarget, 'id' | 'title' | 'environment'>) => void`

Source: [ui/src/chat/sidebar/session-menu.ts:326](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L326)

### `useEnvironmentActions`

Function.

The environment's own commands (push, open PR), asked for while `enabled`
(the menu is open on a ready environment): they depend on its live state.

```ts
function useEnvironmentActions(
  sessionId: string,
  enabled: boolean,
): readonly EnvironmentActionSummary[]
```

**Parameters**

- `sessionId` (`string`): The conversation.
- `enabled` (`boolean`): Ask now.

**Returns** `readonly EnvironmentActionSummary[]`

Source: [ui/src/chat/sidebar/session-menu.ts:232](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L232)

### `useEnvironmentCommands`

Function.

Running an environment command (open what it returns, else say what happened) and setting a failed
environment up again, worded through the labels and told with the provider's `notify`. Stable identities.

```ts
function useEnvironmentCommands(): { retry: (sessionId: string) => void; run: (sessionId: string, actionId: string, label: string) => void }
```

**Returns** `{ retry: (sessionId: string) => void; run: (sessionId: string, actionId: string, label: string) => void }`

Source: [ui/src/chat/sidebar/session-menu.ts:257](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L257)

### `useMainSession`

Function.

Creates the Main when orchestration turns on and returns its opener.

```ts
function useMainSession(enabled: boolean, open: (sessionId: string) => void): () => void
```

**Parameters**

- `enabled` (`boolean`): The `orchestration` setting.
- `open` (`(sessionId: string) => void`): Opens a session by id.

**Returns** `() => void`: Opens the Main (a no-op while `enabled` is false).

Source: [ui/src/chat/sidebar/use-main-session.ts:19](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/use-main-session.ts#L19)

### `usePinnedProjects`

Function.

The space's pinned project folders and a setter that persists them.

```ts
function usePinnedProjects(
  spaceId: string,
): { pinned: readonly string[]; setPinned: (fullPath: string, pinned: boolean) => void }
```

**Parameters**

- `spaceId` (`string`): The space whose pins to read and change.

**Returns** `{ pinned: readonly string[]; setPinned: (fullPath: string, pinned: boolean) => void }`

Source: [ui/src/chat/sidebar/usePinnedProjects.ts:20](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/usePinnedProjects.ts#L20)

### `useProjectIcons`

Function.

Icon map + setter, shared by every caller on the page.

```ts
function useProjectIcons(): { icons: ProjectIconMap; setIcon: (fullPath: string, icon: ProjectIcon | null) => void }
```

**Returns** `{ icons: ProjectIconMap; setIcon: (fullPath: string, icon: ProjectIcon | null) => void }`

Source: [ui/src/chat/sidebar/ProjectIcon.tsx:69](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/ProjectIcon.tsx#L69)

### `useProjectSessionActions`

Function.

A project header's archive and delete: list the project's conversations in its space (archived ones too),
confirm with the count, then act on them all.

```ts
function useProjectSessionActions<S extends { archived?: boolean; environment?: SessionEnvironmentSummary; id: string }>(
  ops: { archive: (sessionIds: readonly string[]) => Promise<unknown>; list: (project: SidebarProject) => Promise<readonly S[]>; remove: (sessionIds: readonly string[]) => Promise<unknown> },
): { archive: (project: SidebarProject, label: string) => void; remove: (project: SidebarProject, label: string, onRemoved?: () => void) => void }
```

**Type parameters**

- `S` (`extends { archived?: boolean; environment?: SessionEnvironmentSummary; id: string }`)

**Parameters**

- `ops` (`{ archive: (sessionIds: readonly string[]) => Promise<unknown>; list: (project: SidebarProject) => Promise<readonly S[]>; remove: (sessionIds: readonly string[]) => Promise<unknown> }`): How to list, archive and delete them.

**Returns** `{ archive: (project: SidebarProject, label: string) => void; remove: (project: SidebarProject, label: string, onRemoved?: () => void) => void }`

Source: [ui/src/chat/sidebar/session-menu.ts:403](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L403)

### `useSaveViewAsSpace`

Function.

The filter menu's `onSaveView` over a directory's `saveViewAsSpace`: saves the shown view under
the next free saved-view name; a failure (an invalid query, a settings write that failed) shows
`labels.saveViewFailed`. `undefined` when `save` is.

```ts
function useSaveViewAsSpace(
  save: ((name: string) => Promise<unknown>) | undefined,
  spaces: readonly Pick<Space, 'name'>[],
): (() => void) | undefined
```

**Parameters**

- `save` (`((name: string) => Promise<unknown>) | undefined`): `SessionDirectory.saveViewAsSpace` (or the app's wrapper of it).
- `spaces` (`readonly Pick<Space, 'name'>[]`): Every space (`SessionDirectoryState.spaces`): the names already taken.

**Returns** `(() => void) | undefined`

Source: [ui/src/chat/sidebar/useSaveViewAsSpace.ts:24](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSaveViewAsSpace.ts#L24)

### `useSessionActivity`

Function.

What the session's run is doing, `null` when nothing of a run was seen (or
it ended). An entry can outlive a run whose end was missed: show it only
while the session is running.

```ts
function useSessionActivity(
  store: SessionActivityStore,
  sessionId: string,
  enabled?: boolean,
): SessionActivity | null
```

**Parameters**

- `store` (`SessionActivityStore`): The app's [`SessionActivityStore`](https://zidane.si/docs/reference/ui-chat-headless.md#SessionActivityStore).
- `sessionId` (`string`): The session to follow.
- `enabled?` (`boolean`, default `true`): False: nothing is followed (and `null` returned).

**Returns** `SessionActivity | null`

Source: [ui/src/chat/sidebar/useSessionActivity.ts:16](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSessionActivity.ts#L16)

### `useSessionBadges`

Function.

The session's badges, `null` until first read (asked for on first use).

```ts
function useSessionBadges(
  store: SessionBadgesStore,
  sessionId: string,
  enabled?: boolean,
): SessionBadgesEntry | null
```

**Parameters**

- `store` (`SessionBadgesStore`): The app's [`SessionBadgesStore`](https://zidane.si/docs/reference/ui-chat-headless.md#SessionBadgesStore).
- `sessionId` (`string`): The session whose badges to read.
- `enabled?` (`boolean`, default `true`): False: nothing is asked or followed.

**Returns** `SessionBadgesEntry | null`

Source: [ui/src/chat/sidebar/useSessionBadges.ts:14](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSessionBadges.ts#L14)

### `useSessionDirectoryView`

Function.

Subscribe to a session directory.

```ts
function useSessionDirectoryView<S extends SidebarListSession, C>(
  directory: SessionDirectory<S, C>,
  unfiltered?: boolean,
): SessionDirectoryView<S>
```

**Type parameters**

- `S` (`extends SidebarListSession`)
- `C`

**Parameters**

- `directory` (`SessionDirectory<S, C>`): The [`SessionDirectory`](https://zidane.si/docs/reference/ui-chat-headless.md#SessionDirectory) to read.
- `unfiltered?` (`boolean`, default `false`): List every session whatever the filters say (a window that only shows one session).

**Returns** `SessionDirectoryView<S>`

Source: [ui/src/chat/sidebar/useSessionDirectoryView.ts:57](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSessionDirectoryView.ts#L57)

### `useSessionMenuItems`

Function.

A conversation's menu rows for a surface that shows one session (the session header): the environment's
commands are asked for while the menu is `open`, and the platform rows follow the [`SidebarHost`](https://zidane.si/docs/reference/ui-chat-headless.md#SidebarHost).

```ts
function useSessionMenuItems(
  session: SessionMenuTarget,
  spaces: readonly Space[] | null,
  open: boolean,
  actions: SessionMenuSurfaceActions,
): RowActionItem[]
```

**Parameters**

- `session` (`SessionMenuTarget`): The conversation.
- `spaces` (`readonly Space[] | null`): The space list while Spaces is on; `null` off.
- `open` (`boolean`): The menu is open (its environment commands are read then).
- `actions` (`SessionMenuSurfaceActions`): What the surface's rows do.

**Returns** `RowActionItem[]`

Source: [ui/src/chat/sidebar/session-menu.ts:299](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L299)

### `useSessionSearch`

Function.

The sidebar's search: the query, its title matches and its content matches.

```ts
function useSessionSearch<S extends SidebarListSession>(
  sessions: readonly S[],
  archiveFilter: SessionArchiveFilter,
  search: SessionContentSearch | undefined,
): { contentMatches: { hit: SessionSearchHit; session: S }[]; searching: boolean; searchMode: boolean; searchQuery: string; setSearchQuery: Dispatch<SetStateAction<string>>; titleMatches: S[]; trimmedQuery: string }
```

**Type parameters**

- `S` (`extends SidebarListSession`)

**Parameters**

- `sessions` (`readonly S[]`): The filtered list the matches come from.
- `archiveFilter` (`SessionArchiveFilter`): The archive axis the content search reads.
- `search` (`SessionContentSearch | undefined`): The host's content search; absent, only titles match.

**Returns** `{ contentMatches: { hit: SessionSearchHit; session: S }[]; searching: boolean; searchMode: boolean; searchQuery: string; setSearchQuery: Dispatch<SetStateAction<string>>; titleMatches: S[]; trimmedQuery: string }`

Source: [ui/src/chat/sidebar/useSessionSearch.ts:32](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSessionSearch.ts#L32)

### `useSidebarFrame`

Function.

The frame's presence, width and drag.

```ts
function useSidebarFrame(options: SidebarFrameOptions): SidebarFrameState
```

**Parameters**

- `options` (`SidebarFrameOptions`): Collapsed, the wanted width and where a drag commits.

**Returns** `SidebarFrameState`

Source: [ui/src/chat/sidebar/SidebarFrame.tsx:58](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFrame.tsx#L58)

### `useSidebarHost`

Function.

The nearest [`SidebarHost`](https://zidane.si/docs/reference/ui-chat-headless.md#SidebarHost); an empty host (every capability left out) outside a provider.

```ts
function useSidebarHost(): SidebarHost
```

**Returns** `SidebarHost`

Source: [ui/src/chat/sidebar/SidebarHostProvider.tsx:44](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarHostProvider.tsx#L44)

### `useSidebarKeyboardNav`

Function.

Binds the sidebar's keyboard navigation.

```ts
function useSidebarKeyboardNav<K extends string>(
  options: SidebarKeyboardNavOptions<K>,
): { commitImmediate: (sessionId: K | null) => void }
```

**Type parameters**

- `K` (`extends string`)

**Parameters**

- `options` (`SidebarKeyboardNavOptions<K>`): The list, its sessions, the open one and what to do.

**Returns** `{ commitImmediate: (sessionId: K | null) => void }`: `commitImmediate`: open a session now, cancelling a pending arrow commit.

Source: [ui/src/chat/sidebar/useSidebarKeyboardNav.ts:49](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSidebarKeyboardNav.ts#L49)

### `useSidebarLabels`

Function.

The session sidebar: the list with its groups, rows, filters, search and spaces, and the pieces around it.

```ts
function useSidebarLabels(): { activityCompacting: string; activityRetrying: string; activityThinking: string; activityWriting: string; addDiagnosticToChat: (message: string) => string; addFavorite: string; additionalInstructions: string; additionalInstructionsHint: string; additionalInstructionsPlaceholder: string; address: string; addressPlaceholder: string; addSpace: string; addToChat: string; agent: string; agentDraftNote: string; agentGroupDefault: string; agentProfiles: string; archive: string; archiveConfirmLabel: string; archived: string; archiveProjectMessage: (count: number) => 'It stays under Archived, where you can restore it.' | 'They stay under Archived, where you can restore them.'; archiveProjectTitle: (count: number, project: string) => string; attachFile: string; attachmentEmpty: (name: string) => string; attachmentExportPdf: (name: string) => string; attachmentNotices: string; attachmentReadFailed: (name: string) => string; attachments: string; attachmentTitle: (name: string, detail: string) => string; attachmentTooLarge: (name: string, size: string, limit: string) => string; attachmentUnreadableImage: (name: string) => string; attachmentUnsupported: (name: string) => string; authCancel: string; authCard: string; authCopied: string; authCopyDetails: string; authEnterCode: (code: string) => string; authFailed: (message: string) => string; authFixed: string; authHeadline: (auth: AuthFailure, label: string) => string; authOpeningBrowser: string; authOpenPage: string; authPaste: string; authPasteSend: string; authSettings: string; authSettingsHint: string; authSignedIn: string; authSignedInRetrying: string; authSignInAgain: string; authSwitching: (account: string) => string; authTryAgain: string; authUseAccount: (account: string) => string; authWaiting: string; autoDenied: string; back: string; badgeCopied: string; badgeNoComposer: string; badgeOpenIn: (app: string) => string; badgeOpenInBrowserPane: string; badgePathUnavailable: string; blockRunAgain: string; blockRunAttach: string; blockRunAttachmentName: string; blockRunCopy: string; blockRunFailed: (reason: string) => string; blockRunHere: string; blockRunInTerminal: string; blockRunMenu: string; blockRunNeedsTerminal: string; blockRunning: string; blockRunOutput: string; blockRunRemove: string; blockRunStop: string; blockRunStopped: string; blockRunTimedOut: string; blockRunTruncated: string; cancel: string; changeIconFor: (project: string) => string; changeMainIcon: string; changeProjectIcon: string; changeSpaceIcon: string; chats: string; chipBranch: (name: string) => string; chipChat: (name: string) => string; chipCommand: (name: string) => string; chipCommit: (sha: string) => string; chipFactAliases: string; chipFactBranch: string; chipFactChanges: string; chipFactContext: string; chipFactDate: string; chipFactModel: string; chipFactPrompts: string; chipFactSize: string; chipFactTurns: string; chipFactUpdated: string; chipLoading: string; chipNotAmongChats: string; chipNotFound: (title: string) => string; chipRemoteFile: (path: string, host: string) => string; chipSessionError: string; chipSessionRunning: string; chipSkill: (name: string) => string; chipTokens: (count: string) => string; chipUntitledChat: string; chooseImage: string; chooseModel: string; chooseProjectIcon: string; chooseSpaceIcon: string; clearSearch: string; clickToAnswer: string; close: string; closeTab: (name: string) => string; code: string; collapseGroup: (label: string) => string; collapseItem: (title: string) => string; collapseSidebar: string; commandDetail: string; commandSuggestions: string; compactingTitle: string; completionSuggestions: string; composerBadges: string; composerLabel: string; composerPlaceholder: string; composerPlaceholderQueue: string; composerPlaceholderSteer: string; confirm: string; confirmNo: string; confirmYes: string; contextActiveSkills: string; contextAutoCompact: (pct: number) => string; contextCacheRead: string; contextCacheWrite: string; contextClickToCopy: (hasDescription: boolean) => string; contextCopied: string; contextDeferred: string; contextDetail: string; contextEstimated: string; contextFreshInput: string; contextLastTurn: string; contextNoBreakdown: string; contextOutput: string; contextRunCount: (runs: number) => string; contextSessionCost: string; contextSummary: (used: string, window: string, pct: number) => string; contextSummaryCost: (summary: string, cost: string) => string; contextWindow: string; continue: string; continueHint: string; continueRun: string; copied: string; copy: string; copyCode: string; copyDiagramSource: string; copyImage: string; copyImageBase64: string; copyImageDataUrl: string; current: string; customEmoji: string; declineSecret: string; declineSecretHint: string; defaultAgent: string; defaultSpaceName: string; delete: string; deleteConfirmLabel: string; deleteProjectArchived: (archived: number) => string; deleteProjectCannotUndo: string; deleteProjectSandboxes: (sandboxed: number) => string; deleteProjectTitle: (count: number, project: string) => string; deleteSessionQuestion: (title: string) => string; deleteSessionSandbox: (kind: string) => string; deleteSpace: string; deleteSpaceMessage: (fallback: string) => string; deleteSpaceNamed: (name: string) => string; deleteSpaceQuestion: (name: string) => string; diagnosticsCheckedBy: (source: string) => string; diagnosticsChecking: string; diagnosticsNone: string; diagram: (type: string | null) => string; diagramError: (message: string, at: string) => string; diagramErrorAt: (line: number, column: number) => string; dismiss: string; dismissHint: string; dotAttached: string; dotAttention: string; dotCompleted: string; dotError: string; dotIdle: string; dotPending: string; dotRunning: string; earlierHistory: string; earlierLines: (count: number) => string; earlierMessages: (count: number) => string; editorConflict: string; editorConflictDetail: string; editorEmpty: string; editorOverwrite: string; editorReadFailed: (message: string) => string; editorReload: string; effortLevel: (level: string) => string; emojiPlaceholder: string; environmentActionFailed: (action: string, message: string) => string; environmentKept: (reason?: string) => string; environmentKinds: Readonly<Record<string, string>>; environmentOnBranch: (kind: string, branch: string) => string; environmentOnMachine: (kind: string, machine: string) => string; environmentPaused: (where: string) => string; environmentSettingUp: (where: string) => string; environmentSetupFailed: (where: string, error?: string) => string; environmentsKept: (count: number) => string; errorFailed: (region: string) => string; errorStack: string; errorTryAgain: string; estimateDue: string; estimateDueTitle: string; estimateOver: string; estimateOverTitle: string; estimatePausedTitle: (left: string) => string; estimateProblemTitle: (reason: string, message?: string) => string; estimateTitle: (left: string) => string; expandGroup: (label: string) => string; expandItem: (title: string) => string; expandSidebar: string; favorites: string; filePath: (path: string) => string; fileReadOnly: (path: string) => string; fileTree: string; fileUnsaved: string; fileUnsavedTitle: (path: string) => string; filterActivities: { '1d': string; '30d': string; '3d': string; '7d': string; all: string }; filterActivity: string; filterAgent: string; filterAllAgents: string; filterAllAgentsOption: string; filterAllProjects: string; filterAllProjectsOption: string; filterAny: string; filterNoAgents: string; filterNoProjects: string; filterOrigin: string; filterOrigins: { all: string; scheduled: string; unscheduled: string }; filterPicked: (count: number) => string; filterProject: string; filterSaveView: string; filterSessions: string; filterSort: string; filterSorts: { alphabetical: string; createdTime: string; recency: string }; filterSpaceDefault: string; filterStatus: string; filterStatuses: { active: string; all: string; archived: string }; filterView: string; filterViews: { agent: string; date: string; host: string; none: string; project: string; state: string }; findClose: string; findCloseHint: string; findInConversation: string; findInConversationClose: string; findInFile: string; findMatchCase: string; findNext: string; findNextHint: string; findNoResults: string; findPrevious: string; findPreviousHint: string; findReferences: string; fitDiagram: string; foldOutcomes: (ok: number, failed: number) => string; foldSteps: (count: number) => string; footerSettings: string; footerSettingsWithNote: (note: string) => string; footerSignIn: string; footerSignInTitle: string; generatedImage: string; generatingImage: (model: string | null) => string; generatingImages: (count: number, model: string | null) => string; goToDefinition: string; goToStep: (step: string) => string; hiddenSpaces: string; hideSpace: string; hostBadgeTitle: (host: string, status: string) => string; hostCollapse: (name: string) => string; hostExpand: (name: string) => string; hostOpenSettings: (host: string) => string; hostPicker: string; hostRunsOn: (name: string) => string; hostRunsOnSection: string; hostStatusError: (status: string, error: string) => string; hostStatuses: { 'auth-refused': string; connected: string; connecting: string; identity: string; local: string; offline: string; reconnecting: string; 'version-mismatch': string }; hostThisMachine: string; imageModelReferences: string; imageModelReferencesHint: string; imageModelsNone: string; imageModelsPill: string; imageModelTransparency: string; imageModelTransparencyHint: string; inboxEmpty: string; inboxInProgress: string; inboxNeedsYou: string; inboxPreviousSession: string; inboxRecent: string; inputCaption: string; interactionAnsweredBy: (who: string) => string; interactionApproved: string; interactionDismissed: string; interactionPlan: string; interactionQuestion: string; interactionRejected: string; interactionRevise: string; interactionsLabel: string; interactionWaitingAnswers: string; interactionWaitingDecision: string; itemActions: (title: string) => string; itemOpenFailed: (message: string) => string; justNow: string; loadEarlierHistory: string; loadFullOutput: string; loading: string; loadingEarlierHistory: string; loadingEarlierMessages: string; loadingFullOutput: string; mainSession: string; mentionSuggestions: string; menuAddFavorite: string; menuArchive: string; menuArchiveProject: string; menuCopyPath: string; menuDelete: string; menuDeleteProject: string; menuMoveProjectToSpace: string; menuMoveTo: string; menuMoveToSpace: string; menuOpenChatWindow: string; menuOpenPanelsWindow: string; menuOpenWindow: string; menuRemoveFavorite: string; menuRename: string; menuRetryEnvironment: string; menuReveal: string; menuUnarchive: string; modalBack: string; modalFailed: string; modelAccountBlocked: (provider: string) => string; modelChain: string; modelChainNoModel: string; modelChainOrderHint: string; modelFallback: string; modelFallbackHint: string; modelFallbackPosition: (n: number) => string; modelFeatures: string; modelForNextChat: string; modelInUse: string; modelKinds: string; modelLegacy: string; modelLegacyHint: string; modelNotInCatalog: string; modelNotInCatalogHint: string; modelOptions: string; modelOptionsEmpty: string; modelOptionsHint: string; modelPrimary: string; modelPrimaryHint: string; modelReasoning: string; modelReasoningHint: string; modelRemoveFallback: (n: number) => string; modelRemoveFromChain: string; modelRemovePrimary: string; modelsChatTab: string; modelsCustomId: string; modelServing: (picked: string, serving: string) => string; modelServingFallback: string; modelsImageTab: string; modelsInUse: string; modelsJumpHint: (provider: string, digit: number | null) => string; modelsJumpToProvider: string; modelsLegacy: string; modelsLegacyHidden: (count: number) => string; modelsLoadFailed: (error: string) => string; modelsLoading: string; modelsNoMatch: (query: string) => string; modelsNoProviders: string; modelsSelected: (count: number) => string; modelsShowLegacy: string; modelsShowLegacyHint: string; modelsShownOf: (shown: number, total: number) => string; modelsTypeAnId: string; modelUnavailable: string; modelVerdictTitle: (approved: boolean, model: string, confidence: string | null) => string; modelVia: string; modelViaHint: (modelId: string, provider: string) => string; months: readonly string[]; moreActions: string; moreAttachments: (count: number) => string; moveProjectFailed: (message: string) => string; moveSessionFailed: (message: string) => string; moveSpaceDown: (name: string) => string; moveSpaceLeft: string; moveSpaceRight: string; moveSpaceUp: (name: string) => string; newSession: string; newSessionIn: (project: string) => string; newSessionTitle: string; newSpaceName: (n: number) => string; next: string; noAnswer: string; noChatsMatchFilters: string; noChatsYet: string; noMatches: (query: string) => string; noReferences: string; noSessions: string; noSuggestions: string; of: (index: number, count: number) => string; openFiles: string; openGroup: (label: string) => string; openImageFile: (path: string) => string; openInNewTab: string; openNamedSession: (title: string) => string; openSecrets: string; openSession: string; outputCaption: string; paletteBack: string; paletteBackHint: string; paletteChoose: string; paletteEmpty: string; paletteFilter: string; paletteLabel: string; paletteLoading: string; paletteNoMatch: (query: string) => string; paletteOpen: string; paletteRun: string; paletteScopeHint: string; paletteTurnOff: string; paletteTurnOn: string; pickModel: string; pickOneOrMore: string; pinNamed: (project: string) => string; pinProject: string; planApprove: string; planReject: string; planRejectAndStop: string; planRejectNote: string; planRejectPlaceholder: string; planRevise: string; planReviseNote: string; planRevisePlaceholder: string; planSendRevision: string; previewFailed: (name: string) => string; previewTooLarge: (name: string, size: string) => string; previous: string; queryGroupOther: string; questionCount: (count: number) => string; queueHint: string; queueMessage: string; reasoningEffort: string; receiptAgent: string; receiptAgentSwitched: string; receiptCost: string; receiptDuration: string; receiptModel: string; receiptModelOthers: (others: number) => string; receiptSpeed: string; receiptTokens: (sent: string, received: string) => string; receiptTurns: (turns: number) => string; reload: string; removeAttachment: (name: string) => string; removeFavorite: string; rename: string; requiredHint: string; requiredMark: string; resetFilters: string; resetsAt: (time: string) => string; resetToFolder: string; resetToInitial: string; retry: string; retryEnvironmentFailed: (message: string) => string; retryHint: string; rowNeedsYou: string; rowRunning: string; rowScheduled: string; rowWorking: string; runningFor: (elapsed: string) => string; runReceipt: string; runRetrying: (attempt: number, max: number, source?: string) => string; runWaiting: string; savedViewName: (n: number) => string; saveSecurely: string; saveViewFailed: (message: string) => string; screenBack: (screen: string) => string; screenBackKey: string; scriptCallsDone: (done: number) => string; scriptCallsFailed: (failed: number) => string; scriptCallsOf: (done: number, total: number) => string; scriptCallsRunning: (running: number) => string; scriptLineCalls: (calls: number) => string; scriptLiveOutput: string; scriptLoop: string; scriptLoopRound: (round: number) => string; scriptLoopRounds: (rounds: number) => string; scriptLoopRuns: (runs: number) => string; scriptOptionOutput: string; scriptOptions: string; scriptOptionTimeout: string; scriptOptionTokens: (tokens: number) => string; scriptPercent: (percent: number) => string; scriptProgress: string; scriptWaitLeft: (seconds: number) => string; searchingSessions: string; searchModels: string; searchModelsPlaceholder: string; searchSessions: string; searchSessionsLabel: string; secretDeclined: (name: string) => string; secretNote: (ttl: SecretTtl) => string; secretReused: (name: string) => string; secretSaved: (name: string, left: SecretTimeLeft) => string; secretSent: (name: string) => string; secretTtlLabel: string; secretTtlName: (ttl: SecretTtl) => string; secretValueLabel: string; secretValuePlaceholder: string; selectTurnCopied: string; selectTurnCopy: string; selectTurnDetails: string; selectTurnExit: string; selectTurnFork: string; selectTurnForkFailed: string; selectTurnMove: string; selectTurnNothingToCopy: string; selectTurnSelecting: string; sendAnswers: (count: number) => string; sendHint: string; sendMessage: string; sessionActions: string; sessionEventLabel: (title: string, verb: string, needsAttention: boolean) => string; sessions: string; setModelOptions: string; shellCancelled: string; shellExit: (code: number) => string; shellKilled: string; showDiagram: string; showDiagramSource: string; showHiddenSpace: (name: string) => string; showMore: string; showMoreAttachments: (count: number) => string; showOutput: string; showSystemPrompt: string; sidebarNoMatches: string; signInCopyCode: string; signInDone: (account?: string) => string; signInEnterCode: (host: string) => string; signInFailed: string; signInInBrowser: (service: string) => string; signInNotOpened: string; signInOpenPage: string; signInPaste: string; signInStarting: string; signInSubmit: string; skip: string; spaceFromExtension: (extension: string) => string; spaceNamed: (name: string) => string; spaceNameOf: (name: string) => string; spaceOptions: (name: string) => string; spaces: string; spacesTitle: string; spawnResumes: (childId: string) => string; spawnTask: string; stateCompleted: string; stateError: string; stateIdle: string; stateRunning: string; steerHint: string; steerMessage: string; stepDone: string; stepFailed: string; stepOf: (index: number, count: number) => string; stepResuming: string; stepRunning: string; steps: string; stepWaiting: string; stopCommand: string; stopHint: string; stopped: string; stoppedByYou: string; stopRun: string; switchAgent: string; switchingAgent: string; switchModel: string; terminal: string; terminalExited: (code: number) => string; terminalLoadFailed: (message: string) => string; thinkingLive: string; thoughtFor: (seconds: number) => string; thoughts: string; thoughtTimes: (count: number) => string; today: string; toolAttachments: string; transcriptLoading: string; turnMenuCopy: string; turnMenuCopySelection: string; turnMenuCopySelectionFailed: string; turnMenuDelete: string; turnMenuEdit: string; turnMenuEditNeedsComposer: string; turnMenuFork: string; turnMenuRewind: string; turnMenuSent: (age: string) => string; turnMenuStopFirst: (label: string) => string; turnsCompacted: string; unarchive: string; unpinNamed: (project: string) => string; unpinProject: string; unsupportedInteraction: (tool: string) => string; usagePanelHint: string; usageWindow: (window: string, percent: string) => string; useSpaces: string; useSpacesDescription: string; viewAttachment: (name: string) => string; waitingForSlot: (max: number) => string; workerContinues: string; workerModel: string; workerSystemPrompt: string; workerSystemReplaced: string; workerType: string; working: string; wrapLines: string; yesterday: string; yourSpaces: string; zoomFit: string; zoomInDiagram: string; zoomOutDiagram: string; zoomPercent: (percent: number) => string }
```

**Returns** `{ activityCompacting: string; activityRetrying: string; activityThinking: string; activityWriting: string; addDiagnosticToChat: (message: string) => string; addFavorite: string; additionalInstructions: string; additionalInstructionsHint: string; additionalInstructionsPlaceholder: string; address: string; addressPlaceholder: string; addSpace: string; addToChat: string; agent: string; agentDraftNote: string; agentGroupDefault: string; agentProfiles: string; archive: string; archiveConfirmLabel: string; archived: string; archiveProjectMessage: (count: number) => 'It stays under Archived, where you can restore it.' | 'They stay under Archived, where you can restore them.'; archiveProjectTitle: (count: number, project: string) => string; attachFile: string; attachmentEmpty: (name: string) => string; attachmentExportPdf: (name: string) => string; attachmentNotices: string; attachmentReadFailed: (name: string) => string; attachments: string; attachmentTitle: (name: string, detail: string) => string; attachmentTooLarge: (name: string, size: string, limit: string) => string; attachmentUnreadableImage: (name: string) => string; attachmentUnsupported: (name: string) => string; authCancel: string; authCard: string; authCopied: string; authCopyDetails: string; authEnterCode: (code: string) => string; authFailed: (message: string) => string; authFixed: string; authHeadline: (auth: AuthFailure, label: string) => string; authOpeningBrowser: string; authOpenPage: string; authPaste: string; authPasteSend: string; authSettings: string; authSettingsHint: string; authSignedIn: string; authSignedInRetrying: string; authSignInAgain: string; authSwitching: (account: string) => string; authTryAgain: string; authUseAccount: (account: string) => string; authWaiting: string; autoDenied: string; back: string; badgeCopied: string; badgeNoComposer: string; badgeOpenIn: (app: string) => string; badgeOpenInBrowserPane: string; badgePathUnavailable: string; blockRunAgain: string; blockRunAttach: string; blockRunAttachmentName: string; blockRunCopy: string; blockRunFailed: (reason: string) => string; blockRunHere: string; blockRunInTerminal: string; blockRunMenu: string; blockRunNeedsTerminal: string; blockRunning: string; blockRunOutput: string; blockRunRemove: string; blockRunStop: string; blockRunStopped: string; blockRunTimedOut: string; blockRunTruncated: string; cancel: string; changeIconFor: (project: string) => string; changeMainIcon: string; changeProjectIcon: string; changeSpaceIcon: string; chats: string; chipBranch: (name: string) => string; chipChat: (name: string) => string; chipCommand: (name: string) => string; chipCommit: (sha: string) => string; chipFactAliases: string; chipFactBranch: string; chipFactChanges: string; chipFactContext: string; chipFactDate: string; chipFactModel: string; chipFactPrompts: string; chipFactSize: string; chipFactTurns: string; chipFactUpdated: string; chipLoading: string; chipNotAmongChats: string; chipNotFound: (title: string) => string; chipRemoteFile: (path: string, host: string) => string; chipSessionError: string; chipSessionRunning: string; chipSkill: (name: string) => string; chipTokens: (count: string) => string; chipUntitledChat: string; chooseImage: string; chooseModel: string; chooseProjectIcon: string; chooseSpaceIcon: string; clearSearch: string; clickToAnswer: string; close: string; closeTab: (name: string) => string; code: string; collapseGroup: (label: string) => string; collapseItem: (title: string) => string; collapseSidebar: string; commandDetail: string; commandSuggestions: string; compactingTitle: string; completionSuggestions: string; composerBadges: string; composerLabel: string; composerPlaceholder: string; composerPlaceholderQueue: string; composerPlaceholderSteer: string; confirm: string; confirmNo: string; confirmYes: string; contextActiveSkills: string; contextAutoCompact: (pct: number) => string; contextCacheRead: string; contextCacheWrite: string; contextClickToCopy: (hasDescription: boolean) => string; contextCopied: string; contextDeferred: string; contextDetail: string; contextEstimated: string; contextFreshInput: string; contextLastTurn: string; contextNoBreakdown: string; contextOutput: string; contextRunCount: (runs: number) => string; contextSessionCost: string; contextSummary: (used: string, window: string, pct: number) => string; contextSummaryCost: (summary: string, cost: string) => string; contextWindow: string; continue: string; continueHint: string; continueRun: string; copied: string; copy: string; copyCode: string; copyDiagramSource: string; copyImage: string; copyImageBase64: string; copyImageDataUrl: string; current: string; customEmoji: string; declineSecret: string; declineSecretHint: string; defaultAgent: string; defaultSpaceName: string; delete: string; deleteConfirmLabel: string; deleteProjectArchived: (archived: number) => string; deleteProjectCannotUndo: string; deleteProjectSandboxes: (sandboxed: number) => string; deleteProjectTitle: (count: number, project: string) => string; deleteSessionQuestion: (title: string) => string; deleteSessionSandbox: (kind: string) => string; deleteSpace: string; deleteSpaceMessage: (fallback: string) => string; deleteSpaceNamed: (name: string) => string; deleteSpaceQuestion: (name: string) => string; diagnosticsCheckedBy: (source: string) => string; diagnosticsChecking: string; diagnosticsNone: string; diagram: (type: string | null) => string; diagramError: (message: string, at: string) => string; diagramErrorAt: (line: number, column: number) => string; dismiss: string; dismissHint: string; dotAttached: string; dotAttention: string; dotCompleted: string; dotError: string; dotIdle: string; dotPending: string; dotRunning: string; earlierHistory: string; earlierLines: (count: number) => string; earlierMessages: (count: number) => string; editorConflict: string; editorConflictDetail: string; editorEmpty: string; editorOverwrite: string; editorReadFailed: (message: string) => string; editorReload: string; effortLevel: (level: string) => string; emojiPlaceholder: string; environmentActionFailed: (action: string, message: string) => string; environmentKept: (reason?: string) => string; environmentKinds: Readonly<Record<string, string>>; environmentOnBranch: (kind: string, branch: string) => string; environmentOnMachine: (kind: string, machine: string) => string; environmentPaused: (where: string) => string; environmentSettingUp: (where: string) => string; environmentSetupFailed: (where: string, error?: string) => string; environmentsKept: (count: number) => string; errorFailed: (region: string) => string; errorStack: string; errorTryAgain: string; estimateDue: string; estimateDueTitle: string; estimateOver: string; estimateOverTitle: string; estimatePausedTitle: (left: string) => string; estimateProblemTitle: (reason: string, message?: string) => string; estimateTitle: (left: string) => string; expandGroup: (label: string) => string; expandItem: (title: string) => string; expandSidebar: string; favorites: string; filePath: (path: string) => string; fileReadOnly: (path: string) => string; fileTree: string; fileUnsaved: string; fileUnsavedTitle: (path: string) => string; filterActivities: { '1d': string; '30d': string; '3d': string; '7d': string; all: string }; filterActivity: string; filterAgent: string; filterAllAgents: string; filterAllAgentsOption: string; filterAllProjects: string; filterAllProjectsOption: string; filterAny: string; filterNoAgents: string; filterNoProjects: string; filterOrigin: string; filterOrigins: { all: string; scheduled: string; unscheduled: string }; filterPicked: (count: number) => string; filterProject: string; filterSaveView: string; filterSessions: string; filterSort: string; filterSorts: { alphabetical: string; createdTime: string; recency: string }; filterSpaceDefault: string; filterStatus: string; filterStatuses: { active: string; all: string; archived: string }; filterView: string; filterViews: { agent: string; date: string; host: string; none: string; project: string; state: string }; findClose: string; findCloseHint: string; findInConversation: string; findInConversationClose: string; findInFile: string; findMatchCase: string; findNext: string; findNextHint: string; findNoResults: string; findPrevious: string; findPreviousHint: string; findReferences: string; fitDiagram: string; foldOutcomes: (ok: number, failed: number) => string; foldSteps: (count: number) => string; footerSettings: string; footerSettingsWithNote: (note: string) => string; footerSignIn: string; footerSignInTitle: string; generatedImage: string; generatingImage: (model: string | null) => string; generatingImages: (count: number, model: string | null) => string; goToDefinition: string; goToStep: (step: string) => string; hiddenSpaces: string; hideSpace: string; hostBadgeTitle: (host: string, status: string) => string; hostCollapse: (name: string) => string; hostExpand: (name: string) => string; hostOpenSettings: (host: string) => string; hostPicker: string; hostRunsOn: (name: string) => string; hostRunsOnSection: string; hostStatusError: (status: string, error: string) => string; hostStatuses: { 'auth-refused': string; connected: string; connecting: string; identity: string; local: string; offline: string; reconnecting: string; 'version-mismatch': string }; hostThisMachine: string; imageModelReferences: string; imageModelReferencesHint: string; imageModelsNone: string; imageModelsPill: string; imageModelTransparency: string; imageModelTransparencyHint: string; inboxEmpty: string; inboxInProgress: string; inboxNeedsYou: string; inboxPreviousSession: string; inboxRecent: string; inputCaption: string; interactionAnsweredBy: (who: string) => string; interactionApproved: string; interactionDismissed: string; interactionPlan: string; interactionQuestion: string; interactionRejected: string; interactionRevise: string; interactionsLabel: string; interactionWaitingAnswers: string; interactionWaitingDecision: string; itemActions: (title: string) => string; itemOpenFailed: (message: string) => string; justNow: string; loadEarlierHistory: string; loadFullOutput: string; loading: string; loadingEarlierHistory: string; loadingEarlierMessages: string; loadingFullOutput: string; mainSession: string; mentionSuggestions: string; menuAddFavorite: string; menuArchive: string; menuArchiveProject: string; menuCopyPath: string; menuDelete: string; menuDeleteProject: string; menuMoveProjectToSpace: string; menuMoveTo: string; menuMoveToSpace: string; menuOpenChatWindow: string; menuOpenPanelsWindow: string; menuOpenWindow: string; menuRemoveFavorite: string; menuRename: string; menuRetryEnvironment: string; menuReveal: string; menuUnarchive: string; modalBack: string; modalFailed: string; modelAccountBlocked: (provider: string) => string; modelChain: string; modelChainNoModel: string; modelChainOrderHint: string; modelFallback: string; modelFallbackHint: string; modelFallbackPosition: (n: number) => string; modelFeatures: string; modelForNextChat: string; modelInUse: string; modelKinds: string; modelLegacy: string; modelLegacyHint: string; modelNotInCatalog: string; modelNotInCatalogHint: string; modelOptions: string; modelOptionsEmpty: string; modelOptionsHint: string; modelPrimary: string; modelPrimaryHint: string; modelReasoning: string; modelReasoningHint: string; modelRemoveFallback: (n: number) => string; modelRemoveFromChain: string; modelRemovePrimary: string; modelsChatTab: string; modelsCustomId: string; modelServing: (picked: string, serving: string) => string; modelServingFallback: string; modelsImageTab: string; modelsInUse: string; modelsJumpHint: (provider: string, digit: number | null) => string; modelsJumpToProvider: string; modelsLegacy: string; modelsLegacyHidden: (count: number) => string; modelsLoadFailed: (error: string) => string; modelsLoading: string; modelsNoMatch: (query: string) => string; modelsNoProviders: string; modelsSelected: (count: number) => string; modelsShowLegacy: string; modelsShowLegacyHint: string; modelsShownOf: (shown: number, total: number) => string; modelsTypeAnId: string; modelUnavailable: string; modelVerdictTitle: (approved: boolean, model: string, confidence: string | null) => string; modelVia: string; modelViaHint: (modelId: string, provider: string) => string; months: readonly string[]; moreActions: string; moreAttachments: (count: number) => string; moveProjectFailed: (message: string) => string; moveSessionFailed: (message: string) => string; moveSpaceDown: (name: string) => string; moveSpaceLeft: string; moveSpaceRight: string; moveSpaceUp: (name: string) => string; newSession: string; newSessionIn: (project: string) => string; newSessionTitle: string; newSpaceName: (n: number) => string; next: string; noAnswer: string; noChatsMatchFilters: string; noChatsYet: string; noMatches: (query: string) => string; noReferences: string; noSessions: string; noSuggestions: string; of: (index: number, count: number) => string; openFiles: string; openGroup: (label: string) => string; openImageFile: (path: string) => string; openInNewTab: string; openNamedSession: (title: string) => string; openSecrets: string; openSession: string; outputCaption: string; paletteBack: string; paletteBackHint: string; paletteChoose: string; paletteEmpty: string; paletteFilter: string; paletteLabel: string; paletteLoading: string; paletteNoMatch: (query: string) => string; paletteOpen: string; paletteRun: string; paletteScopeHint: string; paletteTurnOff: string; paletteTurnOn: string; pickModel: string; pickOneOrMore: string; pinNamed: (project: string) => string; pinProject: string; planApprove: string; planReject: string; planRejectAndStop: string; planRejectNote: string; planRejectPlaceholder: string; planRevise: string; planReviseNote: string; planRevisePlaceholder: string; planSendRevision: string; previewFailed: (name: string) => string; previewTooLarge: (name: string, size: string) => string; previous: string; queryGroupOther: string; questionCount: (count: number) => string; queueHint: string; queueMessage: string; reasoningEffort: string; receiptAgent: string; receiptAgentSwitched: string; receiptCost: string; receiptDuration: string; receiptModel: string; receiptModelOthers: (others: number) => string; receiptSpeed: string; receiptTokens: (sent: string, received: string) => string; receiptTurns: (turns: number) => string; reload: string; removeAttachment: (name: string) => string; removeFavorite: string; rename: string; requiredHint: string; requiredMark: string; resetFilters: string; resetsAt: (time: string) => string; resetToFolder: string; resetToInitial: string; retry: string; retryEnvironmentFailed: (message: string) => string; retryHint: string; rowNeedsYou: string; rowRunning: string; rowScheduled: string; rowWorking: string; runningFor: (elapsed: string) => string; runReceipt: string; runRetrying: (attempt: number, max: number, source?: string) => string; runWaiting: string; savedViewName: (n: number) => string; saveSecurely: string; saveViewFailed: (message: string) => string; screenBack: (screen: string) => string; screenBackKey: string; scriptCallsDone: (done: number) => string; scriptCallsFailed: (failed: number) => string; scriptCallsOf: (done: number, total: number) => string; scriptCallsRunning: (running: number) => string; scriptLineCalls: (calls: number) => string; scriptLiveOutput: string; scriptLoop: string; scriptLoopRound: (round: number) => string; scriptLoopRounds: (rounds: number) => string; scriptLoopRuns: (runs: number) => string; scriptOptionOutput: string; scriptOptions: string; scriptOptionTimeout: string; scriptOptionTokens: (tokens: number) => string; scriptPercent: (percent: number) => string; scriptProgress: string; scriptWaitLeft: (seconds: number) => string; searchingSessions: string; searchModels: string; searchModelsPlaceholder: string; searchSessions: string; searchSessionsLabel: string; secretDeclined: (name: string) => string; secretNote: (ttl: SecretTtl) => string; secretReused: (name: string) => string; secretSaved: (name: string, left: SecretTimeLeft) => string; secretSent: (name: string) => string; secretTtlLabel: string; secretTtlName: (ttl: SecretTtl) => string; secretValueLabel: string; secretValuePlaceholder: string; selectTurnCopied: string; selectTurnCopy: string; selectTurnDetails: string; selectTurnExit: string; selectTurnFork: string; selectTurnForkFailed: string; selectTurnMove: string; selectTurnNothingToCopy: string; selectTurnSelecting: string; sendAnswers: (count: number) => string; sendHint: string; sendMessage: string; sessionActions: string; sessionEventLabel: (title: string, verb: string, needsAttention: boolean) => string; sessions: string; setModelOptions: string; shellCancelled: string; shellExit: (code: number) => string; shellKilled: string; showDiagram: string; showDiagramSource: string; showHiddenSpace: (name: string) => string; showMore: string; showMoreAttachments: (count: number) => string; showOutput: string; showSystemPrompt: string; sidebarNoMatches: string; signInCopyCode: string; signInDone: (account?: string) => string; signInEnterCode: (host: string) => string; signInFailed: string; signInInBrowser: (service: string) => string; signInNotOpened: string; signInOpenPage: string; signInPaste: string; signInStarting: string; signInSubmit: string; skip: string; spaceFromExtension: (extension: string) => string; spaceNamed: (name: string) => string; spaceNameOf: (name: string) => string; spaceOptions: (name: string) => string; spaces: string; spacesTitle: string; spawnResumes: (childId: string) => string; spawnTask: string; stateCompleted: string; stateError: string; stateIdle: string; stateRunning: string; steerHint: string; steerMessage: string; stepDone: string; stepFailed: string; stepOf: (index: number, count: number) => string; stepResuming: string; stepRunning: string; steps: string; stepWaiting: string; stopCommand: string; stopHint: string; stopped: string; stoppedByYou: string; stopRun: string; switchAgent: string; switchingAgent: string; switchModel: string; terminal: string; terminalExited: (code: number) => string; terminalLoadFailed: (message: string) => string; thinkingLive: string; thoughtFor: (seconds: number) => string; thoughts: string; thoughtTimes: (count: number) => string; today: string; toolAttachments: string; transcriptLoading: string; turnMenuCopy: string; turnMenuCopySelection: string; turnMenuCopySelectionFailed: string; turnMenuDelete: string; turnMenuEdit: string; turnMenuEditNeedsComposer: string; turnMenuFork: string; turnMenuRewind: string; turnMenuSent: (age: string) => string; turnMenuStopFirst: (label: string) => string; turnsCompacted: string; unarchive: string; unpinNamed: (project: string) => string; unpinProject: string; unsupportedInteraction: (tool: string) => string; usagePanelHint: string; usageWindow: (window: string, percent: string) => string; useSpaces: string; useSpacesDescription: string; viewAttachment: (name: string) => string; waitingForSlot: (max: number) => string; workerContinues: string; workerModel: string; workerSystemPrompt: string; workerSystemReplaced: string; workerType: string; working: string; wrapLines: string; yesterday: string; yourSpaces: string; zoomFit: string; zoomInDiagram: string; zoomOutDiagram: string; zoomPercent: (percent: number) => string }`

Source: [ui/src/chat/sidebar/useSidebarLabels.ts:7](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSidebarLabels.ts#L7)

### `useSidebarNotice`

Function.

How the nearest [`SidebarHostProvider`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarHostProvider) tells the user something.

```ts
function useSidebarNotice(): (message: string) => void
```

**Returns** `(message: string) => void`

Source: [ui/src/chat/sidebar/SidebarHostProvider.tsx:49](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarHostProvider.tsx#L49)

## Constants

### `ARRIVAL_MS`

Constant.

How long a new commit or pull request reads as new (the badge pop, the row sweep).

```ts
const ARRIVAL_MS = 1600
```

Source: [ui/src/chat/sidebar/sidebar-live.tsx:72](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/sidebar-live.tsx#L72)

### `ICON_PICKER_WIDTH`

Constant.

Width of the picker's popover — shared with other hosts of [`IconPicker`](https://zidane.si/docs/reference/ui-chat-sidebar.md#IconPicker) (space icons).

```ts
const ICON_PICKER_WIDTH = 232
```

Source: [ui/src/chat/sidebar/ProjectIcon.tsx:303](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/ProjectIcon.tsx#L303)

## Interfaces

### `EnvironmentChipProps`

Interface.

Props of [`EnvironmentChip`](https://zidane.si/docs/reference/ui-chat-sidebar.md#EnvironmentChip).

```ts
interface EnvironmentChipProps
```

**Properties**

- `className?` (`string`): Extra classes on the chip.
- `environment` (`SessionEnvironmentSummary | undefined`): Where the session runs; nothing renders without one (a local session).
- `style?` (`CSSProperties`): Inline styles on the chip.

Source: [ui/src/chat/sidebar/RowChips.tsx:17](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/RowChips.tsx#L17)

### `IconPickerProps`

Interface.

Props of [`IconPicker`](https://zidane.si/docs/reference/ui-chat-sidebar.md#IconPicker).

```ts
interface IconPickerProps
```

**Properties**

- `hasIcon` (`boolean`): An icon is set: the reset row shows.
- `onPick` (`(icon: ProjectIcon | null) => void`): `null` = reset to the default glyph.
- `resetLabel?` (`string`): Label of the reset row (shown when an icon is set).

Source: [ui/src/chat/sidebar/ProjectIcon.tsx:307](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/ProjectIcon.tsx#L307)

### `MainSessionRowProps`

Interface.

Props of [`MainSessionRow`](https://zidane.si/docs/reference/ui-chat-sidebar.md#MainSessionRow).

```ts
interface MainSessionRowProps<K extends string = string>
```

**Type parameters**

- `K` (`extends string`, default `string`)

**Properties**

- `className?` (`string`): Extra classes on the row's `<li>`.
- `icon?` (`ProjectIcon`): Custom icon from the shared project-icon map (`MAIN_SESSION_ICON_KEY`).
- `isActive` (`boolean`): The main session is the open one.
- `onAssignIcon` (`(key: string, icon: ProjectIcon | null) => void`): Assigns (or, with `null`, resets) the icon under `key`.
- `onSelect` (`(sessionId: K) => void`): Opens the main session.
- `sessionId` (`K`): The main session's id (put on the row as `data-session-id`).
- `style?` (`CSSProperties`): Inline styles on the row's `<li>`.

Source: [ui/src/chat/sidebar/MainSessionRow.tsx:16](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/MainSessionRow.tsx#L16)

### `NewSessionButtonProps`

Interface.

Props of [`NewSessionButton`](https://zidane.si/docs/reference/ui-chat-sidebar.md#NewSessionButton).

```ts
interface NewSessionButtonProps
```

**Properties**

- `className?` (`string`): Extra classes on the wrapper.
- `isActive` (`boolean`): No session is open: the button is the current selection (the raised chip).
- `onNewSession` (`() => void`): Starts a new session.
- `style?` (`CSSProperties`): Inline styles on the wrapper.

Source: [ui/src/chat/sidebar/SessionSidebar.tsx:265](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SessionSidebar.tsx#L265)

### `ProjectChipProps`

Interface.

Props of [`ProjectChip`](https://zidane.si/docs/reference/ui-chat-sidebar.md#ProjectChip).

```ts
interface ProjectChipProps
```

**Properties**

- `className?` (`string`): Extra classes on the chip.
- `project` (`RowProject`): The project.
- `style?` (`CSSProperties`): Inline styles on the chip.

Source: [ui/src/chat/sidebar/RowChips.tsx:68](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/RowChips.tsx#L68)

### `ProjectIconButtonProps`

Interface.

Props of [`ProjectIconButton`](https://zidane.si/docs/reference/ui-chat-sidebar.md#ProjectIconButton).

```ts
interface ProjectIconButtonProps
```

**Properties**

- `className?` (`string`): Extra classes on the trigger (or the plain slot).
- `defaultGlyph?` (`string`): Default glyph class when nothing is assigned. Overrides the folder /
  git-branch choice — the pinned Main row uses a home icon here.
- `fullPath?` (`string`): Full directory path keying the icon map. Absent for the "No folder"
  bucket — renders the default glyph as a plain non-interactive slot.
- `icon?` (`ProjectIcon`): The icon assigned to the folder, if any.
- `isGitRepo?` (`boolean`): Directory is a git repository — the DEFAULT glyph (no custom icon
  assigned, or after Reset) becomes a git branch instead of a folder.
- `label` (`string`): Basename shown in the header — used for the trigger's aria-label.
- `onAssign` (`(fullPath: string, icon: ProjectIcon | null) => void`): Assigns (or, with `null`, resets) the folder's icon.
- `style?` (`CSSProperties`): Inline styles on the trigger (or the plain slot).
- `title?` (`string`): Tooltip on the trigger; defaults to the project wording.

Source: [ui/src/chat/sidebar/ProjectIcon.tsx:182](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/ProjectIcon.tsx#L182)

### `ProjectIconGlyphProps`

Interface.

Props of [`ProjectIconGlyph`](https://zidane.si/docs/reference/ui-chat-sidebar.md#ProjectIconGlyph).

```ts
interface ProjectIconGlyphProps
```

**Properties**

- `className?` (`string`): Extra classes on the slot.
- `defaultGlyph?` (`string`): Default glyph class when nothing is assigned; overrides the folder / git-branch choice.
- `icon?` (`ProjectIcon`): The icon assigned to the folder, if any.
- `isGitRepo?` (`boolean`): No icon assigned: a git branch for a repository, else a folder.
- `size?` (`'sm' | 'lg'`): `sm`: the sidebar's 18px slot. `lg`: a heading's 28px slot (the project home).
- `style?` (`CSSProperties`): Inline styles on the slot.

Source: [ui/src/chat/sidebar/ProjectIcon.tsx:78](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/ProjectIcon.tsx#L78)

### `RowProject`

Interface.

A session's project, first on its badge line: a favorite has left its project group.

```ts
interface RowProject
```

**Properties**

- `icon?` (`ProjectIcon`): The icon the project's group shows (a picked one, else git or folder).
- `isGitRepo` (`boolean`): Its folder is a git repository.
- `label` (`string`): The project's name.
- `path` (`string`): Its folder, for the tooltip.

Source: [ui/src/chat/sidebar/RowChips.tsx:56](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/RowChips.tsx#L56)

### `SessionDirectoryView`

Interface.

The directory as the sidebar reads it: its state plus the shown space's filtered list and view.

```ts
interface SessionDirectoryView<S extends SidebarListSession> extends SessionDirectoryState<S>
```

**Type parameters**

- `S` (`extends SidebarListSession`)

**Properties**

- `activeSessionId` (`S['id'] | null`, from `SessionDirectoryState`): The open session.
- `activeSpace` (`SidebarSpace`, from `SessionDirectoryState`): The space shown (the default one while spaces are off).
- `activityFilter` (`SessionActivityFilter`): The shown space's activity axis.
- `allSessions` (`readonly S[]`, from `SessionDirectoryState`): Every listed session, unfiltered (the archive filter is the host's).
- `archiveFilter` (`SessionArchiveFilter`): The shown space's archive axis.
- `availableProjects` (`string[]`): Every project the listed sessions belong to (by folder name), sorted.
- `contributions` (`SidebarContributions`, from `SessionDirectoryState`): What the extensions contribute to the sidebar.
- `groupBy` (`SidebarGroupBy`): The shown space's grouping.
- `hiddenSpaces` (`readonly SidebarSpace[]`, from `SessionDirectoryState`): The spaces the user hid from the switcher on this device (`setSpaceHidden`), in `spaces` order:
  what the switcher's Hidden spaces menu offers to show again. A space hidden in the settings'
  space list (`hidden: true`) is not in it: the settings show it again.
- `hostNotice` (`string | null`, from `SessionDirectoryState`): Why the open session closed (its host was removed), until dismissed or another opens.
- `listSpaceId` (`string`): The space the list shows: `activeSpace`, in the same render. Deferring it
  time-sliced the new rows behind the switcher's spring, \~3 frames late.
- `projectFilter` (`string | null`): The shown space's project axis (a folder name, or `null` for all).
- `query` (`SidebarQueryLayer`): The shown space's query layer: pass it to `SessionSidebar` and `SidebarFilterMenu`.
- `sessionRefs` (`ReadonlyMap<string, SessionRef>`): How a reference names each session.
- `sessions` (`readonly S[]`): The sessions the list shows (space, project, activity, agent and contributed filters applied).
- `sortBy` (`SidebarSortBy`): The shown space's sort.
- `spaces` (`readonly SidebarSpace[]`, from `SessionDirectoryState`): Every space, the default one always present: the user's in order, then the extensions'.
- `spaceSlide` (`{ direction: 'next' | 'prev'; spaceId: string } | null`, from `SessionDirectoryState`): The last space switch, for the list's slide.
- `spacesOn` (`boolean`, from `SessionDirectoryState`): Spaces are on.
- `switcherSpaces` (`readonly SidebarSpace[]`, from `SessionDirectoryState`): The spaces the switcher shows, in its order (the user's arrangement on top of `spaces`).

Source: [ui/src/chat/sidebar/useSessionDirectoryView.ts:25](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSessionDirectoryView.ts#L25)

### `SessionMenuActions`

Interface.

What the rows do.

```ts
interface SessionMenuActions
```

**Properties**

- `moveSession?` (`() => void`): Move to another environment of its host ("Move to…", `useMoveSession`). Absent: no row.
- `moveToSpace` (`(spaceId: string) => void`): Move to another space.
- `remove` (`() => void`): Delete (after a confirmation).
- `rename` (`() => void`): Edit the title (in the row, or in place).
- `retryEnvironment` (`() => void`): Set a failed environment up again.
- `runEnvironmentAction` (`(actionId: string, label: string) => void`): Run one of the environment's commands.
- `setArchived` (`(archived: boolean) => void`): Archive or restore.
- `setFavorite` (`(favorite: boolean) => void`): Star or unstar.

Source: [ui/src/chat/sidebar/session-menu.ts:49](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L49)

### `SessionMenuContext`

Interface.

What the menu knows beyond the conversation.

```ts
interface SessionMenuContext
```

**Properties**

- `environmentActions` (`readonly EnvironmentActionSummary[]`): The environment's own commands, once asked for (`useEnvironmentActions`).
- `host?` (`Pick<SidebarHost, 'revealPath' | 'openWindow'>`): The platform's members: the Finder and window rows show only with them.
- `spaces` (`readonly Space[] | null`): The space list while Spaces is on; `null` off.

Source: [ui/src/chat/sidebar/session-menu.ts:69](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L69)

### `SessionMenuTarget`

Interface.

What the menu reads off the conversation.

```ts
interface SessionMenuTarget
```

**Properties**

- `archived` (`boolean`): Archived.
- `cwd` (`string`): Its folder; `''` for a chat without one.
- `environment?` (`SessionEnvironmentSummary`): Where it runs when not here.
- `favorite?` (`boolean`): Starred.
- `hostId?` (`string`): A remote host's id: its folder is on that host, not on this machine.
- `id` (`string`): The session's key.
- `isMain?` (`boolean`): The orchestration Main: in every space, never moved.
- `spaceId?` (`string`): The space it is in.
- `title` (`string`): Its title.

Source: [ui/src/chat/sidebar/session-menu.ts:27](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L27)

### `SessionSidebarProps`

Interface.

Props of [`SessionSidebar`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SessionSidebar).

```ts
interface SessionSidebarProps<S extends SidebarRowSession>
```

**Type parameters**

- `S` (`extends SidebarRowSession`)

**Properties**

- `activeSessionId` (`S['id'] | null`): The open session.
- `agentNames?` (`Readonly<Record<string, string>>`): Agent names by id: the agent grouping's headers. Default: the composer host's agent catalog. An agent left out shows its id.
- `archiveFilter` (`SessionArchiveFilter`): The archive axis, for the content search.
- `ariaLabel?` (`string`): Names the aside's landmark (several sidebars on one page each need their own).
- `artifactBadges?` (`boolean`): Artifacts on a second line. Default: true.
- `chatsOpen?` (`boolean`): A new chat with no folder shows: the Chats header wears the active chip.
- `chromeInset?` (`SidebarChromeInset`): A drag strip clearing the window's native controls.
- `className?` (`string`): Extra classes on the aside.
- `collapsed` (`boolean`): The user collapsed the sidebar.
- `filter?` (`ReactNode`): Beside the search well: the filter menu.
- `footer?` (`ReactNode`): Under the list: the footer strip.
- `groupBy` (`SidebarGroupBy`): How the rows group.
- `hosts` (`readonly HostView[]`): This machine and the remote hosts (their sections and chips).
- `keyboardBlocked?` (`() => boolean`): The keys belong elsewhere now (a modal is open).
- `listSpaceId` (`string`): The space the list shows (`listSpaceId`).
- `live` (`SidebarLive`): The rows' live parts (`createSidebarLive`, built once).
- `onActivate` (`(sessionId: S['id'] | null) => void`): Opens a session (`null`: the new-session surface).
- `onArchiveProject` (`(project: SidebarProject, label: string) => void`): Archives a project's conversations (`useProjectSessionActions`).
- `onDelete` (`(session: { environment?: SessionEnvironmentSummary; id: S['id']; title: string }) => void`): Deletes a session (ask first: `useConfirmDeleteSession`).
- `onDeleteProject` (`(project: SidebarProject, label: string, onRemoved: () => void) => void`): Deletes a project's conversations; `onRemoved` unpins it once they are gone.
- `onMoveProjectToSpace?` (`(project: SidebarProject, spaceId: string) => Promise<unknown>`): Moves a project to a space. Absent: no move rows on the headers.
- `onMoveSession?` (`(sessionId: S['id']) => void`): Moves a session to another environment of its host (`useMoveSession`, `zidane-ui/git`). Absent: no "Move to…".
- `onMoveToSpace?` (`(sessionId: S['id'], spaceId: string) => Promise<unknown>`): Moves a session to a space. Absent: no move rows.
- `onNewSession` (`() => void`): Starts a new session.
- `onNewSessionIn` (`(path: string) => void`): Starts a new session in a project's folder.
- `onOpenChats?` (`() => void`): Starts a new chat with no folder (the Chats name clicked). Present: the Chats collapse moves to a chevron.
- `onOpenItem?` (`(open: NonNullable<SidebarRowOpen | undefined>, item: ExtensionItem<'sidebar-row'>) => void`): Opens an extension item's target. Default: a session opens, a command runs through the extensions
  host with the item's `args`, a panel focuses in the workspace, a screen opens on the modal layer.
  The wire's ids are already full (`SidebarRowWire`): they are used as they are.
- `onOpenProject?` (`(project: SidebarProjectRef) => void`): Opens a project's home (its name clicked; a server's project too). Present: project names open it and
  their collapse moves to a chevron after their buttons. Absent: names toggle collapse.
- `onRename` (`(sessionId: S['id'], title: string) => Promise<void>`): Renames a session.
- `onSetArchived` (`(sessionId: S['id'], archived: boolean) => Promise<void>`): Archives or restores a session.
- `onSetFavorite` (`(sessionId: S['id'], favorite: boolean) => Promise<void>`): Stars or unstars a session.
- `onViewChange?` (`(patch: Partial<SidebarView>) => void`): Changes the shown space's view: the empty list's reset turns its filters off with it, when
  filters hid every session (needs `query`). Absent: the empty list offers no reset.
- `onWidthCommit` (`(width: number) => void`): A resize ended at this width.
- `openProject?` (`SidebarProjectRef | null`): The project whose home shows: its header wears the active chip.
- `orchestration` (`boolean`): The orchestration Main is on: its session is pinned above the groups. Off: it is hidden.
- `query?` (`SidebarQueryLayer`): The shown space's query layer (`SessionDirectoryView.query`): the grouping and sort that apply
  (a space's, an extension's, the agents'), the row decorations and the extension items. Absent:
  the built-in grouping and sort, no decorations, no items.
- `runDetails?` (`boolean`): What runs are doing in the trailing slot. Default: true.
- `search?` (`SessionContentSearch`): Content search. Absent: titles only.
- `sessions` (`readonly S[]`): The sessions the list shows (the shown space's filters applied).
- `sortBy` (`SidebarSortBy`): How the rows sort inside a group.
- `spaces` (`readonly Space[]`): The spaces.
- `spaceSlide` (`SidebarSpaceSlide | null`): The last user switch of space; the list slides when it showed `listSpaceId`.
- `spacesOn` (`boolean`): Spaces are on.
- `style?` (`CSSProperties`): Inline styles on the aside.
- `width` (`number`): The width the user wants (px).

Source: [ui/src/chat/sidebar/SessionSidebar.tsx:115](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SessionSidebar.tsx#L115)

### `SidebarBadgeFocus`

Interface.

Where a badge's panel opens: the badge's kind and, for one row of its card, that artifact.

```ts
interface SidebarBadgeFocus
```

**Properties**

- `kind` (`string`): The badge's artifact kind.
- `uri?` (`string`): One artifact of it.

Source: [ui/src/chat/sidebar/sidebar-live.tsx:94](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/sidebar-live.tsx#L94)

### `SidebarChipProps`

Interface.

Props of [`SidebarChip`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarChip).

```ts
interface SidebarChipProps
```

**Properties**

- `chip` (`SidebarRowChip`): The chip.
- `className?` (`string`): Extra classes on the chip.
- `style?` (`CSSProperties`): Inline styles on the chip.

Source: [ui/src/chat/sidebar/SidebarDecoration.tsx:17](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarDecoration.tsx#L17)

### `SidebarChromeInset`

Interface.

The space a window's native controls (macOS traffic lights) take at the sheet's top-left, as CSS lengths.

```ts
interface SidebarChromeInset
```

**Properties**

- `height` (`string`): The drag strip's height: its centerline is the controls'.
- `width` (`string`): What the strip keeps clear from the left edge.

Source: [ui/src/chat/sidebar/SidebarFrame.tsx:89](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFrame.tsx#L89)

### `SidebarCollapsedStore`

Interface.

A sidebar's collapsed state (`createSidebarCollapsed`).

```ts
interface SidebarCollapsedStore
```

**Properties**

- `collapsed` (`() => boolean`): Whether the sidebar is collapsed now.
- `reload` (`() => void`): Reads the stored choice again, as a new window would (tests).
- `toggle` (`() => void`): Collapses an expanded sidebar, expands a collapsed one, and keeps the choice. Does nothing while pinned.
- `useCollapsed` (`() => boolean`): Whether the sidebar is collapsed, re-rendering the caller when it toggles.

Source: [ui/src/chat/sidebar/collapsed.ts:14](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/collapsed.ts#L14)

### `SidebarCompactingIndicatorProps`

Interface.

Props of [`SidebarCompactingIndicator`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarCompactingIndicator).

```ts
interface SidebarCompactingIndicatorProps
```

**Properties**

- `className?` (`string`): Extra classes on the root.
- `progress` (`CompactionProgress | null`): The compaction's progress; `null` before it reports any.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/chat/sidebar/SidebarFooter.tsx:202](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFooter.tsx#L202)

### `SidebarDecorationProps`

Interface.

Props of [`SidebarDecoration`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarDecoration).

```ts
interface SidebarDecorationProps
```

**Properties**

- `className?` (`string`): Extra classes on the root.
- `decoration` (`SidebarRowDecoration`): The row's merged decoration.
- `sessionId` (`string`): The session the row lists: a decoration's component gets it as `sessionId`.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/chat/sidebar/SidebarDecoration.tsx:41](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarDecoration.tsx#L41)

### `SidebarFilterMenuProps`

Interface.

Props of [`SidebarFilterMenu`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarFilterMenu).

```ts
interface SidebarFilterMenuProps
```

**Properties**

- `agentNames?` (`Readonly<Record<string, string>>`): Agent names by id. Default: the composer host's agent catalog. An agent left out shows its id.
- `agents?` (`readonly string[]`): The agents the space's sessions run (`AgentProfile.id`): the agent filter's choices. Absent or empty: no agent filter.
- `className?` (`string`): Extra classes on the trigger button.
- `hosts?` (`boolean`): Remote hosts are on: offer the per-host view.
- `onChange` (`(patch: Partial<SidebarView>) => void`): Change some axes of the view.
- `onSaveView?` (`() => void`): Saves the view as a space of its own. Absent: no such row.
- `origin?` (`boolean`): Offer the Origin filter: All, Scheduled (a reminder started the session), Not scheduled. Pass it while
  reminders are on. A view that has an origin picked shows the row anyway, so it can be cleared.
- `projects` (`readonly string[]`): Every project the listed sessions belong to (by folder name).
- `query?` (`Pick<SidebarQueryLayer, 'space' | 'groups' | 'filters' | 'sorts'>`): The space and what the extensions offer it (`SessionDirectoryView.query`): their filters, sorts
  and groupings join the menu, and the space's own grouping and sort are a choice.
- `view` (`SidebarView`): The shown space's view.

Source: [ui/src/chat/sidebar/SidebarFilterMenu.tsx:33](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFilterMenu.tsx#L33)

### `SidebarFooterProps`

Interface.

Props of [`SidebarFooter`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarFooter).

```ts
interface SidebarFooterProps
```

**Properties**

- `className?` (`string`): Extra classes on the strip.
- `onOpenSettings` (`() => void`): Opens Settings.
- `sessionId?` (`string`): The session on screen: its extensions' `sidebar.footer` and `app.statusbar` items show too.
- `settingsNote?` (`SidebarSettingsNote`): Something waiting in Settings.
- `spaces?` (`ReactNode`): The center: the spaces switcher (Spaces on).
- `status?` (`ReactNode`): The status side, left: the app's indicators.
- `style?` (`CSSProperties`): Inline styles on the strip.

Source: [ui/src/chat/sidebar/SidebarFooter.tsx:40](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFooter.tsx#L40)

### `SidebarFrameOptions`

Interface.

What [`useSidebarFrame`](https://zidane.si/docs/reference/ui-chat-sidebar.md#useSidebarFrame) reads.

```ts
interface SidebarFrameOptions
```

**Properties**

- `collapsed` (`boolean`): The user collapsed the sidebar.
- `defaultWidth?` (`number`): A double-click on the handle goes back to this width. Default: the appearance default.
- `maxWidth?` (`number`): The widest drag without a layout budget. Default: the appearance limit.
- `minWidth?` (`number`): The narrowest drag. Default: the appearance limit.
- `onWidthCommit` (`(width: number) => void`): A drag ended at this width: keep it.
- `width` (`number`): The width the user wants (px).

Source: [ui/src/chat/sidebar/SidebarFrame.tsx:24](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFrame.tsx#L24)

### `SidebarFrameProps`

Interface.

Props of [`SidebarFrame`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarFrame).

```ts
interface SidebarFrameProps
```

**Properties**

- `ariaLabel?` (`string`): Names the aside's landmark (several sidebars on one page each need their own). Absent: unnamed.
- `children` (`ReactNode`): The sheet's content, top to bottom.
- `chromeInset?` (`SidebarChromeInset`): A drag strip clearing the window's native controls. Absent: none.
- `className?` (`string`): Extra classes on the aside.
- `frame` (`SidebarFrameState`): The frame's state (`useSidebarFrame`).
- `style?` (`CSSProperties`): Inline styles on the aside.

Source: [ui/src/chat/sidebar/SidebarFrame.tsx:97](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFrame.tsx#L97)

### `SidebarFrameState`

Interface.

The frame's state, for [`SidebarFrame`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarFrame).

```ts
interface SidebarFrameState
```

**Properties**

- `asideRef` (`RefObject<HTMLElement | null>`): The aside, for the drag's live CSS var.
- `drag` (`ResizeDrag`): The resize handle's props and whether a drag is going.
- `mounted` (`boolean`): The aside is mounted (open, or animating shut).
- `open` (`boolean`): Fully open (not entering or closing).
- `width` (`number`): The width shown (px).

Source: [ui/src/chat/sidebar/SidebarFrame.tsx:40](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFrame.tsx#L40)

### `SidebarGroupHeaderProps`

Interface.

Props of [`SidebarGroupHeader`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarGroupHeader).

```ts
interface SidebarGroupHeaderProps
```

**Properties**

- `canArchive` (`boolean`): Some of the project's listed conversations are not archived yet.
- `className?` (`string`): Extra classes on the header.
- `groupBy` (`SidebarGroupBy`): The view: which glyph a header shows, and whether its groups are folders.
- `icon?` (`ProjectIcon`): The project's picked icon.
- `onArchiveProject` (`(project: SidebarProject, label: string) => void`): Archives the project's conversations (after a confirmation).
- `onAssignIcon` (`(fullPath: string, icon: ProjectIcon | null) => void`): Picks (or, with `null`, resets) a project's icon.
- `onDeleteProject` (`(project: SidebarProject, label: string) => void`): Deletes the project's conversations (after a confirmation).
- `onMoveProject` (`(project: SidebarProject, spaceId: string) => void`): Moves the project to another space.
- `onNewSessionIn` (`(fullPath: string) => void`): Starts a session in the project's folder.
- `onOpenChats?` (`() => void`): Starts a new chat with no folder from the Chats name. Absent: the name toggles collapse.
- `onOpenProject?` (`(project: SidebarProjectRef) => void`): Opens a project folder's home. Absent: the name toggles collapse.
- `onSetPinned` (`(fullPath: string, pinned: boolean) => void`): Pins or unpins the project.
- `onToggle` (`(id: string) => void`): Collapses or expands the group.
- `open?` (`boolean`): This project's home, or for Chats a new chat with no folder, is the one shown.
- `pinned` (`boolean`): The project is pinned at the top of the list.
- `row` (`{ chats?: boolean; collapsed: boolean; favorites?: boolean; fullPath?: string; id: string; isGitRepo?: boolean; kind: 'header'; label: string; pinned?: boolean } & { hostId?: string; repoKey?: string }`): The header.
- `server?` (`HostView`): The remote host a server folder's header names, as a badge that opens the host's settings.
- `spaceId` (`string`): The space the list shows: where the project moves from.
- `spaces` (`readonly Space[] | null`): The spaces to move the project between while Spaces is on; `null` off.
- `style?` (`CSSProperties`): Inline styles on the header.

Source: [ui/src/chat/sidebar/SidebarGroupHeader.tsx:44](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarGroupHeader.tsx#L44)

### `SidebarHostProviderProps`

Interface.

Props of [`SidebarHostProvider`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarHostProvider).

```ts
interface SidebarHostProviderProps
```

**Properties**

- `children` (`ReactNode`): The app's components.
- `host` (`SidebarHost`): The platform's sidebar capabilities.
- `notify?` (`(message: string) => void`): Tells the user a command's outcome or failure. Default: the browser's `alert`.

Source: [ui/src/chat/sidebar/SidebarHostProvider.tsx:24](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarHostProvider.tsx#L24)

### `SidebarKeyboardNavOptions`

Interface.

What [`useSidebarKeyboardNav`](https://zidane.si/docs/reference/ui-chat-sidebar.md#useSidebarKeyboardNav) reads.

```ts
interface SidebarKeyboardNavOptions<K extends string>
```

**Type parameters**

- `K` (`extends string`)

**Properties**

- `activeSessionId` (`K | null`): The open session.
- `blocked?` (`() => boolean`): The keys belong elsewhere now (a modal is open). Read at each key.
- `listRef` (`RefObject<HTMLElement | null>`): The list that holds the rows (`[data-session-id]`).
- `onActivate` (`(sessionId: K | null) => void`): Opens a session (`null`: none, the new-session surface).
- `sessions` (`readonly { id: K }[]`): The sessions in on-screen order.

Source: [ui/src/chat/sidebar/useSidebarKeyboardNav.ts:30](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSidebarKeyboardNav.ts#L30)

### `SidebarLive`

Interface.

The live row parts [`createSidebarLive`](https://zidane.si/docs/reference/ui-chat-sidebar.md#createSidebarLive) returns.

```ts
interface SidebarLive
```

**Properties**

- `RowArtifacts` (`NamedExoticComponent<SidebarRowArtifactsProps>`): Line 2: the badges, when the session has some.
- `RowMeta` (`NamedExoticComponent<SidebarRowMetaProps>`): Line 1's trailing slot.
- `SessionStatusDot` (`NamedExoticComponent<{ override?: SessionDotState; sessionId: string }>`): A session's live dot; `override` forces a state (previews).
- `useSessionDotState` (`(sessionId: string) => SessionDotState`): A session's dot state (a hook).

Source: [ui/src/chat/sidebar/sidebar-live.tsx:165](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/sidebar-live.tsx#L165)

### `SidebarLiveOptions`

Interface.

The app's live signals the rows read. Each `use…` member is a hook, called once per row that needs it.

```ts
interface SidebarLiveOptions
```

**Properties**

- `activity` (`SessionActivityStore`): What each session's run is doing (`createSessionActivity`).
- `badges` (`SessionBadgesStore`): Each session's artifact badges (`createSessionBadges`).
- `estimates?` (`RunEstimatesStore`): How long each session's run has left (`createRunEstimates`): shown instead of the elapsed time while known. Absent: the elapsed time.
- `openBadge?` (`(sessionId: string, panel: string | undefined, focus: SidebarBadgeFocus) => void`): Opens a badge's panel (`badge.panel`, else the app's default) focused on it. Absent: a badge click only selects the row.
- `useHost?` (`(hostId: string | undefined) => HostView | undefined`): A remote host by id, for its chip. Absent: no host chip.
- `useNotification?` (`(sessionId: string) => 'error' | 'completed' | null`): How the run that ended while the session was not open ended. Absent: never.
- `usePending?` (`(sessionId: string) => boolean`): An approval, plan or question of this window waits on the user. Absent: never.
- `usePresence?` (`(sessionId: string) => Pick<SessionPresence, 'attention' | 'running' | 'windows'> | null`): The daemon's presence for the session. Absent: none.
- `useRunElapsedSec` (`(sessionId: string, live: boolean, intervalMs: number) => number`): The run's elapsed seconds, ticking every `intervalMs` while `live`.
- `useRunning` (`(sessionId: string) => boolean`): Whether this window sees the session's run going.

Source: [ui/src/chat/sidebar/sidebar-live.tsx:102](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/sidebar-live.tsx#L102)

### `SidebarProject`

Interface.

A project's place: its folder and the space it is listed in.

```ts
interface SidebarProject
```

**Properties**

- `path` (`string`): The project's folder.
- `repoKey?` (`string`): Its repository, when its group also lists the repository's sessions on other machines.
- `spaceId` (`string`): The space the list shows.

Source: [ui/src/chat/sidebar/session-menu.ts:388](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L388)

### `SidebarProjectRef`

Interface.

A project folder as the sidebar names it: its path, and the server it is on (absent: this computer).

```ts
interface SidebarProjectRef
```

**Properties**

- `hostId?` (`string`): The saved server; absent: this computer.
- `path` (`string`): The folder.

Source: [ui/src/chat/sidebar/SidebarGroupHeader.tsx:31](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarGroupHeader.tsx#L31)

### `SidebarRowArtifactsProps`

Interface.

Props of the badge line (`SidebarLive.RowArtifacts`).

```ts
interface SidebarRowArtifactsProps
```

**Properties**

- `cards?` (`BadgeCardPlacement`, default `'beside'`): Where a badge's card opens: beside the row, top-aligned with it (`'beside'`, the sidebar: never over the
  rows below), or under the badge itself (`'below'`, a wide list where the row's edge is far away).
- `cwd?` (`string`): The chat's folder: which extensions' badge actions apply.
- `enabled` (`boolean`): Read and show its artifact badges (run details and artifacts on).
- `environment?` (`SessionEnvironmentSummary`): Where the session runs when not here, after the project (not an artifact either).
- `hostId?` (`string`): A remote host's session: its name leads the line, whatever `enabled` says.
- `onArrival` (`(fresh: boolean) => void`): Hears whether a badge just arrived (the row sweeps).
- `onSelect?` (`(sessionId: string) => void`): Selects the row (a badge click opens the chat too).
- `project?` (`RowProject`): Shown first, whatever `enabled` says (it is not an artifact).
- `sessionId` (`string`): The session.

Source: [ui/src/chat/sidebar/sidebar-live.tsx:136](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/sidebar-live.tsx#L136)

### `SidebarRowHandlers`

Interface.

What a row does; one stable bag for every row of a list, so the rows' memo holds.

```ts
interface SidebarRowHandlers
```

**Properties**

- `onCloseMenu` (`(sessionId: string) => void`): Its menu closed.
- `onDelete` (`(sessionId: string, title: string, environment?: SessionEnvironmentSummary) => void`): Deletes the session (after a confirmation).
- `onMoveSession?` (`(sessionId: string) => void`): Moves it to another environment of its host ("Move to…"). Absent: no row.
- `onMoveToSpace` (`(sessionId: string, spaceId: string) => void`): Moves it to a space.
- `onOpenMenu` (`(sessionId: string) => void`): Its menu opened.
- `onRenameCancel` (`() => void`): Abandons the rename.
- `onRenameCommit` (`() => void | Promise<void>`): Confirms the rename.
- `onRenameValueChange` (`(value: string) => void`): The rename field's text changed.
- `onRetryEnvironment` (`(sessionId: string) => void`): Sets its failed environment up again.
- `onRunEnvironmentAction` (`(sessionId: string, actionId: string, label: string) => void`): Runs one of its environment's commands.
- `onSelect` (`(sessionId: string) => void`): Opens the session.
- `onSetArchived` (`(sessionId: string, archived: boolean) => void`): Archives or restores it.
- `onSetFavorite` (`(sessionId: string, favorite: boolean) => void`): Stars or unstars it.
- `onStartRename` (`(sessionId: string, currentTitle: string) => void`): Starts renaming the session.

Source: [ui/src/chat/sidebar/SidebarSessionRow.tsx:50](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarSessionRow.tsx#L50)

### `SidebarRowMetaProps`

Interface.

Props of the trailing slot (`SidebarLive.RowMeta`).

```ts
interface SidebarRowMetaProps
```

**Properties**

- `details` (`boolean`): Run details on: what the run does; off: "Working".
- `sessionId` (`string`): The session.
- `updatedAt` (`number`): Its last activity (ms).

Source: [ui/src/chat/sidebar/sidebar-live.tsx:126](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/sidebar-live.tsx#L126)

### `SidebarRowSession`

Interface.

A session as the sidebar's rows read it: the list's session plus where it runs when not here.

```ts
interface SidebarRowSession extends SidebarListSession
```

**Properties**

- `agentId?` (`string`, from `SidebarListSession`): The agent profile it runs (`AgentProfile.id`): the agent grouping and filter read it.
- `archived?` (`boolean`, from `SidebarListSession`): Archived: listed only under the archived filter.
- `createdAt` (`number`, from `SidebarListSession`): Epoch ms.
- `cwd` (`string`, from `SidebarListSession`): The folder its tools run in.
- `environment?` (`SessionEnvironmentSummary`): Its environment, when it runs somewhere else than this machine's folder.
- `facets?` (`Readonly<Record<string, unknown>>`, from `SidebarListSession`): What extensions computed for it, keyed `<extensionId>.<key>` (a query reads one as
  `facet.<extensionId>.<key>`). Absent: none, or a host that sends none.
- `favorite?` (`boolean`, from `SidebarListSession`): Starred: listed under Favorites.
- `hostId?` (`string`, from `SidebarListSession`): The remote host it lives on; undefined on this machine.
- `id` (`string`, from `SidebarListSession`): The session's key.
- `isGitRepo?` (`boolean`, from `SidebarListSession`): Its folder is a git repository.
- `isMain?` (`boolean`, from `SidebarListSession`): The orchestration main session.
- `projectRoot?` (`string`, from `SidebarListSession`): The repository or project folder it belongs to, when known.
- `repoKey?` (`string`, from `SidebarListSession`): The repository its folder is a checkout of (`github.com/owner/repo`). Sessions of one
  repository on several machines are listed under one project.
- `scheduleId?` (`string`, from `SidebarListSession`): The reminder that started it (zidane's `SessionMeta.scheduleId`): the clock mark and the Origin filter read it.
- `spaceId?` (`string`, from `SidebarListSession`): The space it belongs to; undefined in the default space.
- `status` (`ChatSessionStatus`, from `SidebarListSession`): Whether a run is going, and how the last one ended.
- `title` (`string`, from `SidebarListSession`): What the row shows.
- `updatedAt` (`number`, from `SidebarListSession`): Epoch ms of the last activity.

Source: [ui/src/chat/sidebar/SessionSidebar.tsx:101](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SessionSidebar.tsx#L101)

### `SidebarRowViewProps`

Interface.

Props of [`SidebarRowView`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarRowView).

```ts
interface SidebarRowViewProps
```

**Properties**

- `childCount` (`number`): How many sessions it lists.
- `children?` (`ReactNode`): Its child session rows, drawn under it while expanded.
- `className?` (`string`): Extra classes on the root.
- `collapsed` (`boolean`): Its sessions are hidden.
- `entry` (`ExtensionItem<'sidebar-row'>`): The item.
- `onOpen` (`(entry: ExtensionItem<'sidebar-row'>) => void`): Opens the item's target.
- `onRunAction?` (`(entry: ExtensionItem<'sidebar-row'>, action: SidebarRowActionWire) => void`): Runs one of its actions. Absent: the actions show disabled.
- `onToggle` (`(rowId: string) => void`): Shows or hides its sessions.
- `rowId` (`string`): The row's id (`i-<item id>`): collapse is kept under it.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/chat/sidebar/SidebarRowView.tsx:35](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarRowView.tsx#L35)

### `SidebarSearchRowProps`

Interface.

Props of [`SidebarSearchRow`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarSearchRow).

```ts
interface SidebarSearchRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the row.
- `filter?` (`ReactNode`): Beside the well: the filter menu.
- `onChange` (`(next: string) => void`): The query changed (cleared with Escape or the clear button).
- `style?` (`CSSProperties`): Inline styles on the row.
- `value` (`string`): The query typed so far.

Source: [ui/src/chat/sidebar/SidebarSearchRow.tsx:16](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarSearchRow.tsx#L16)

### `SidebarSessionRowProps`

Interface.

Props of [`SidebarSessionRow`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarSessionRow).

```ts
interface SidebarSessionRowProps extends SidebarRowHandlers
```

**Properties**

- `archived` (`boolean`): Archived.
- `artifactBadges` (`boolean`): Artifacts on a second line (run details and artifacts both on).
- `className?` (`string`): Extra classes on the row.
- `cwd?` (`string`): The session's folder (`''`: none): which extensions' references its title shows.
- `decoration?` (`SidebarRowDecoration | null`): What extensions put on the row (`createDecorator`): an icon and chips beside the title, a subtitle.
- `environment?` (`SessionEnvironmentSummary`): Non-local execution environment: badge, plus a retry action once it failed.
- `excerpt?` (`string`): A content-search excerpt under the title, with the query highlighted. Regular rows keep their 28px.
- `excerptQuery?` (`string`): The query the excerpt highlights.
- `favorite?` (`boolean`): Starred.
- `hostBadge?` (`boolean`): Show the host chip on the badge line (off under a header that already names the host).
- `hostId?` (`string`): A remote host's id: no Finder for its folder.
- `isActive` (`boolean`): The open session.
- `isMain?` (`boolean`): The orchestration Main: in every space, never moved.
- `isRenaming` (`boolean`): Its title is being edited.
- `live` (`SidebarLive`): The app's live row parts (`createSidebarLive`, built once).
- `menuOpen` (`boolean`): Its menu is the open one.
- `onCloseMenu` (`(sessionId: string) => void`, from `SidebarRowHandlers`): Its menu closed.
- `onDelete` (`(sessionId: string, title: string, environment?: SessionEnvironmentSummary) => void`, from `SidebarRowHandlers`): Deletes the session (after a confirmation).
- `onMoveSession?` (`(sessionId: string) => void`, from `SidebarRowHandlers`): Moves it to another environment of its host ("Move to…"). Absent: no row.
- `onMoveToSpace` (`(sessionId: string, spaceId: string) => void`, from `SidebarRowHandlers`): Moves it to a space.
- `onOpenMenu` (`(sessionId: string) => void`, from `SidebarRowHandlers`): Its menu opened.
- `onRenameCancel` (`() => void`, from `SidebarRowHandlers`): Abandons the rename.
- `onRenameCommit` (`() => void | Promise<void>`, from `SidebarRowHandlers`): Confirms the rename.
- `onRenameValueChange` (`(value: string) => void`, from `SidebarRowHandlers`): The rename field's text changed.
- `onRetryEnvironment` (`(sessionId: string) => void`, from `SidebarRowHandlers`): Sets its failed environment up again.
- `onRunEnvironmentAction` (`(sessionId: string, actionId: string, label: string) => void`, from `SidebarRowHandlers`): Runs one of its environment's commands.
- `onSelect` (`(sessionId: string) => void`, from `SidebarRowHandlers`): Opens the session.
- `onSetArchived` (`(sessionId: string, archived: boolean) => void`, from `SidebarRowHandlers`): Archives or restores it.
- `onSetFavorite` (`(sessionId: string, favorite: boolean) => void`, from `SidebarRowHandlers`): Stars or unstars it.
- `onStartRename` (`(sessionId: string, currentTitle: string) => void`, from `SidebarRowHandlers`): Starts renaming the session.
- `project?` (`RowProject`): In the favorites section: the project, first on the badge line (keep its identity stable for the memo).
- `renameValue` (`string`): The rename field's text.
- `runDetails` (`boolean`): Run details in the trailing slot; off: "Working".
- `scheduled?` (`boolean`): A reminder started it (zidane's `scheduleId`): a clock mark beside the title.
- `sessionId` (`string`): The session's key.
- `spaceId?` (`string`): The space it is in.
- `spaces` (`readonly Space[] | null`): The spaces to move it between while Spaces is on; `null` off.
- `style?` (`CSSProperties`): Inline styles on the row.
- `title` (`string`): Its title.
- `updatedAt?` (`number`): Last activity (ms): the trailing relative time. Absent for search results.

Source: [ui/src/chat/sidebar/SidebarSessionRow.tsx:82](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarSessionRow.tsx#L82)

### `SidebarSettingsNote`

Interface.

Something waiting in Settings: the gear's dot and its name.

```ts
interface SidebarSettingsNote
```

**Properties**

- `text` (`string`): Said after "Settings" in the gear's name.
- `warn?` (`boolean`): A warning (a failed update) rather than news.

Source: [ui/src/chat/sidebar/SidebarFooter.tsx:32](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFooter.tsx#L32)

### `SidebarSignInPromptProps`

Interface.

Props of [`SidebarSignInPrompt`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarSignInPrompt).

```ts
interface SidebarSignInPromptProps
```

**Properties**

- `className?` (`string`): Extra classes on the button.
- `onClick` (`() => void`): Opens the sign-in.
- `style?` (`CSSProperties`): Inline styles on the button.

Source: [ui/src/chat/sidebar/SidebarFooter.tsx:114](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFooter.tsx#L114)

### `SidebarSpaceSlide`

Interface.

The space switch that showed the list's space: the list slides that way.

```ts
interface SidebarSpaceSlide
```

**Properties**

- `direction` (`'next' | 'prev'`): Toward a later space, or an earlier one.
- `spaceId` (`string`): The space switched to.

Source: [ui/src/chat/sidebar/SessionSidebar.tsx:107](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SessionSidebar.tsx#L107)

### `SidebarToggleButtonProps`

Interface.

Props of [`SidebarToggleButton`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarToggleButton).

```ts
interface SidebarToggleButtonProps
```

**Properties**

- `className?` (`string`): Positioning and drag-region classes.
- `collapsed` (`boolean`): The user collapsed the sidebar: the name says Expand.
- `onClick` (`() => void`): Toggles it.
- `style?` (`CSSProperties`): Inline positioning.

Source: [ui/src/chat/sidebar/SidebarToggleButton.tsx:14](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarToggleButton.tsx#L14)

### `SidebarUsageIndicatorProps`

Interface.

Props of [`SidebarUsageIndicator`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SidebarUsageIndicator).

```ts
interface SidebarUsageIndicatorProps
```

**Properties**

- `account?` (`string`): The account the session is pinned to, when it is.
- `className?` (`string`): Extra classes on the chip.
- `providerKey?` (`string`): The open session's provider. Absent: nothing renders.
- `snapshots` (`readonly ProviderUsageSnapshot[]`): The providers' usage snapshots (`useProviderUsage`, `zidane-ui/session`).
- `style?` (`CSSProperties`): Inline styles on the chip.

Source: [ui/src/chat/sidebar/SidebarFooter.tsx:149](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarFooter.tsx#L149)

### `SpaceGlyphProps`

Interface.

Props of [`SpaceGlyph`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SpaceGlyph).

```ts
interface SpaceGlyphProps
```

**Properties**

- `size?` (`number`): Side of the square in px. Defaults to 18.
- `space` (`Pick<Space, 'icon' | 'name'> & Pick<SidebarSpace, 'glyph'>`): The space whose icon (an extension's icon class, its emoji or image, else its first letter) shows.

Source: [ui/src/chat/sidebar/SpaceSwitcher.tsx:36](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SpaceSwitcher.tsx#L36)

### `SpacesSectionProps`

Interface.

Props of [`SpacesSection`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SpacesSection).

```ts
interface SpacesSectionProps
```

**Properties**

- `className?` (`string`): Extra classes on the root.
- `renderDefaults?` (`(space: Space, update: (patch: (space: Space) => Space) => void) => ReactNode`): What a space shows under its name row (its defaults for new sessions). `update` patches the space in
  the list. Absent: nothing.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/chat/sidebar/SpacesSection.tsx:27](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SpacesSection.tsx#L27)

### `SpaceSwitcherProps`

Interface.

Props of [`SpaceSwitcher`](https://zidane.si/docs/reference/ui-chat-sidebar.md#SpaceSwitcher).

```ts
interface SpaceSwitcherProps
```

**Properties**

- `activeId` (`string`): The space shown.
- `className?` (`string`): Extra classes on the toolbar.
- `hidden?` (`readonly (SidebarSpace | Space)[]`): The spaces hidden from the switcher, offered in an icon's menu to show again.
- `onHide?` (`(spaceId: string, hidden: boolean) => void`): Hides a space or shows it again. Absent: no hide or show rows.
- `onMove?` (`(spaceId: string, delta: -1 | 1) => void`): Moves a space one place left (-1) or right (1). Absent: no move rows.
- `onSelect` (`(spaceId: string) => void`): Show another space.
- `spaces` (`readonly (SidebarSpace | Space)[]`): The spaces in switcher order (`SessionDirectoryState.switcherSpaces`).
- `style?` (`CSSProperties`): Inline styles on the toolbar.

Source: [ui/src/chat/sidebar/SpaceSwitcher.tsx:103](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SpaceSwitcher.tsx#L103)

## Types

### `BadgeCardPlacement`

Type.

Where a row badge's card opens (`SidebarRowArtifactsProps.cards`).

```ts
type BadgeCardPlacement = 'beside' | 'below'
```

Source: [ui/src/chat/sidebar/sidebar-live.tsx:162](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/sidebar-live.tsx#L162)

### `SessionContentSearch`

Type.

The host's content search; absent, only titles match.

```ts
type SessionContentSearch = (query: string, filter: { archive: SessionArchiveFilter }) => Promise<readonly SessionSearchHit[]>
```

Source: [ui/src/chat/sidebar/useSessionSearch.ts:20](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/useSessionSearch.ts#L20)

### `SessionMenuSurfaceActions`

Type.

Which actions [`useSessionMenuItems`](https://zidane.si/docs/reference/ui-chat-sidebar.md#useSessionMenuItems) needs from its surface; the environment rows come from the host.

```ts
type SessionMenuSurfaceActions = Omit<SessionMenuActions, 'retryEnvironment' | 'runEnvironmentAction'>
```

Source: [ui/src/chat/sidebar/session-menu.ts:288](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/session-menu.ts#L288)

### `SidebarHeaderRow`

Type.

A group header row.

```ts
type SidebarHeaderRow = Extract<SidebarListRow, { kind: 'header' }>
```

Source: [ui/src/chat/sidebar/SidebarGroupHeader.tsx:41](https://github.com/Tahul/zidane/blob/main/ui/src/chat/sidebar/SidebarGroupHeader.tsx#L41)
