# zidane-ui/session

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

## Components

### `ArtifactRowChips`

Component.

Renders an artifact row's lead, diff and facts as chips; nothing when there are none.

```ts
function ArtifactRowChips(props: ArtifactRowChipsProps): Element | null
```

**Parameters**

- `props` (`ArtifactRowChipsProps`): The `lead`, `diff`, `facts`, `className` and `style`.

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra classes on the root.
- `diff?` (`{ added: number; files?: number; href?: string; removed: number }`, from `ArtifactRowChipsFields`): A change size.
- `facts?` (`readonly ExtensionArtifactRowFact[]`, from `ArtifactRowChipsFields`): Quiet facts after the diff.
- `lead?` (`{ href?: string; mono?: boolean; text: string }`, from `ArtifactRowChipsFields`): A short id (a commit hash, `owner/repo#12`); `mono` for hashes.
- `style?` (`CSSProperties`): Inline styles on the root.

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

### `ArtifactsPanel`

Component.

Renders a session's artifacts by kind, with a count summary under them.

```ts
function ArtifactsPanel(props: ArtifactsPanelProps): Element
```

**Parameters**

- `props` (`ArtifactsPanelProps`): The `sessionId`, an optional `focus`, path handlers, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root.
- `focus?` (`ArtifactsPanelFocus | null`): Brings a group or an artifact into view and marks it, until the next focus.
- `onOpenPath?` (`(path: string, event?: ArtifactOpenEvent) => Promise<boolean>`): Opens a path (a file, a folder). Resolves `false` when it is unavailable. Absent: path rows are text.
- `onRevealPath?` (`(path: string) => void`): Shows a path in the file manager. Absent: no Reveal item.
- `remoteName?` (`string | null`): The machine the session's paths are on when it is not this one: a path row says so instead of opening.
- `sessionId` (`string`): The session whose artifacts to list.
- `style?` (`CSSProperties`): Inline styles on the root.

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

### `DiffFacts`

Component.

A change size: `+added` green, `−removed` red (a zero muted), then the files icon and count.

```ts
function DiffFacts(props: DiffFactsProps): Element
```

**Parameters**

- `props` (`DiffFactsProps`): The counts, an optional `href`, `className` and `style`.

**Returns** `Element`

**Props**

- `added` (`number`): Lines added.
- `className?` (`string`): Extra classes on the root.
- `files?` (`number`): Files changed. Absent: not shown.
- `href?` (`string`): Makes it a link (a pull request's files tab).
- `removed` (`number`): Lines removed.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/session/ArtifactRowChips.tsx:108](https://github.com/Tahul/zidane/blob/main/ui/src/session/ArtifactRowChips.tsx#L108)

### `DiffFileTree`

Component.

The changed files as a tree of folder and file rows, each with its +/- counts.

```ts
const DiffFileTree: MemoExoticComponent<(__namedParameters: DiffFileTreeProps) => Element>
```

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

### `InboxAttention`

Component.

Badges every session's Inbox tab with its pending requests and opens it for a live request in the active session.

```ts
function InboxAttention(props: InboxAttentionProps): null
```

**Parameters**

- `props` (`InboxAttentionProps`): The [`InboxAttentionProps`](https://zidane.si/docs/reference/ui-session.md#InboxAttentionProps).

**Returns** `null`

**Props**

- `actions?` (`AttentionActions`, from `PanelAttentionProps`): Where badges go. Default: the `WorkspaceProvider` above (none: nothing happens). Keep it stable.
- `reveal?` (`boolean`, default `true`): A live request may open the panel and focus the Inbox. False (an overlay panel that is not showing): only the
  tab switches and the badge carries it.
- `sessionId` (`string | null`, from `PanelAttentionProps`): The active session, or `null`.

Source: [ui/src/session/PanelAttention.tsx:63](https://github.com/Tahul/zidane/blob/main/ui/src/session/PanelAttention.tsx#L63)

### `PlanTracker`

Component.

Renders one plan with its step edits, retry, add box, tally, and the plan's stop, resume and drop.

```ts
function PlanTracker(props: PlanTrackerProps): Element
```

**Parameters**

- `props` (`PlanTrackerProps`): The [`PlanTrackerProps`](https://zidane.si/docs/reference/ui-session.md#PlanTrackerProps).

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `hideHeader?` (`boolean`): Leave out the title row (a "Recent" row opened already shows it).
- `plan` (`PlanView`): The plan to show.
- `sessionId` (`string`): The session the plan belongs to.
- `style?` (`CSSProperties`): Inline styles on the root element.

Source: [ui/src/session/PlanTracker.tsx:98](https://github.com/Tahul/zidane/blob/main/ui/src/session/PlanTracker.tsx#L98)

### `ProjectHome`

Component.

Renders the project home.

```ts
function ProjectHome(props: ProjectHomeProps): Element
```

**Parameters**

- `props` (`ProjectHomeProps`): The [`ProjectHomeProps`](https://zidane.si/docs/reference/ui-session.md#ProjectHomeProps).

**Returns** `Element`

**Props**

- `blocksUnavailable?` (`boolean`): The project's blocks can't load here (a project on a server): say so instead.
- `className?` (`string`): Extra classes on the root.
- `cwd` (`string`): The folder the blocks are for; `''` for the home of no project.
- `defaultBlocks?` (`readonly string[]`): The blocks shown before the user adds any (panel ids); the rest wait in Add block. Absent: every block.
- `now?` (`Date`): The moment the greeting describes. Default: when it mounts.
- `onOpenFiles?` (`() => void`): A click on the project's path chip: open the Files panel. Absent: the chip is plain text.
- `onOpenInEditor?` (`(path: string) => void`): "Open in editor" in the path chip's right-click menu.
- `onOpenPath?` (`(path: string, event?: PanelOpenEvent) => void`): Opens a block row's path.
- `onOpenRepo?` (`() => void`): A click on the repository chip (its web page, or the working tree). Absent: the chip is plain text.
- `onOpenSession?` (`(sessionId: string) => void`): Opens a block row's session.
- `onRevealPath?` (`(path: string) => void`): "Open in Finder" in the path chip's right-click menu.
- `onStartSession?` (`(start: PanelStartSession) => Promise<ProjectHomeStartResult>`): A block row's "start a session" (a pull request's Open in worktree, a ticket's Open here): sets up the new-chat
  draft (`useStartFromPanel`, `zidane-ui/git`). A failure shows on the block. Absent: those buttons are not offered.
- `panels?` (`WorkspacePanels`): Where blocks come from. Absent: no blocks (see `blocksUnavailable`).
- `project?` (`ProjectHomeProject`): The project. Absent: the home of no project, headed by the greeting.
- `projectKey` (`string`): Key the arrangement is kept under (the project root, qualified by its host).
- `style?` (`CSSProperties`): Inline styles on the root.
- `switcher?` (`ProjectHomeSwitcher`): A click on the project's name opens this menu of projects. Absent: the name is plain text.

Source: [ui/src/session/ProjectHome.tsx:170](https://github.com/Tahul/zidane/blob/main/ui/src/session/ProjectHome.tsx#L170)

### `ProviderUsageProvider`

Component.

Runs the refresh cadence of the host's subscription usage for the components below.

```ts
function ProviderUsageProvider(props: ProviderUsageProviderProps): Element
```

**Parameters**

- `props` (`ProviderUsageProviderProps`): `autoLoad` and the `children`.

**Returns** `Element`

**Props**

- `autoLoad?` (`boolean`): Probe in the background (every minute while visible and focused). Off: only a manual refresh fetches. Default `true`.
- `children` (`ReactNode`): The components that read usage.

Source: [ui/src/session/ProviderUsageProvider.tsx:61](https://github.com/Tahul/zidane/blob/main/ui/src/session/ProviderUsageProvider.tsx#L61)

### `QueueAttention`

Component.

Badges the Queue tab with the active session's queued messages; hidden at zero.

```ts
function QueueAttention(props: PanelAttentionProps): null
```

**Parameters**

- `props` (`PanelAttentionProps`): The [`PanelAttentionProps`](https://zidane.si/docs/reference/ui-session.md#PanelAttentionProps).

**Returns** `null`

**Props**

- `actions?` (`AttentionActions`): Where badges go. Default: the `WorkspaceProvider` above (none: nothing happens). Keep it stable.
- `sessionId` (`string | null`): The active session, or `null`.

Source: [ui/src/session/PanelAttention.tsx:106](https://github.com/Tahul/zidane/blob/main/ui/src/session/PanelAttention.tsx#L106)

### `QueueTab`

Component.

Renders a session's queue: the summary, the rows and their inline editor; an empty state without entries.

```ts
function QueueTab(props: QueueTabProps): Element
```

**Parameters**

- `props` (`QueueTabProps`): The `sessionId`, optional push / drop / edit handlers, the `attachments` slot, `className` and `style`.

**Returns** `Element`

**Props**

- `attachments?` (`QueueAttachmentsSlot`): Attachment editing in the editor. Absent: stored attachments are kept as they are, none can be added.
- `className?` (`string`): Extra classes on the root.
- `onDrop?` (`(id: string) => void`): Drops an entry. Default: `queue.remove`.
- `onEdit?` (`(sessionId: string, from: string, to: string) => void`): An entry's text is about to change from `from` to `to`.
- `onPush?` (`(id: string, text: string) => void`): Pushes an entry (with the text the host now holds) into the run. Default: `queue.pushNow`.
- `sessionId` (`string`): The session whose queue to show.
- `style?` (`CSSProperties`): Inline styles on the root.

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

### `RecentPlans`

Component.

The Inbox's "Recent" plans: one line each (title, how it ended, its tally), opened in place to read its steps.

```ts
function RecentPlans(props: RecentPlansProps): Element
```

**Parameters**

- `props` (`RecentPlansProps`): The [`RecentPlansProps`](https://zidane.si/docs/reference/ui-session.md#RecentPlansProps).

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `plans` (`readonly PlanView[]`): Closed plans, newest first (`useInboxPlans`).
- `sessionId` (`string`): The session the plans belong to.
- `style?` (`CSSProperties`): Inline styles on the root element.

Source: [ui/src/session/PlanTracker.tsx:390](https://github.com/Tahul/zidane/blob/main/ui/src/session/PlanTracker.tsx#L390)

### `RemindersPanel`

Component.

Renders the reminders of a session, or all of them, with the create form.

```ts
function RemindersPanel(props: RemindersPanelProps): Element | null
```

**Parameters**

- `props` (`RemindersPanelProps`): The `sessionId`, `initialScope`, `className` and `style`.

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra classes on the root.
- `initialScope?` (`RemindersScope`, default `'session'`): The list it opens on.
- `onOpenSession?` (`(sessionId: string) => void`): Opens a session: a reminder that goes to another session links to it. Default: the `OpenSessionContext` opener.
- `sessionId` (`string`): The session the panel is beside: its reminders, and where a new one goes.
- `style?` (`CSSProperties`): Inline styles on the root.

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

### `RunningWorkDialog`

Component.

Renders a session's running work with per-row and all-at-once cancel.

```ts
function RunningWorkDialog(props: RunningWorkDialogProps): Element
```

**Parameters**

- `props` (`RunningWorkDialogProps`): The `sessionId`, `onClose`, an optional `showTerminal`, `renderShell`, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the default shell.
- `onClose` (`() => void`): Closes the dialog.
- `renderShell?` (`RenderSessionShell`): The app's modal shell. Default: [`SessionShell`](https://zidane.si/docs/reference/ui-session.md#SessionShell).
- `sessionId` (`string`): The session whose work to show.
- `showTerminal?` (`(item: RunningWorkItem) => (() => void) | null`): The terminal a row can show: a handler that shows it, or `null`. Absent: no Show terminal.
- `style?` (`CSSProperties`): Inline styles on the default shell.

Source: [ui/src/session/RunningWorkDialog.tsx:46](https://github.com/Tahul/zidane/blob/main/ui/src/session/RunningWorkDialog.tsx#L46)

### `SecretsAttention`

Component.

Opens the Secrets tab (proactively) the first time the active session saves a secret, once per session. Reads the
session's secrets itself, so the change signal reaches it while the panel is closed.

```ts
function SecretsAttention(props: SecretsAttentionProps): null
```

**Parameters**

- `props` (`SecretsAttentionProps`): The [`SecretsAttentionProps`](https://zidane.si/docs/reference/ui-session.md#SecretsAttentionProps).

**Returns** `null`

**Props**

- `actions?` (`Pick<WorkspaceActions, 'openProactive'>`): Where the open goes. Default: the `WorkspaceProvider` above (none: nothing happens). Keep it stable.
- `sessionId` (`string | null`): The active session, or `null`.

Source: [ui/src/session/PanelAttention.tsx:131](https://github.com/Tahul/zidane/blob/main/ui/src/session/PanelAttention.tsx#L131)

### `SecretsPanel`

Component.

Renders a session project's saved secrets, with revoke, replace and add.

```ts
function SecretsPanel(props: SecretsPanelProps): Element
```

**Parameters**

- `props` (`SecretsPanelProps`): The `sessionId`, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root.
- `sessionId` (`string`): The session whose project's secrets to list.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/session/SecretsPanel.tsx:43](https://github.com/Tahul/zidane/blob/main/ui/src/session/SecretsPanel.tsx#L43)

### `SessionCacheFacts`

Component.

Renders the cache chips and the per-request rows; nothing before the first request.

```ts
function SessionCacheFacts(props: SessionCacheFactsProps): Element | null
```

**Parameters**

- `props` (`SessionCacheFactsProps`): [`SessionCacheFactsProps`](https://zidane.si/docs/reference/ui-session.md#SessionCacheFactsProps).

**Returns** `Element | null`

**Props**

- `className?` (`string`): Classes merged on the root.
- `defaultOpen?` (`boolean`): The per-request table starts open. Default: collapsed behind a toggle.
- `now?` (`number`): The clock the expiry reads against. Default: now.
- `report` (`CacheReport`): The report, from [`useSessionCacheReport`](https://zidane.si/docs/reference/ui-session.md#useSessionCacheReport).
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/session/SessionCacheFacts.tsx:79](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionCacheFacts.tsx#L79)

### `SessionDetailsDialog`

Component.

Renders a session's facts and actions.

```ts
function SessionDetailsDialog(props: SessionDetailsDialogProps): Element
```

**Parameters**

- `props` (`SessionDetailsDialogProps`): The `session` facts, the session-list handlers, folder handlers, slots, `onClose`, `renderShell`.

**Returns** `Element`

**Props**

- `cache?` (`ReactNode`): The cache report, as the Cache fact.
- `className?` (`string`): Extra classes on the default shell.
- `confirmDelete?` (`() => Promise<boolean>`): Asks the user to confirm the deletion. Absent: no confirmation.
- `folderPicker?` (`(attach: (folder: string) => void) => ReactNode`): Replaces the folder picker button (a remote folder picker for a server session); `attach` sets the folder.
- `formatError?` (`(error: unknown) => string`): Words an error from an action. Default: its message.
- `onChanged?` (`() => Promise<void>`): Something about the session changed (title, folder, compaction): re-read what shows it.
- `onClose` (`() => void`): Closes the dialog.
- `onDelete?` (`() => Promise<void>`): Deletes the session (the dialog closes after). Absent: no Delete.
- `onMoveToSpace?` (`(spaceId: string) => Promise<void>`): Moves the session to a space.
- `onPickFolder?` (`() => Promise<string | null>`): Picks a folder on this computer. Resolves `null` when cancelled. Absent: no picker.
- `onRename?` (`(title: string) => Promise<void>`): Renames the session. Absent: the title is read-only.
- `onRevealFolder?` (`() => Promise<boolean>`): Shows the folder in the file manager. Resolves `false` when it is gone. Absent: no Open button.
- `renderShell?` (`RenderSessionShell`): The app's modal shell. Default: [`SessionShell`](https://zidane.si/docs/reference/ui-session.md#SessionShell).
- `session` (`SessionDetailsFacts`): The session's facts.
- `spaceId?` (`string`): The session's space.
- `spaces?` (`readonly SessionDetailsSpace[] | null`): The spaces, when spaces are on.
- `style?` (`CSSProperties`): Inline styles on the default shell.

Source: [ui/src/session/SessionDetailsDialog.tsx:140](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionDetailsDialog.tsx#L140)

### `SessionHeader`

Component.

Renders the folder chip, the title and the toolbar of the open session.

```ts
function SessionHeader(props: SessionHeaderProps): Element
```

**Parameters**

- `props` (`SessionHeaderProps`): The session facts, the folder, details and rename handlers, the menu, the `toolbar`, `className` and
  `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root.
- `cwd` (`string`): The session's folder; `''` for a chat without one.
- `isMain?` (`boolean`): The orchestration main: no folder, a fixed name.
- `menuItems?` (`RowActionItem[]`): The right-click menu's items. Absent: no menu.
- `onMenuOpenChange?` (`(open: boolean) => void`): The menu opened or closed (to load items only while it shows).
- `onOpenDetails?` (`() => void`): Opens the session details.
- `onPickFolder?` (`() => void`): Picks a folder (attaches one to a chat, or changes the default folder). Absent: the chip is inert.
- `onRename?` (`(title: string) => Promise<void>`): Renames the session. Absent: no in-place rename.
- `onRenamingChange?` (`(renaming: boolean) => void`): The rename started or ended.
- `renaming?` (`boolean`): The title is being renamed in place (controlled by the menu's Rename).
- `running?` (`boolean`): A run is in progress (a folderless chat can't attach a folder mid-run).
- `server?` (`SessionHeaderServer`): The server a server session runs on (its folders are the server's: no local picker).
- `sessionId?` (`string`): The session shown: its extensions' `session.header` items show before the toolbar. Default: `titleScope`.
- `style?` (`CSSProperties`): Inline styles on the root (the app's chrome insets).
- `title` (`string`): The session title.
- `titleDisplay?` (`ReactNode`): What draws the title (reference badges); plain text by default, so a new title writes in word by word.
- `titleScope?` (`string`): Keys the title's write-in animation (the session id).
- `toolbar?` (`ReactNode`): The app's controls on the right.

Source: [ui/src/session/SessionHeader.tsx:80](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionHeader.tsx#L80)

### `SessionProvider`

Component.

Provides a [`SessionHost`](https://zidane.si/docs/reference/ui-session-headless.md#SessionHost) and optional label overrides to the session panels below it.

```ts
function SessionProvider(props: SessionProviderProps): Element
```

**Parameters**

- `props` (`SessionProviderProps`): Provider props: the `host`, optional `labels`, and the `children` to render.

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The components that read from `host`.
- `host` (`SessionHost`): The host the session panels below read plans, queues and artifacts from.
- `labels?` (`Partial<{ artifactCopyLink: string; artifactCopyPath: string; artifactCopySha: string; artifactHideDetails: string; artifactOnRemote: (machine: string) => string; artifactOpen: (path: string) => string; artifactPathUnavailable: string; artifactRemove: string; artifactReveal: string; artifactsCount: (label: string, count: number) => string; artifactsEmpty: string; artifactsEmptyHint: string; artifactsGroup: (label: string, count: number) => string; artifactShowDetails: string; artifactsLabel: string; artifactsUnsupported: string; cacheBreaks: (count: number) => string; cacheColumns: Record<'prompt' | 'dropped' | 'turn' | 'cached' | 'reread' | 'ttft' | 'energy', string>; cacheExpired: string; cacheExpiresIn: (until: string) => string; cacheExpiryHint: string; cacheHideRequests: string; cacheScopeAll: (total: number) => string; cacheScopeLast: (shown: number, total: number) => string; cacheShowRequests: string; cacheUncached: (pct: number) => string; detailsAccountHint: string; detailsAccountSignedOut: string; detailsActivity: string; detailsAgent: string; detailsAttachHint: string; detailsCache: string; detailsChange: string; detailsCompact: string; detailsCompactHint: string; detailsCompacting: string; detailsCompactNow: string; detailsCopied: string; detailsCopyId: string; detailsCopyIdHint: string; detailsCreated: string; detailsDefaultModel: string; detailsDelete: string; detailsDeleting: string; detailsDetach: string; detailsDetachHint: string; detailsEffortHint: string; detailsExport: string; detailsExportHint: string; detailsExporting: string; detailsFolder: string; detailsFolderElsewhere: (where: string) => string; detailsFolderGone: (cwd: string) => string; detailsFolderLocation: (where: FolderLocation) => string; detailsGenerate: string; detailsGenerateHint: string; detailsGenerating: string; detailsId: string; detailsJson: string; detailsMainDescription: string; detailsMainEverySpace: string; detailsMainHasNoFolder: string; detailsMainKeepsName: string; detailsMainNoFolder: string; detailsMainTitle: string; detailsMarkdown: string; detailsMessages: (count: number) => string; detailsModel: string; detailsNoFolder: string; detailsPickOther: string; detailsProviderHint: string; detailsReveal: string; detailsRevealHint: (cwd: string) => string; detailsRuns: (count: number) => string; detailsSave: string; detailsSavedTo: string; detailsSetFolder: string; detailsSpace: string; detailsSpaceHint: string; detailsSpaceLabel: string; detailsStatus: string; detailsStatusLabel: Record<'error' | 'running' | 'idle' | 'completed', string>; detailsStopToChange: string; detailsStopToDetach: string; detailsTitle: string; detailsTitleFact: string; detailsTitleLabel: string; detailsTurns: (count: number) => string; detailsUnknown: string; detailsUpdated: string; diffChangedFiles: string; diffFiles: (files: number) => string; diffFindings: (errors: number, warnings: number) => string; headerChangeFolder: (cwd: string) => string; headerChat: string; headerChatAttach: string; headerChatRunning: string; headerDetails: string; headerFolderOnServer: (cwd: string, server: string | null) => string; headerMainFolder: string; headerOnServer: (server: string | null) => string; headerRename: string; headerServerGone: string; planDrop: string; planDropCancel: string; planDropConfirm: (applying: boolean) => 'Drop this plan and stop the run?' | 'Drop this plan?'; planDropHint: string; planDropYes: string; planHideBody: string; planMaybeInterrupted: string; planNoSteps: string; planResume: string; planResumeHint: string; planShowBody: string; planState: Record<PlanState, string>; planStop: string; planStopHint: string; planStopped: (step: number | null, reason: PlanStopReason | undefined) => string; planUntitled: string; projectHomeAddBlock: string; projectHomeBlockMenu: (block: string) => string; projectHomeCustomize: string; projectHomeDismiss: string; projectHomeDone: string; projectHomeDrag: (block: string) => string; projectHomeFullWidth: string; projectHomeHalfWidth: string; projectHomeHide: string; projectHomeLabel: (project: string | null) => string; projectHomeMoveDown: string; projectHomeMoveUp: string; projectHomeOpenEditor: string; projectHomeOpenFiles: (path: string) => string; projectHomeOpenRepo: (repo: string, web: boolean) => string; projectHomeRefresh: string; projectHomeRemote: string; projectHomeReveal: string; projectHomeSwitch: string; queueAttach: string; queueAttachmentName: (attachment: { mediaType: string; name?: string }) => string; queueCancel: string; queueCount: (count: number) => string; queueEdit: string; queueEditHint: string; queueEditLabel: string; queueEmpty: string; queueEmptyHint: string; queueHintCancel: string; queueHintNewline: string; queueHintPush: string; queueHintSave: string; queueListLabel: string; queueOrder: string; queuePush: string; queueRemove: string; queueSave: string; queueSaveAndPush: string; queueViewAttachments: (count: number, first: string) => string; reminderCancel: string; reminderCountdown: (ms: number) => string; reminderCreate: string; reminderCreator: (creator: ScheduleCreator) => string; reminderDelete: (label: string) => string; reminderDone: string; reminderExpires: (when: string) => string; reminderFireLate: string; reminderFireOutcome: (outcome: ScheduleFireOutcome) => string; reminderHistoryHide: (label: string) => string; reminderHistoryLabel: (label: string) => string; reminderHistoryShow: (label: string) => string; reminderKeep: (label: string) => string; reminderLastSent: (when: string) => string; reminderNew: string; reminderNext: (when: string) => string; reminderNoFires: string; reminderOff: string; reminderOffReason: (reason: string) => string; reminderOnce: string; reminderPause: (label: string) => string; reminderPreview: (when: string) => string; reminderPromptLabel: string; reminderPromptPlaceholder: string; reminderResume: (label: string) => string; reminderRunNow: (label: string) => string; remindersCount: (n: number) => string; remindersEmpty: string; remindersEmptyAll: string; remindersEmptyHint: string; remindersFinished: string; remindersLabel: string; remindersListLabel: string; remindersOff: string; remindersOffHint: string; remindersScopeAll: string; remindersScopeLabel: string; remindersScopeSession: string; remindersUnsupported: string; reminderTargetExtension: (extension: string) => string; reminderTargetNew: (folder: string) => string; reminderTargetOpen: (title: string) => string; reminderTargetOther: string; reminderTargetUntitled: string; reminderWhenError: (reason: 'unknown' | 'empty' | 'extra') => 'Type when to send it.' | 'Only the time goes here. Put the message below.' | 'Try in 20m, at 9:00, tomorrow 9:00, every 2h, daily 9:00, weekdays 9:00 or cron "0 9 * * 1-5".'; reminderWhenLabel: string; reminderWhenPick: (words: string) => string; reminderWhenPicks: readonly string[]; reminderWhenPlaceholder: string; runningWorkCancel: string; runningWorkCancelAll: string; runningWorkCancelling: string; runningWorkDescription: string; runningWorkEmpty: string; runningWorkKind: Record<'task' | 'tool', string>; runningWorkRefresh: string; runningWorkShowTerminal: string; runningWorkTitle: string; secretCancel: string; secretExpiry: (left: SecretTimeLeft) => string; secretNameInvalid: string; secretNameLabel: string; secretNamePlaceholder: string; secretReplace: (name: string) => string; secretReplacesSaved: (name: string) => string; secretRevoke: (name: string) => string; secretsAdd: string; secretSave: string; secretSavedElsewhere: string; secretSavedHere: string; secretsEmpty: string; secretsEmptyHint: string; secretsLabel: string; secretsListLabel: string; secretsNote: string; secretValueLabel: string; shellClose: string; sideComposerLabel: string; sideEmptyHint: string; sideEmptyTitle: string; sidePlaceholder: string; sideRefusal: (reason: 'unavailable' | 'no-conversation' | 'no-panel') => 'Send a message first. A side chat follows a conversation.' | 'Side chats work only on this computer\'s conversations' | 'This window has no side panel for side chats'; sideResetDescription: string; sideResetFailed: (reason: string) => string; stepAdded: string; stepAgentNote: (note: string) => string; stepCancel: string; stepCancelHint: string; stepCancelledByYou: string; stepDroppedByAgent: string; todoAdd: string; todoAddLabel: string; todoAddPlaceholder: string; todoEdit: string; todoRetry: string; todoRetryHint: string; todosEmpty: string; todosEmptyHint: string; todosProgress: (done: number, total: number) => string; todoStatus: (status: TodoStatus) => string; todoTally: Record<TodoStatus, string>; turnAfter: (count: number) => string; turnBefore: (count: number) => string; turnCancel: string; turnCopied: string; turnCopy: string; turnCopyFailed: (message: string) => string; turnCopyHint: string; turnDelete: string; turnDeleteHint: string; turnEdit: string; turnEditHint: string; turnFork: string; turnForkHint: string; turnLoading: string; turnNoText: string; turnRole: (role: string | null) => string; turnSave: string; turnSaving: string; turnStopFirst: string; turnTextLabel: string; turnTitle: string; usageChecking: string; usageCredits: string; usageDescription: string; usageGithub: string; usageInUse: string; usageModelProviders: string; usageNone: string; usageOff: string; usageRefresh: string; usageRefreshing: string; usageResetConfirm: string; usageResetConfirmMessage: (count: number, title?: string | null) => string; usageResetConfirmTitle: (provider: string) => string; usageResetDates: (grantedAt: number | null, expiresAt: number | null) => string; usageResetOutcome: (code: 'failed' | 'reset' | 'nothing_to_reset' | 'no_credit' | 'already_redeemed', error?: string | null) => string; usageResets: string; usageResetsLeft: (count: number) => string; usageResetUntitled: string; usageResetUse: string; usageResetUseOne: (title: string) => string; usageResetUseShort: string; usageResetUsing: string; usageTitle: string; usageUnavailable: (unauthorized: boolean, error?: string | null) => string; usageWindowUsed: (window: string, percent: string) => string; welcomeDate: (date: Date) => string; welcomeGreeting: (hour: number, name: string | null) => string; welcomeUsageLabel: string }>`): Overrides for the built-in strings. Keys you leave out keep the default English label.

Source: [ui/src/session/SessionProvider.tsx:42](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionProvider.tsx#L42)

### `SessionShell`

Component.

Renders a titled panel with a body and an optional footer, as a `dialog` named by its title.

```ts
function SessionShell(props: SessionShellProps): Element
```

**Parameters**

- `props` (`SessionShellProps`): The `title`, `description`, `onClose`, `footer`, `children`, `className` and `style`.

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The body.
- `className?` (`string`): Extra classes on the panel.
- `description?` (`ReactNode`): A line (or chips) under the heading.
- `footer?` (`ReactNode`): The actions row under the body.
- `onClose?` (`() => void`): Called by the close button. Absent: no close button.
- `style?` (`CSSProperties`): Inline styles on the panel.
- `title` (`string`): The dialog's heading.

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

### `SideChat`

Component.

A side chat about `parentId`: its transcript, an empty state before the first send, and its composer.
Renders nothing without `SessionHost.side`.

```ts
function SideChat(props: SideChatProps): Element | null
```

**Parameters**

- `props` (`SideChatProps`): The [`SideChatProps`](https://zidane.si/docs/reference/ui-session.md#SideChatProps).

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra class names for the root.
- `cwd` (`string`): Its folder: where a new side chat starts.
- `parentId` (`string`): The session the side chat is about.
- `renderPickers?` (`(pick: SideChatSession, commitTo: () => Promise<string>) => ReactNode`): Renders the model pickers: before the first send they show the parent's pick (`pick`), which the side chat
  starts on; a pick then creates the side chat (`commitTo`, resolving with its id) and applies to it.
- `renderTranscript` (`(sideId: string, running: boolean) => ReactNode`): Renders the side chat's transcript.
- `requests?` (`SideRequests`): Where `/side <question>` from the conversation's composer waits for this chat.
- `style?` (`CSSProperties`): Inline styles on the root element.

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

### `TodoListView`

Component.

A todo list, read-only: one row per item with its status glyph.

```ts
function TodoListView(props: TodoListViewProps): Element
```

**Parameters**

- `props` (`TodoListViewProps`): The [`TodoListViewProps`](https://zidane.si/docs/reference/ui-session.md#TodoListViewProps).

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `items` (`readonly TodoListItem[]`): The items, in order.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/session/TodoList.tsx:67](https://github.com/Tahul/zidane/blob/main/ui/src/session/TodoList.tsx#L67)

### `TodoTally`

Component.

One chip per status (`2 in progress`, `3 done`, `1 pending`), zeros omitted, in the TUI's order and tones.

```ts
function TodoTally(props: TodoTallyProps): Element
```

**Parameters**

- `props` (`TodoTallyProps`): The [`TodoTallyProps`](https://zidane.si/docs/reference/ui-session.md#TodoTallyProps).

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `tally` (`TodoTallyCounts`): Items per status (`planTally` of a plan).

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

### `TurnDetailsDialog`

Component.

Renders one turn's actions and preview.

```ts
function TurnDetailsDialog(props: TurnDetailsDialogProps): Element
```

**Parameters**

- `props` (`TurnDetailsDialogProps`): The `sessionId`, `turnId`, `running`, `neighbors`, the follow-up callbacks, `onClose`, `renderShell`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the default shell.
- `neighbors?` (`{ after: number; before: number } | null`): How many selectable turns come before and after it; `null` while unknown.
- `onChanged?` (`(change: 'edit' | 'delete') => void | Promise<void>`): The turn was edited or deleted: reload what shows it. Awaited before the dialog closes.
- `onClose` (`() => void`): Closes the dialog.
- `onForked?` (`(newSessionId: string) => void | Promise<void>`): The fork exists: switch to it. Awaited before the dialog closes.
- `renderShell?` (`RenderSessionShell`): The app's modal shell. Default: [`SessionShell`](https://zidane.si/docs/reference/ui-session.md#SessionShell).
- `running?` (`boolean`): A run is in progress: history edits are refused, and the dialog says so.
- `sessionId` (`string`): The session the turn belongs to.
- `style?` (`CSSProperties`): Inline styles on the default shell.
- `turnId` (`string`): The turn.

Source: [ui/src/session/TurnDetailsDialog.tsx:54](https://github.com/Tahul/zidane/blob/main/ui/src/session/TurnDetailsDialog.tsx#L54)

### `UsagePanel`

Component.

Renders the subscription windows of every signed-in provider and GitHub, with a Refresh.

```ts
function UsagePanel(props: UsagePanelProps): Element
```

**Parameters**

- `props` (`UsagePanelProps`): `activeProviderKey`, `autoLoad`, `onClose`, `renderShell`, `className` and `style`.

**Returns** `Element`

**Props**

- `activeProviderKey?` (`string | null`): The provider the active session runs on: its active credential's row is marked In use.
- `autoLoad?` (`boolean`): Background probes are on (it words the empty state). Default `true`.
- `className?` (`string`): Extra classes on the default shell.
- `onClose` (`() => void`): Closes the dialog.
- `renderShell?` (`RenderSessionShell`): The app's modal shell. Default: [`SessionShell`](https://zidane.si/docs/reference/ui-session.md#SessionShell).
- `style?` (`CSSProperties`): Inline styles on the default shell.

Source: [ui/src/session/UsagePanel.tsx:65](https://github.com/Tahul/zidane/blob/main/ui/src/session/UsagePanel.tsx#L65)

### `WelcomeScreen`

Component.

Renders the greeting and the usage card.

```ts
function WelcomeScreen(props: WelcomeScreenProps): Element
```

**Parameters**

- `props` (`WelcomeScreenProps`): `modelName`, `now`, `className` and `style`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root.
- `modelName?` (`(modelId: string) => string`): A model id's display name. Default: the id made readable.
- `now?` (`Date`): The moment the screen describes (greeting, date, heatmap end). Default: when it mounts.
- `style?` (`CSSProperties`): Inline styles on the root.

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

## Functions

### `badgeColorStyle`

Function.

An exact icon color (`#rgb` / `#rrggbb`) as an inline style over the tone class; nothing for anything else.

```ts
function badgeColorStyle(color: unknown): CSSProperties | undefined
```

**Parameters**

- `color` (`unknown`): The color an extension named.

**Returns** `CSSProperties | undefined`

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

### `badgeToneClass`

Function.

The text color class for a tone; `muted` for none or an unknown one.

```ts
function badgeToneClass(tone: ExtensionBadgeTone | undefined): string
```

**Parameters**

- `tone` (`ExtensionBadgeTone | undefined`): A badge tone.

**Returns** `string`

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

### `hasArtifactRowChips`

Function.

Whether the fields have anything to show.

```ts
function hasArtifactRowChips(fields: ArtifactRowChipsFields): boolean
```

**Parameters**

- `fields` (`ArtifactRowChipsFields`): The row's lead, diff and facts.

**Returns** `boolean`

Source: [ui/src/session/ArtifactRowChips.tsx:208](https://github.com/Tahul/zidane/blob/main/ui/src/session/ArtifactRowChips.tsx#L208)

### `isDoneTodo`

Function.

Whether a todo is over (completed or cancelled): its text is struck through.

```ts
function isDoneTodo(status: TodoStatus): boolean
```

**Parameters**

- `status` (`TodoStatus`): The todo's status.

**Returns** `boolean`

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

### `planStateTone`

Function.

The tone of a plan's state chip.

```ts
function planStateTone(plan: PlanView): 'muted' | 'accent' | 'success' | 'warn'
```

**Parameters**

- `plan` (`PlanView`): The plan.

**Returns** `'muted' | 'accent' | 'success' | 'warn'`

Source: [ui/src/session/PlanTracker.tsx:71](https://github.com/Tahul/zidane/blob/main/ui/src/session/PlanTracker.tsx#L71)

### `todoGlyphTone`

Function.

A status glyph's color class.

```ts
function todoGlyphTone(status: TodoStatus): string
```

**Parameters**

- `status` (`TodoStatus`): The todo's status.

**Returns** `string`

Source: [ui/src/session/TodoList.tsx:23](https://github.com/Tahul/zidane/blob/main/ui/src/session/TodoList.tsx#L23)

### `useAllSchedules`

Function.

Every reminder of the host (`null` until read, while off, or without a `schedules` host).

```ts
function useAllSchedules(): readonly Schedule[] | null
```

**Returns** `readonly Schedule[] | null`

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

### `useInboxPlans`

Function.

A session's plans for the Inbox: the one in progress and the recent ones. Reads the session from the host once.

```ts
function useInboxPlans(sessionId: string): InboxPlans
```

**Parameters**

- `sessionId` (`string`): The session.

**Returns** `InboxPlans`

Source: [ui/src/session/PlanTracker.tsx:84](https://github.com/Tahul/zidane/blob/main/ui/src/session/PlanTracker.tsx#L84)

### `useProviderUsage`

Function.

The host's subscription usage: the model providers' windows, GitHub's limits, and a manual refresh. Outside a
[`ProviderUsageProvider`](https://zidane.si/docs/reference/ui-session.md#ProviderUsageProvider) nothing is fetched until `refresh`.

```ts
function useProviderUsage(): ProviderUsage
```

**Returns** `ProviderUsage`

Source: [ui/src/session/ProviderUsageProvider.tsx:105](https://github.com/Tahul/zidane/blob/main/ui/src/session/ProviderUsageProvider.tsx#L105)

### `useSchedulesStatus`

Function.

Whether reminders are on (`null` until read, or without a `schedules` host). The first read asks the host. Nothing
about reminders shows unless this is `enabled`.

```ts
function useSchedulesStatus(): SchedulesStatus | null
```

**Returns** `SchedulesStatus | null`

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

### `useSessionArtifacts`

Function.

A session's artifacts by kind (`null` until read, or without a session or an `artifacts` host). Re-renders only
when that session's artifacts change.

```ts
function useSessionArtifacts(
  sessionId: string | null | undefined,
): readonly SessionArtifactGroup[] | null
```

**Parameters**

- `sessionId` (`string | null | undefined`): The session, or nothing.

**Returns** `readonly SessionArtifactGroup[] | null`

Source: [ui/src/session/SessionProvider.tsx:139](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionProvider.tsx#L139)

### `useSessionCacheReport`

Function.

The session's cache report, read again when the session changes (`updatedAt`). `null` while loading, when there
is none, or without the host's `details.cacheReport`.

```ts
function useSessionCacheReport(
  sessionId: string,
  updatedAt: number | undefined,
): CacheReport | null
```

**Parameters**

- `sessionId` (`string`): The session.
- `updatedAt` (`number | undefined`): Its last update: a new value reads the report again.

**Returns** `CacheReport | null`

Source: [ui/src/session/SessionCacheFacts.tsx:25](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionCacheFacts.tsx#L25)

### `useSessionHost`

Function.

Returns the [`SessionHost`](https://zidane.si/docs/reference/ui-session-headless.md#SessionHost) from the nearest [`SessionProvider`](https://zidane.si/docs/reference/ui-session.md#SessionProvider). Throws when called outside one.

```ts
function useSessionHost(): SessionHost
```

**Returns** `SessionHost`

Source: [ui/src/session/SessionProvider.tsx:51](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionProvider.tsx#L51)

### `useSessionLabels`

Function.

Returns the session panels' strings: the defaults merged with any overrides given to `SessionProvider` or `LabelsProvider`.

```ts
function useSessionLabels(): { artifactCopyLink: string; artifactCopyPath: string; artifactCopySha: string; artifactHideDetails: string; artifactOnRemote: (machine: string) => string; artifactOpen: (path: string) => string; artifactPathUnavailable: string; artifactRemove: string; artifactReveal: string; artifactsCount: (label: string, count: number) => string; artifactsEmpty: string; artifactsEmptyHint: string; artifactsGroup: (label: string, count: number) => string; artifactShowDetails: string; artifactsLabel: string; artifactsUnsupported: string; cacheBreaks: (count: number) => string; cacheColumns: Record<'prompt' | 'dropped' | 'turn' | 'cached' | 'reread' | 'ttft' | 'energy', string>; cacheExpired: string; cacheExpiresIn: (until: string) => string; cacheExpiryHint: string; cacheHideRequests: string; cacheScopeAll: (total: number) => string; cacheScopeLast: (shown: number, total: number) => string; cacheShowRequests: string; cacheUncached: (pct: number) => string; detailsAccountHint: string; detailsAccountSignedOut: string; detailsActivity: string; detailsAgent: string; detailsAttachHint: string; detailsCache: string; detailsChange: string; detailsCompact: string; detailsCompactHint: string; detailsCompacting: string; detailsCompactNow: string; detailsCopied: string; detailsCopyId: string; detailsCopyIdHint: string; detailsCreated: string; detailsDefaultModel: string; detailsDelete: string; detailsDeleting: string; detailsDetach: string; detailsDetachHint: string; detailsEffortHint: string; detailsExport: string; detailsExportHint: string; detailsExporting: string; detailsFolder: string; detailsFolderElsewhere: (where: string) => string; detailsFolderGone: (cwd: string) => string; detailsFolderLocation: (where: FolderLocation) => string; detailsGenerate: string; detailsGenerateHint: string; detailsGenerating: string; detailsId: string; detailsJson: string; detailsMainDescription: string; detailsMainEverySpace: string; detailsMainHasNoFolder: string; detailsMainKeepsName: string; detailsMainNoFolder: string; detailsMainTitle: string; detailsMarkdown: string; detailsMessages: (count: number) => string; detailsModel: string; detailsNoFolder: string; detailsPickOther: string; detailsProviderHint: string; detailsReveal: string; detailsRevealHint: (cwd: string) => string; detailsRuns: (count: number) => string; detailsSave: string; detailsSavedTo: string; detailsSetFolder: string; detailsSpace: string; detailsSpaceHint: string; detailsSpaceLabel: string; detailsStatus: string; detailsStatusLabel: Record<'error' | 'running' | 'idle' | 'completed', string>; detailsStopToChange: string; detailsStopToDetach: string; detailsTitle: string; detailsTitleFact: string; detailsTitleLabel: string; detailsTurns: (count: number) => string; detailsUnknown: string; detailsUpdated: string; diffChangedFiles: string; diffFiles: (files: number) => string; diffFindings: (errors: number, warnings: number) => string; headerChangeFolder: (cwd: string) => string; headerChat: string; headerChatAttach: string; headerChatRunning: string; headerDetails: string; headerFolderOnServer: (cwd: string, server: string | null) => string; headerMainFolder: string; headerOnServer: (server: string | null) => string; headerRename: string; headerServerGone: string; planDrop: string; planDropCancel: string; planDropConfirm: (applying: boolean) => 'Drop this plan and stop the run?' | 'Drop this plan?'; planDropHint: string; planDropYes: string; planHideBody: string; planMaybeInterrupted: string; planNoSteps: string; planResume: string; planResumeHint: string; planShowBody: string; planState: Record<PlanState, string>; planStop: string; planStopHint: string; planStopped: (step: number | null, reason: PlanStopReason | undefined) => string; planUntitled: string; projectHomeAddBlock: string; projectHomeBlockMenu: (block: string) => string; projectHomeCustomize: string; projectHomeDismiss: string; projectHomeDone: string; projectHomeDrag: (block: string) => string; projectHomeFullWidth: string; projectHomeHalfWidth: string; projectHomeHide: string; projectHomeLabel: (project: string | null) => string; projectHomeMoveDown: string; projectHomeMoveUp: string; projectHomeOpenEditor: string; projectHomeOpenFiles: (path: string) => string; projectHomeOpenRepo: (repo: string, web: boolean) => string; projectHomeRefresh: string; projectHomeRemote: string; projectHomeReveal: string; projectHomeSwitch: string; queueAttach: string; queueAttachmentName: (attachment: { mediaType: string; name?: string }) => string; queueCancel: string; queueCount: (count: number) => string; queueEdit: string; queueEditHint: string; queueEditLabel: string; queueEmpty: string; queueEmptyHint: string; queueHintCancel: string; queueHintNewline: string; queueHintPush: string; queueHintSave: string; queueListLabel: string; queueOrder: string; queuePush: string; queueRemove: string; queueSave: string; queueSaveAndPush: string; queueViewAttachments: (count: number, first: string) => string; reminderCancel: string; reminderCountdown: (ms: number) => string; reminderCreate: string; reminderCreator: (creator: ScheduleCreator) => string; reminderDelete: (label: string) => string; reminderDone: string; reminderExpires: (when: string) => string; reminderFireLate: string; reminderFireOutcome: (outcome: ScheduleFireOutcome) => string; reminderHistoryHide: (label: string) => string; reminderHistoryLabel: (label: string) => string; reminderHistoryShow: (label: string) => string; reminderKeep: (label: string) => string; reminderLastSent: (when: string) => string; reminderNew: string; reminderNext: (when: string) => string; reminderNoFires: string; reminderOff: string; reminderOffReason: (reason: string) => string; reminderOnce: string; reminderPause: (label: string) => string; reminderPreview: (when: string) => string; reminderPromptLabel: string; reminderPromptPlaceholder: string; reminderResume: (label: string) => string; reminderRunNow: (label: string) => string; remindersCount: (n: number) => string; remindersEmpty: string; remindersEmptyAll: string; remindersEmptyHint: string; remindersFinished: string; remindersLabel: string; remindersListLabel: string; remindersOff: string; remindersOffHint: string; remindersScopeAll: string; remindersScopeLabel: string; remindersScopeSession: string; remindersUnsupported: string; reminderTargetExtension: (extension: string) => string; reminderTargetNew: (folder: string) => string; reminderTargetOpen: (title: string) => string; reminderTargetOther: string; reminderTargetUntitled: string; reminderWhenError: (reason: 'unknown' | 'empty' | 'extra') => 'Type when to send it.' | 'Only the time goes here. Put the message below.' | 'Try in 20m, at 9:00, tomorrow 9:00, every 2h, daily 9:00, weekdays 9:00 or cron "0 9 * * 1-5".'; reminderWhenLabel: string; reminderWhenPick: (words: string) => string; reminderWhenPicks: readonly string[]; reminderWhenPlaceholder: string; runningWorkCancel: string; runningWorkCancelAll: string; runningWorkCancelling: string; runningWorkDescription: string; runningWorkEmpty: string; runningWorkKind: Record<'task' | 'tool', string>; runningWorkRefresh: string; runningWorkShowTerminal: string; runningWorkTitle: string; secretCancel: string; secretExpiry: (left: SecretTimeLeft) => string; secretNameInvalid: string; secretNameLabel: string; secretNamePlaceholder: string; secretReplace: (name: string) => string; secretReplacesSaved: (name: string) => string; secretRevoke: (name: string) => string; secretsAdd: string; secretSave: string; secretSavedElsewhere: string; secretSavedHere: string; secretsEmpty: string; secretsEmptyHint: string; secretsLabel: string; secretsListLabel: string; secretsNote: string; secretValueLabel: string; shellClose: string; sideComposerLabel: string; sideEmptyHint: string; sideEmptyTitle: string; sidePlaceholder: string; sideRefusal: (reason: 'unavailable' | 'no-conversation' | 'no-panel') => 'Send a message first. A side chat follows a conversation.' | 'Side chats work only on this computer\'s conversations' | 'This window has no side panel for side chats'; sideResetDescription: string; sideResetFailed: (reason: string) => string; stepAdded: string; stepAgentNote: (note: string) => string; stepCancel: string; stepCancelHint: string; stepCancelledByYou: string; stepDroppedByAgent: string; todoAdd: string; todoAddLabel: string; todoAddPlaceholder: string; todoEdit: string; todoRetry: string; todoRetryHint: string; todosEmpty: string; todosEmptyHint: string; todosProgress: (done: number, total: number) => string; todoStatus: (status: TodoStatus) => string; todoTally: Record<TodoStatus, string>; turnAfter: (count: number) => string; turnBefore: (count: number) => string; turnCancel: string; turnCopied: string; turnCopy: string; turnCopyFailed: (message: string) => string; turnCopyHint: string; turnDelete: string; turnDeleteHint: string; turnEdit: string; turnEditHint: string; turnFork: string; turnForkHint: string; turnLoading: string; turnNoText: string; turnRole: (role: string | null) => string; turnSave: string; turnSaving: string; turnStopFirst: string; turnTextLabel: string; turnTitle: string; usageChecking: string; usageCredits: string; usageDescription: string; usageGithub: string; usageInUse: string; usageModelProviders: string; usageNone: string; usageOff: string; usageRefresh: string; usageRefreshing: string; usageResetConfirm: string; usageResetConfirmMessage: (count: number, title?: string | null) => string; usageResetConfirmTitle: (provider: string) => string; usageResetDates: (grantedAt: number | null, expiresAt: number | null) => string; usageResetOutcome: (code: 'failed' | 'reset' | 'nothing_to_reset' | 'no_credit' | 'already_redeemed', error?: string | null) => string; usageResets: string; usageResetsLeft: (count: number) => string; usageResetUntitled: string; usageResetUse: string; usageResetUseOne: (title: string) => string; usageResetUseShort: string; usageResetUsing: string; usageTitle: string; usageUnavailable: (unauthorized: boolean, error?: string | null) => string; usageWindowUsed: (window: string, percent: string) => string; welcomeDate: (date: Date) => string; welcomeGreeting: (hour: number, name: string | null) => string; welcomeUsageLabel: string }
```

**Returns** `{ artifactCopyLink: string; artifactCopyPath: string; artifactCopySha: string; artifactHideDetails: string; artifactOnRemote: (machine: string) => string; artifactOpen: (path: string) => string; artifactPathUnavailable: string; artifactRemove: string; artifactReveal: string; artifactsCount: (label: string, count: number) => string; artifactsEmpty: string; artifactsEmptyHint: string; artifactsGroup: (label: string, count: number) => string; artifactShowDetails: string; artifactsLabel: string; artifactsUnsupported: string; cacheBreaks: (count: number) => string; cacheColumns: Record<'prompt' | 'dropped' | 'turn' | 'cached' | 'reread' | 'ttft' | 'energy', string>; cacheExpired: string; cacheExpiresIn: (until: string) => string; cacheExpiryHint: string; cacheHideRequests: string; cacheScopeAll: (total: number) => string; cacheScopeLast: (shown: number, total: number) => string; cacheShowRequests: string; cacheUncached: (pct: number) => string; detailsAccountHint: string; detailsAccountSignedOut: string; detailsActivity: string; detailsAgent: string; detailsAttachHint: string; detailsCache: string; detailsChange: string; detailsCompact: string; detailsCompactHint: string; detailsCompacting: string; detailsCompactNow: string; detailsCopied: string; detailsCopyId: string; detailsCopyIdHint: string; detailsCreated: string; detailsDefaultModel: string; detailsDelete: string; detailsDeleting: string; detailsDetach: string; detailsDetachHint: string; detailsEffortHint: string; detailsExport: string; detailsExportHint: string; detailsExporting: string; detailsFolder: string; detailsFolderElsewhere: (where: string) => string; detailsFolderGone: (cwd: string) => string; detailsFolderLocation: (where: FolderLocation) => string; detailsGenerate: string; detailsGenerateHint: string; detailsGenerating: string; detailsId: string; detailsJson: string; detailsMainDescription: string; detailsMainEverySpace: string; detailsMainHasNoFolder: string; detailsMainKeepsName: string; detailsMainNoFolder: string; detailsMainTitle: string; detailsMarkdown: string; detailsMessages: (count: number) => string; detailsModel: string; detailsNoFolder: string; detailsPickOther: string; detailsProviderHint: string; detailsReveal: string; detailsRevealHint: (cwd: string) => string; detailsRuns: (count: number) => string; detailsSave: string; detailsSavedTo: string; detailsSetFolder: string; detailsSpace: string; detailsSpaceHint: string; detailsSpaceLabel: string; detailsStatus: string; detailsStatusLabel: Record<'error' | 'running' | 'idle' | 'completed', string>; detailsStopToChange: string; detailsStopToDetach: string; detailsTitle: string; detailsTitleFact: string; detailsTitleLabel: string; detailsTurns: (count: number) => string; detailsUnknown: string; detailsUpdated: string; diffChangedFiles: string; diffFiles: (files: number) => string; diffFindings: (errors: number, warnings: number) => string; headerChangeFolder: (cwd: string) => string; headerChat: string; headerChatAttach: string; headerChatRunning: string; headerDetails: string; headerFolderOnServer: (cwd: string, server: string | null) => string; headerMainFolder: string; headerOnServer: (server: string | null) => string; headerRename: string; headerServerGone: string; planDrop: string; planDropCancel: string; planDropConfirm: (applying: boolean) => 'Drop this plan and stop the run?' | 'Drop this plan?'; planDropHint: string; planDropYes: string; planHideBody: string; planMaybeInterrupted: string; planNoSteps: string; planResume: string; planResumeHint: string; planShowBody: string; planState: Record<PlanState, string>; planStop: string; planStopHint: string; planStopped: (step: number | null, reason: PlanStopReason | undefined) => string; planUntitled: string; projectHomeAddBlock: string; projectHomeBlockMenu: (block: string) => string; projectHomeCustomize: string; projectHomeDismiss: string; projectHomeDone: string; projectHomeDrag: (block: string) => string; projectHomeFullWidth: string; projectHomeHalfWidth: string; projectHomeHide: string; projectHomeLabel: (project: string | null) => string; projectHomeMoveDown: string; projectHomeMoveUp: string; projectHomeOpenEditor: string; projectHomeOpenFiles: (path: string) => string; projectHomeOpenRepo: (repo: string, web: boolean) => string; projectHomeRefresh: string; projectHomeRemote: string; projectHomeReveal: string; projectHomeSwitch: string; queueAttach: string; queueAttachmentName: (attachment: { mediaType: string; name?: string }) => string; queueCancel: string; queueCount: (count: number) => string; queueEdit: string; queueEditHint: string; queueEditLabel: string; queueEmpty: string; queueEmptyHint: string; queueHintCancel: string; queueHintNewline: string; queueHintPush: string; queueHintSave: string; queueListLabel: string; queueOrder: string; queuePush: string; queueRemove: string; queueSave: string; queueSaveAndPush: string; queueViewAttachments: (count: number, first: string) => string; reminderCancel: string; reminderCountdown: (ms: number) => string; reminderCreate: string; reminderCreator: (creator: ScheduleCreator) => string; reminderDelete: (label: string) => string; reminderDone: string; reminderExpires: (when: string) => string; reminderFireLate: string; reminderFireOutcome: (outcome: ScheduleFireOutcome) => string; reminderHistoryHide: (label: string) => string; reminderHistoryLabel: (label: string) => string; reminderHistoryShow: (label: string) => string; reminderKeep: (label: string) => string; reminderLastSent: (when: string) => string; reminderNew: string; reminderNext: (when: string) => string; reminderNoFires: string; reminderOff: string; reminderOffReason: (reason: string) => string; reminderOnce: string; reminderPause: (label: string) => string; reminderPreview: (when: string) => string; reminderPromptLabel: string; reminderPromptPlaceholder: string; reminderResume: (label: string) => string; reminderRunNow: (label: string) => string; remindersCount: (n: number) => string; remindersEmpty: string; remindersEmptyAll: string; remindersEmptyHint: string; remindersFinished: string; remindersLabel: string; remindersListLabel: string; remindersOff: string; remindersOffHint: string; remindersScopeAll: string; remindersScopeLabel: string; remindersScopeSession: string; remindersUnsupported: string; reminderTargetExtension: (extension: string) => string; reminderTargetNew: (folder: string) => string; reminderTargetOpen: (title: string) => string; reminderTargetOther: string; reminderTargetUntitled: string; reminderWhenError: (reason: 'unknown' | 'empty' | 'extra') => 'Type when to send it.' | 'Only the time goes here. Put the message below.' | 'Try in 20m, at 9:00, tomorrow 9:00, every 2h, daily 9:00, weekdays 9:00 or cron "0 9 * * 1-5".'; reminderWhenLabel: string; reminderWhenPick: (words: string) => string; reminderWhenPicks: readonly string[]; reminderWhenPlaceholder: string; runningWorkCancel: string; runningWorkCancelAll: string; runningWorkCancelling: string; runningWorkDescription: string; runningWorkEmpty: string; runningWorkKind: Record<'task' | 'tool', string>; runningWorkRefresh: string; runningWorkShowTerminal: string; runningWorkTitle: string; secretCancel: string; secretExpiry: (left: SecretTimeLeft) => string; secretNameInvalid: string; secretNameLabel: string; secretNamePlaceholder: string; secretReplace: (name: string) => string; secretReplacesSaved: (name: string) => string; secretRevoke: (name: string) => string; secretsAdd: string; secretSave: string; secretSavedElsewhere: string; secretSavedHere: string; secretsEmpty: string; secretsEmptyHint: string; secretsLabel: string; secretsListLabel: string; secretsNote: string; secretValueLabel: string; shellClose: string; sideComposerLabel: string; sideEmptyHint: string; sideEmptyTitle: string; sidePlaceholder: string; sideRefusal: (reason: 'unavailable' | 'no-conversation' | 'no-panel') => 'Send a message first. A side chat follows a conversation.' | 'Side chats work only on this computer\'s conversations' | 'This window has no side panel for side chats'; sideResetDescription: string; sideResetFailed: (reason: string) => string; stepAdded: string; stepAgentNote: (note: string) => string; stepCancel: string; stepCancelHint: string; stepCancelledByYou: string; stepDroppedByAgent: string; todoAdd: string; todoAddLabel: string; todoAddPlaceholder: string; todoEdit: string; todoRetry: string; todoRetryHint: string; todosEmpty: string; todosEmptyHint: string; todosProgress: (done: number, total: number) => string; todoStatus: (status: TodoStatus) => string; todoTally: Record<TodoStatus, string>; turnAfter: (count: number) => string; turnBefore: (count: number) => string; turnCancel: string; turnCopied: string; turnCopy: string; turnCopyFailed: (message: string) => string; turnCopyHint: string; turnDelete: string; turnDeleteHint: string; turnEdit: string; turnEditHint: string; turnFork: string; turnForkHint: string; turnLoading: string; turnNoText: string; turnRole: (role: string | null) => string; turnSave: string; turnSaving: string; turnStopFirst: string; turnTextLabel: string; turnTitle: string; usageChecking: string; usageCredits: string; usageDescription: string; usageGithub: string; usageInUse: string; usageModelProviders: string; usageNone: string; usageOff: string; usageRefresh: string; usageRefreshing: string; usageResetConfirm: string; usageResetConfirmMessage: (count: number, title?: string | null) => string; usageResetConfirmTitle: (provider: string) => string; usageResetDates: (grantedAt: number | null, expiresAt: number | null) => string; usageResetOutcome: (code: 'failed' | 'reset' | 'nothing_to_reset' | 'no_credit' | 'already_redeemed', error?: string | null) => string; usageResets: string; usageResetsLeft: (count: number) => string; usageResetUntitled: string; usageResetUse: string; usageResetUseOne: (title: string) => string; usageResetUseShort: string; usageResetUsing: string; usageTitle: string; usageUnavailable: (unauthorized: boolean, error?: string | null) => string; usageWindowUsed: (window: string, percent: string) => string; welcomeDate: (date: Date) => string; welcomeGreeting: (hour: number, name: string | null) => string; welcomeUsageLabel: string }`

Source: [ui/src/session/useSessionLabels.ts:11](https://github.com/Tahul/zidane/blob/main/ui/src/session/useSessionLabels.ts#L11)

### `useSessionPlans`

Function.

A session's plans snapshot (`null` until read, or without a session or a `plans` host). Re-renders only when that
session's snapshot changes.

```ts
function useSessionPlans(sessionId: string | null | undefined): PlansSnapshot | null
```

**Parameters**

- `sessionId` (`string | null | undefined`): The session, or nothing.

**Returns** `PlansSnapshot | null`

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

### `useSessionQueue`

Function.

A session's queued messages, in delivery order (empty without a session or a `queue` host). Re-renders only when
that session's queue changes.

```ts
function useSessionQueue(sessionId: string | null | undefined): readonly QueuedMessage[]
```

**Parameters**

- `sessionId` (`string | null | undefined`): The session, or nothing.

**Returns** `readonly QueuedMessage[]`

Source: [ui/src/session/SessionProvider.tsx:128](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionProvider.tsx#L128)

### `useSessionRunningWork`

Function.

A session's running work, live (empty without a session or a `runningWork` host). The first read of a session
seeds it from the host. Re-renders only when that session's work changes.

```ts
function useSessionRunningWork(
  sessionId: string | null | undefined,
): readonly RunningWorkItem[]
```

**Parameters**

- `sessionId` (`string | null | undefined`): The session, or nothing.

**Returns** `readonly RunningWorkItem[]`

Source: [ui/src/session/SessionProvider.tsx:150](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionProvider.tsx#L150)

### `useSessionSchedules`

Function.

The reminders whose prompt goes to a session (`null` until read, while off, or without a session or a
`schedules` host). Re-renders only when that session's reminders change.

```ts
function useSessionSchedules(
  sessionId: string | null | undefined,
): readonly Schedule[] | null
```

**Parameters**

- `sessionId` (`string | null | undefined`): The session, or nothing.

**Returns** `readonly Schedule[] | null`

Source: [ui/src/session/SessionProvider.tsx:83](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionProvider.tsx#L83)

### `useSessionSecrets`

Function.

A session project's saved secrets, by name (`null` until read, or without a session or a `secrets` host).
Re-renders only when that session's list changes.

```ts
function useSessionSecrets(
  sessionId: string | null | undefined,
): readonly SecretEntry[] | null
```

**Parameters**

- `sessionId` (`string | null | undefined`): The session, or nothing.

**Returns** `readonly SecretEntry[] | null`

Source: [ui/src/session/SessionProvider.tsx:106](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionProvider.tsx#L106)

### `useUsageSummary`

Function.

The summary to show for `range`, refreshed on mount and on every range change.

```ts
function useUsageSummary(range: UsageRange): UsageSummaryView
```

**Parameters**

- `range` (`UsageRange`): The range asked for.

**Returns** `UsageSummaryView`

Source: [ui/src/session/useUsageSummary.ts:61](https://github.com/Tahul/zidane/blob/main/ui/src/session/useUsageSummary.ts#L61)

## Constants

### `BADGE_ICONS`

Constant.

Icon classes extension badges and references may name. Icons are UnoCSS classes generated at
build time from literals in scanned source, so an icon an extension names exists only if it
appears here (or anywhere else the app's Uno scans); one outside it paints nothing and the badge
keeps its text.

```ts
const BADGE_ICONS: readonly ['i-ph-git-commit', 'i-ph-git-pull-request', 'i-ph-git-branch', 'i-ph-git-merge', 'i-ph-ticket', 'i-ph-kanban', 'i-ph-cube', 'i-ph-users-three', 'i-ph-arrows-clockwise', 'i-ph-eye', 'i-ph-chat-circle', 'i-ph-caret-right', 'i-ph-user-circle', 'i-ph-files', 'i-ph-git-commit', 'i-ph-circle', 'i-ph-circle-dashed', 'i-ph-circle-half', 'i-ph-circle-half-fill', 'i-ph-check-circle', 'i-ph-check-circle-fill', 'i-ph-x-circle', 'i-ph-x-circle-fill', 'i-ph-prohibit', 'i-ph-bug', 'i-ph-rocket-launch', 'i-ph-flag', 'i-ph-folder-simple', 'i-ph-file', 'i-ph-link', 'i-ph-globe', 'i-ph-cloud-arrow-up', 'i-ph-package', 'i-ph-tag', 'i-ph-warning-circle', 'i-ph-warning-circle-fill', 'i-ph-record', 'i-ph-hash']
```

Source: [ui/src/session/ArtifactRowChips.tsx:46](https://github.com/Tahul/zidane/blob/main/ui/src/session/ArtifactRowChips.tsx#L46)

### `renderSessionModalShell`

Constant.

A session dialog in the app's `ModalShell`, medium width.

```ts
const renderSessionModalShell: RenderSessionShell
```

Source: [ui/src/session/modal-shell.tsx:21](https://github.com/Tahul/zidane/blob/main/ui/src/session/modal-shell.tsx#L21)

### `renderWideSessionModalShell`

Constant.

For the session details: a facts grid and the cache table need the room.

```ts
const renderWideSessionModalShell: RenderSessionShell
```

Source: [ui/src/session/modal-shell.tsx:24](https://github.com/Tahul/zidane/blob/main/ui/src/session/modal-shell.tsx#L24)

### `TODO_ROW_CLASS`

Constant.

A flat todo row: no box of its own, the hover wash only.

```ts
const TODO_ROW_CLASS = 'flex items-center gap-2.5 px-2 py-1 rounded-zg-md'
```

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

## Interfaces

### `ArtifactOpenEvent`

Interface.

The modifier keys of the click that opened a path.

```ts
interface ArtifactOpenEvent
```

**Properties**

- `altKey?` (`boolean`): Alt was held: the path opens the app's way, past the extensions' link handlers.
- `ctrlKey?` (`boolean`): Ctrl was held.
- `metaKey?` (`boolean`): ⌘ was held.

Source: [ui/src/session/ArtifactsPanel.tsx:39](https://github.com/Tahul/zidane/blob/main/ui/src/session/ArtifactsPanel.tsx#L39)

### `ArtifactRowChipsFields`

Interface.

The fields of an artifact row's chips line.

```ts
interface ArtifactRowChipsFields
```

**Properties**

- `diff?` (`{ added: number; files?: number; href?: string; removed: number }`): A change size.
- `facts?` (`readonly ExtensionArtifactRowFact[]`): Quiet facts after the diff.
- `lead?` (`{ href?: string; mono?: boolean; text: string }`): A short id (a commit hash, `owner/repo#12`); `mono` for hashes.

Source: [ui/src/session/ArtifactRowChips.tsx:146](https://github.com/Tahul/zidane/blob/main/ui/src/session/ArtifactRowChips.tsx#L146)

### `ArtifactRowChipsProps`

Interface.

Props for [`ArtifactRowChips`](https://zidane.si/docs/reference/ui-session.md#ArtifactRowChips).

```ts
interface ArtifactRowChipsProps extends ArtifactRowChipsFields
```

**Properties**

- `className?` (`string`): Extra classes on the root.
- `diff?` (`{ added: number; files?: number; href?: string; removed: number }`, from `ArtifactRowChipsFields`): A change size.
- `facts?` (`readonly ExtensionArtifactRowFact[]`, from `ArtifactRowChipsFields`): Quiet facts after the diff.
- `lead?` (`{ href?: string; mono?: boolean; text: string }`, from `ArtifactRowChipsFields`): A short id (a commit hash, `owner/repo#12`); `mono` for hashes.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/session/ArtifactRowChips.tsx:156](https://github.com/Tahul/zidane/blob/main/ui/src/session/ArtifactRowChips.tsx#L156)

### `ArtifactsPanelFocus`

Interface.

What a sidebar badge pointed the panel at: a kind's group, or one artifact.

```ts
interface ArtifactsPanelFocus
```

**Properties**

- `kind?` (`string`): The kind's group to bring into view.
- `uri?` (`string`): The artifact (by URI) to bring into view and mark.

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

### `ArtifactsPanelProps`

Interface.

Props for [`ArtifactsPanel`](https://zidane.si/docs/reference/ui-session.md#ArtifactsPanel).

```ts
interface ArtifactsPanelProps
```

**Properties**

- `className?` (`string`): Extra classes on the root.
- `focus?` (`ArtifactsPanelFocus | null`): Brings a group or an artifact into view and marks it, until the next focus.
- `onOpenPath?` (`(path: string, event?: ArtifactOpenEvent) => Promise<boolean>`): Opens a path (a file, a folder). Resolves `false` when it is unavailable. Absent: path rows are text.
- `onRevealPath?` (`(path: string) => void`): Shows a path in the file manager. Absent: no Reveal item.
- `remoteName?` (`string | null`): The machine the session's paths are on when it is not this one: a path row says so instead of opening.
- `sessionId` (`string`): The session whose artifacts to list.
- `style?` (`CSSProperties`): Inline styles on the root.

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

### `DiffFactsProps`

Interface.

Props for [`DiffFacts`](https://zidane.si/docs/reference/ui-session.md#DiffFacts).

```ts
interface DiffFactsProps
```

**Properties**

- `added` (`number`): Lines added.
- `className?` (`string`): Extra classes on the root.
- `files?` (`number`): Files changed. Absent: not shown.
- `href?` (`string`): Makes it a link (a pull request's files tab).
- `removed` (`number`): Lines removed.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/session/ArtifactRowChips.tsx:88](https://github.com/Tahul/zidane/blob/main/ui/src/session/ArtifactRowChips.tsx#L88)

### `DiffFileTreeProps`

Interface.

Props for [`DiffFileTree`](https://zidane.si/docs/reference/ui-session.md#DiffFileTree).

```ts
interface DiffFileTreeProps
```

**Properties**

- `chevron` (`(open: boolean) => ReactNode`): A folder's chevron, open or closed.
- `className?` (`string`): Extra classes on the root element.
- `collapsed` (`ReadonlySet<string>`): Paths of the collapsed folders.
- `fileIcon` (`(path: string) => ReactNode`): A file's icon (14px).
- `findings` (`ReadonlyMap<string, FindingCounts> | null | undefined`): Project tools' findings by file key; none: no findings column.
- `listRef?` (`Ref<HTMLUListElement>`): The list element.
- `onBrowse?` (`(browsing: boolean) => void`): The pointer moving over the list (`true`), or leaving it.
- `onOpen` (`(key: string) => void`): A file row was clicked.
- `onToggle` (`(dirPath: string) => void`): A folder row was clicked.
- `rows` (`readonly DiffTreeNode[]`): The rows on screen (`visibleRows`).
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `visible` (`ReadonlySet<string>`): Keys of the files whose diff is on screen.

Source: [ui/src/session/DiffFileTree.tsx:26](https://github.com/Tahul/zidane/blob/main/ui/src/session/DiffFileTree.tsx#L26)

### `FindingCounts`

Interface.

Errors and warnings project tools reported on a file.

```ts
interface FindingCounts
```

**Properties**

- `errors` (`number`): Errors on the file.
- `warnings` (`number`): Warnings on the file.

Source: [ui/src/session/DiffFileTree.tsx:18](https://github.com/Tahul/zidane/blob/main/ui/src/session/DiffFileTree.tsx#L18)

### `InboxAttentionProps`

Interface.

Props for [`InboxAttention`](https://zidane.si/docs/reference/ui-session.md#InboxAttention).

```ts
interface InboxAttentionProps extends PanelAttentionProps
```

**Properties**

- `actions?` (`AttentionActions`, from `PanelAttentionProps`): Where badges go. Default: the `WorkspaceProvider` above (none: nothing happens). Keep it stable.
- `reveal?` (`boolean`, default `true`): A live request may open the panel and focus the Inbox. False (an overlay panel that is not showing): only the
  tab switches and the badge carries it.
- `sessionId` (`string | null`, from `PanelAttentionProps`): The active session, or `null`.

Source: [ui/src/session/PanelAttention.tsx:42](https://github.com/Tahul/zidane/blob/main/ui/src/session/PanelAttention.tsx#L42)

### `PanelAttentionProps`

Interface.

Props shared by the attention drivers.

```ts
interface PanelAttentionProps
```

**Properties**

- `actions?` (`AttentionActions`): Where badges go. Default: the `WorkspaceProvider` above (none: nothing happens). Keep it stable.
- `sessionId` (`string | null`): The active session, or `null`.

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

### `PlanTrackerProps`

Interface.

Props for [`PlanTracker`](https://zidane.si/docs/reference/ui-session.md#PlanTracker).

```ts
interface PlanTrackerProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `hideHeader?` (`boolean`): Leave out the title row (a "Recent" row opened already shows it).
- `plan` (`PlanView`): The plan to show.
- `sessionId` (`string`): The session the plan belongs to.
- `style?` (`CSSProperties`): Inline styles on the root element.

Source: [ui/src/session/PlanTracker.tsx:46](https://github.com/Tahul/zidane/blob/main/ui/src/session/PlanTracker.tsx#L46)

### `ProjectHomeProject`

Interface.

The project a home is for.

```ts
interface ProjectHomeProject
```

**Properties**

- `hostId?` (`string`): The host the project is on (`HostView.id`), for showing its path. Absent: this computer.
- `icon?` (`ReactNode`): Its icon (the sidebar's project icon).
- `name` (`string`): Its name (the folder's).
- `path` (`string`): Its path, shown under the name (its machine's home folder as `~`).
- `repo?` (`ProjectHomeRepo`): Its repository (`owner/repo`), shown as a chip before the path.

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

### `ProjectHomeProps`

Interface.

Props for [`ProjectHome`](https://zidane.si/docs/reference/ui-session.md#ProjectHome).

```ts
interface ProjectHomeProps
```

**Properties**

- `blocksUnavailable?` (`boolean`): The project's blocks can't load here (a project on a server): say so instead.
- `className?` (`string`): Extra classes on the root.
- `cwd` (`string`): The folder the blocks are for; `''` for the home of no project.
- `defaultBlocks?` (`readonly string[]`): The blocks shown before the user adds any (panel ids); the rest wait in Add block. Absent: every block.
- `now?` (`Date`): The moment the greeting describes. Default: when it mounts.
- `onOpenFiles?` (`() => void`): A click on the project's path chip: open the Files panel. Absent: the chip is plain text.
- `onOpenInEditor?` (`(path: string) => void`): "Open in editor" in the path chip's right-click menu.
- `onOpenPath?` (`(path: string, event?: PanelOpenEvent) => void`): Opens a block row's path.
- `onOpenRepo?` (`() => void`): A click on the repository chip (its web page, or the working tree). Absent: the chip is plain text.
- `onOpenSession?` (`(sessionId: string) => void`): Opens a block row's session.
- `onRevealPath?` (`(path: string) => void`): "Open in Finder" in the path chip's right-click menu.
- `onStartSession?` (`(start: PanelStartSession) => Promise<ProjectHomeStartResult>`): A block row's "start a session" (a pull request's Open in worktree, a ticket's Open here): sets up the new-chat
  draft (`useStartFromPanel`, `zidane-ui/git`). A failure shows on the block. Absent: those buttons are not offered.
- `panels?` (`WorkspacePanels`): Where blocks come from. Absent: no blocks (see `blocksUnavailable`).
- `project?` (`ProjectHomeProject`): The project. Absent: the home of no project, headed by the greeting.
- `projectKey` (`string`): Key the arrangement is kept under (the project root, qualified by its host).
- `style?` (`CSSProperties`): Inline styles on the root.
- `switcher?` (`ProjectHomeSwitcher`): A click on the project's name opens this menu of projects. Absent: the name is plain text.

Source: [ui/src/session/ProjectHome.tsx:100](https://github.com/Tahul/zidane/blob/main/ui/src/session/ProjectHome.tsx#L100)

### `ProjectHomeRepo`

Interface.

A project's repository, as its header's chip shows it.

```ts
interface ProjectHomeRepo
```

**Properties**

- `icon?` (`string`): The chip's icon class (`i-ph-github-logo`). Default: a git branch.
- `name` (`string`): `owner/repo` (or the folder's name for a repository without a remote).
- `web` (`boolean`): It has a web page (`onOpenRepo` opens it); else the chip shows the working tree. Words the tooltip.

Source: [ui/src/session/ProjectHome.tsx:90](https://github.com/Tahul/zidane/blob/main/ui/src/session/ProjectHome.tsx#L90)

### `ProjectHomeSwitcher`

Interface.

The projects the name switches between: the composer's folder menu, opened from the name.

```ts
interface ProjectHomeSwitcher
```

**Properties**

- `current` (`string | null`): The project on show, checked in the list.
- `onImportRepo?` (`() => void | Promise<void>`): Imports a repository. Absent: not offered.
- `onPick` (`(folder: string) => void`): Switches to a project.
- `onSelectDirectory?` (`() => void | Promise<void>`): "Select directory…" (a native dialog). Absent: not offered.
- `projects` (`readonly string[]`): The projects to pick from, most recent first.

Source: [ui/src/session/ProjectHome.tsx:76](https://github.com/Tahul/zidane/blob/main/ui/src/session/ProjectHome.tsx#L76)

### `ProviderUsage`

Interface.

What [`useProviderUsage`](https://zidane.si/docs/reference/ui-session.md#useProviderUsage) returns.

```ts
interface ProviderUsage extends ProviderUsageView
```

**Properties**

- `available` (`boolean`): Whether the host reports subscription usage at all.
- `github` (`readonly ProviderUsageSnapshot[]`, from `ProviderUsageView`): GitHub's API limits, one snapshot per host. Never read as a model provider.
- `loaded` (`boolean`, from `ProviderUsageView`): At least one fetch completed (auto or manual).
- `loading` (`boolean`, from `ProviderUsageView`): A fetch is in flight.
- `redeemReset` (`((target: ProviderResetTarget) => Promise<ProviderResetOutcome>) | null`): Spends one banked reset on a snapshot's account, then refreshes. `null`: the host can't redeem.
- `refresh` (`() => void`): Fetches now, bypassing the backend's cache. Works with background probes off.
- `snapshots` (`readonly ProviderUsageSnapshot[]`, from `ProviderUsageView`): The model providers' snapshots.

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

### `ProviderUsageProviderProps`

Interface.

Props for [`ProviderUsageProvider`](https://zidane.si/docs/reference/ui-session.md#ProviderUsageProvider).

```ts
interface ProviderUsageProviderProps
```

**Properties**

- `autoLoad?` (`boolean`): Probe in the background (every minute while visible and focused). Off: only a manual refresh fetches. Default `true`.
- `children` (`ReactNode`): The components that read usage.

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

### `QueueAttachmentRowProps`

Interface.

What an `attachments` slot's row receives: the staged attachments and the editor's removal wiring.

```ts
interface QueueAttachmentRowProps
```

**Properties**

- `attachments` (`readonly StagedAttachment[]`): The staged attachments (a removed one stays while it shrinks away: see `exitingIds`).
- `exitingIds` (`Set<string>`): The ids leaving.
- `onExited` (`(id: string) => void`): A removed tile finished leaving.
- `onOpenLightbox` (`(id: string, origin: HTMLElement) => void`): Opens the lightbox at one attachment.
- `onRemove` (`(id: string) => void`): Starts removing one (the tile shrinks away).

Source: [ui/src/session/QueueTab.tsx:43](https://github.com/Tahul/zidane/blob/main/ui/src/session/QueueTab.tsx#L43)

### `QueueAttachmentsSlot`

Interface.

The app's attachment pieces for the queue editor: the staged tiles and their previews.

```ts
interface QueueAttachmentsSlot
```

**Properties**

- `enabled?` (`boolean`): Whether attaching is on. Default `true`.
- `lightboxItems?` (`(attachments: readonly StagedAttachment[]) => LightboxItem[]`): The lightbox gallery of staged attachments (the previewable ones). Default: images and PDFs.
- `renderRow` (`(props: QueueAttachmentRowProps) => ReactNode`): Draws the staged attachments as tiles.

Source: [ui/src/session/QueueTab.tsx:57](https://github.com/Tahul/zidane/blob/main/ui/src/session/QueueTab.tsx#L57)

### `QueueTabProps`

Interface.

Props for [`QueueTab`](https://zidane.si/docs/reference/ui-session.md#QueueTab).

```ts
interface QueueTabProps
```

**Properties**

- `attachments?` (`QueueAttachmentsSlot`): Attachment editing in the editor. Absent: stored attachments are kept as they are, none can be added.
- `className?` (`string`): Extra classes on the root.
- `onDrop?` (`(id: string) => void`): Drops an entry. Default: `queue.remove`.
- `onEdit?` (`(sessionId: string, from: string, to: string) => void`): An entry's text is about to change from `from` to `to`.
- `onPush?` (`(id: string, text: string) => void`): Pushes an entry (with the text the host now holds) into the run. Default: `queue.pushNow`.
- `sessionId` (`string`): The session whose queue to show.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/session/QueueTab.tsx:67](https://github.com/Tahul/zidane/blob/main/ui/src/session/QueueTab.tsx#L67)

### `RecentPlansProps`

Interface.

Props for [`RecentPlans`](https://zidane.si/docs/reference/ui-session.md#RecentPlans).

```ts
interface RecentPlansProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `plans` (`readonly PlanView[]`): Closed plans, newest first (`useInboxPlans`).
- `sessionId` (`string`): The session the plans belong to.
- `style?` (`CSSProperties`): Inline styles on the root element.

Source: [ui/src/session/PlanTracker.tsx:374](https://github.com/Tahul/zidane/blob/main/ui/src/session/PlanTracker.tsx#L374)

### `RemindersPanelProps`

Interface.

Props for [`RemindersPanel`](https://zidane.si/docs/reference/ui-session.md#RemindersPanel).

```ts
interface RemindersPanelProps
```

**Properties**

- `className?` (`string`): Extra classes on the root.
- `initialScope?` (`RemindersScope`, default `'session'`): The list it opens on.
- `onOpenSession?` (`(sessionId: string) => void`): Opens a session: a reminder that goes to another session links to it. Default: the `OpenSessionContext` opener.
- `sessionId` (`string`): The session the panel is beside: its reminders, and where a new one goes.
- `style?` (`CSSProperties`): Inline styles on the root.

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

### `RunningWorkDialogProps`

Interface.

Props for [`RunningWorkDialog`](https://zidane.si/docs/reference/ui-session.md#RunningWorkDialog).

```ts
interface RunningWorkDialogProps
```

**Properties**

- `className?` (`string`): Extra classes on the default shell.
- `onClose` (`() => void`): Closes the dialog.
- `renderShell?` (`RenderSessionShell`): The app's modal shell. Default: [`SessionShell`](https://zidane.si/docs/reference/ui-session.md#SessionShell).
- `sessionId` (`string`): The session whose work to show.
- `showTerminal?` (`(item: RunningWorkItem) => (() => void) | null`): The terminal a row can show: a handler that shows it, or `null`. Absent: no Show terminal.
- `style?` (`CSSProperties`): Inline styles on the default shell.

Source: [ui/src/session/RunningWorkDialog.tsx:26](https://github.com/Tahul/zidane/blob/main/ui/src/session/RunningWorkDialog.tsx#L26)

### `SecretsAttentionProps`

Interface.

Props for [`SecretsAttention`](https://zidane.si/docs/reference/ui-session.md#SecretsAttention).

```ts
interface SecretsAttentionProps
```

**Properties**

- `actions?` (`Pick<WorkspaceActions, 'openProactive'>`): Where the open goes. Default: the `WorkspaceProvider` above (none: nothing happens). Keep it stable.
- `sessionId` (`string | null`): The active session, or `null`.

Source: [ui/src/session/PanelAttention.tsx:118](https://github.com/Tahul/zidane/blob/main/ui/src/session/PanelAttention.tsx#L118)

### `SecretsPanelProps`

Interface.

Props for [`SecretsPanel`](https://zidane.si/docs/reference/ui-session.md#SecretsPanel).

```ts
interface SecretsPanelProps
```

**Properties**

- `className?` (`string`): Extra classes on the root.
- `sessionId` (`string`): The session whose project's secrets to list.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/session/SecretsPanel.tsx:29](https://github.com/Tahul/zidane/blob/main/ui/src/session/SecretsPanel.tsx#L29)

### `SessionCacheFactsProps`

Interface.

Props for [`SessionCacheFacts`](https://zidane.si/docs/reference/ui-session.md#SessionCacheFacts).

```ts
interface SessionCacheFactsProps
```

**Properties**

- `className?` (`string`): Classes merged on the root.
- `defaultOpen?` (`boolean`): The per-request table starts open. Default: collapsed behind a toggle.
- `now?` (`number`): The clock the expiry reads against. Default: now.
- `report` (`CacheReport`): The report, from [`useSessionCacheReport`](https://zidane.si/docs/reference/ui-session.md#useSessionCacheReport).
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/session/SessionCacheFacts.tsx:61](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionCacheFacts.tsx#L61)

### `SessionDetailsDialogProps`

Interface.

Props for [`SessionDetailsDialog`](https://zidane.si/docs/reference/ui-session.md#SessionDetailsDialog).

```ts
interface SessionDetailsDialogProps
```

**Properties**

- `cache?` (`ReactNode`): The cache report, as the Cache fact.
- `className?` (`string`): Extra classes on the default shell.
- `confirmDelete?` (`() => Promise<boolean>`): Asks the user to confirm the deletion. Absent: no confirmation.
- `folderPicker?` (`(attach: (folder: string) => void) => ReactNode`): Replaces the folder picker button (a remote folder picker for a server session); `attach` sets the folder.
- `formatError?` (`(error: unknown) => string`): Words an error from an action. Default: its message.
- `onChanged?` (`() => Promise<void>`): Something about the session changed (title, folder, compaction): re-read what shows it.
- `onClose` (`() => void`): Closes the dialog.
- `onDelete?` (`() => Promise<void>`): Deletes the session (the dialog closes after). Absent: no Delete.
- `onMoveToSpace?` (`(spaceId: string) => Promise<void>`): Moves the session to a space.
- `onPickFolder?` (`() => Promise<string | null>`): Picks a folder on this computer. Resolves `null` when cancelled. Absent: no picker.
- `onRename?` (`(title: string) => Promise<void>`): Renames the session. Absent: the title is read-only.
- `onRevealFolder?` (`() => Promise<boolean>`): Shows the folder in the file manager. Resolves `false` when it is gone. Absent: no Open button.
- `renderShell?` (`RenderSessionShell`): The app's modal shell. Default: [`SessionShell`](https://zidane.si/docs/reference/ui-session.md#SessionShell).
- `session` (`SessionDetailsFacts`): The session's facts.
- `spaceId?` (`string`): The session's space.
- `spaces?` (`readonly SessionDetailsSpace[] | null`): The spaces, when spaces are on.
- `style?` (`CSSProperties`): Inline styles on the default shell.

Source: [ui/src/session/SessionDetailsDialog.tsx:86](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionDetailsDialog.tsx#L86)

### `SessionDetailsFacts`

Interface.

The facts the dialog shows, resolved by the app.

```ts
interface SessionDetailsFacts
```

**Properties**

- `account?` (`{ label: string; signedOut?: boolean }`): The pinned account. `signedOut`: its provider no longer lists it.
- `agent?` (`{ color?: string; description?: string; id: string; label?: string }`): The agent profile.
- `createdAt?` (`number`): Created (ms).
- `cwd` (`string`): The folder; `''` for a chat without one.
- `effort?` (`string`): The reasoning effort.
- `folderDisplay?` (`string`): The folder as shown (its home folder as `~`, a long path giving way in the middle). Default: `cwd`.
- `folderLocation?` (`SessionFolderLocation | null`): Where the folder is when this computer's picker can't choose it.
- `id` (`string`): The session id, shown and copied.
- `isMain?` (`boolean`): The orchestration main: titled Main, folderless, everywhere.
- `model?` (`{ id: string; name: string }`): The model: its id (on hover) and display name. Absent: the default model.
- `projectRoot?` (`string`): The project root, the description when there is no folder.
- `provider?` (`{ key: string; label: string }`): The provider: its key (for its color) and display name.
- `runCount` (`number`): Runs.
- `status` (`SessionDetailsStatus`): The run state.
- `title` (`string`): The title.
- `turnCount` (`number`): Stored turns.
- `updatedAt?` (`number`): Last updated (ms).
- `userMessageCount` (`number`): User messages.

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

### `SessionDetailsSpace`

Interface.

A space the session can move to.

```ts
interface SessionDetailsSpace
```

**Properties**

- `id` (`string`): The space id.
- `label` (`string`): What the option shows (its emoji and name).

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

### `SessionHeaderProps`

Interface.

Props for [`SessionHeader`](https://zidane.si/docs/reference/ui-session.md#SessionHeader).

```ts
interface SessionHeaderProps
```

**Properties**

- `className?` (`string`): Extra classes on the root.
- `cwd` (`string`): The session's folder; `''` for a chat without one.
- `isMain?` (`boolean`): The orchestration main: no folder, a fixed name.
- `menuItems?` (`RowActionItem[]`): The right-click menu's items. Absent: no menu.
- `onMenuOpenChange?` (`(open: boolean) => void`): The menu opened or closed (to load items only while it shows).
- `onOpenDetails?` (`() => void`): Opens the session details.
- `onPickFolder?` (`() => void`): Picks a folder (attaches one to a chat, or changes the default folder). Absent: the chip is inert.
- `onRename?` (`(title: string) => Promise<void>`): Renames the session. Absent: no in-place rename.
- `onRenamingChange?` (`(renaming: boolean) => void`): The rename started or ended.
- `renaming?` (`boolean`): The title is being renamed in place (controlled by the menu's Rename).
- `running?` (`boolean`): A run is in progress (a folderless chat can't attach a folder mid-run).
- `server?` (`SessionHeaderServer`): The server a server session runs on (its folders are the server's: no local picker).
- `sessionId?` (`string`): The session shown: its extensions' `session.header` items show before the toolbar. Default: `titleScope`.
- `style?` (`CSSProperties`): Inline styles on the root (the app's chrome insets).
- `title` (`string`): The session title.
- `titleDisplay?` (`ReactNode`): What draws the title (reference badges); plain text by default, so a new title writes in word by word.
- `titleScope?` (`string`): Keys the title's write-in animation (the session id).
- `toolbar?` (`ReactNode`): The app's controls on the right.

Source: [ui/src/session/SessionHeader.tsx:29](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionHeader.tsx#L29)

### `SessionHeaderServer`

Interface.

The server a server session runs on.

```ts
interface SessionHeaderServer
```

**Properties**

- `name?` (`string`): Its name; absent when it is no longer saved.
- `status?` (`ReactNode`): Its connection status (a dot).
- `url?` (`string`): Its address, on hover.

Source: [ui/src/session/SessionHeader.tsx:19](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionHeader.tsx#L19)

### `SessionProviderProps`

Interface.

Props for [`SessionProvider`](https://zidane.si/docs/reference/ui-session.md#SessionProvider).

```ts
interface SessionProviderProps
```

**Properties**

- `children` (`ReactNode`): The components that read from `host`.
- `host` (`SessionHost`): The host the session panels below read plans, queues and artifacts from.
- `labels?` (`Partial<{ artifactCopyLink: string; artifactCopyPath: string; artifactCopySha: string; artifactHideDetails: string; artifactOnRemote: (machine: string) => string; artifactOpen: (path: string) => string; artifactPathUnavailable: string; artifactRemove: string; artifactReveal: string; artifactsCount: (label: string, count: number) => string; artifactsEmpty: string; artifactsEmptyHint: string; artifactsGroup: (label: string, count: number) => string; artifactShowDetails: string; artifactsLabel: string; artifactsUnsupported: string; cacheBreaks: (count: number) => string; cacheColumns: Record<'prompt' | 'dropped' | 'turn' | 'cached' | 'reread' | 'ttft' | 'energy', string>; cacheExpired: string; cacheExpiresIn: (until: string) => string; cacheExpiryHint: string; cacheHideRequests: string; cacheScopeAll: (total: number) => string; cacheScopeLast: (shown: number, total: number) => string; cacheShowRequests: string; cacheUncached: (pct: number) => string; detailsAccountHint: string; detailsAccountSignedOut: string; detailsActivity: string; detailsAgent: string; detailsAttachHint: string; detailsCache: string; detailsChange: string; detailsCompact: string; detailsCompactHint: string; detailsCompacting: string; detailsCompactNow: string; detailsCopied: string; detailsCopyId: string; detailsCopyIdHint: string; detailsCreated: string; detailsDefaultModel: string; detailsDelete: string; detailsDeleting: string; detailsDetach: string; detailsDetachHint: string; detailsEffortHint: string; detailsExport: string; detailsExportHint: string; detailsExporting: string; detailsFolder: string; detailsFolderElsewhere: (where: string) => string; detailsFolderGone: (cwd: string) => string; detailsFolderLocation: (where: FolderLocation) => string; detailsGenerate: string; detailsGenerateHint: string; detailsGenerating: string; detailsId: string; detailsJson: string; detailsMainDescription: string; detailsMainEverySpace: string; detailsMainHasNoFolder: string; detailsMainKeepsName: string; detailsMainNoFolder: string; detailsMainTitle: string; detailsMarkdown: string; detailsMessages: (count: number) => string; detailsModel: string; detailsNoFolder: string; detailsPickOther: string; detailsProviderHint: string; detailsReveal: string; detailsRevealHint: (cwd: string) => string; detailsRuns: (count: number) => string; detailsSave: string; detailsSavedTo: string; detailsSetFolder: string; detailsSpace: string; detailsSpaceHint: string; detailsSpaceLabel: string; detailsStatus: string; detailsStatusLabel: Record<'error' | 'running' | 'idle' | 'completed', string>; detailsStopToChange: string; detailsStopToDetach: string; detailsTitle: string; detailsTitleFact: string; detailsTitleLabel: string; detailsTurns: (count: number) => string; detailsUnknown: string; detailsUpdated: string; diffChangedFiles: string; diffFiles: (files: number) => string; diffFindings: (errors: number, warnings: number) => string; headerChangeFolder: (cwd: string) => string; headerChat: string; headerChatAttach: string; headerChatRunning: string; headerDetails: string; headerFolderOnServer: (cwd: string, server: string | null) => string; headerMainFolder: string; headerOnServer: (server: string | null) => string; headerRename: string; headerServerGone: string; planDrop: string; planDropCancel: string; planDropConfirm: (applying: boolean) => 'Drop this plan and stop the run?' | 'Drop this plan?'; planDropHint: string; planDropYes: string; planHideBody: string; planMaybeInterrupted: string; planNoSteps: string; planResume: string; planResumeHint: string; planShowBody: string; planState: Record<PlanState, string>; planStop: string; planStopHint: string; planStopped: (step: number | null, reason: PlanStopReason | undefined) => string; planUntitled: string; projectHomeAddBlock: string; projectHomeBlockMenu: (block: string) => string; projectHomeCustomize: string; projectHomeDismiss: string; projectHomeDone: string; projectHomeDrag: (block: string) => string; projectHomeFullWidth: string; projectHomeHalfWidth: string; projectHomeHide: string; projectHomeLabel: (project: string | null) => string; projectHomeMoveDown: string; projectHomeMoveUp: string; projectHomeOpenEditor: string; projectHomeOpenFiles: (path: string) => string; projectHomeOpenRepo: (repo: string, web: boolean) => string; projectHomeRefresh: string; projectHomeRemote: string; projectHomeReveal: string; projectHomeSwitch: string; queueAttach: string; queueAttachmentName: (attachment: { mediaType: string; name?: string }) => string; queueCancel: string; queueCount: (count: number) => string; queueEdit: string; queueEditHint: string; queueEditLabel: string; queueEmpty: string; queueEmptyHint: string; queueHintCancel: string; queueHintNewline: string; queueHintPush: string; queueHintSave: string; queueListLabel: string; queueOrder: string; queuePush: string; queueRemove: string; queueSave: string; queueSaveAndPush: string; queueViewAttachments: (count: number, first: string) => string; reminderCancel: string; reminderCountdown: (ms: number) => string; reminderCreate: string; reminderCreator: (creator: ScheduleCreator) => string; reminderDelete: (label: string) => string; reminderDone: string; reminderExpires: (when: string) => string; reminderFireLate: string; reminderFireOutcome: (outcome: ScheduleFireOutcome) => string; reminderHistoryHide: (label: string) => string; reminderHistoryLabel: (label: string) => string; reminderHistoryShow: (label: string) => string; reminderKeep: (label: string) => string; reminderLastSent: (when: string) => string; reminderNew: string; reminderNext: (when: string) => string; reminderNoFires: string; reminderOff: string; reminderOffReason: (reason: string) => string; reminderOnce: string; reminderPause: (label: string) => string; reminderPreview: (when: string) => string; reminderPromptLabel: string; reminderPromptPlaceholder: string; reminderResume: (label: string) => string; reminderRunNow: (label: string) => string; remindersCount: (n: number) => string; remindersEmpty: string; remindersEmptyAll: string; remindersEmptyHint: string; remindersFinished: string; remindersLabel: string; remindersListLabel: string; remindersOff: string; remindersOffHint: string; remindersScopeAll: string; remindersScopeLabel: string; remindersScopeSession: string; remindersUnsupported: string; reminderTargetExtension: (extension: string) => string; reminderTargetNew: (folder: string) => string; reminderTargetOpen: (title: string) => string; reminderTargetOther: string; reminderTargetUntitled: string; reminderWhenError: (reason: 'unknown' | 'empty' | 'extra') => 'Type when to send it.' | 'Only the time goes here. Put the message below.' | 'Try in 20m, at 9:00, tomorrow 9:00, every 2h, daily 9:00, weekdays 9:00 or cron "0 9 * * 1-5".'; reminderWhenLabel: string; reminderWhenPick: (words: string) => string; reminderWhenPicks: readonly string[]; reminderWhenPlaceholder: string; runningWorkCancel: string; runningWorkCancelAll: string; runningWorkCancelling: string; runningWorkDescription: string; runningWorkEmpty: string; runningWorkKind: Record<'task' | 'tool', string>; runningWorkRefresh: string; runningWorkShowTerminal: string; runningWorkTitle: string; secretCancel: string; secretExpiry: (left: SecretTimeLeft) => string; secretNameInvalid: string; secretNameLabel: string; secretNamePlaceholder: string; secretReplace: (name: string) => string; secretReplacesSaved: (name: string) => string; secretRevoke: (name: string) => string; secretsAdd: string; secretSave: string; secretSavedElsewhere: string; secretSavedHere: string; secretsEmpty: string; secretsEmptyHint: string; secretsLabel: string; secretsListLabel: string; secretsNote: string; secretValueLabel: string; shellClose: string; sideComposerLabel: string; sideEmptyHint: string; sideEmptyTitle: string; sidePlaceholder: string; sideRefusal: (reason: 'unavailable' | 'no-conversation' | 'no-panel') => 'Send a message first. A side chat follows a conversation.' | 'Side chats work only on this computer\'s conversations' | 'This window has no side panel for side chats'; sideResetDescription: string; sideResetFailed: (reason: string) => string; stepAdded: string; stepAgentNote: (note: string) => string; stepCancel: string; stepCancelHint: string; stepCancelledByYou: string; stepDroppedByAgent: string; todoAdd: string; todoAddLabel: string; todoAddPlaceholder: string; todoEdit: string; todoRetry: string; todoRetryHint: string; todosEmpty: string; todosEmptyHint: string; todosProgress: (done: number, total: number) => string; todoStatus: (status: TodoStatus) => string; todoTally: Record<TodoStatus, string>; turnAfter: (count: number) => string; turnBefore: (count: number) => string; turnCancel: string; turnCopied: string; turnCopy: string; turnCopyFailed: (message: string) => string; turnCopyHint: string; turnDelete: string; turnDeleteHint: string; turnEdit: string; turnEditHint: string; turnFork: string; turnForkHint: string; turnLoading: string; turnNoText: string; turnRole: (role: string | null) => string; turnSave: string; turnSaving: string; turnStopFirst: string; turnTextLabel: string; turnTitle: string; usageChecking: string; usageCredits: string; usageDescription: string; usageGithub: string; usageInUse: string; usageModelProviders: string; usageNone: string; usageOff: string; usageRefresh: string; usageRefreshing: string; usageResetConfirm: string; usageResetConfirmMessage: (count: number, title?: string | null) => string; usageResetConfirmTitle: (provider: string) => string; usageResetDates: (grantedAt: number | null, expiresAt: number | null) => string; usageResetOutcome: (code: 'failed' | 'reset' | 'nothing_to_reset' | 'no_credit' | 'already_redeemed', error?: string | null) => string; usageResets: string; usageResetsLeft: (count: number) => string; usageResetUntitled: string; usageResetUse: string; usageResetUseOne: (title: string) => string; usageResetUseShort: string; usageResetUsing: string; usageTitle: string; usageUnavailable: (unauthorized: boolean, error?: string | null) => string; usageWindowUsed: (window: string, percent: string) => string; welcomeDate: (date: Date) => string; welcomeGreeting: (hour: number, name: string | null) => string; welcomeUsageLabel: string }>`): Overrides for the built-in strings. Keys you leave out keep the default English label.

Source: [ui/src/session/SessionProvider.tsx:28](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionProvider.tsx#L28)

### `SessionShellProps`

Interface.

What a shell receives: the dialog's title, description, content and footer, and how to close it.

```ts
interface SessionShellProps
```

**Properties**

- `children` (`ReactNode`): The body.
- `className?` (`string`): Extra classes on the panel.
- `description?` (`ReactNode`): A line (or chips) under the heading.
- `footer?` (`ReactNode`): The actions row under the body.
- `onClose?` (`() => void`): Called by the close button. Absent: no close button.
- `style?` (`CSSProperties`): Inline styles on the panel.
- `title` (`string`): The dialog's heading.

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

### `SideChatProps`

Interface.

Props for [`SideChat`](https://zidane.si/docs/reference/ui-session.md#SideChat).

```ts
interface SideChatProps
```

**Properties**

- `className?` (`string`): Extra class names for the root.
- `cwd` (`string`): Its folder: where a new side chat starts.
- `parentId` (`string`): The session the side chat is about.
- `renderPickers?` (`(pick: SideChatSession, commitTo: () => Promise<string>) => ReactNode`): Renders the model pickers: before the first send they show the parent's pick (`pick`), which the side chat
  starts on; a pick then creates the side chat (`commitTo`, resolving with its id) and applies to it.
- `renderTranscript` (`(sideId: string, running: boolean) => ReactNode`): Renders the side chat's transcript.
- `requests?` (`SideRequests`): Where `/side <question>` from the conversation's composer waits for this chat.
- `style?` (`CSSProperties`): Inline styles on the root element.

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

### `TodoListItem`

Interface.

One item of a [`TodoListView`](https://zidane.si/docs/reference/ui-session.md#TodoListView).

```ts
interface TodoListItem
```

**Properties**

- `content` (`string`): What to do.
- `id` (`string`): Stable id.
- `status` (`TodoStatus`): Where it stands.

Source: [ui/src/session/TodoList.tsx:43](https://github.com/Tahul/zidane/blob/main/ui/src/session/TodoList.tsx#L43)

### `TodoListViewProps`

Interface.

Props for [`TodoListView`](https://zidane.si/docs/reference/ui-session.md#TodoListView).

```ts
interface TodoListViewProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `items` (`readonly TodoListItem[]`): The items, in order.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/session/TodoList.tsx:53](https://github.com/Tahul/zidane/blob/main/ui/src/session/TodoList.tsx#L53)

### `TodoTallyProps`

Interface.

Props for [`TodoTally`](https://zidane.si/docs/reference/ui-session.md#TodoTally).

```ts
interface TodoTallyProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `tally` (`TodoTallyCounts`): Items per status (`planTally` of a plan).

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

### `TurnDetailsDialogProps`

Interface.

Props for [`TurnDetailsDialog`](https://zidane.si/docs/reference/ui-session.md#TurnDetailsDialog).

```ts
interface TurnDetailsDialogProps
```

**Properties**

- `className?` (`string`): Extra classes on the default shell.
- `neighbors?` (`{ after: number; before: number } | null`): How many selectable turns come before and after it; `null` while unknown.
- `onChanged?` (`(change: 'edit' | 'delete') => void | Promise<void>`): The turn was edited or deleted: reload what shows it. Awaited before the dialog closes.
- `onClose` (`() => void`): Closes the dialog.
- `onForked?` (`(newSessionId: string) => void | Promise<void>`): The fork exists: switch to it. Awaited before the dialog closes.
- `renderShell?` (`RenderSessionShell`): The app's modal shell. Default: [`SessionShell`](https://zidane.si/docs/reference/ui-session.md#SessionShell).
- `running?` (`boolean`): A run is in progress: history edits are refused, and the dialog says so.
- `sessionId` (`string`): The session the turn belongs to.
- `style?` (`CSSProperties`): Inline styles on the default shell.
- `turnId` (`string`): The turn.

Source: [ui/src/session/TurnDetailsDialog.tsx:22](https://github.com/Tahul/zidane/blob/main/ui/src/session/TurnDetailsDialog.tsx#L22)

### `UsagePanelProps`

Interface.

Props for [`UsagePanel`](https://zidane.si/docs/reference/ui-session.md#UsagePanel).

```ts
interface UsagePanelProps
```

**Properties**

- `activeProviderKey?` (`string | null`): The provider the active session runs on: its active credential's row is marked In use.
- `autoLoad?` (`boolean`): Background probes are on (it words the empty state). Default `true`.
- `className?` (`string`): Extra classes on the default shell.
- `onClose` (`() => void`): Closes the dialog.
- `renderShell?` (`RenderSessionShell`): The app's modal shell. Default: [`SessionShell`](https://zidane.si/docs/reference/ui-session.md#SessionShell).
- `style?` (`CSSProperties`): Inline styles on the default shell.

Source: [ui/src/session/UsagePanel.tsx:45](https://github.com/Tahul/zidane/blob/main/ui/src/session/UsagePanel.tsx#L45)

### `UsageSummaryView`

Interface.

What [`useUsageSummary`](https://zidane.si/docs/reference/ui-session.md#useUsageSummary) returns.

```ts
interface UsageSummaryView
```

**Properties**

- `available` (`boolean`): Whether the host reports usage summaries at all.
- `standIn` (`boolean`): `summary` is another range's, standing in while the range loads.
- `summary` (`UsageSummary | null`): The range's summary, or while it loads the last one shown (another range); `null` before any.

Source: [ui/src/session/useUsageSummary.ts:47](https://github.com/Tahul/zidane/blob/main/ui/src/session/useUsageSummary.ts#L47)

### `WelcomeScreenProps`

Interface.

Props for [`WelcomeScreen`](https://zidane.si/docs/reference/ui-session.md#WelcomeScreen).

```ts
interface WelcomeScreenProps
```

**Properties**

- `className?` (`string`): Extra classes on the root.
- `modelName?` (`(modelId: string) => string`): A model id's display name. Default: the id made readable.
- `now?` (`Date`): The moment the screen describes (greeting, date, heatmap end). Default: when it mounts.
- `style?` (`CSSProperties`): Inline styles on the root.

Source: [ui/src/session/WelcomeScreen.tsx:23](https://github.com/Tahul/zidane/blob/main/ui/src/session/WelcomeScreen.tsx#L23)

## Types

### `AttentionActions`

Type.

The panel actions a driver calls.

```ts
type AttentionActions = Pick<WorkspaceActions, 'setAttention' | 'requestAttention'>
```

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

### `ProjectHomeStartResult`

Type.

What a block row's start answered: done, or why not in words.

```ts
type ProjectHomeStartResult = { ok: true } | { message: string; ok: false }
```

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

### `RemindersScope`

Type.

Which reminders the panel lists.

```ts
type RemindersScope = 'session' | 'all'
```

Source: [ui/src/session/RemindersPanel.tsx:45](https://github.com/Tahul/zidane/blob/main/ui/src/session/RemindersPanel.tsx#L45)

### `RenderSessionShell`

Type.

A dialog's `renderShell`: the app's modal shell, given the dialog's title, body and footer.

```ts
type RenderSessionShell = (props: SessionShellProps) => ReactNode
```

Source: [ui/src/session/SessionShell.tsx:72](https://github.com/Tahul/zidane/blob/main/ui/src/session/SessionShell.tsx#L72)

### `SessionDetailsStatus`

Type.

A session's run state.

```ts
type SessionDetailsStatus = 'idle' | 'running' | 'completed' | 'error'
```

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

### `SessionFolderLocation`

Type.

Where a session's folder is, when this computer's picker can't choose it.

```ts
type SessionFolderLocation =
  | { kind: 'server-gone' }
  | { kind: 'machine'; name: string }
  | { kind: 'sandbox' }
```

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