# zidane-ui/chat/transcript

> Transcript row components, renderer slots and row actions.

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

Use this entry point to change how the transcript draws. `TranscriptRenderersProvider` overrides slots such as the code block and markdown, and `TranscriptActionsProvider` turns on controls such as loading full tool output. `zidane-ui/chat` re-exports all of it. See [Transcript](https://zidane.si/docs/ui-transcript.md).

```tsx
import type { ChatEvent } from 'zidane-ui/chat/headless'
import type { CodeBlockSlotProps, TranscriptRenderers } from 'zidane-ui/chat'
import { Transcript, TranscriptRenderersProvider } from 'zidane-ui/chat'

function Code({ code, language }: CodeBlockSlotProps) {
  return <pre data-language={language}>{code}</pre>
}

const RENDERERS: Partial<TranscriptRenderers> = { CodeBlock: Code }

export function Replay({ id, events }: { id: string, events: readonly ChatEvent[] }) {
  return (
    <TranscriptRenderersProvider value={RENDERERS}>
      <Transcript events={events} streaming={false} sessionId={id} />
    </TranscriptRenderersProvider>
  )
}
```

## Components

### `AnsiSpans`

Component.

One line of terminal output, already parsed (an output line's `spans`).

```ts
const AnsiSpans: MemoExoticComponent<(__namedParameters: AnsiSpansProps) => Element>
```

Source: [ui/src/chat/transcript/AnsiText.tsx:60](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/AnsiText.tsx#L60)

### `AnsiText`

Component.

Terminal output in the theme's colors, a line per line; parsed only when it holds an escape (else the text as
is), once per text.

```ts
const AnsiText: MemoExoticComponent<(__namedParameters: AnsiTextProps) => Element>
```

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

### `AttachmentIcon`

Component.

An attachment's icon, or its short badge (e.g. `TS`) for icon-less kinds, in its tone.

```ts
function AttachmentIcon(props: AttachmentIconProps): Element
```

**Parameters**

- `props` (`AttachmentIconProps`): Icon props: the label `parts` and an optional `className`.

**Returns** `Element`

**Props**

- `className?` (`string`, default `'text-base'`): Class names for the icon. Its font size sets the icon's size.
- `parts` (`AttachmentLabelParts`): The attachment's icon or badge, and the tone to draw it in.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/prompt.tsx:232](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/prompt.tsx#L232)

### `AuthFailureCard`

Component.

Renders a sign-in failure as a card with its fixes; see the module
comment for the rules.

```ts
const AuthFailureCard: MemoExoticComponent<(__namedParameters: AuthFailureCardProps) => Element>
```

Source: [ui/src/chat/transcript/AuthFailureCard.tsx:113](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/AuthFailureCard.tsx#L113)

### `BadgeMenuProvider`

Component.

Provides the badge menu to the badges below it and renders it (and its notice) when one opens.

```ts
function BadgeMenuProvider(props: BadgeMenuProviderProps): Element
```

**Parameters**

- `props` (`BadgeMenuProviderProps`): The composer, the path opener and the browser the effects use, and the children.

**Returns** `Element`

**Props**

- `browser?` (`BadgeMenuBrowser`): The default browser's name and the browser pane. Absent: "Open in browser" only.
- `children` (`ReactNode`): The surfaces whose badges open the menu.
- `composer?` (`BadgeMenuComposer`): The focused composer. Absent: "Add to prompt" is disabled and inserts are dropped with a notice.
- `system?` (`BadgeMenuSystem`): Opens and reveals paths. Absent: path actions answer "Path unavailable."

Source: [ui/src/chat/transcript/BadgeMenu.tsx:154](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/BadgeMenu.tsx#L154)

### `CardMarkdown`

Component.

A hover card's body as compact Markdown (see the module comment).

```ts
const CardMarkdown: MemoExoticComponent<(__namedParameters: CardMarkdownProps) => Element>
```

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

### `Caret`

Component.

The disclosure caret of a collapsible header: points right, turns down while open.

```ts
function Caret(props: CaretProps): Element
```

**Parameters**

- `props` (`CaretProps`): Caret props: `open` and an optional `className`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra class names, for example to show the caret only on hover.
- `open` (`boolean`): The header is expanded. Turns the caret down.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/frame.tsx:257](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/frame.tsx#L257)

### `ChipCard`

Component.

The one hover card every chip opens (see the module comment for its layout).

```ts
function ChipCard(props: ChipCardProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the card.
- `loading?` (`boolean`): Facts still being read.
- `mono?` (`boolean`): The label in the code face (a sha).
- `onTitle?` (`() => void`): The title as an action (open the chat) instead of `href`.
- `style?` (`CSSProperties`): Inline style on the card.
- `view` (`ExtensionReferenceView`): What the card shows.

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

### `ChipHover`

Component.

A chip with its card: opens on hover / focus, under the chip.

```ts
function ChipHover(props: ChipHoverProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `ariaLabel` (`string`): The card's accessible name.
- `children` (`ReactNode`): The card.
- `trigger` (`(props: HoverCardTriggerProps) => ReactNode`): Renders the chip, spreading the props that open the card.

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

### `CodemodeScript`

Component.

A codemode script with its line numbers and, while it streams its progress, the state of each line.

```ts
const CodemodeScript: MemoExoticComponent<(__namedParameters: CodemodeScriptProps) => Element>
```

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

### `CommandCard`

Component.

A command chip's card.

```ts
function CommandCard(props: CommandCardProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `cwd` (`string | null`): The folder whose commands are read, when the transcript names no scope.
- `text` (`string`): The chip's text (`/fix conflicts`).

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

### `CommandDetailRow`

Component.

Supporting output from a `/` command, in the ToolRow idiom: the info Dot
in the gutter (drawn by TranscriptRow), a capitalized label, a trailing
caret; COLLAPSED by default like tool results. The expanded body renders
through the `Markdown` slot — command emits are markdown text (prose,
fenced code the app may highlight), not raw terminal output, so a capped
monospace `<pre>` would misrender them as a wall of mono.

```ts
const CommandDetailRow: MemoExoticComponent<(__namedParameters: CommandDetailRowProps) => Element>
```

Source: [ui/src/chat/transcript/notices.tsx:400](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L400)

### `CommandNoteRow`

Component.

A `/` command's receipt: what it recorded for the model, one muted line
beside its check dot. Its commits, PRs, branches, links and `` `code` ``
are whatever the `InlineText` slot draws (the desktop app: the badges a
message shows).

```ts
const CommandNoteRow: MemoExoticComponent<(__namedParameters: CommandNoteRowProps) => Element>
```

Source: [ui/src/chat/transcript/notices.tsx:52](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L52)

### `CommitCard`

Component.

A sha chip's card.

```ts
function CommitCard(props: CommitCardProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `cwd` (`string | null`): The repository's folder.
- `href?` (`string`): Where the commit's page is.
- `sha` (`string`): The commit.

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

### `CompactSummaryRow`

Component.

Renders a compaction boundary: how many turns were compacted, the model, cost, and tokens, with the summary text behind a toggle.

```ts
function CompactSummaryRow(props: CompactSummaryRowProps): Element
```

**Parameters**

- `props` (`CompactSummaryRowProps`): Row props: the summary `text` and its `meta`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `meta` (`{ cacheCreationTokens: number; cacheReadTokens: number; compactedAt: number; costUsd?: number; inputTokens: number; model: string; outputTokens: number; providerKey?: string; replacedCount: number }`): Details of the compaction: turns replaced, model, cost, and token counts.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): The summary the model wrote for the compacted turns, as markdown. Shown when the row is expanded.

Source: [ui/src/chat/transcript/run-rows.tsx:218](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/run-rows.tsx#L218)

### `CvRow`

Component.

Renders a transcript row that is always mounted, such as a row inside an open fold or a subagent block.

```ts
function CvRow(props: CvRowProps): Element
```

**Parameters**

- `props` (`CvRowProps`): Row props: `style`, `children`, the select-mode data attributes and the row's id.

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The row's content.
- `className?` (`string`): Extra classes on the root element.
- `data-row?` (`string`): The row's id (`Row.id`): how a view that left the transcript finds its place again (`useStickToBottom`'s `restorePosition`).
- `data-sel?` (`string`): Marks the row as part of the selected stop, so the select cursor can find it.
- `data-stop?` (`string`): The select-turn stop the row belongs to. Set only in select mode; makes the row a hover and click target.
- `style` (`CSSProperties`): Inline style for the row's wrapper, usually its content-visibility sizing.

Source: [ui/src/chat/transcript/LazyRow.tsx:221](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/LazyRow.tsx#L221)

### `DefaultInlineText`

Component.

Renders the text as is. The default `InlineText` slot.

```ts
function DefaultInlineText(props: InlineTextSlotProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `text` (`string`): One line of plain text; `` `code` `` spans keep their backticks.

Source: [ui/src/chat/transcript/renderers.tsx:151](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L151)

### `DefaultMarkdown`

Component.

The kit's [`Markdown`](https://zidane.si/docs/reference/ui-chat-transcript.md#Markdown), its fences drawn by the `CodeBlock` slot in effect. The default
`Markdown` slot.

```ts
const DefaultMarkdown: MemoExoticComponent<(props: DefaultMarkdownProps) => Element>
```

Source: [ui/src/chat/transcript/renderers.tsx:224](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L224)

### `DefaultPrompt`

Component.

The prompt's text as typed, a block per line (`PromptLines`).

```ts
function DefaultPrompt(props: PromptSlotProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `command?` (`boolean`): A command invocation (`/fix conflicts now`).
- `refs?` (`readonly PromptSegmentRef[]`): The references the composer recorded (files, skills, links, a command).
- `text` (`string`): The prompt as sent; the bubble around it keeps its whitespace.

Source: [ui/src/chat/transcript/renderers.tsx:163](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L163)

### `DefaultSessionTitle`

Component.

The session's id as a link that opens it (`TranscriptActions.openSession`;
without it, plain text). A link inside the tool row's header button:
the click is stopped before the button toggles the row, and `role=link` +
Enter keeps it reachable without a nested `<button>`, which HTML forbids.

```ts
function DefaultSessionTitle(props: SessionTitleSlotProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `fallback` (`string`): What to show until the app knows the session's title (the formatter's short id).
- `id` (`string`): The addressed session's id.
- `plain?` (`boolean`): Only the session's current title as text: no link, no directory. For a
  title inside a control that already opens the session (a report row).

Source: [ui/src/chat/transcript/renderers.tsx:178](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L178)

### `DiffLines`

Component.

Tight diff rendering: green/red tints, gutter glyph (`+` / `−` / space),
`whitespace-pre` so leading indentation survives. Consecutive lines with
the same op paint as one block (one tint, one gutter, one text node):
a 500-line hunk would otherwise be 1,500 elements to build, style and lay
out every time its row scrolled into a long transcript.

```ts
const DiffLines: MemoExoticComponent<(__namedParameters: DiffLinesProps) => Element>
```

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

### `Dot`

Component.

Renders the status dot that leads a transcript row, centered on the row's
first text line. Nothing in a transcript without row icons ([`RowIconsContext`](https://zidane.si/docs/reference/ui-chat-transcript.md#RowIconsContext)).

```ts
const Dot: MemoExoticComponent<(__namedParameters: DotProps) => Element | null>
```

Source: [ui/src/chat/transcript/frame.tsx:284](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/frame.tsx#L284)

### `EditDiffBlock`

Component.

Per-hunk diff renderer with approval-outcome badges. When `edit.outcomes`
is set (per-edit approval landed live, or replay re-parsed it off the
tool result body), each hunk gets its own card with a ✓/✕/⊘/⚠/⋯ badge;
the header summarizes via canonical `summarizeOutcomes`. Single-hunk
edits with all-applied outcomes collapse back to the flat layout so
the common case doesn't grow extra chrome.

```ts
const EditDiffBlock: MemoExoticComponent<(__namedParameters: EditDiffBlockProps) => Element>
```

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

### `ErrorRow`

Component.

Renders an error line in the transcript's error tone.

```ts
const ErrorRow: MemoExoticComponent<(__namedParameters: ErrorRowProps) => Element>
```

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

### `ExchangeFoldRow`

Component.

Renders a folded exchange: one header line summarizing the work, a live stack of the latest steps while it runs, and the full step list when expanded.

```ts
const ExchangeFoldRow: MemoExoticComponent<(__namedParameters: ExchangeFoldRowProps) => Element>
```

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

### `FailedMark`

Component.

A failed step's mark in its own line, in a transcript without row icons:
the red cross its icon would have shown.

```ts
function FailedMark(props: FailedMarkProps): Element
```

**Parameters**

- `props` (`FailedMarkProps`): Mark props: `decorative` for a row that names its state in text already.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `decorative?` (`boolean`, default `false`): Hides the mark from assistive tech, for a row whose text says it failed already.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `FailureRow`

Component.

How a run that ended early reads: one quiet line (`Stopped`, then the
reason in muted text, for a failure; `Stopped by you` for a stop), and on the transcript's last
word a small button that picks the work back up: Continue when the run
had done something, Retry (the same prompt) when it had not. Both hand
their prompt to `onResume` (the desktop app: the composer's send); without
it there is no button. A run stopped by a failed sign-in (`detail.auth`)
shows the sign-in's card instead (`AuthFailureCard`).

```ts
const FailureRow: MemoExoticComponent<(__namedParameters: FailureRowProps) => Element>
```

Source: [ui/src/chat/transcript/notices.tsx:194](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L194)

### `FileBadgeIcon`

Component.

A file's type icon (or its language's two letters), as the badge's leading
icon. The letters are drawn by CSS, so the badge's text is the name alone
(what a copy or a screen reader gets).

```ts
function FileBadgeIcon(props: FileBadgeIconProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `chip` (`FileChip`): The file the icon is for.

Source: [ui/src/chat/transcript/badges.tsx:91](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/badges.tsx#L91)

### `FoldHeader`

Component.

A fold's header line (the exchange's work, a group of earlier messages):
a toggle with its caret when opening shows something more, otherwise the
same line, inert. Same box, tone and spacing either way.

```ts
function FoldHeader(props: FoldHeaderProps): Element
```

**Parameters**

- `props` (`FoldHeaderProps`): Header props: `expandable`, `open`, `onToggle`, and the `children` of the line.

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The header line's content.
- `className?` (`string`): Extra classes on the root element.
- `expandable` (`boolean`): Makes the line a toggle with a caret. When false the line is inert.
- `onToggle` (`() => void`): Called when the user toggles the header.
- `open` (`boolean`): The fold is expanded. Drives `aria-expanded` and the caret.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/fold.tsx:259](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/fold.tsx#L259)

### `ImageGenerationBlock`

Component.

Renders a `generate_image` call's loader while it runs and its images once they land.

```ts
function ImageGenerationBlock(props: ImageGenerationBlockProps): Element | null
```

**Parameters**

- `props` (`ImageGenerationBlockProps`): Block props.

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `tool` (`Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }`): The `generate_image` row, or the script row that called it.

Source: [ui/src/chat/transcript/ImageGenerationBlock.tsx:158](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/ImageGenerationBlock.tsx#L158)

### `InfoRow`

Component.

Renders a plain informational line from the harness, in muted text.

```ts
const InfoRow: MemoExoticComponent<(__namedParameters: InfoRowProps) => Element>
```

Source: [ui/src/chat/transcript/notices.tsx:75](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L75)

### `InlineChipText`

Component.

A receipt line with its chips (see the module comment).

```ts
function InlineChipText(props: InlineChipTextProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `text` (`string`): The line, with backticks around its code.

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

### `InlineCode`

Component.

Inline code in prose, as what it names (see above).

```ts
function InlineCode(props: InlineCodeProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `text` (`string`): The code's text.

Source: [ui/src/chat/transcript/FileChip.tsx:195](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/FileChip.tsx#L195)

### `InteractionToolBody`

Component.

The expanded body of a `present_plan`, `ask_user` or `todowrite` call (see the module comment); `null` for any other.

```ts
function InteractionToolBody(props: InteractionToolBodyProps): Element | null
```

**Parameters**

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

**Returns** `Element | null`

**Props**

- `tool` (`InteractionTool`): The call.

Source: [ui/src/chat/transcript/InteractionToolBody.tsx:152](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/InteractionToolBody.tsx#L152)

### `LazyRow`

Component.

Renders a transcript row that mounts its content only when it nears the viewport. Until then it is an empty box at its estimated height; once mounted it stays mounted.

```ts
function LazyRow(props: LazyRowProps): Element
```

**Parameters**

- `props` (`LazyRowProps`): Row props: `eager`, `estimatePx`, `style`, `children`, the select-mode data attributes and the row's id.

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The row's content.
- `className?` (`string`): Extra classes on the root element.
- `data-row?` (`string`): The row's id (`Row.id`): how a view that left the transcript finds its place again (`useStickToBottom`'s `restorePosition`).
- `data-sel?` (`string`): Marks the row as part of the selected stop, so the select cursor can find it.
- `data-stop?` (`string`): The select-turn stop the row belongs to. Set only in select mode; makes the row a hover and click target.
- `eager` (`boolean`): Mounts the content at once instead of waiting for the row to approach. Used for the tail of the transcript.
- `estimatePx` (`number`): Height in pixels of the placeholder box before the content mounts.
- `style` (`CSSProperties`): Inline style for the row's wrapper, usually its content-visibility sizing.

Source: [ui/src/chat/transcript/LazyRow.tsx:268](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/LazyRow.tsx#L268)

### `LinkBadge`

Component.

A link as a badge: the site's icon and the short address; the whole URL on hover. Opens externally.

```ts
function LinkBadge(props: LinkBadgeProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the link.
- `cwd?` (`string | null`): The chat's folder, for the badge menu.
- `style?` (`CSSProperties`): Inline style on the link.
- `url` (`string`): The address.

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

### `LinkIcon`

Component.

The site's icon before a link in prose; nothing until (or unless) the site has one.

```ts
function LinkIcon(props: LinkIconProps): Element | null
```

**Parameters**

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

**Returns** `Element | null`

**Props**

- `href` (`string`): The link's address.

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

### `LiveOutput`

Component.

A live output window.

```ts
function LiveOutput(props: LiveOutputProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `label` (`string`): Accessible name of the log.
- `lines` (`readonly OutputLine[]`): The lines to show, oldest first.
- `window` (`number`): How many lines the window holds: at that count the box keeps its full height.

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

### `LoadEarlierRow`

Component.

Explicit scrollback at the top of the timeline, drawn as one of its rows:
the rail's quiet ring (an arrow up, the running arc while a page loads)
and a muted line on the conversation's text size, with the hover pill the
fold's action lines use. Scroll-to-load needs an overflowing viewport;
this works regardless, and by keyboard. Without row icons (`showIcon`,
the Row icons setting) the ring goes too, so its text lines up with the rows'.

```ts
function LoadEarlierRow(props: LoadEarlierRowProps): Element | null
```

**Parameters**

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

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra classes on the row.
- `onLoad` (`() => void`): Loads the next older page.
- `page` (`SessionPageState`): The session's page state: whether older pages exist, whether one is loading.
- `showIcon?` (`boolean`): Draw the rail's ring (the Row icons setting). Default true.
- `style?` (`CSSProperties`): Inline style on the row.

Source: [ui/src/chat/transcript/EarlierHistory.tsx:96](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/EarlierHistory.tsx#L96)

### `LoadFullOutputButton`

Component.

"Load full output" under a clipped result.

```ts
function LoadFullOutputButton(props: LoadFullOutputButtonProps): Element
```

**Parameters**

- `props` (`LoadFullOutputButtonProps`): Button props: `loading`, `disabled`, `onClick`, and `className`.

**Returns** `Element`

**Props**

- `className` (`string`): Extra class names for the button.
- `disabled` (`boolean`): Disables the button, for example when the call has no id to fetch by.
- `loading` (`boolean`): The full output is being fetched. Disables the button and changes its label.
- `onClick` (`() => void`): Called when the user asks for the full output.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/tool-parts.tsx:237](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L237)

### `Markdown`

Component.

Renders markdown in the `.zg-md` prose box. Long texts (a pasted 60 KB prompt, a long report)
render in chunks (`splitMarkdown`): each is its own memoised parse, so a streaming reply
re-parses only its tail, and a long text mounting ahead of the view (`useBackgroundMount`)
parses a couple of chunks per frame instead of all of it in one. Chunks are siblings in the one
box, so block spacing, the first/last-child rules and the streaming caret are unchanged. While a
transcript search runs, everything renders at once (it walks the DOM). A fence still open at the
end of a streaming reply skips the parse: the code block draws its text until it closes.

```ts
const Markdown: MemoExoticComponent<(__namedParameters: MarkdownProps) => Element>
```

Source: [ui/src/chat/transcript/markdown.tsx:281](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown.tsx#L281)

### `MarkdownDiagrams`

Component.

Sets whether the [`Markdown`](https://zidane.si/docs/reference/ui-chat-transcript.md#Markdown) below draws \`\`\`mermaid fences as diagrams. Without one they do.
`Transcript` sets it from its `renderDiagrams` option.

```ts
function MarkdownDiagrams(props: MarkdownDiagramsProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `children?` (`ReactNode`): The subtree it applies to.
- `enabled` (`boolean`): Draw \`\`\`mermaid fences as diagrams (`true`) or as code (`false`).

Source: [ui/src/chat/transcript/markdown.tsx:148](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown.tsx#L148)

### `MermaidDiagram`

Component.

Draws a Mermaid source as a themed SVG diagram, with zoom and a toggle to its source. Falls back to
the highlighted source when Pele cannot draw it.

```ts
const MermaidDiagram: MemoExoticComponent<(__namedParameters: MermaidDiagramProps) => Element>
```

Source: [ui/src/chat/transcript/MermaidDiagram.tsx:166](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/MermaidDiagram.tsx#L166)

### `MessageGroupRow`

Component.

Renders a group of an exchange's messages: earlier messages stacked behind the latest one, which shows in full. Expands to list every message.

```ts
const MessageGroupRow: MemoExoticComponent<(__namedParameters: MessageGroupRowProps) => Element>
```

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

### `ModelVerdict`

Component.

The decision model's verdict on the call. A denial reads "auto-denied"
with the model and its confidence as chips; an approval is only a sparkle
(most calls of a model-approved session are), its verdict in the tooltip.

```ts
function ModelVerdict(props: ModelVerdictProps): Element
```

**Parameters**

- `props` (`ModelVerdictProps`): Component props.

**Returns** `Element`

**Props**

- `approval` (`ModelApproval`): The call's approval record: the choice, the deciding model and its confidence (`p`).
- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/tool-row.tsx:150](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-row.tsx#L150)

### `NestedToolCalls`

Component.

The calls a tool made (a codemode script's `tools.*`, its row's
`children`), one step in under its row, open or not: they are the call's
children, not its body. Each one is a regular `ToolRow` with its own state.

```ts
function NestedToolCalls(props: NestedToolCallsProps): Element | null
```

**Parameters**

- `props` (`NestedToolCallsProps`): The child calls, plus the display props every nested `ToolRow` gets.

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `lineState?` (`LineState`, from `Omit`): The call's state, for its line to show: a light sweep over the name while
  it runs, a red cross once it failed. `TranscriptRow` sets it when the
  transcript draws no row icons (the `showRowIcons` option), where the icon
  would have said it. Absent: the line shows neither.
- `mode` (`'hidden' | 'full' | 'formatted'`, from `Omit`): How the call is shown. `hidden` drops the row unless it has a diff, `formatted` shows a one-line target with an input panel, and `full` shows the raw input.
- `showDiff` (`boolean`, from `Omit`): Shows the edit diff for edit tools, even when `mode` is `hidden`.
- `showResult` (`boolean`, from `Omit`): Shows the call's output panel when the row is open. When false the user can still reveal it on demand.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `tools` (`readonly (Owned & { approval?: ModelApproval; callId?: string; children?: readonly (Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; ... 12 more ...; children?: readonly (Owned & ...)[] | undefined; })[] | undefined; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } })[] | undefined`): The child calls, drawn recursively; empty or absent renders nothing.

Source: [ui/src/chat/transcript/tool-row.tsx:566](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-row.tsx#L566)

### `NoticeRow`

Component.

Structured notice: the headline as a severity-toned badge, facts beneath.
GUI counterpart of the TUI's `NoticeRow` (which keeps the glyph + label,
this surface has color). Rendered for `info` events that carry
`notice` (run-end stop reasons, model fallback, repeat guard, …); plain
`info` events keep the quiet `InfoRow`.

```ts
const NoticeRow: MemoExoticComponent<(__namedParameters: NoticeRowProps) => Element>
```

Source: [ui/src/chat/transcript/notices.tsx:112](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L112)

### `PromptEcho`

Component.

A sent prompt with the composer's badges (see above).

```ts
function PromptEcho(props: PromptEchoProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `command?` (`boolean`): A command invocation (`/fix conflicts now`): its command (`/fix conflicts`) is a badge.
- `refs?` (`readonly PromptSegmentRef[]`): What the composer marked in it (files, skills, links); inferred when absent.
- `text` (`string`): The prompt as sent.
- `useCommandArgs?` (`(name: string | null) => ReadonlySet<string>`): Reads a command's fixed arguments (`conflicts`), so `/fix conflicts` reads as one badge. A hook,
  called on every render: pass a stable one. Absent: the command name alone is the badge.

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

### `PromptLines`

Component.

A prompt's content as the composer lays it out: every typed line its own
block (`.zg-prompt-line`), so a sent prompt keeps the rhythm it had while
being written (`.zg-prompt-bubble`, transcript.css). `items` is the text
and its inline badges, in order; a badge never spans a line break.

```ts
function PromptLines(props: PromptLinesProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `items` (`readonly ReactNode[]`): The text and its inline badges, in order; a badge never spans a line break.

Source: [ui/src/chat/transcript/prompt-lines.tsx:17](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/prompt-lines.tsx#L17)

### `ProseMarkdown`

Component.

Markdown prose with chips: inline code as file / ref chips, links as reference and PR badges, extension references parsed in.

```ts
const ProseMarkdown: MemoExoticComponent<(__namedParameters: ProseMarkdownProps) => Element>
```

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

### `ReadFileBlock`

Component.

The highlighted file a `read_file` call returned, its language from the path it read.

```ts
function ReadFileBlock(props: ReadFileBlockProps): Element
```

**Parameters**

- `props` (`ReadFileBlockProps`): Block props: the `tool` and its `output`.

**Returns** `Element`

**Props**

- `output` (`string`): The call's result text, with line numbers. They are stripped before display.
- `tool` (`Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }`): The `read_file` call. Its `path` input picks the language.

Source: [ui/src/chat/transcript/tool-parts.tsx:76](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L76)

### `RefChip`

Component.

A `#N` or sha chip: a GitHub issue or PR with its state and card when the repo is on GitHub, else the plain chip.

```ts
function RefChip(props: RefChipProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `label` (`string`): What the chip says.
- `link?` (`string`): Where the text said it links.
- `parsed` (`ParsedRef`): The parsed reference.

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

### `ReferenceChip`

Component.

An extension reference as its badge (and hover card) once its view names something; the text until then.

```ts
function ReferenceChip(props: ReferenceChipProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `className?` (`string`): Badge chrome.
- `cwd` (`string | null | undefined`): The folder whose providers resolve the reference.
- `fallback?` (`ReactNode`): What shows while the reference is unknown or names nothing (default: `text`).
- `link?` (`boolean`): `false`: never a link (inside another control, a sidebar row's button). Default true.
- `placeholder?` (`string`): A label to paint before the view is known (the pattern's `placeholder`).
- `placeholderIcon?` (`ExtensionBadgeIcon`): The icon that placeholder shows (the pattern's `placeholderIcon`).
- `providerId` (`string`): The reference's provider.
- `refKey` (`string`): The reference's key.
- `text` (`string`): The matched text: shown until (or unless) the reference resolves.

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

### `ReferenceText`

Component.

`text` with its references as badges; plain text when there are none.

```ts
const ReferenceText: MemoExoticComponent<(__namedParameters: ReferenceTextProps) => Element>
```

Source: [ui/src/chat/transcript/ReferenceText.tsx:172](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/ReferenceText.tsx#L172)

### `RowFrame`

Component.

Lays out one transcript row: a flex line that holds the row's dot and its content.

```ts
function RowFrame(props: RowFrameProps): Element
```

**Parameters**

- `props` (`RowFrameProps`): Frame props: the row's `children` and the `enter` animation switch.

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The row's dot and content.
- `className?` (`string`): Extra classes on the root element.
- `enter?` (`boolean`, default `true`): Fades the row in on mount. Pass `false` when the row was already on screen in another form.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/frame.tsx:110](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/frame.tsx#L110)

### `RunnableCodeBlock`

Component.

A shell block with its run controls and its last run under it. A block with nothing to run, or an app that offers
neither way to run, draws the plain block.

```ts
function RunnableCodeBlock(props: RunnableCodeBlockProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `actions?` (`(buttonClass: string) => ReactNode`, from `CodeBlockSlotProps`): Controls the frame shows beside its own (a shell block's Run button), as
  `HighlightedCodeProps.actions`. A replacement slot that drops them
  leaves the block without them.
- `code` (`string`, from `CodeBlockSlotProps`): The code to show, without the closing newline.
- `CodeBlock` (`ComponentType<CodeBlockSlotProps>`): Draws the block itself (the `CodeBlock` slot); it receives the run controls as `actions`.
- `language` (`string`, from `CodeBlockSlotProps`): A fence's language (`plaintext` when it names none).
- `scope` (`ShellBlockScope`): The reply the block is in.

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

### `RunReceiptInline`

Component.

The run receipt as a row of small chips (model, time, round trips, cost,
tokens, speed), each tinted by meaning and explained on hover. The
hairline chips (`.zg-meta-chip`) keep the values apart.

```ts
function RunReceiptInline(props: RunReceiptInlineProps): Element | null
```

**Parameters**

- `props` (`RunReceiptInlineProps`): Receipt props: the `receipt` and an optional `className`.

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra class names for the receipt's root element.
- `receipt` (`RunReceipt`): The run's summary: model, time, round trips, cost, tokens, and speed.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/run-rows.tsx:134](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/run-rows.tsx#L134)

### `RunSummaryRow`

Component.

Standalone receipt row — only for a run whose closing turn has no assistant row to dock onto.

```ts
const RunSummaryRow: MemoExoticComponent<(__namedParameters: RunSummaryRowProps) => Element | null>
```

Source: [ui/src/chat/transcript/run-rows.tsx:183](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/run-rows.tsx#L183)

### `SearchHighlightStyle`

Component.

The `::highlight()` color rules, resolved once per mount.
`::highlight()` pseudos can't reliably resolve CSS custom properties
in all Chromium versions, so the accent is resolved to a concrete
color and interpolated into the injected rules. Theme changes
mid-search show the old accent until reopen — acceptable for a
transient surface. Render exactly one instance while search is
active (overlay OR composer mode).

```ts
function SearchHighlightStyle(): Element | null
```

**Returns** `Element | null`

Source: [ui/src/chat/transcript/useTranscriptSearch.tsx:360](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useTranscriptSearch.tsx#L360)

### `SelectCursor`

Component.

Renders the select-turn highlight behind the transcript rows marked `data-sel`, and scrolls the selection into view.

```ts
function SelectCursor(props: SelectCursorProps): Element
```

**Parameters**

- `props` (`SelectCursorProps`): Cursor props: the `selected` stop and a `layout` token.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `layout` (`unknown`): Any value that changes when rows reflow, such as the stops. A change re-measures the highlight.
- `selected` (`string | null`): Id of the selected stop, or `null` when select mode is off. Hides the highlight.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/SelectCursor.tsx:37](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/SelectCursor.tsx#L37)

### `SelectTurnExit`

Component.

The mode's exit key, as a button.

```ts
function SelectTurnExit(): Element
```

**Returns** `Element`

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

### `SelectTurnHintKeys`

Component.

The mode's key list (or its notice); `null` unless the mode is on in `sessionId`.

```ts
function SelectTurnHintKeys(props: SelectTurnHintKeysProps): Element | null
```

**Parameters**

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

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra classes on the row's content.
- `sessionId` (`string | null`): The session whose transcript the row is under: nothing shows unless the mode is on in it.
- `style?` (`CSSProperties`): Inline style on the row's content.

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

### `SelectTurnProvider`

Component.

Holds select-turn mode for the surfaces below it (one mode for the whole app).

```ts
function SelectTurnProvider(props: SelectTurnProviderProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The surfaces that read the mode.

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

### `SessionCard`

Component.

A `#chat` chip's card; its title opens the chat (`OpenSessionContext`).

```ts
function SessionCard(props: SessionCardProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `token` (`string`): The `#token` naming the chat.

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

### `SessionEventRow`

Component.

Orchestration: a worker session reported an outcome. Drawn as a session
thread draws its steps (the fold head / ToolRow idiom): a flat
`.zg-disclosure` row, the title in the content voice, the receipt in
`.zg-meta`, and a muted two-line excerpt of the worker's last word. No
card, tint or line: status lives on the timeline dot and the verb's color. The whole row is a button that jumps to the
reporting session (`onOpenSession`; without it the row is inert);
`needs-attention` is the loud one, since it is the one status a human, not
the main, has to act on. Falls back to a plain, non-clickable text row
when `sessionEvent` is absent (malformed signal).

```ts
const SessionEventRow: MemoExoticComponent<(__namedParameters: SessionEventRowProps) => Element>
```

Source: [ui/src/chat/transcript/notices.tsx:275](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L275)

### `ShellBlockProvider`

Component.

Lets the shell blocks of the reply below run (`RunnableCodeBlock`).

```ts
function ShellBlockProvider(props: ShellBlockProviderProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The reply.
- `sessionId` (`string`): The session the reply is in.
- `turnId` (`string`): The reply's turn.

Source: [ui/src/chat/transcript/shell-block.tsx:58](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/shell-block.tsx#L58)

### `SkillCard`

Component.

A skill chip's card.

```ts
function SkillCard(props: SkillCardProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `cwd` (`string | null`): The folder whose skills are read.
- `text` (`string`): The chip's text (`/review`, `$review`).

Source: [ui/src/chat/transcript/ChipCards.tsx:75](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/ChipCards.tsx#L75)

### `SpawnEndRow`

Component.

The worker's end: a sentence, then what it cost and used as chips (`describeSpawnEnd`, shared with the TUI).

```ts
const SpawnEndRow: MemoExoticComponent<(__namedParameters: SpawnEndRowProps) => Element>
```

Source: [ui/src/chat/transcript/notices.tsx:506](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L506)

### `SpawnStartRow`

Component.

Spawn lifecycle markers — rendered INSIDE the SubagentBlock (every
spawn row carries a `childId`, so `clusterByOwner` always folds them
into a cluster). The block header already carries the identity +
outcome, so these stay quiet: a plain "Task" / "Finished" lead-in and
the marker text in normal (non-mono) type — task previews and outcome
summaries are prose, not code. The raw child label survives as a
tooltip for debugging.

```ts
const SpawnStartRow: MemoExoticComponent<(__namedParameters: SpawnStartRowProps) => Element>
```

Source: [ui/src/chat/transcript/notices.tsx:487](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L487)

### `SubagentBlock`

Component.

A contiguous run of subagent output behind one header, drawn as a tool
call is: the outcome Dot in the gutter, "Agent" and the task preview, the
duration and turn count inline, a trailing caret. The raw child label
survives only as a tooltip.

Always individually collapsible — `defaultCollapsed` (driven by the
`hideSubagentOutput` setting) only seeds the initial state; a manual
toggle wins for the lifetime of the block.

```ts
function SubagentBlock(props: SubagentBlockProps): Element
```

**Parameters**

- `props` (`SubagentBlockProps`): Block props: the worker's `childId`, the transcript's `sessionId`, `depth`, `parentDepth`, `rows`, `defaultCollapsed`, `streaming`, the `children` to show when open, and the block's `data-row` id.

**Returns** `Element`

**Props**

- `childId` (`string`): Id of the worker session. Shown as a tooltip on the header.
- `children` (`ReactNode`): The block's body, drawn when it is open.
- `className?` (`string`): Extra classes on the root element.
- `data-row?` (`string`): The block's id among the transcript's rows: how a view that left the transcript finds its place again (`useStickToBottom`'s `restorePosition`).
- `defaultCollapsed` (`boolean`): Starts the block collapsed. Only the initial state: a manual toggle wins afterwards.
- `depth` (`number`): Nesting level of the worker: 1 for a direct subagent.
- `parentDepth?` (`number`): Depth of the spawner's block this one is nested in; absent at the transcript root.
- `rows` (`readonly Row[]`): The worker's own rows. The header reads its task, status, duration, and turn count from them.
- `sessionId?` (`string`): The transcript's session: while the worker runs, its time estimate shows in the header (`RunEstimatesProvider`).
- `streaming` (`boolean`): The worker is still running. Decides the header dot when no outcome is recorded.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/SubagentBlock.tsx:120](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/SubagentBlock.tsx#L120)

### `TextRow`

Component.

Renders an assistant reply as markdown through the `Markdown` renderer slot. While `streaming` it marks the reply as still arriving.

```ts
const TextRow: MemoExoticComponent<(__namedParameters: TextRowProps) => Element>
```

Source: [ui/src/chat/transcript/prose.tsx:159](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/prose.tsx#L159)

### `ThinkingBatchRow`

Component.

Chained-thoughts group — mirrors ToolBatchRow's affordance exactly:
one quiet header ("Thought 4 times", then the summed time as inline
`ToolTiming` like a tool batch's) that expands to the individual
ThinkingRow entries, each still individually collapsible. The duration
only shows when at least one segment carried timing (live-session
groups); replayed groups render a bare count.

```ts
const ThinkingBatchRow: MemoExoticComponent<(__namedParameters: ThinkingBatchRowProps) => Element>
```

Source: [ui/src/chat/transcript/prose.tsx:111](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/prose.tsx#L111)

### `ThinkingRow`

Component.

Collapsible reasoning block — same zg-collapsible affordance as
ToolRow / ToolBatchRow.

Header states:

- live (segment still streaming): "Thinking…", collapsed to its
  header unless `autoExpand` (`Settings.thinkingAutoExpand`) opens it
  so the text streams in view.
- closed with duration: "Thought for Ns" — `thinkingMs` is stamped
  when a live segment ends; the row auto-collapses at that moment.
- replay: "Thoughts" — persisted thinking blocks carry no timing
  metadata (canonical shape is `{ type: 'thinking', text,
  signature? }`), so reloaded rows collapse without a duration.

Manual toggling always wins over the auto state: `userOpen` starts
null (follow auto) and, once the user clicks, pins the row — the
live→closed transition can't re-collapse a row the user opened
because the row id is ordinal-based and stable across the segment's
close (see the thinking case in `collapseEvents`).

```ts
const ThinkingRow: MemoExoticComponent<(__namedParameters: ThinkingRowProps) => Element>
```

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

### `ToolBatchRow`

Component.

Claude-Code-style batch header — collapsed by default, expands to
reveal each child `ToolRow`. Mirrors the chevron / press-soft pattern
the rest of the transcript already uses so the user reads it as
"the same affordance" even though the underlying row is synthetic.

```ts
const ToolBatchRow: MemoExoticComponent<(__namedParameters: ToolBatchRowProps) => Element>
```

Source: [ui/src/chat/transcript/tool-batch.tsx:53](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-batch.tsx#L53)

### `ToolDetails`

Component.

A tool call's payload: the command and its output, the diff, the file read, or input and output.

```ts
function ToolDetails(props: ToolDetailsProps): Element
```

**Parameters**

- `props` (`ToolDetailsProps`): Component props: the `tool` to show.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element (not passed to an app's `ToolBody`).
- `style?` (`CSSProperties`): Inline styles on the root element (not passed to an app's `ToolBody`).
- `tool` (`Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }`): The tool call whose payload to show.

Source: [ui/src/chat/transcript/tool-details.tsx:27](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-details.tsx#L27)

### `ToolGlyph`

Component.

Renders the icon for a tool: a glyph by tool name, a puzzle piece for MCP tools, and a wrench otherwise.

```ts
function ToolGlyph(props: ToolGlyphProps): Element
```

**Parameters**

- `props` (`ToolGlyphProps`): Glyph props: the tool `name`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `name` (`string`): The tool's name.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/tool-parts.tsx:371](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L371)

### `ToolInput`

Component.

A tool call's input panel, syntax-highlighted: the code it runs (a
Codemode script line by line, `CodemodeScript`; a shell command, via
`toolInputCode`), or else its JSON input.

```ts
function ToolInput(props: ToolInputProps): Element
```

**Parameters**

- `props` (`ToolInputProps`): Panel props: the tool `name`, its `input`, and a script's progress.

**Returns** `Element`

**Props**

- `finished?` (`boolean`): The call ended (`ok` tells how): a Codemode script stops showing its live output.
- `input` (`Record<string, unknown>`): The tool call's raw input, shown as JSON when no script is extracted.
- `name` (`string`): The tool's name. Some tools (Codemode) show their script instead of JSON.
- `ok?` (`boolean`): The call ended without error.
- `output?` (`ReactNode`): A Codemode script's output, shown in the box its live lines were in once it ends.
- `result?` (`string | null`): The call's result text: a failed Codemode script's names the line it threw at.
- `scriptProgress?` (`ScriptProgress`): A Codemode script's live progress (`ToolRowModel.scriptProgress`): its lines show their state.

Source: [ui/src/chat/transcript/tool-parts.tsx:44](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L44)

### `ToolMedia`

Component.

Renders a tool result's media inline: images as thumbnails that open the lightbox, video and audio with native controls. An item that fails to load shows its stand-in text.

```ts
function ToolMedia(props: ToolMediaProps): Element
```

**Parameters**

- `props` (`ToolMediaProps`): Component props: the `media` items, `url` to address each by index, and an optional `name`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `media` (`readonly ToolMediaItem[]`): The media items the tool result carries, in order.
- `name?` (`string`): What the images are of (the file read), for their names in the lightbox.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `url` (`(index: number) => string`): Returns the address of the item at an index.

Source: [ui/src/chat/transcript/tool-media.tsx:60](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-media.tsx#L60)

### `ToolRow`

Component.

Renders a tool call as a collapsible row: glyph, name and target, timing, and, when opened, its input, output, diff, or media.

```ts
const ToolRow: MemoExoticComponent<(__namedParameters: ToolRowProps) => Element | null>
```

Source: [ui/src/chat/transcript/tool-row.tsx:185](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-row.tsx#L185)

### `ToolTiming`

Component.

Live elapsed while the call runs, the final duration once it lands, both
from the host's timing (the row's `startedAt` / `durationMs`). Same data
the TUI shows for running work; muted mono so it reads as a receipt cell.
No spinner: the ticking number is the progress cue, and the tool glyph
already anchors the row's left edge.

```ts
function ToolTiming(props: ToolTimingProps): Element | null
```

**Parameters**

- `props` (`ToolTimingProps`): Timing props: `startedAt`, `durationMs`, and `running`.

**Returns** `Element | null`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `durationMs?` (`number`): Final duration in milliseconds. Shown once the call is no longer `running`.
- `running?` (`boolean`, default `false`): The call is still running. Shows live elapsed time instead of the final duration.
- `startedAt?` (`number`): Epoch milliseconds the call started. While `running`, the elapsed time counts up from it.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/tool-parts.tsx:278](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L278)

### `TranscriptActionsProvider`

Component.

Provides the transcript's actions to every row below it.

```ts
function TranscriptActionsProvider(props: TranscriptActionsProviderProps): Element
```

**Parameters**

- `props` (`TranscriptActionsProviderProps`): Provider props: the `value` actions and the `children` that read them.

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The transcript that reads the actions.
- `value` (`TranscriptActions`): The actions to provide. Memoize it: every row reading the context re-renders when it changes.

Source: [ui/src/chat/transcript/actions.tsx:96](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/actions.tsx#L96)

### `TranscriptRenderersProvider`

Component.

Overrides any subset of the slots; the rest keep the enclosing (or default) renderers.

```ts
function TranscriptRenderersProvider(props: TranscriptRenderersProviderProps): Element
```

**Parameters**

- `props` (`TranscriptRenderersProviderProps`): Provider props: the slots to override in `value` and the `children` that read them.

**Returns** `Element`

**Props**

- `children` (`ReactNode`): The transcript that reads the renderers.
- `value` (`Partial<TranscriptRenderers>`): The slots to replace. Slots left out keep the enclosing provider's renderer, or the default.

Source: [ui/src/chat/transcript/renderer-slots.tsx:26](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderer-slots.tsx#L26)

### `TranscriptRow`

Component.

Renders one transcript row by switching on its `kind`: prompts, replies, thinking, tool calls, notices, folds, and groups.

```ts
const TranscriptRow: MemoExoticComponent<(__namedParameters: TranscriptRowProps) => Element | null>
```

Source: [ui/src/chat/transcript/TranscriptRow.tsx:190](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/TranscriptRow.tsx#L190)

### `TranscriptRowSlot`

Component.

One root transcript row in its lazy wrapper, memoised on the row's own inputs.

```ts
const TranscriptRowSlot: MemoExoticComponent<(__namedParameters: TranscriptRowSlotProps) => Element>
```

Source: [ui/src/chat/transcript/TranscriptRow.tsx:163](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/TranscriptRow.tsx#L163)

### `TranscriptSearch`

Component.

The ⌘F overlay: the query, the match counter, ▲▼ and Esc (see the module comment). Needs the app's `ModalProvider`.

```ts
function TranscriptSearch(props: TranscriptSearchProps): Element
```

**Parameters**

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

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the overlay.
- `container` (`RefObject<HTMLElement | null>`): The transcript's scroll container — the walk + jump targets live inside it.
- `initialQuery?` (`string`): The query to open on: a palette match's.
- `onClose` (`() => void`): Closes the search.
- `revision` (`unknown`): Changes identity when the transcript re-renders (its events): matches track streaming updates.
- `style?` (`CSSProperties`): Inline style on the overlay.
- `terms?` (`(query: string) => readonly string[]`): Splits the opening query into the terms its content search matched (see `TranscriptSearchOptions.terms`).

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

### `UserBashRow`

Component.

Dedicated row for user-initiated `!` shell runs: `! <command>` header
with a stop button while running / an exit-code badge after, and a monospace tail window of
the merged output (last 10 lines by default, full when `showFull` is
on). Live streaming and reloaded transcripts render identically — both
read the same persisted result text.

```ts
const UserBashRow: MemoExoticComponent<(__namedParameters: UserBashRowProps) => Element>
```

Source: [ui/src/chat/transcript/user-bash.tsx:47](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/user-bash.tsx#L47)

### `UserPromptAttachments`

Component.

A sent prompt's attachments, above its bubble: images as 64px thumbnails,
PDFs and text files as chips, all opening the lightbox (one gallery over
them) when the transcript has their bytes or an address for them; other
files as plain chips (the transcript has their name, not their bytes).

```ts
function UserPromptAttachments(props: UserPromptAttachmentsProps): Element
```

**Parameters**

- `props` (`UserPromptAttachmentsProps`): Component props: the `items` to show.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `items` (`readonly ChatAttachment[]`): The attachments sent with the prompt. Images with a `dataUrl` show as thumbnails, the rest as chips; a PDF's or a text file's chip with a `dataUrl` opens it.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `UserPromptRow`

Component.

The prompt row: its dot, its attachments, its bubble. The bubble's
pointer handlers are the app's (the desktop app opens the turn's actions
on right-click).

```ts
function UserPromptRow(props: UserPromptRowProps): Element
```

**Parameters**

- `props` (`UserPromptRowProps`): Row props: the `row` and the optional bubble pointer handlers.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `onBubbleContextMenu?` (`(event: MouseEvent<HTMLDivElement>) => void`): Called on right-click in the prompt bubble. The desktop app opens the turn's actions here.
- `onBubblePointerEnter?` (`() => void`): Called when the pointer enters the prompt bubble.
- `row` (`Owned & { attachments?: readonly ChatAttachment[]; id: string; kind: 'user-prompt'; origin?: PromptOrigin; refs?: readonly PromptSegmentRef[]; synthetic?: true; text: string }`): The `user-prompt` row to render: its text, mention refs, attachments, and whether the user typed it.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `WorkerDetails`

Component.

A worker, opened: what it was asked (the Task step, closed by default),
then its own progress folded like an exchange (`foldWorkerRows`): its
calls behind one "Working" row, earlier messages stacked behind one
group, its last message in full. No second "Agent" block: the fold line
above already is the agent.

```ts
function WorkerDetails(props: WorkerDetailsProps): Element
```

**Parameters**

- `props` (`WorkerDetailsProps`): Component props: the worker `item` and `renderRows`.

**Returns** `Element`

**Props**

- `className?` (`string`): Extra classes on the root element.
- `item` (`FoldActionItem`): The fold step for the worker. Its `workerRows` hold the worker's lifecycle markers and output.
- `renderRows` (`(c: readonly Cluster[]) => ReactNode[]`): Renders the worker's folded clusters with the transcript's row components.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/fold-worker.tsx:37](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/fold-worker.tsx#L37)

## Functions

### `classifyInlineRef`

Function.

Inline code that is exactly an issue or PR number or a SHA becomes a ref chip too.

```ts
function classifyInlineRef(raw: string): ParsedRef | null
```

**Parameters**

- `raw` (`string`): The inline code's text.

**Returns** `ParsedRef | null`

Source: [ui/src/chat/transcript/remark-refs.ts:149](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-refs.ts#L149)

### `copyPromptLines`

Function.

Copying from a bubble: the selected lines as typed, one line break between
them and blank lines kept. The browser's own copy would drop the blank
lines (an empty block has no text) and add breaks of its own.

```ts
function copyPromptLines(event: ClipboardEvent<HTMLElement>): void
```

**Parameters**

- `event` (`ClipboardEvent<HTMLElement>`): The bubble's `copy` event; left to the browser when nothing is selected.

Source: [ui/src/chat/transcript/prompt-lines.tsx:47](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/prompt-lines.tsx#L47)

### `createTurnCommands`

Function.

Creates the turn commands over a session host's stored turns.

```ts
function createTurnCommands(
  turns: SessionTurns,
  options?: TurnCommandsOptions,
): TurnCommands
```

**Parameters**

- `turns` (`SessionTurns`): The stored turns.
- `options?` (`TurnCommandsOptions`, default `{}`): The clipboard and the refusal wording.

**Returns** `TurnCommands`

Source: [ui/src/chat/transcript/turn-commands.ts:46](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/turn-commands.ts#L46)

### `defaultAttachmentLabel`

Function.

Returns a generic file icon and the file name. The default `attachmentLabel` slot.

```ts
function defaultAttachmentLabel(name: string): AttachmentLabelParts
```

**Parameters**

- `name` (`string`): The attachment's file name.

**Returns** `AttachmentLabelParts`

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

### `drawsImageGeneration`

Function.

True when the row draws images: it made image requests, itself or through a script.

```ts
function drawsImageGeneration(
  tool: Pick<ToolRowModel, 'name' | 'rawInput' | 'parentId' | 'children'>,
): boolean
```

**Parameters**

- `tool` (`Pick<ToolRowModel, 'name' | 'rawInput' | 'parentId' | 'children'>`): The tool row.

**Returns** `boolean`

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

### `fileBadgeName`

Function.

A file badge's name: long names end in an ellipsis rather than crowding the line.

```ts
function fileBadgeName(chip: FileChip): string
```

**Parameters**

- `chip` (`FileChip`): The file.

**Returns** `string`

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

### `fileBadgeSpec`

Function.

A file badge as an editor node renders it (the composer has no React inside its nodes).

```ts
function fileBadgeSpec(path: string, attrs: Record<string, string>): DOMOutputSpec
```

**Parameters**

- `path` (`string`): The file's path.
- `attrs` (`Record<string, string>`): The node's own attributes (merged on the badge).

**Returns** `DOMOutputSpec`

Source: [ui/src/chat/transcript/badges.tsx:64](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/badges.tsx#L64)

### `findRefs`

Function.

The `#123`s and SHAs in a plain text, in order (outside markdown: receipts, titles).

```ts
function findRefs(text: string): RefMatch[]
```

**Parameters**

- `text` (`string`): The text to scan.

**Returns** `RefMatch[]`

Source: [ui/src/chat/transcript/remark-refs.ts:73](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-refs.ts#L73)

### `hasInteractionBody`

Function.

The tools this body knows how to render.

```ts
function hasInteractionBody(tool: Pick<InteractionTool, 'name' | 'rawInput'>): boolean
```

**Parameters**

- `tool` (`Pick<InteractionTool, 'name' | 'rawInput'>`): The call's name and arguments.

**Returns** `boolean`

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

### `holdForceMountRows`

Function.

Every lazy row mounts while held (and stays mounted after release). Returns the release.

```ts
function holdForceMountRows(): () => void
```

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

Source: [ui/src/chat/transcript/LazyRow.tsx:169](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/LazyRow.tsx#L169)

### `imageRequestsOf`

Function.

The image requests a row draws: its own `generate_image` call, or the ones a
script (a row with nested calls) made. Empty for anything else, a model
listing, and a nested call (its script's row draws it).

```ts
function imageRequestsOf(
  tool: Pick<ToolRowModel, 'name' | 'rawInput' | 'parentId' | 'children'>,
): Record<string, unknown>[]
```

**Parameters**

- `tool` (`Pick<ToolRowModel, 'name' | 'rawInput' | 'parentId' | 'children'>`): The tool row.

**Returns** `Record<string, unknown>[]`

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

### `isHiddenRow`

Function.

Reasoning rows render nothing while `showThinking` is off (and get no wrapper).

```ts
function isHiddenRow(row: Row, showThinking: boolean): boolean
```

**Parameters**

- `row` (`Row`): The transcript row.
- `showThinking` (`boolean`): Whether reasoning rows are shown.

**Returns** `boolean`

Source: [ui/src/chat/transcript/TranscriptRow.tsx:109](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/TranscriptRow.tsx#L109)

### `lineStateOf`

Function.

The [`LineState`](https://zidane.si/docs/reference/ui-chat-transcript.md#LineState) a row icon stands for, or `undefined` when the row's
line says its state already (a reply, a note, an error in its own tone).

```ts
function lineStateOf(variant: DotVariant): LineState | undefined
```

**Parameters**

- `variant` (`DotVariant`): The row's icon.

**Returns** `LineState | undefined`

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

### `linkGlyph`

Function.

A link badge's glyph: the site's icon once loaded (set `--zg-site-icon`), the globe until then or without one.

```ts
function linkGlyph(icon: string | null): string
```

**Parameters**

- `icon` (`string | null`): The site's icon once loaded (`null`: none yet).

**Returns** `string`

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

### `mountRowNow`

Function.

Mount a lazy row's content now, wherever it is: a view putting its place
back (`useStickToBottom`'s `restorePosition`) lands on rows it never
came near. A row already mounted, or not a lazy row, is left alone. Call
it outside React's render and effects: it commits synchronously.

```ts
function mountRowNow(row: Element): void
```

**Parameters**

- `row` (`Element`): The row's element, the wrapper `LazyRow` renders.

Source: [ui/src/chat/transcript/LazyRow.tsx:112](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/LazyRow.tsx#L112)

### `numberRef`

Function.

The number of a text that is exactly `#N` (an issue or PR), else null.

```ts
function numberRef(text: string): ParsedRef | null
```

**Parameters**

- `text` (`string`): The text (`#123`).

**Returns** `ParsedRef | null`

Source: [ui/src/chat/transcript/remark-refs.ts:139](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-refs.ts#L139)

### `parseReferenceUrl`

Function.

The extension reference a `zg-ref:ext:` link names; `null` for any other URL.

```ts
function parseReferenceUrl(url: string | undefined): ParsedReferenceUrl | null
```

**Parameters**

- `url` (`string | undefined`): The link's URL.

**Returns** `ParsedReferenceUrl | null`

Source: [ui/src/chat/transcript/remark-references.ts:71](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-references.ts#L71)

### `parseRefUrl`

Function.

The ref a `zg-ref:` link names; `null` for any other URL.

```ts
function parseRefUrl(url: string | undefined): ParsedRef | null
```

**Parameters**

- `url` (`string | undefined`): The link's URL.

**Returns** `ParsedRef | null`

Source: [ui/src/chat/transcript/remark-refs.ts:126](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-refs.ts#L126)

### `referenceUrl`

Function.

The `zg-ref:ext:` URL for an extension reference (what the remark plugin writes).

```ts
function referenceUrl(
  providerId: string,
  key: string,
  href?: string,
  placeholder?: string,
  placeholderIcon?: string,
): string
```

**Parameters**

- `providerId` (`string`): The provider.
- `key` (`string`): The key.
- `href?` (`string`): The link's own URL, when a link was retargeted.
- `placeholder?` (`string`): The match's placeholder label.
- `placeholderIcon?` (`string`): The placeholder's icon class.

**Returns** `string`

Source: [ui/src/chat/transcript/remark-references.ts:54](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-references.ts#L54)

### `refHref`

Function.

Where a ref leads on the repo's site (a PR or issue, a commit); `null` without a web base.

```ts
function refHref(ref: ParsedRef, webBase: string | null): string | null
```

**Parameters**

- `ref` (`ParsedRef`): The ref.
- `webBase` (`string | null`): The repo's web address.

**Returns** `string | null`

Source: [ui/src/chat/transcript/remark-refs.ts:167](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-refs.ts#L167)

### `remarkReferences`

Function.

The remark plugin: the providers' matches in prose become `zg-ref:ext:` links.

```ts
function remarkReferences(
  options: { providers: readonly ReferenceProviderWire[] },
): (tree: MdNode) => void
```

**Parameters**

- `options` (`{ providers: readonly ReferenceProviderWire[] }`): The providers whose patterns match.

**Returns** `(tree: MdNode) => void`

Source: [ui/src/chat/transcript/remark-references.ts:153](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-references.ts#L153)

### `remarkRefs`

Function.

The remark plugin: `#123` and commit SHAs in prose become `zg-ref:` links (see the module comment).

```ts
function remarkRefs(): (tree: MdNode) => void
```

**Returns** `(tree: MdNode) => void`

Source: [ui/src/chat/transcript/remark-refs.ts:30](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-refs.ts#L30)

### `savedPaths`

Function.

The saved paths, from the result's `Saved: <path> (<size>)` lines.

```ts
function savedPaths(text: string): string[]
```

**Parameters**

- `text` (`string`): The tool result's text.

**Returns** `string[]`

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

### `siteIconValue`

Function.

The `--zg-site-icon` value for a loaded icon's data URL.

```ts
function siteIconValue(icon: string): string
```

**Parameters**

- `icon` (`string`): The icon's data URL.

**Returns** `string`

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

### `useBackgroundMount`

Function.

True inside a row mounted ahead of the view, where content may render over a few frames.

```ts
function useBackgroundMount(): boolean
```

**Returns** `boolean`

Source: [ui/src/chat/transcript/LazyRow.tsx:239](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/LazyRow.tsx#L239)

### `useBadgeMenu`

Function.

Opens the badge menu for a badge. Outside the provider (a test, a detached
surface) the event is left alone, so the surrounding menu still opens.

```ts
function useBadgeMenu(): OpenBadgeMenu | null
```

**Returns** `OpenBadgeMenu | null`

Source: [ui/src/chat/transcript/BadgeMenu.tsx:274](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/BadgeMenu.tsx#L274)

### `useChipResolution`

Function.

Current answer for `text` in `cwd`, refreshed when stale.

```ts
function useChipResolution(cwd: string | null, text: string): ChipResolution
```

**Parameters**

- `cwd` (`string | null`): The session's folder (`null`: nothing resolves).
- `text` (`string`): The chip's text.

**Returns** `ChipResolution`

Source: [ui/src/chat/transcript/chip-resolve.ts:37](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/chip-resolve.ts#L37)

### `useCommand`

Function.

The command a chip's text names, in a folder on a host (`hostId` `null`: this one).

```ts
function useCommand(
  scope: { cwd: string; hostId: string | null } | null,
  text: string,
): { command: ChatCommandFacts | null; loading: boolean }
```

**Parameters**

- `scope` (`{ cwd: string; hostId: string | null } | null`): The folder and host whose commands are read (`null`: none).
- `text` (`string`): The chip's text.

**Returns** `{ command: ChatCommandFacts | null; loading: boolean }`

Source: [ui/src/chat/transcript/chip-details.ts:157](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/chip-details.ts#L157)

### `useCommitInfo`

Function.

A sha's commit in `cwd`'s repository.

```ts
function useCommitInfo(
  cwd: string | null,
  sha: string,
): { loading: boolean; value: ChatCommit | null | undefined }
```

**Parameters**

- `cwd` (`string | null`): The repository's folder (`null`: nothing to read).
- `sha` (`string`): The commit.

**Returns** `{ loading: boolean; value: ChatCommit | null | undefined }`

Source: [ui/src/chat/transcript/chip-details.ts:100](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/chip-details.ts#L100)

### `useComposerSearch`

Function.

The composer's `?` search: its query, the engine over the transcript, and a change another window made
(`remoteApply`) for the composer to show.

```ts
function useComposerSearch<K extends string>(
  sessionId: K | null,
  scrollRef: RefObject<HTMLElement | null>,
  closeOverlay: () => void,
  useRevision: (active: boolean) => unknown,
): { engine: TranscriptSearchState; onQueryChange: (next: string | null) => void; query: string | null; remoteApply: { active: boolean; query: string; seq: number } | null }
```

**Type parameters**

- `K` (`extends string`)

**Parameters**

- `sessionId` (`K | null`): The conversation searched.
- `scrollRef` (`RefObject<HTMLElement | null>`): The transcript's scroll container.
- `closeOverlay` (`() => void`): Closes the ⌘F overlay (the two searches share one highlight registry).
- `useRevision` (`(active: boolean) => unknown`): A hook returning a value whose identity changes when the transcript re-renders, read
  while the search is `active` (its rescans follow the transcript); a constant otherwise, so the stream never
  re-renders the conversation through this.

**Returns** `{ engine: TranscriptSearchState; onQueryChange: (next: string | null) => void; query: string | null; remoteApply: { active: boolean; query: string; seq: number } | null }`

Source: [ui/src/chat/transcript/useComposerSearch.ts:35](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useComposerSearch.ts#L35)

### `useFillViewportScrollback`

Function.

Fill a viewport that cannot scroll. On a long live run the tail page is
all one exchange, folded into a single `Working` row: nothing overflows,
no `scroll` event ever fires, and the history above stays unreachable.
Load pages until the content overflows (`slackPx` past the viewport) and
holds [`FILL_MIN_PROMPTS`](https://zidane.si/docs/reference/ui-chat-transcript.md#FILL_MIN_PROMPTS) of the user's prompts (rows marked
`data-prompt`), capped per activation so a 10k-turn fold doesn't drag the
whole run over IPC. Past the cap, [`LoadEarlierRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#LoadEarlierRow) takes over.

```ts
function useFillViewportScrollback<K extends string>(
  options: { hydrated: boolean; loadEarlier: (sessionId: K) => boolean; page: SessionPageState; scrollRef: RefObject<HTMLElement | null>; sessionId: K | null; slackPx: number },
): void
```

**Type parameters**

- `K` (`extends string`)

**Parameters**

- `options` (`{ hydrated: boolean; loadEarlier: (sessionId: K) => boolean; page: SessionPageState; scrollRef: RefObject<HTMLElement | null>; sessionId: K | null; slackPx: number }`): The scroll container, the session, whether it is hydrated, its page state and loader, and how far past the viewport to fill (`slackPx`).

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

### `useForceMountRows`

Function.

Returns whether every lazy row must be mounted now, for example while a search needle is active.

```ts
function useForceMountRows(): boolean
```

**Returns** `boolean`

Source: [ui/src/chat/transcript/LazyRow.tsx:189](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/LazyRow.tsx#L189)

### `useFullOutput`

Function.

The whole text of a clipped tool result, fetched on demand through
`TranscriptActions.toolOutput`. `full`: `null` = not fetched, a string =
the full text (replaces the clipped preview), `'loading'` while the
roundtrip runs. `available` is false when the app cannot fetch outputs:
the row then offers no button.

```ts
function useFullOutput(
  tool: Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } },
): { available: boolean; full: string | null; load: () => void; ready: boolean }
```

**Parameters**

- `tool` (`Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }`): The clipped tool row. Its `callId` is passed to `TranscriptActions.toolOutput`.

**Returns** `{ available: boolean; full: string | null; load: () => void; ready: boolean }`

Source: [ui/src/chat/transcript/tool-parts.tsx:204](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L204)

### `useModelName`

Function.

How the transcript names a model: the app's `modelName`, else from the id.

```ts
function useModelName(): ModelNamer
```

**Returns** `ModelNamer`

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

### `useReferencedSession`

Function.

The chat a `#token` names, and its context gauge.

```ts
function useReferencedSession(
  token: string,
): { context: ChatContextFacts | null; loading: boolean; session: ChatSessionFacts | null }
```

**Parameters**

- `token` (`string`): The chip's text (`#3f2a`).

**Returns** `{ context: ChatContextFacts | null; loading: boolean; session: ChatSessionFacts | null }`

Source: [ui/src/chat/transcript/chip-details.ts:116](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/chip-details.ts#L116)

### `useReferenceMatches`

Function.

The references in `text` for `surface`; empty until the providers are known.

```ts
function useReferenceMatches(
  text: string,
  cwd: string | null | undefined,
  surface: ExtensionReferenceSurface,
): ReferenceMatch[]
```

**Parameters**

- `text` (`string`): The text to scan.
- `cwd` (`string | null | undefined`): The folder whose providers match.
- `surface` (`ExtensionReferenceSurface`): Where the text is.

**Returns** `ReferenceMatch[]`

Source: [ui/src/chat/transcript/references.ts:74](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/references.ts#L74)

### `useReferenceProviders`

Function.

The providers for `cwd` (`''`: user-level), asked for on first use.
`peek`: only if the host already built that folder's registry.

```ts
function useReferenceProviders(
  cwd: string | null | undefined,
  peek?: boolean,
): readonly ReferenceProviderWire[]
```

**Parameters**

- `cwd` (`string | null | undefined`): The folder (`null`: user-level).
- `peek?` (`boolean`, default `false`): Only what the host already built (a title).

**Returns** `readonly ReferenceProviderWire[]`

Source: [ui/src/chat/transcript/references.ts:54](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/references.ts#L54)

### `useReferenceView`

Function.

A reference's view: `undefined` while unknown, `null` when it names
nothing (no badge). Asked for on first use.

```ts
function useReferenceView(
  cwd: string | null | undefined,
  providerId: string,
  key: string,
): ExtensionReferenceView | null | undefined
```

**Parameters**

- `cwd` (`string | null | undefined`): The folder.
- `providerId` (`string`): The reference's provider.
- `key` (`string`): The reference's key.

**Returns** `ExtensionReferenceView | null | undefined`

Source: [ui/src/chat/transcript/references.ts:91](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/references.ts#L91)

### `useResolveChipNow`

Function.

Asks again now, bypassing the cache (a click: the file may exist since). `null` without a host's paths.

```ts
function useResolveChipNow(): (cwd: string, text: string) => Promise<ChipResolution>
```

**Returns** `(cwd: string, text: string) => Promise<ChipResolution>`

Source: [ui/src/chat/transcript/chip-resolve.ts:50](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/chip-resolve.ts#L50)

### `useRowIcons`

Function.

Whether the rows of the transcript around draw their icons ([`RowIconsContext`](https://zidane.si/docs/reference/ui-chat-transcript.md#RowIconsContext)).

```ts
function useRowIcons(): boolean
```

**Returns** `boolean`

Source: [ui/src/chat/transcript/frame.tsx:37](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/frame.tsx#L37)

### `useSelectStops`

Function.

Select-turn stops (`computeSelectStops`): which turns the cursor walks
and which rows light up. Derived per transcript change while the mode is
on, never per keypress, and not at all outside it. `registerStops` hands
the app a function that answers from the rows painted right now (it asks
before the mode is on, and on every arrow), cached per input so a burst
of arrows computes once.

```ts
function useSelectStops(
  visibleRows: readonly Row[],
  events: readonly ChatEvent[],
  showThinking: boolean,
  selecting: boolean,
  registerStops: ((source: () => SelectStops) => () => void) | undefined,
): SelectStops | null
```

**Parameters**

- `visibleRows` (`readonly Row[]`): The rows painted, from [`useTranscriptRows`](https://zidane.si/docs/reference/ui-chat-transcript.md#useTranscriptRows).
- `events` (`readonly ChatEvent[]`): The session's events, oldest first.
- `showThinking` (`boolean`): Reasoning rows are shown, so they can be stops.
- `selecting` (`boolean`): Select-turn mode is on.
- `registerStops` (`((source: () => SelectStops) => () => void) | undefined`): Hands the app the stops source; returns its unregister function.

**Returns** `SelectStops | null`

Source: [ui/src/chat/transcript/use-transcript-rows.ts:155](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/use-transcript-rows.ts#L155)

### `useSelectTurn`

Function.

The select-turn mode. `K`: the app's session id type. Throws outside a [`SelectTurnProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#SelectTurnProvider).

```ts
function useSelectTurn<K extends string = string>(): SelectTurnValue<K>
```

**Type parameters**

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

**Returns** `SelectTurnValue<K>`

Source: [ui/src/chat/transcript/SelectTurnProvider.tsx:142](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/SelectTurnProvider.tsx#L142)

### `useSelectTurnKeys`

Function.

Drives select-turn mode for the session on show.

```ts
function useSelectTurnKeys<K extends string = string>(
  options: SelectTurnKeysOptions<K>,
): (() => void) | undefined
```

**Type parameters**

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

**Parameters**

- `options` (`SelectTurnKeysOptions<K>`): The session, its stops and the turn commands.

**Returns** `(() => void) | undefined`: The `enterSelectTurnMode` handler, `undefined` without a session.

Source: [ui/src/chat/transcript/useSelectTurnKeys.ts:45](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useSelectTurnKeys.ts#L45)

### `useSettledReveal`

Function.

Whether the thread is still veiled (see the module comment).

```ts
function useSettledReveal(key: string | null, ready: boolean, maxMs?: number): boolean
```

**Parameters**

- `key` (`string | null`): The thread shown (`null`: none).
- `ready` (`boolean`): Its transcript has hydrated.
- `maxMs?` (`number`, default `REVEAL_MAX_MS`): The longest it stays veiled.

**Returns** `boolean`

Source: [ui/src/chat/transcript/useSettledReveal.ts:42](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useSettledReveal.ts#L42)

### `useShellBlockScope`

Function.

The reply whose blocks can run here, or `null` (a streaming reply, a thought, a tool's input).

```ts
function useShellBlockScope(): ShellBlockScope | null
```

**Returns** `ShellBlockScope | null`

Source: [ui/src/chat/transcript/shell-block-scope.ts:35](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/shell-block-scope.ts#L35)

### `useSiteIcon`

Function.

The site icon of `url` once loaded; `null` until then, for a site without one, or without a host's icons.

```ts
function useSiteIcon(url: string): string | null
```

**Parameters**

- `url` (`string`): The link.

**Returns** `string | null`

Source: [ui/src/chat/transcript/site-icons.ts:15](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/site-icons.ts#L15)

### `useSkill`

Function.

The skill a chip's text names in `cwd`.

```ts
function useSkill(
  cwd: string | null,
  text: string,
): { loading: boolean; skill: ChatSkillFacts | null }
```

**Parameters**

- `cwd` (`string | null`): The folder whose skills are read (`null`: none).
- `text` (`string`): The chip's text.

**Returns** `{ loading: boolean; skill: ChatSkillFacts | null }`

Source: [ui/src/chat/transcript/chip-details.ts:141](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/chip-details.ts#L141)

### `useStickToBottom`

Function.

Keeps a transcript's scroller on the bottom while it grows, and its reader's line in place once they leave it (the contract above).

```ts
function useStickToBottom(
  scrollRef: RefObject<HTMLElement | null>,
  options?: StickToBottomOptions,
): { glideToBottom: () => void; pinned: boolean; readPosition: () => ScrollPosition | null; restorePosition: (saved: ScrollPosition) => boolean; setPinned: (next: boolean) => void; snapToBottom: () => void }
```

**Parameters**

- `scrollRef` (`RefObject<HTMLElement | null>`): The scroller. Its first element child is the content whose growth the view follows.
- `options?` (`StickToBottomOptions`, default `{}`): [`StickToBottomOptions`](https://zidane.si/docs/reference/ui-chat-transcript.md#StickToBottomOptions).

**Returns** `{ glideToBottom: () => void; pinned: boolean; readPosition: () => ScrollPosition | null; restorePosition: (saved: ScrollPosition) => boolean; setPinned: (next: boolean) => void; snapToBottom: () => void }`: `pinned`, `snapToBottom` (go there now), `glideToBottom` (go there eased: a prompt sent), `setPinned`, and `readPosition` / `restorePosition` (where the view is, and back there after showing something else).

Source: [ui/src/chat/transcript/useStickToBottom.ts:204](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useStickToBottom.ts#L204)

### `useToolMedia`

Function.

The media a result shows inline, with the text left around it; `null` when it shows none.

```ts
function useToolMedia(
  tool: Pick<ToolRowModel, 'callId'>,
  output: string | null,
): { media: ToolMediaItem[]; rest: string; url: (index: number) => string } | null
```

**Parameters**

- `tool` (`Pick<ToolRowModel, 'callId'>`): The tool row; its `callId` addresses the media.
- `output` (`string | null`): The tool result's text, or `null` before it has one.

**Returns** `{ media: ToolMediaItem[]; rest: string; url: (index: number) => string } | null`

Source: [ui/src/chat/transcript/tool-media.tsx:28](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-media.tsx#L28)

### `useTranscriptActions`

Function.

Returns the [`TranscriptActions`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptActions) from the nearest [`TranscriptActionsProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptActionsProvider). Without one it returns an object with no session and no actions.

```ts
function useTranscriptActions(): TranscriptActions
```

**Returns** `TranscriptActions`

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

### `useTranscriptFind`

Function.

The find in the conversation: ⌘F opens it on the session on show (keeping a query already there), a
switch to another session closes it.

```ts
function useTranscriptFind<K extends string = string>(
  options: TranscriptFindOptions<K>,
): TranscriptFind<K>
```

**Type parameters**

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

**Parameters**

- `options` (`TranscriptFindOptions<K>`): The session on show, and what blocks ⌘F.

**Returns** `TranscriptFind<K>`

Source: [ui/src/chat/transcript/useTranscriptFind.ts:46](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useTranscriptFind.ts#L46)

### `useTranscriptFindKey`

Function.

Routes ⌘F / ⌘⇧F to the tab scope in reach, else to the conversation. The listener attaches once.

```ts
function useTranscriptFindKey<K extends string = string>(
  options: TranscriptFindKeyOptions<K>,
): void
```

**Type parameters**

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

**Parameters**

- `options` (`TranscriptFindKeyOptions<K>`): The session on show and what opens its find.

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

### `useTranscriptRenderers`

Function.

Returns the renderer slots in effect: the defaults merged with every enclosing
[`TranscriptRenderersProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptRenderersProvider), and the extensions' language and tool renderers routed in.

```ts
function useTranscriptRenderers(): TranscriptRenderers
```

**Returns** `TranscriptRenderers`

Source: [ui/src/chat/transcript/renderers.tsx:248](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L248)

### `useTranscriptRows`

Function.

Runs the headless pipeline over a transcript's events, one `useMemo` per pass, and returns the rows to paint.

```ts
function useTranscriptRows(
  events: readonly ChatEvent[],
  streaming: boolean,
  input: TranscriptRowsInput,
): TranscriptRows
```

**Parameters**

- `events` (`readonly ChatEvent[]`): The session's events, oldest first.
- `streaming` (`boolean`): A run is in flight, so the last reply may still be streaming.
- `input` (`TranscriptRowsInput`): The display options that shape the rows.

**Returns** `TranscriptRows`

Source: [ui/src/chat/transcript/use-transcript-rows.ts:71](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/use-transcript-rows.ts#L71)

### `useTranscriptScroll`

Function.

The transcript's scroll: stick-to-bottom, where a conversation opens, the from-top signal and lazy scrollback (see the module comment).

```ts
function useTranscriptScroll<K extends string>(
  sessionId: K | null,
  hydrated: boolean,
  inputs: TranscriptScrollInputs<K>,
): { glideToBottom: () => void; pinned: boolean; scrolledFromTop: boolean; scrollRef: RefObject<HTMLElement | null> }
```

**Type parameters**

- `K` (`extends string`)

**Parameters**

- `sessionId` (`K | null`): The conversation shown.
- `hydrated` (`boolean`): Its events have loaded.
- `inputs` (`TranscriptScrollInputs<K>`): The [`TranscriptScrollInputs`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptScrollInputs).

**Returns** `{ glideToBottom: () => void; pinned: boolean; scrolledFromTop: boolean; scrollRef: RefObject<HTMLElement | null> }`

Source: [ui/src/chat/transcript/useTranscriptScroll.ts:48](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useTranscriptScroll.ts#L48)

### `useTranscriptSearch`

Function.

`revision` is any value whose identity changes when the transcript
re-renders (the host's `events` array) — it triggers a match
recompute without moving the viewport, so streaming deltas don't yank
the user away from the match they're reading. Only a needle CHANGE
scrolls.

```ts
function useTranscriptSearch(
  container: RefObject<HTMLElement | null>,
  query: string,
  revision: unknown,
  options?: TranscriptSearchOptions,
): TranscriptSearchState
```

**Parameters**

- `container` (`RefObject<HTMLElement | null>`): The transcript's scroll container.
- `query` (`string`): The query as typed.
- `revision` (`unknown`): Changes identity when the transcript re-renders.
- `options?` (`TranscriptSearchOptions`, default `{}`): The [`TranscriptSearchOptions`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptSearchOptions).

**Returns** `TranscriptSearchState`

Source: [ui/src/chat/transcript/useTranscriptSearch.tsx:218](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useTranscriptSearch.tsx#L218)

### `useTranscriptSelectionCopy`

Function.

Drag-select transcript copy — mirrors the TUI's OSC-52 hook. On
mouseup inside the timeline, if the live selection intersects the
transcript and is non-empty, write its plain-text contents to the
clipboard. Debounced via `lastCopiedRef` so dragging across the same
selection doesn't spam the clipboard.

Web equivalent of the TUI's OSC-52 path. We don't subscribe to
`selectionchange` directly because that event fires per-character
during a drag — mouseup is the natural "I'm done picking" boundary.

```ts
function useTranscriptSelectionCopy(
  containerRef: RefObject<HTMLDivElement | null>,
): void
```

**Parameters**

- `containerRef` (`RefObject<HTMLDivElement | null>`): Ref to the transcript's root element. A selection inside it is copied on mouse up.

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

### `useTurnCommands`

Function.

The turn commands over the session host's turns (stable while they are); `null` when the host has none.

```ts
function useTurnCommands(options?: TurnCommandsOptions): TurnCommands | null
```

**Parameters**

- `options?` (`TurnCommandsOptions`): The clipboard and the refusal wording.

**Returns** `TurnCommands | null`

Source: [ui/src/chat/transcript/turn-commands.ts:92](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/turn-commands.ts#L92)

### `useTurnMenu`

Function.

The transcript's turn menu: `onContextMenu` for a row, `prefetch` on hover (the send time), and the
`menu` element to render once (memoized).

```ts
function useTurnMenu<K extends string>(
  sessionId: K | null | undefined,
  actions: TurnMenuActions<K>,
): { menu: Element; onContextMenu: (event: MouseEvent<HTMLElement>, clicked: TurnMenuTarget) => void; prefetch: (turnId: string) => void }
```

**Type parameters**

- `K` (`extends string`)

**Parameters**

- `sessionId` (`K | null | undefined`): The transcript's session.
- `actions` (`TurnMenuActions<K>`): The [`TurnMenuActions`](https://zidane.si/docs/reference/ui-chat-transcript.md#TurnMenuActions).

**Returns** `{ menu: Element; onContextMenu: (event: MouseEvent<HTMLElement>, clicked: TurnMenuTarget) => void; prefetch: (turnId: string) => void }`

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

### `useWheelHoverPause`

Function.

Pauses hover effects while the wheel scrolls the transcript, so rows passing under the pointer don't light up.

```ts
function useWheelHoverPause(scrollRef: RefObject<HTMLElement | null>): void
```

**Parameters**

- `scrollRef` (`RefObject<HTMLElement | null>`): The transcript's scroll container.

Source: [ui/src/chat/transcript/useWheelHoverPause.ts:39](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useWheelHoverPause.ts#L39)

## Constants

### `AUTO_FILL_PAGES`

Constant.

Pages auto-loaded per activation before the explicit row takes over.

```ts
const AUTO_FILL_PAGES = 3
```

Source: [ui/src/chat/transcript/EarlierHistory.tsx:7](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/EarlierHistory.tsx#L7)

### `BADGE_GLYPH`

Constant.

Literal classes (UnoCSS scans this file): the `::before` glyph of each badge kind.

```ts
const BADGE_GLYPH: { readonly chat: 'zg-badge-glyph before:i-ph-chats'; readonly command: 'zg-badge-glyph before:i-ph-terminal-window'; readonly extension: 'zg-badge-glyph before:i-ph-puzzle-piece'; readonly link: 'zg-badge-glyph before:i-ph-globe'; readonly skill: 'zg-badge-glyph before:i-ph-book-bookmark' }
```

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

### `CHIP_CARD_WIDTH`

Constant.

The hover card's width, px.

```ts
const CHIP_CARD_WIDTH = 340
```

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

### `CODE_PANEL`

Constant.

Tool input / output panels: set into the row on the code tone (quiet text, the code panel's inset edge).

```ts
const CODE_PANEL = 'zg-code-panel zg-output zg-ansi'
```

Source: [ui/src/chat/transcript/tool-parts.tsx:17](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L17)

### `COMMAND_DETAIL_LINE`

Constant.

The gutter line height of a command-detail row's Dot: a `text-sm` × 1.6
line (22.4px) plus the header button's `py-0.5`. A body-less detail has
no button but keeps the same padding, so both share it.

```ts
const COMMAND_DETAIL_LINE = '26.4px'
```

Source: [ui/src/chat/transcript/notices.tsx:376](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L376)

### `CommandScopeContext`

Constant.

The transcript's command scope (its container provides the session's).

```ts
const CommandScopeContext: Context<CommandScope | null>
```

Source: [ui/src/chat/transcript/markdown-context.ts:53](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown-context.ts#L53)

### `DEFAULT_TRANSCRIPT_RENDERERS`

Constant.

The default renderer slots: safe markdown, highlighted code, plain inline text, and a generic attachment icon. Used when no [`TranscriptRenderersProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptRenderersProvider) is present.

```ts
const DEFAULT_TRANSCRIPT_RENDERERS: TranscriptRenderers
```

Source: [ui/src/chat/transcript/renderers.tsx:230](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L230)

### `FILL_MIN_PROMPTS`

Constant.

Prompts the opened conversation should show: fewer, and the fill keeps loading.

```ts
const FILL_MIN_PROMPTS = 10
```

Source: [ui/src/chat/transcript/EarlierHistory.tsx:9](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/EarlierHistory.tsx#L9)

### `GUTTER_STEP_PX`

Constant.

Horizontal distance in pixels from one nesting level of the transcript's glyph column to the next: a 16px glyph slot plus a 12px gap.

```ts
const GUTTER_STEP_PX = 28
```

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

### `INLINE_CODE_CLASS`

Constant.

Inline code in running prose: the code tone, no outline. A path or identifier longer than the line breaks instead of running past the column.

```ts
const INLINE_CODE_CLASS: 'px-1 py-0.5 rounded-[5px] bg-[var(--zg-code-bg)] text-[var(--zg-code-fg)] font-mono text-[0.85em] [overflow-wrap:anywhere]'
```

Source: [ui/src/chat/transcript/markdown-context.ts:49](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown-context.ts#L49)

### `MarkdownContext`

Constant.

The chips' session facts (no session: nothing resolves, nothing links).

```ts
const MarkdownContext: Context<MarkdownContextValue>
```

Source: [ui/src/chat/transcript/markdown-context.ts:35](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown-context.ts#L35)

### `MAX_MATCHES`

Constant.

Range cap — a short query ("e") over a long transcript can produce
tens of thousands of matches; building Ranges + a Highlight for all
of them stalls the frame for no navigational benefit. The counter
shows "500+" when the cap is hit.

```ts
const MAX_MATCHES = 500
```

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

### `OpenSessionContext`

Constant.

Shows a chat by its id (a `#chat` card's title). The app provides it once; absent, the title is plain.

```ts
const OpenSessionContext: Context<((sessionId: string) => void) | null>
```

Source: [ui/src/chat/transcript/markdown-context.ts:38](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown-context.ts#L38)

### `RowIconsContext`

Constant.

Whether the transcript draws its row icons: the [`Dot`](https://zidane.si/docs/reference/ui-chat-transcript.md#Dot) that leads
each row (you, the agent, how a step went). `Transcript` provides it from
its `showRowIcons` option. Without them the icon column goes and the rows
take its room.

```ts
const RowIconsContext: Context<boolean>
```

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

### `TranscriptSettling`

Constant.

True while the transcript is first painting a conversation (switching to
it, or its history landing). Rows mounted then were already there: they
must not play their enter animation.

```ts
const TranscriptSettling: Context<() => boolean>
```

Source: [ui/src/chat/transcript/LazyRow.tsx:198](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/LazyRow.tsx#L198)

## Interfaces

### `AnsiSpansProps`

Interface.

Props for [`AnsiSpans`](https://zidane.si/docs/reference/ui-chat-transcript.md#AnsiSpans).

```ts
interface AnsiSpansProps
```

**Properties**

- `spans` (`readonly AnsiSpan[]`): One line's spans, as the parser gave them.

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

### `AnsiTextProps`

Interface.

Props for [`AnsiText`](https://zidane.si/docs/reference/ui-chat-transcript.md#AnsiText).

```ts
interface AnsiTextProps
```

**Properties**

- `text` (`string`): Terminal output, with or without ANSI codes.

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

### `AttachmentIconProps`

Interface.

Props for [`AttachmentIcon`](https://zidane.si/docs/reference/ui-chat-transcript.md#AttachmentIcon).

```ts
interface AttachmentIconProps
```

**Properties**

- `className?` (`string`, default `'text-base'`): Class names for the icon. Its font size sets the icon's size.
- `parts` (`AttachmentLabelParts`): The attachment's icon or badge, and the tone to draw it in.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/prompt.tsx:215](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/prompt.tsx#L215)

### `AttachmentLabelParts`

Interface.

What a non-image attachment shows: an icon (or a short badge) and its name.

```ts
interface AttachmentLabelParts
```

**Properties**

- `badge?` (`string`): Short badge for icon-less kinds (e.g. `TS`).
- `detail?` (`string`): Secondary text, e.g. `L61 to L69` or `comment`.
- `icon` (`string`): Icon class name, for example `i-ph-file`.
- `name` (`string`): The attachment's display name.
- `tone?` (`string`): CSS color for the icon or badge. Default: the muted text color.

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

### `AuthFailureCardProps`

Interface.

Props for [`AuthFailureCard`](https://zidane.si/docs/reference/ui-chat-transcript.md#AuthFailureCard).

```ts
interface AuthFailureCardProps
```

**Properties**

- `auth` (`AuthFailure`): The sign-in that failed (`detail.auth`).
- `className?` (`string`): Extra classes on the root element.
- `detail?` (`RunErrorDetail`): The error's structured detail: the provider's own words, for the tooltip and Copy details.
- `failure` (`{ cause: 'error' | 'aborted'; prompt?: string; resume: 'retry' | 'continue' }`): How the run ended and how it would resume.
- `onResume?` (`(prompt: string) => void`): Called with the prompt that resumes the run (Retry, and after a sign-in or a switch). Absent: no Retry.
- `resumable` (`boolean`): The card is the transcript's last word, with no run in progress: it offers its actions.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): The run's stop reason, shown muted under the headline.

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

### `BadgeEffectContext`

Interface.

What `applyBadgeEffect` applies an effect with.

```ts
interface BadgeEffectContext
```

**Properties**

- `builtin` (`string | null`): The built-in action's id; `null` for an extension's.
- `composer?` (`BadgeMenuComposer`): Where inserts go.
- `cwd` (`string`): The chat's folder.
- `labels` (`Pick<ChatLabels, 'badgePathUnavailable' | 'badgeNoComposer' | 'badgeCopied'>`): The notices' words.
- `openLink?` (`(url: string, fallback: () => void) => Promise<boolean>`): Offers an `open` link to the extensions' link handlers, calling `fallback` when none takes it. Absent: `fallback` at once.
- `system?` (`BadgeMenuSystem`): Opens and reveals paths.
- `target` (`BadgeTarget`): The badge acted on.

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

### `BadgeMenuBrowser`

Interface.

Where web links open: the default browser, and the app's own browser pane.

```ts
interface BadgeMenuBrowser
```

**Properties**

- `name` (`string | null`): The default browser's name ("Arc"): the row reads "Open in Arc". `null` when unknown: "Open in browser".
- `openInPane?` (`(url: string) => void`): Opens a web link in the app's browser pane. Absent: no "Open in browser pane" row.

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

### `BadgeMenuComposer`

Interface.

Where "Add to prompt" and an action's `insert` go: the focused composer.

```ts
interface BadgeMenuComposer
```

**Properties**

- `focused` (`boolean`): A composer has focus now (re-render the provider when it changes).
- `insert` (`(text: string) => void`): Inserts text at the composer's caret.
- `isFocused` (`() => boolean`): Whether a composer has focus at the moment an effect applies.
- `mention` (`(path: string) => void`): Adds a file mention (a path relative to the chat's folder).

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

### `BadgeMenuProviderProps`

Interface.

Props for [`BadgeMenuProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#BadgeMenuProvider).

```ts
interface BadgeMenuProviderProps
```

**Properties**

- `browser?` (`BadgeMenuBrowser`): The default browser's name and the browser pane. Absent: "Open in browser" only.
- `children` (`ReactNode`): The surfaces whose badges open the menu.
- `composer?` (`BadgeMenuComposer`): The focused composer. Absent: "Add to prompt" is disabled and inserts are dropped with a notice.
- `system?` (`BadgeMenuSystem`): Opens and reveals paths. Absent: path actions answer "Path unavailable."

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

### `BadgeMenuSystem`

Interface.

Opens and reveals paths (`open` / `reveal` effects); each resolves `false` when the path is unavailable.

```ts
interface BadgeMenuSystem
```

**Properties**

- `openPath` (`(path: string) => Promise<boolean>`): Opens a path in the editor or file manager.
- `revealPath` (`(path: string) => Promise<boolean>`): Shows a path in the file manager.

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

### `CardMarkdownProps`

Interface.

Props for [`CardMarkdown`](https://zidane.si/docs/reference/ui-chat-transcript.md#CardMarkdown).

```ts
interface CardMarkdownProps
```

**Properties**

- `text` (`string`): The excerpt, as Markdown.

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

### `CaretProps`

Interface.

Props for [`Caret`](https://zidane.si/docs/reference/ui-chat-transcript.md#Caret).

```ts
interface CaretProps
```

**Properties**

- `className?` (`string`): Extra class names, for example to show the caret only on hover.
- `open` (`boolean`): The header is expanded. Turns the caret down.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/frame.tsx:243](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/frame.tsx#L243)

### `ChipCardProps`

Interface.

Props for [`ChipCard`](https://zidane.si/docs/reference/ui-chat-transcript.md#ChipCard).

```ts
interface ChipCardProps
```

**Properties**

- `className?` (`string`): Extra classes on the card.
- `loading?` (`boolean`): Facts still being read.
- `mono?` (`boolean`): The label in the code face (a sha).
- `onTitle?` (`() => void`): The title as an action (open the chat) instead of `href`.
- `style?` (`CSSProperties`): Inline style on the card.
- `view` (`ExtensionReferenceView`): What the card shows.

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

### `ChipHoverProps`

Interface.

Props for [`ChipHover`](https://zidane.si/docs/reference/ui-chat-transcript.md#ChipHover).

```ts
interface ChipHoverProps
```

**Properties**

- `ariaLabel` (`string`): The card's accessible name.
- `children` (`ReactNode`): The card.
- `trigger` (`(props: HoverCardTriggerProps) => ReactNode`): Renders the chip, spreading the props that open the card.

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

### `CodeBlockSlotProps`

Interface.

Props of the `CodeBlock` renderer slot.

```ts
interface CodeBlockSlotProps
```

**Properties**

- `actions?` (`(buttonClass: string) => ReactNode`): Controls the frame shows beside its own (a shell block's Run button), as
  `HighlightedCodeProps.actions`. A replacement slot that drops them
  leaves the block without them.
- `code` (`string`): The code to show, without the closing newline.
- `language` (`string`): A fence's language (`plaintext` when it names none).

Source: [ui/src/chat/transcript/renderers.tsx:47](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L47)

### `CodemodeScriptProps`

Interface.

Props for [`CodemodeScript`](https://zidane.si/docs/reference/ui-chat-transcript.md#CodemodeScript).

```ts
interface CodemodeScriptProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `code` (`string`): The script, as the model wrote it.
- `finished?` (`boolean`): The script ended.
- `ok?` (`boolean`): It ended without error.
- `output?` (`ReactNode`): Its output once it ends (the tool row's output panel), shown in the box its live lines were in: the
  end swaps the lines for it in place. Without it, the box closes at the end.
- `progress?` (`ScriptProgress`): Its live progress (the row's `scriptProgress`). Without it, the lines show no state.
- `result?` (`string | null`): Its result text: a failed script's names the line it threw at.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `CommandCardProps`

Interface.

Props for [`CommandCard`](https://zidane.si/docs/reference/ui-chat-transcript.md#CommandCard).

```ts
interface CommandCardProps
```

**Properties**

- `cwd` (`string | null`): The folder whose commands are read, when the transcript names no scope.
- `text` (`string`): The chip's text (`/fix conflicts`).

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

### `CommandDetailRowProps`

Interface.

Props for [`CommandDetailRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#CommandDetailRow).

```ts
interface CommandDetailRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `label?` (`string`): The detail's label. Default: the `commandDetail` label.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `syntax?` (`'diff'`): `diff`: the body is a stat table, drawn as a code block.
- `text` (`string`): The detail's markdown body; blank: a static line with no caret.

Source: [ui/src/chat/transcript/notices.tsx:379](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L379)

### `CommandNoteRowProps`

Interface.

Props for [`CommandNoteRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#CommandNoteRow).

```ts
interface CommandNoteRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): What the command recorded for the model, one line.

Source: [ui/src/chat/transcript/notices.tsx:37](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L37)

### `CommandScope`

Interface.

Where a session's commands come from: its folder, on this computer or a server.

```ts
interface CommandScope
```

**Properties**

- `cwd` (`string`): The folder.
- `hostId` (`string | null`): The server (`null`: this computer).

Source: [ui/src/chat/transcript/markdown-context.ts:41](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown-context.ts#L41)

### `CommitCardProps`

Interface.

Props for [`CommitCard`](https://zidane.si/docs/reference/ui-chat-transcript.md#CommitCard).

```ts
interface CommitCardProps
```

**Properties**

- `cwd` (`string | null`): The repository's folder.
- `href?` (`string`): Where the commit's page is.
- `sha` (`string`): The commit.

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

### `CompactSummaryRowProps`

Interface.

Props for [`CompactSummaryRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#CompactSummaryRow).

```ts
interface CompactSummaryRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `meta` (`{ cacheCreationTokens: number; cacheReadTokens: number; compactedAt: number; costUsd?: number; inputTokens: number; model: string; outputTokens: number; providerKey?: string; replacedCount: number }`): Details of the compaction: turns replaced, model, cost, and token counts.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): The summary the model wrote for the compacted turns, as markdown. Shown when the row is expanded.

Source: [ui/src/chat/transcript/run-rows.tsx:202](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/run-rows.tsx#L202)

### `CvRowProps`

Interface.

Props for [`CvRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#CvRow).

```ts
interface CvRowProps
```

**Properties**

- `children` (`ReactNode`): The row's content.
- `className?` (`string`): Extra classes on the root element.
- `data-row?` (`string`): The row's id (`Row.id`): how a view that left the transcript finds its place again (`useStickToBottom`'s `restorePosition`).
- `data-sel?` (`string`): Marks the row as part of the selected stop, so the select cursor can find it.
- `data-stop?` (`string`): The select-turn stop the row belongs to. Set only in select mode; makes the row a hover and click target.
- `style` (`CSSProperties`): Inline style for the row's wrapper, usually its content-visibility sizing.

Source: [ui/src/chat/transcript/LazyRow.tsx:201](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/LazyRow.tsx#L201)

### `DefaultMarkdownProps`

Interface.

Props for [`DefaultMarkdown`](https://zidane.si/docs/reference/ui-chat-transcript.md#DefaultMarkdown): the [`MarkdownSlotProps`](https://zidane.si/docs/reference/ui-chat-transcript.md#MarkdownSlotProps) plus the root's style.

```ts
interface DefaultMarkdownProps extends MarkdownSlotProps
```

**Properties**

- `children` (`string`, from `MarkdownSlotProps`): The markdown source to render.
- `className?` (`string`, from `MarkdownSlotProps`): Extra class names for the rendered block.
- `streaming?` (`boolean`, from `MarkdownSlotProps`): Still streaming: a renderer may re-parse only the tail.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/renderers.tsx:213](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L213)

### `DiffLinesProps`

Interface.

Props for [`DiffLines`](https://zidane.si/docs/reference/ui-chat-transcript.md#DiffLines).

```ts
interface DiffLinesProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `lines` (`readonly DiffLine[]`): The diff's lines, in order.
- `maxHeight?` (`number`): Vertical clamp on the diff block. When omitted (or `0`), the block
  grows naturally and the parent scroll context handles overflow.
  Pass an explicit pixel value (e.g. `360`) only when an outer
  scroll context isn't available — `EditDiffBlock` uses this so a
  500-line refactor doesn't blow out the transcript card.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `DotProps`

Interface.

Props for [`Dot`](https://zidane.si/docs/reference/ui-chat-transcript.md#Dot).

```ts
interface DotProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `line?` (`string`): The first text line's height it centres on, in place of the variant's (a CSS length).
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `variant` (`DotVariant`): The row's kind and state: picks the glyph, its tone and the line height it centres on.

Source: [ui/src/chat/transcript/frame.tsx:269](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/frame.tsx#L269)

### `EditDiffBlockProps`

Interface.

Props for [`EditDiffBlock`](https://zidane.si/docs/reference/ui-chat-transcript.md#EditDiffBlock).

```ts
interface EditDiffBlockProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `edit` (`EditPayload`): The edit to draw: its path, hunks and per-hunk approval outcomes.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/EditDiffBlock.tsx:9](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/EditDiffBlock.tsx#L9)

### `ErrorRowProps`

Interface.

Props for [`ErrorRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#ErrorRow).

```ts
interface ErrorRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): The error's text.

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

### `ExchangeFoldRowProps`

Interface.

Props for [`ExchangeFoldRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#ExchangeFoldRow).

```ts
interface ExchangeFoldRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `renderRows` (`(c: readonly Cluster[]) => ReactNode[]`): Renders clusters with the transcript's row components, for the open list and worker steps.
- `row` (`Owned & { id: string; kind: 'exchange-fold'; live: boolean; rows: Row[]; stats: ExchangeFoldStats; summary: string }`): The folded exchange.
- `showAttachments?` (`boolean`, default `false`): Gathers the images the exchange's tool calls returned in a strip under its steps (the Tool attachments setting).
- `status?` (`LiveRunStatus`): The live run's status, which the header names ("Waiting for the model", "Retrying 2/3"). Set on the transcript's live fold only.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/fold.tsx:66](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/fold.tsx#L66)

### `FailedMarkProps`

Interface.

Props for [`FailedMark`](https://zidane.si/docs/reference/ui-chat-transcript.md#FailedMark).

```ts
interface FailedMarkProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `decorative?` (`boolean`, default `false`): Hides the mark from assistive tech, for a row whose text says it failed already.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `FailureRowProps`

Interface.

Props for [`FailureRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#FailureRow).

```ts
interface FailureRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `detail?` (`RunErrorDetail`): The error's structured detail, for the tooltip.
- `failure` (`{ cause: 'error' | 'aborted'; prompt?: string; resume: 'retry' | 'continue' }`): How the run ended and how it would resume.
- `onResume?` (`(prompt: string) => void`): Called with the prompt that resumes the run. Absent: no button.
- `resumable` (`boolean`): The row is the transcript's last word: it offers Continue or Retry.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): The reason the run stopped, in muted text after `Stopped`.

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

### `FileBadgeIconProps`

Interface.

Props for [`FileBadgeIcon`](https://zidane.si/docs/reference/ui-chat-transcript.md#FileBadgeIcon).

```ts
interface FileBadgeIconProps
```

**Properties**

- `chip` (`FileChip`): The file the icon is for.

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

### `FoldHeaderProps`

Interface.

Props for [`FoldHeader`](https://zidane.si/docs/reference/ui-chat-transcript.md#FoldHeader).

```ts
interface FoldHeaderProps
```

**Properties**

- `children` (`ReactNode`): The header line's content.
- `className?` (`string`): Extra classes on the root element.
- `expandable` (`boolean`): Makes the line a toggle with a caret. When false the line is inert.
- `onToggle` (`() => void`): Called when the user toggles the header.
- `open` (`boolean`): The fold is expanded. Drives `aria-expanded` and the caret.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/fold.tsx:237](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/fold.tsx#L237)

### `ImageGenerationBlockProps`

Interface.

Props for [`ImageGenerationBlock`](https://zidane.si/docs/reference/ui-chat-transcript.md#ImageGenerationBlock).

```ts
interface ImageGenerationBlockProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `tool` (`Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }`): The `generate_image` row, or the script row that called it.

Source: [ui/src/chat/transcript/ImageGenerationBlock.tsx:144](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/ImageGenerationBlock.tsx#L144)

### `InfoRowProps`

Interface.

Props for [`InfoRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#InfoRow).

```ts
interface InfoRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): The informational line.

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

### `InlineChipTextProps`

Interface.

Props for [`InlineChipText`](https://zidane.si/docs/reference/ui-chat-transcript.md#InlineChipText).

```ts
interface InlineChipTextProps
```

**Properties**

- `text` (`string`): The line, with backticks around its code.

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

### `InlineCodeProps`

Interface.

Props for [`InlineCode`](https://zidane.si/docs/reference/ui-chat-transcript.md#InlineCode).

```ts
interface InlineCodeProps
```

**Properties**

- `text` (`string`): The code's text.

Source: [ui/src/chat/transcript/FileChip.tsx:185](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/FileChip.tsx#L185)

### `InlineTextSlotProps`

Interface.

Props of the `InlineText` renderer slot.

```ts
interface InlineTextSlotProps
```

**Properties**

- `text` (`string`): One line of plain text; `` `code` `` spans keep their backticks.

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

### `InteractionTool`

Interface.

The call an [`InteractionToolBody`](https://zidane.si/docs/reference/ui-chat-transcript.md#InteractionToolBody) draws.

```ts
interface InteractionTool
```

**Properties**

- `id` (`string`): The call's id.
- `name` (`string`): The tool's name (`present_plan`, `ask_user`, `todowrite`).
- `ok` (`boolean | null`): Whether it succeeded; `null` while it runs.
- `rawInput?` (`Record<string, unknown>`): The call's arguments as the model sent them.
- `result` (`string | null`): The call's result text (the serialized response); `null` while waiting.

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

### `InteractionToolBodyProps`

Interface.

Props for [`InteractionToolBody`](https://zidane.si/docs/reference/ui-chat-transcript.md#InteractionToolBody).

```ts
interface InteractionToolBodyProps
```

**Properties**

- `tool` (`InteractionTool`): The call.

Source: [ui/src/chat/transcript/InteractionToolBody.tsx:142](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/InteractionToolBody.tsx#L142)

### `LazyRowProps`

Interface.

Props for [`LazyRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#LazyRow).

```ts
interface LazyRowProps
```

**Properties**

- `children` (`ReactNode`): The row's content.
- `className?` (`string`): Extra classes on the root element.
- `data-row?` (`string`): The row's id (`Row.id`): how a view that left the transcript finds its place again (`useStickToBottom`'s `restorePosition`).
- `data-sel?` (`string`): Marks the row as part of the selected stop, so the select cursor can find it.
- `data-stop?` (`string`): The select-turn stop the row belongs to. Set only in select mode; makes the row a hover and click target.
- `eager` (`boolean`): Mounts the content at once instead of waiting for the row to approach. Used for the tail of the transcript.
- `estimatePx` (`number`): Height in pixels of the placeholder box before the content mounts.
- `style` (`CSSProperties`): Inline style for the row's wrapper, usually its content-visibility sizing.

Source: [ui/src/chat/transcript/LazyRow.tsx:244](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/LazyRow.tsx#L244)

### `LinkBadgeProps`

Interface.

Props for [`LinkBadge`](https://zidane.si/docs/reference/ui-chat-transcript.md#LinkBadge).

```ts
interface LinkBadgeProps
```

**Properties**

- `className?` (`string`): Extra classes on the link.
- `cwd?` (`string | null`): The chat's folder, for the badge menu.
- `style?` (`CSSProperties`): Inline style on the link.
- `url` (`string`): The address.

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

### `LinkIconProps`

Interface.

Props for [`LinkIcon`](https://zidane.si/docs/reference/ui-chat-transcript.md#LinkIcon).

```ts
interface LinkIconProps
```

**Properties**

- `href` (`string`): The link's address.

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

### `LiveOutputProps`

Interface.

Props for [`LiveOutput`](https://zidane.si/docs/reference/ui-chat-transcript.md#LiveOutput).

```ts
interface LiveOutputProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `label` (`string`): Accessible name of the log.
- `lines` (`readonly OutputLine[]`): The lines to show, oldest first.
- `window` (`number`): How many lines the window holds: at that count the box keeps its full height.

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

### `LoadEarlierRowProps`

Interface.

Props for [`LoadEarlierRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#LoadEarlierRow).

```ts
interface LoadEarlierRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the row.
- `onLoad` (`() => void`): Loads the next older page.
- `page` (`SessionPageState`): The session's page state: whether older pages exist, whether one is loading.
- `showIcon?` (`boolean`): Draw the rail's ring (the Row icons setting). Default true.
- `style?` (`CSSProperties`): Inline style on the row.

Source: [ui/src/chat/transcript/EarlierHistory.tsx:73](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/EarlierHistory.tsx#L73)

### `LoadFullOutputButtonProps`

Interface.

Props for [`LoadFullOutputButton`](https://zidane.si/docs/reference/ui-chat-transcript.md#LoadFullOutputButton).

```ts
interface LoadFullOutputButtonProps
```

**Properties**

- `className` (`string`): Extra class names for the button.
- `disabled` (`boolean`): Disables the button, for example when the call has no id to fetch by.
- `loading` (`boolean`): The full output is being fetched. Disables the button and changes its label.
- `onClick` (`() => void`): Called when the user asks for the full output.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/tool-parts.tsx:219](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L219)

### `MarkdownContextValue`

Interface.

Session-scoped facts prose chips need. `cwd` and `repoWebBase` are `null`
outside a session. `host`: the server a server session's files are on; its
file chips are inert (this machine's disk is not that server's), with a
tooltip saying so.

```ts
interface MarkdownContextValue
```

**Properties**

- `cwd` (`string | null`): The session's folder.
- `host?` (`string | null`): The server a server session's files are on.
- `open?` (`ChipOpener`): Opens a chip's path; resolves `false` when it couldn't (the chip dims), nothing when it handed off. Absent: file chips show without opening.
- `repoWebBase` (`string | null`): The repo's web address (`https://github.com/o/r`).

Source: [ui/src/chat/transcript/markdown-context.ts:23](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown-context.ts#L23)

### `MarkdownDiagramsProps`

Interface.

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

```ts
interface MarkdownDiagramsProps
```

**Properties**

- `children?` (`ReactNode`): The subtree it applies to.
- `enabled` (`boolean`): Draw \`\`\`mermaid fences as diagrams (`true`) or as code (`false`).

Source: [ui/src/chat/transcript/markdown.tsx:135](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown.tsx#L135)

### `MarkdownLinkProps`

Interface.

Props of a `MarkdownProps.Link`.

```ts
interface MarkdownLinkProps
```

**Properties**

- `children?` (`ReactNode`): The link's text.
- `href?` (`string`): The link's target, after `urlTransform`.
- `title?` (`string`): The link's title.

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

### `MarkdownProps`

Interface.

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

```ts
interface MarkdownProps extends MarkdownSlotProps
```

**Properties**

- `children` (`string`, from `MarkdownSlotProps`): The markdown source to render.
- `className?` (`string`, from `MarkdownSlotProps`): Extra class names for the rendered block.
- `CodeBlock?` (`ComponentType<CodeBlockSlotProps>`): Draws a fence. Default: [`HighlightedCode`](https://zidane.si/docs/reference/ui-code-highlighted-code.md#HighlightedCode).
- `document?` (`boolean`): A document (an instruction file) rather than a chat reply: headings keep
  their structure (as quiet bold lines) and bold / italic stay.
- `InlineCode?` (`ComponentType<{ text: string }>`): Draws inline code whose content is plain text. Default: a `<code>` on the code tone.
- `Link?` (`ComponentType<MarkdownLinkProps>`): Draws a link. Default: an accent link opening in a new tab.
- `remarkPlugins?` (`PluggableList | null`): Remark plugins, in place of the default `[remarkGfm]`. Keep the list's identity stable.
- `streaming?` (`boolean`, from `MarkdownSlotProps`): Still streaming: a renderer may re-parse only the tail.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `urlTransform?` (`UrlTransform`): Rewrites (or drops) every URL. Default: react-markdown's sanitising (http(s), mailto, tel).

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

### `MarkdownSlotProps`

Interface.

Props of the `Markdown` renderer slot.

```ts
interface MarkdownSlotProps
```

**Properties**

- `children` (`string`): The markdown source to render.
- `className?` (`string`): Extra class names for the rendered block.
- `streaming?` (`boolean`): Still streaming: a renderer may re-parse only the tail.

Source: [ui/src/chat/transcript/renderers.tsx:37](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L37)

### `MermaidDiagramProps`

Interface.

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

```ts
interface MermaidDiagramProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `code` (`string`): The Mermaid source, without the closing newline.
- `streaming?` (`boolean`): The source is still streaming: draw what parses so far, and wait for the rest.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `MessageGroupRowProps`

Interface.

Props for [`MessageGroupRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#MessageGroupRow).

```ts
interface MessageGroupRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `renderRows` (`(c: readonly Cluster[]) => ReactNode[]`): Renders clusters with the transcript's row components, for the messages.
- `row` (`Owned & { current: Row; id: string; kind: 'message-group'; live: boolean; messages: Row[] }`): The group: its earlier messages and the current one.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `ModelVerdictProps`

Interface.

Props for [`ModelVerdict`](https://zidane.si/docs/reference/ui-chat-transcript.md#ModelVerdict).

```ts
interface ModelVerdictProps
```

**Properties**

- `approval` (`ModelApproval`): The call's approval record: the choice, the deciding model and its confidence (`p`).
- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/tool-row.tsx:134](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-row.tsx#L134)

### `NestedToolCallsProps`

Interface.

Props for [`NestedToolCalls`](https://zidane.si/docs/reference/ui-chat-transcript.md#NestedToolCalls): the display props every nested `ToolRow` gets, plus the child calls.

```ts
interface NestedToolCallsProps extends Omit<ToolRowProps, 'tool' | 'className' | 'style'>
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `lineState?` (`LineState`, from `Omit`): The call's state, for its line to show: a light sweep over the name while
  it runs, a red cross once it failed. `TranscriptRow` sets it when the
  transcript draws no row icons (the `showRowIcons` option), where the icon
  would have said it. Absent: the line shows neither.
- `mode` (`'hidden' | 'full' | 'formatted'`, from `Omit`): How the call is shown. `hidden` drops the row unless it has a diff, `formatted` shows a one-line target with an input panel, and `full` shows the raw input.
- `showDiff` (`boolean`, from `Omit`): Shows the edit diff for edit tools, even when `mode` is `hidden`.
- `showResult` (`boolean`, from `Omit`): Shows the call's output panel when the row is open. When false the user can still reveal it on demand.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `tools` (`readonly (Owned & { approval?: ModelApproval; callId?: string; children?: readonly (Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; ... 12 more ...; children?: readonly (Owned & ...)[] | undefined; })[] | undefined; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } })[] | undefined`): The child calls, drawn recursively; empty or absent renders nothing.

Source: [ui/src/chat/transcript/tool-row.tsx:550](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-row.tsx#L550)

### `NoticeRowProps`

Interface.

Props for [`NoticeRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#NoticeRow).

```ts
interface NoticeRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `notice` (`{ label: string; severity: 'error' | 'warn' | 'info' }`): The structured notice: its severity and label.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): The notice's text: the headline on its first line, facts on the rest.

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

### `ParsedRef`

Interface.

A ref a `zg-ref:` link or inline code names.

```ts
interface ParsedRef
```

**Properties**

- `kind` (`'number' | 'sha'`): A number or a SHA.
- `value` (`string`): The number's digits, or the SHA.

Source: [ui/src/chat/transcript/remark-refs.ts:114](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-refs.ts#L114)

### `ParsedReferenceUrl`

Interface.

An extension reference a `zg-ref:ext:` link names.

```ts
interface ParsedReferenceUrl
```

**Properties**

- `href?` (`string`): The link's own URL, when a link was retargeted.
- `key` (`string`): The reference's key.
- `placeholder?` (`string`): The match's placeholder label (`ReferenceMatch.placeholder`).
- `placeholderIcon?` (`string`): The placeholder's GUI icon class.
- `providerId` (`string`): The reference's provider.

Source: [ui/src/chat/transcript/remark-references.ts:32](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-references.ts#L32)

### `PromptEchoProps`

Interface.

A submitted prompt as typed: its lines as the composer lays them out
(`PromptLines`, the bubble keeps whitespace),
with the composer's badges around its references (files, skills, links,
and a command invocation's `/name`), so a prompt reads the same sent as
typed. Badges are atomic inline boxes, so wrapping leaves them whole.
An app's transcript `Prompt` slot.

```ts
interface PromptEchoProps
```

**Properties**

- `command?` (`boolean`): A command invocation (`/fix conflicts now`): its command (`/fix conflicts`) is a badge.
- `refs?` (`readonly PromptSegmentRef[]`): What the composer marked in it (files, skills, links); inferred when absent.
- `text` (`string`): The prompt as sent.
- `useCommandArgs?` (`(name: string | null) => ReadonlySet<string>`): Reads a command's fixed arguments (`conflicts`), so `/fix conflicts` reads as one badge. A hook,
  called on every render: pass a stable one. Absent: the command name alone is the badge.

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

### `PromptLinesProps`

Interface.

Props for [`PromptLines`](https://zidane.si/docs/reference/ui-chat-transcript.md#PromptLines).

```ts
interface PromptLinesProps
```

**Properties**

- `items` (`readonly ReactNode[]`): The text and its inline badges, in order; a badge never spans a line break.

Source: [ui/src/chat/transcript/prompt-lines.tsx:4](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/prompt-lines.tsx#L4)

### `PromptSlotProps`

Interface.

Props of the `Prompt` renderer slot.

```ts
interface PromptSlotProps
```

**Properties**

- `command?` (`boolean`): A command invocation (`/fix conflicts now`).
- `refs?` (`readonly PromptSegmentRef[]`): The references the composer recorded (files, skills, links, a command).
- `text` (`string`): The prompt as sent; the bubble around it keeps its whitespace.

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

### `ProseMarkdownProps`

Interface.

Props for [`ProseMarkdown`](https://zidane.si/docs/reference/ui-chat-transcript.md#ProseMarkdown).

```ts
interface ProseMarkdownProps
```

**Properties**

- `children` (`string`): The Markdown.
- `className?` (`string`): Extra classes on the root.
- `document?` (`boolean`): A document (an instruction file) rather than a chat reply: headings keep
  their structure (as quiet bold lines) and bold / italic stay, so a long
  file can be scanned.
- `streaming?` (`boolean`): Still streaming: split finer so each delta re-parses only the tail.

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

### `ReadFileBlockProps`

Interface.

Props for [`ReadFileBlock`](https://zidane.si/docs/reference/ui-chat-transcript.md#ReadFileBlock).

```ts
interface ReadFileBlockProps
```

**Properties**

- `output` (`string`): The call's result text, with line numbers. They are stripped before display.
- `tool` (`Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }`): The `read_file` call. Its `path` input picks the language.

Source: [ui/src/chat/transcript/tool-parts.tsx:64](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L64)

### `RefChipProps`

Interface.

Props for [`RefChip`](https://zidane.si/docs/reference/ui-chat-transcript.md#RefChip).

```ts
interface RefChipProps
```

**Properties**

- `label` (`string`): What the chip says.
- `link?` (`string`): Where the text said it links.
- `parsed` (`ParsedRef`): The parsed reference.

Source: [ui/src/chat/transcript/FileChip.tsx:74](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/FileChip.tsx#L74)

### `ReferenceChipProps`

Interface.

Props for [`ReferenceChip`](https://zidane.si/docs/reference/ui-chat-transcript.md#ReferenceChip).

```ts
interface ReferenceChipProps
```

**Properties**

- `className?` (`string`): Badge chrome.
- `cwd` (`string | null | undefined`): The folder whose providers resolve the reference.
- `fallback?` (`ReactNode`): What shows while the reference is unknown or names nothing (default: `text`).
- `link?` (`boolean`): `false`: never a link (inside another control, a sidebar row's button). Default true.
- `placeholder?` (`string`): A label to paint before the view is known (the pattern's `placeholder`).
- `placeholderIcon?` (`ExtensionBadgeIcon`): The icon that placeholder shows (the pattern's `placeholderIcon`).
- `providerId` (`string`): The reference's provider.
- `refKey` (`string`): The reference's key.
- `text` (`string`): The matched text: shown until (or unless) the reference resolves.

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

### `ReferenceTextProps`

Interface.

Props for [`ReferenceText`](https://zidane.si/docs/reference/ui-chat-transcript.md#ReferenceText).

```ts
interface ReferenceTextProps
```

**Properties**

- `chipClassName?` (`string`): Badge chrome for each reference.
- `cwd` (`string | null | undefined`): The folder whose providers match it.
- `links?` (`boolean`): `false`: badges never link (see `ReferenceChip.link`).
- `surface` (`ExtensionReferenceSurface`): Where the text is (a prompt, a reply, a title): providers scan only their surfaces.
- `text` (`string`): The text to scan.

Source: [ui/src/chat/transcript/ReferenceText.tsx:158](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/ReferenceText.tsx#L158)

### `RefMatch`

Interface.

A `#123` or SHA found in plain text.

```ts
interface RefMatch
```

**Properties**

- `end` (`number`): Where it ends.
- `kind` (`'number' | 'sha'`): A number or a SHA.
- `start` (`number`): Where it starts in the text.
- `value` (`string`): The number's digits, or the SHA.

Source: [ui/src/chat/transcript/remark-refs.ts:57](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/remark-refs.ts#L57)

### `RowContext`

Interface.

What every row reads besides its own data: one memoized object per transcript.

```ts
interface RowContext
```

**Properties**

- `openSession` (`((id: string) => void) | undefined`): Opens another session by id, or `undefined` when the app cannot. Names stay plain text then.
- `resume` (`((prompt: string) => void) | undefined`): Sends a prompt as the user's next message, or `undefined` when the app cannot. Failure rows then offer no continue button.
- `sessionId` (`string | null`): Id of the session on screen, or `null`. The turn menu needs it.
- `settings` (`{ showEditDiffs: boolean; showFullShellOutput: boolean; showThinking: boolean; showToolAttachments: boolean; showToolResults: boolean; thinkingAutoExpand: boolean; toolCallDisplay: ToolCallDisplay }`): The display settings rows read: thinking, tool results, edit diffs, full shell output, and how tool calls are shown.
- `turnMenu` (`TranscriptTurnMenu | undefined`): The app's turn menu, or `undefined` when turns have none.

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

### `RowFrameProps`

Interface.

Props for [`RowFrame`](https://zidane.si/docs/reference/ui-chat-transcript.md#RowFrame).

```ts
interface RowFrameProps
```

**Properties**

- `children` (`ReactNode`): The row's dot and content.
- `className?` (`string`): Extra classes on the root element.
- `enter?` (`boolean`, default `true`): Fades the row in on mount. Pass `false` when the row was already on screen in another form.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/frame.tsx:91](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/frame.tsx#L91)

### `RowPlace`

Interface.

A row of a [`ScrollPosition`](https://zidane.si/docs/reference/ui-chat-transcript.md#ScrollPosition), and where it was on screen.

```ts
interface RowPlace
```

**Properties**

- `id` (`string`): The row's `data-row` id.
- `offset` (`number`): How far below the scroller's top edge the row started (px); negative once its top is scrolled past.

Source: [ui/src/chat/transcript/useStickToBottom.ts:52](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useStickToBottom.ts#L52)

### `RunnableCodeBlockProps`

Interface.

Props for [`RunnableCodeBlock`](https://zidane.si/docs/reference/ui-chat-transcript.md#RunnableCodeBlock).

```ts
interface RunnableCodeBlockProps extends CodeBlockSlotProps
```

**Properties**

- `actions?` (`(buttonClass: string) => ReactNode`, from `CodeBlockSlotProps`): Controls the frame shows beside its own (a shell block's Run button), as
  `HighlightedCodeProps.actions`. A replacement slot that drops them
  leaves the block without them.
- `code` (`string`, from `CodeBlockSlotProps`): The code to show, without the closing newline.
- `CodeBlock` (`ComponentType<CodeBlockSlotProps>`): Draws the block itself (the `CodeBlock` slot); it receives the run controls as `actions`.
- `language` (`string`, from `CodeBlockSlotProps`): A fence's language (`plaintext` when it names none).
- `scope` (`ShellBlockScope`): The reply the block is in.

Source: [ui/src/chat/transcript/shell-block-scope.ts:19](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/shell-block-scope.ts#L19)

### `RunReceiptInlineProps`

Interface.

Props for [`RunReceiptInline`](https://zidane.si/docs/reference/ui-chat-transcript.md#RunReceiptInline).

```ts
interface RunReceiptInlineProps
```

**Properties**

- `className?` (`string`): Extra class names for the receipt's root element.
- `receipt` (`RunReceipt`): The run's summary: model, time, round trips, cost, tokens, and speed.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/run-rows.tsx:118](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/run-rows.tsx#L118)

### `RunSummaryRowProps`

Interface.

Props for [`RunSummaryRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#RunSummaryRow).

```ts
interface RunSummaryRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `event` (`Owned & { id: string; kind: 'run-summary'; runSummary?: RunReceipt; text: string }`): The run's summary row: its receipt, or a plain line when it has none.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/run-rows.tsx:173](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/run-rows.tsx#L173)

### `SelectCursorProps`

Interface.

Props for [`SelectCursor`](https://zidane.si/docs/reference/ui-chat-transcript.md#SelectCursor).

```ts
interface SelectCursorProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `layout` (`unknown`): Any value that changes when rows reflow, such as the stops. A change re-measures the highlight.
- `selected` (`string | null`): Id of the selected stop, or `null` when select mode is off. Hides the highlight.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/SelectCursor.tsx:21](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/SelectCursor.tsx#L21)

### `SelectTurnCommands`

Interface.

The turn commands an app implements for the mode (open the details, copy, fork).

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

**Type parameters**

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

**Properties**

- `copy` (`(sessionId: K, turnId: string) => void`): Copies a turn.
- `fork` (`(sessionId: K, turnId: string) => void`): Forks the session from a turn.
- `open` (`(sessionId: K, turnId: string) => void`): Opens a turn's details.

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

### `SelectTurnHintKeysProps`

Interface.

Props for [`SelectTurnHintKeys`](https://zidane.si/docs/reference/ui-chat-transcript.md#SelectTurnHintKeys).

```ts
interface SelectTurnHintKeysProps
```

**Properties**

- `className?` (`string`): Extra classes on the row's content.
- `sessionId` (`string | null`): The session whose transcript the row is under: nothing shows unless the mode is on in it.
- `style?` (`CSSProperties`): Inline style on the row's content.

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

### `SelectTurnKeysOptions`

Interface.

Options for [`useSelectTurnKeys`](https://zidane.si/docs/reference/ui-chat-transcript.md#useSelectTurnKeys).

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

**Type parameters**

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

**Properties**

- `sessionId` (`K | null`): The session on show, or `null`.
- `blocked?` (`() => boolean`): Whether something else owns input now (a modal is open).
- `copy?` (`(sessionId: K, turnId: string) => Promise<boolean>`): Copies a turn; resolves whether there was something to copy. Absent: no copy.
- `fallbackStops?` (`(sessionId: K) => readonly string[]`): The session's stops before its Timeline has mounted (the transcript's selectable turns).
- `fork?` (`(sessionId: K, turnId: string, onCreated: () => void) => Promise<unknown>`): Forks from a turn, calling `onCreated` once the fork exists; rejects when it failed. Absent: no fork.
- `open` (`(sessionId: K, turnId: string) => void`): Opens a turn's details.

Source: [ui/src/chat/transcript/useSelectTurnKeys.ts:22](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useSelectTurnKeys.ts#L22)

### `SelectTurnProviderProps`

Interface.

Props for [`SelectTurnProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#SelectTurnProvider).

```ts
interface SelectTurnProviderProps
```

**Properties**

- `children` (`ReactNode`): The surfaces that read the mode.

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

### `SelectTurnState`

Interface.

The mode's cursor: the session that owns it and the selected stop.

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

**Type parameters**

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

**Properties**

- `sessionId` (`K`): Session that owns the cursor — only that session's Timeline shows the accent.
- `turnId` (`string | null`): Currently-selected stop id. `null` = mode active but no turn yet (transcript empty).

Source: [ui/src/chat/transcript/SelectTurnProvider.tsx:20](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/SelectTurnProvider.tsx#L20)

### `SelectTurnValue`

Interface.

What [`useSelectTurn`](https://zidane.si/docs/reference/ui-chat-transcript.md#useSelectTurn) returns: the mode's state and its actions.

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

**Type parameters**

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

**Properties**

- `notice` (`string | null`): A short confirmation shown in the mode's hint bar ("Copied"), cleared after a moment.
- `state` (`SelectTurnState<K> | null`): The cursor; `null` outside the mode.
- `enter` (`(sessionId: K, initialTurnId: string | null) => void`): Enters the mode in a session, on a stop (`null`: none yet).
- `exit` (`() => void`): Leaves the mode.
- `flash` (`(text: string) => void`): Shows a short notice in the hint row for a moment.
- `registerCommands` (`(commands: SelectTurnCommands<K>) => () => void`): The turn commands the host implements (App), callable from any surface (the hint bar).
- `registerStops` (`(sessionId: K, source: () => SelectStops | null) => () => void`): The Timeline's stops source for a session; returns the unregister function.
- `run` (`(command: keyof SelectTurnCommands<K>, sessionId: K, turnId: string) => void`): Runs a registered command on a turn.
- `set` (`(sessionId: K, turnId: string | null) => void`): Moves the cursor (ignored once the mode left that session).
- `stops` (`(sessionId: K) => SelectStops | null`): Current stops for a session, `null` before its Timeline has mounted.

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

### `SessionCardProps`

Interface.

Props for [`SessionCard`](https://zidane.si/docs/reference/ui-chat-transcript.md#SessionCard).

```ts
interface SessionCardProps
```

**Properties**

- `token` (`string`): The `#token` naming the chat.

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

### `SessionEventRowProps`

Interface.

Props for [`SessionEventRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#SessionEventRow).

```ts
interface SessionEventRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `event` (`Owned & { id: string; kind: 'session-event'; sessionEvent?: SessionEvent; text: string }`): The worker's report.
- `onOpenSession?` (`(sessionId: string) => void`): Opens the session the event names, by its id on the transcript's host.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/notices.tsx:253](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L253)

### `SessionTitleSlotProps`

Interface.

Props of the `SessionTitle` renderer slot.

```ts
interface SessionTitleSlotProps
```

**Properties**

- `fallback` (`string`): What to show until the app knows the session's title (the formatter's short id).
- `id` (`string`): The addressed session's id.
- `plain?` (`boolean`): Only the session's current title as text: no link, no directory. For a
  title inside a control that already opens the session (a report row).

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

### `ShellBlockProviderProps`

Interface.

Props for [`ShellBlockProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#ShellBlockProvider).

```ts
interface ShellBlockProviderProps
```

**Properties**

- `children` (`ReactNode`): The reply.
- `sessionId` (`string`): The session the reply is in.
- `turnId` (`string`): The reply's turn.

Source: [ui/src/chat/transcript/shell-block.tsx:44](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/shell-block.tsx#L44)

### `ShellBlockScope`

Interface.

The reply a block is in.

```ts
interface ShellBlockScope
```

**Properties**

- `sessionId` (`string`): The session.
- `turnId` (`string`): The reply's turn.

Source: [ui/src/chat/transcript/shell-block-scope.ts:11](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/shell-block-scope.ts#L11)

### `SkillCardProps`

Interface.

Props for [`SkillCard`](https://zidane.si/docs/reference/ui-chat-transcript.md#SkillCard).

```ts
interface SkillCardProps
```

**Properties**

- `cwd` (`string | null`): The folder whose skills are read.
- `text` (`string`): The chip's text (`/review`, `$review`).

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

### `SlotEntry`

Interface.

A cached root row element and the inputs it was built from. The transcript reuses the element while the inputs are unchanged.

```ts
interface SlotEntry
```

**Properties**

- `deps` (`unknown[]`): The inputs the element was built from. The element is reused while they are unchanged.
- `element` (`ReactElement`): The cached row element.

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

### `SpawnEndRowProps`

Interface.

Props for [`SpawnEndRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#SpawnEndRow).

```ts
interface SpawnEndRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `row` (`Owned & { id: string; kind: 'spawn-end'; model?: string; spawn?: { callId?: string; end?: SpawnEndInfo; parentChildId?: string; prompt?: string; resumes?: string; startedAt: number; task?: string; turns?: number }; text: string }`): The worker's end marker.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/notices.tsx:469](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L469)

### `SpawnStartRowProps`

Interface.

Props for [`SpawnStartRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#SpawnStartRow).

```ts
interface SpawnStartRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `row` (`Owned & { id: string; kind: 'spawn-start'; model?: string; spawn?: { callId?: string; end?: SpawnEndInfo; parentChildId?: string; prompt?: string; resumes?: string; startedAt: number; task?: string; turns?: number }; text: string }`): The worker's start marker.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/notices.tsx:459](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/notices.tsx#L459)

### `StickToBottomOptions`

Interface.

Options of [`useStickToBottom`](https://zidane.si/docs/reference/ui-chat-transcript.md#useStickToBottom).

```ts
interface StickToBottomOptions
```

**Properties**

- `paused?` (`boolean`): Holds every correction (a drag-select in progress). Default: false.
- `rowSelector?` (`string`): The rows the view anchors on. Default: the transcript's top-level rows, `.zg-cv-row`.

Source: [ui/src/chat/transcript/useStickToBottom.ts:190](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useStickToBottom.ts#L190)

### `SubagentBlockProps`

Interface.

Props for [`SubagentBlock`](https://zidane.si/docs/reference/ui-chat-transcript.md#SubagentBlock).

```ts
interface SubagentBlockProps
```

**Properties**

- `childId` (`string`): Id of the worker session. Shown as a tooltip on the header.
- `children` (`ReactNode`): The block's body, drawn when it is open.
- `className?` (`string`): Extra classes on the root element.
- `data-row?` (`string`): The block's id among the transcript's rows: how a view that left the transcript finds its place again (`useStickToBottom`'s `restorePosition`).
- `defaultCollapsed` (`boolean`): Starts the block collapsed. Only the initial state: a manual toggle wins afterwards.
- `depth` (`number`): Nesting level of the worker: 1 for a direct subagent.
- `parentDepth?` (`number`): Depth of the spawner's block this one is nested in; absent at the transcript root.
- `rows` (`readonly Row[]`): The worker's own rows. The header reads its task, status, duration, and turn count from them.
- `sessionId?` (`string`): The transcript's session: while the worker runs, its time estimate shows in the header (`RunEstimatesProvider`).
- `streaming` (`boolean`): The worker is still running. Decides the header dot when no outcome is recorded.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `TextPreviewSlotProps`

Interface.

Props of the `TextPreview` renderer slot: a text attachment opened in the lightbox.

```ts
interface TextPreviewSlotProps
```

**Properties**

- `mediaType` (`string`): Its MIME type, for example `text/markdown`.
- `name` (`string`): The file name.
- `size` (`number`): Its size in bytes.
- `src` (`string`): Where the text is: a `data:` URL, or any URL the page can fetch.

Source: [ui/src/chat/transcript/renderers.tsx:96](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L96)

### `TextRowProps`

Interface.

Props for [`TextRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#TextRow).

```ts
interface TextRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `streaming` (`boolean`): The reply is still arriving.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): The reply, as markdown.

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

### `ThinkingBatchRowProps`

Interface.

Props for [`ThinkingBatchRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#ThinkingBatchRow).

```ts
interface ThinkingBatchRowProps
```

**Properties**

- `autoExpand?` (`boolean`): Passed to each thought: a live one opens on its own once the group is open.
- `className?` (`string`): Extra classes on the root element.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `thoughts` (`readonly (Owned & { id: string; kind: 'thinking'; live?: boolean; text: string; thinkingMs?: number })[]`): The chained thoughts, in order.
- `totalMs?` (`number`): Their summed time, when at least one carried timing.

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

### `ThinkingRowProps`

Interface.

Props for [`ThinkingRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#ThinkingRow).

```ts
interface ThinkingRowProps
```

**Properties**

- `autoExpand?` (`boolean`): A live thought opens on its own (`Settings.thinkingAutoExpand`).
- `className?` (`string`): Extra classes on the root element.
- `live?` (`boolean`): The thought is still streaming.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `text` (`string`): The thought's text, as markdown.
- `thinkingMs?` (`number`): How long the thought took, stamped when a live segment ends.

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

### `ToolBatchRowProps`

Interface.

Props for [`ToolBatchRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#ToolBatchRow).

```ts
interface ToolBatchRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `id` (`string`): The batch's id (its first tool's row id): keys its open state.
- `lineState?` (`LineState`): The batch's worst state, for its header line to show when the transcript draws no row icons (`ToolRowProps.lineState`).
- `mode` (`'hidden' | 'full' | 'formatted'`): How each call's input shows (`Settings.toolCallDisplay`).
- `showDiff` (`boolean`): Each edit shows its diff.
- `showResult` (`boolean`): Each call shows its result.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `summary` (`string`): The header's one-line summary of the calls.
- `tools` (`readonly (Owned & { approval?: ModelApproval; callId?: string; children?: readonly (Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; })[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } })[]`): The batched tool calls, in order.

Source: [ui/src/chat/transcript/tool-batch.tsx:14](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-batch.tsx#L14)

### `ToolBodySlotProps`

Interface.

Props of the `ToolBody` renderer slot.

```ts
interface ToolBodySlotProps
```

**Properties**

- `tool` (`Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }`): The tool call whose body to draw.

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

### `ToolDetailsProps`

Interface.

Props for [`ToolDetails`](https://zidane.si/docs/reference/ui-chat-transcript.md#ToolDetails).

```ts
interface ToolDetailsProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element (not passed to an app's `ToolBody`).
- `style?` (`CSSProperties`): Inline styles on the root element (not passed to an app's `ToolBody`).
- `tool` (`Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }`): The tool call whose payload to show.

Source: [ui/src/chat/transcript/tool-details.tsx:13](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-details.tsx#L13)

### `ToolGlyphProps`

Interface.

Props for [`ToolGlyph`](https://zidane.si/docs/reference/ui-chat-transcript.md#ToolGlyph).

```ts
interface ToolGlyphProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `name` (`string`): The tool's name.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/tool-parts.tsx:357](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L357)

### `ToolInputProps`

Interface.

Props for [`ToolInput`](https://zidane.si/docs/reference/ui-chat-transcript.md#ToolInput).

```ts
interface ToolInputProps
```

**Properties**

- `finished?` (`boolean`): The call ended (`ok` tells how): a Codemode script stops showing its live output.
- `input` (`Record<string, unknown>`): The tool call's raw input, shown as JSON when no script is extracted.
- `name` (`string`): The tool's name. Some tools (Codemode) show their script instead of JSON.
- `ok?` (`boolean`): The call ended without error.
- `output?` (`ReactNode`): A Codemode script's output, shown in the box its live lines were in once it ends.
- `result?` (`string | null`): The call's result text: a failed Codemode script's names the line it threw at.
- `scriptProgress?` (`ScriptProgress`): A Codemode script's live progress (`ToolRowModel.scriptProgress`): its lines show their state.

Source: [ui/src/chat/transcript/tool-parts.tsx:20](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L20)

### `ToolMediaProps`

Interface.

Props for [`ToolMedia`](https://zidane.si/docs/reference/ui-chat-transcript.md#ToolMedia).

```ts
interface ToolMediaProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `media` (`readonly ToolMediaItem[]`): The media items the tool result carries, in order.
- `name?` (`string`): What the images are of (the file read), for their names in the lightbox.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `url` (`(index: number) => string`): Returns the address of the item at an index.

Source: [ui/src/chat/transcript/tool-media.tsx:42](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-media.tsx#L42)

### `ToolRowProps`

Interface.

Props for [`ToolRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#ToolRow).

```ts
interface ToolRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `lineState?` (`LineState`): The call's state, for its line to show: a light sweep over the name while
  it runs, a red cross once it failed. `TranscriptRow` sets it when the
  transcript draws no row icons (the `showRowIcons` option), where the icon
  would have said it. Absent: the line shows neither.
- `mode` (`'hidden' | 'full' | 'formatted'`): How the call is shown. `hidden` drops the row unless it has a diff, `formatted` shows a one-line target with an input panel, and `full` shows the raw input.
- `showDiff` (`boolean`): Shows the edit diff for edit tools, even when `mode` is `hidden`.
- `showResult` (`boolean`): Shows the call's output panel when the row is open. When false the user can still reveal it on demand.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.
- `tool` (`Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }`): The tool call to render.

Source: [ui/src/chat/transcript/tool-row.tsx:36](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-row.tsx#L36)

### `ToolTimingProps`

Interface.

Props for [`ToolTiming`](https://zidane.si/docs/reference/ui-chat-transcript.md#ToolTiming).

```ts
interface ToolTimingProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `durationMs?` (`number`): Final duration in milliseconds. Shown once the call is no longer `running`.
- `running?` (`boolean`, default `false`): The call is still running. Shows live elapsed time instead of the final duration.
- `startedAt?` (`number`): Epoch milliseconds the call started. While `running`, the elapsed time counts up from it.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/tool-parts.tsx:253](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/tool-parts.tsx#L253)

### `TranscriptAccounts`

Interface.

The accounts of the host that holds a session's credentials, for the card
a run stopped by a failed sign-in shows (`AuthFailureCard`). Each member is
optional, and the card's button that needs it hides without it.

```ts
interface TranscriptAccounts
```

**Properties**

- `cwd` (`string`): The session's folder, whose extension providers count (`''`: built-ins only).
- `mcp?` (`Pick<SettingsMcpHost, 'signIn'>`): Its MCP servers: Sign in again on a server whose sign-in ended the run.
- `providers?` (`SettingsProvidersHost`): Its providers: their labels and accounts, Sign in again (`signIn`), Use another account (`setPreferred`).
- `openSettings?` (`(target: AuthSettingsTarget) => void`): Opens Settings on that provider's account (or that MCP server).

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

### `TranscriptActions`

Interface.

What a transcript row can ask of the app that hosts it. Every action but `sessionId` is optional, and its control is hidden when the app leaves it out.

```ts
interface TranscriptActions
```

**Properties**

- `accounts?` (`TranscriptAccounts`): The accounts a run that stopped on a failed sign-in can be fixed with,
  in place. Without it, the card offers only Retry and Copy details.
- `modelName?` (`ModelNamer`): Names a model as the app's model picker does (`Opus 4.5`), from its
  catalogs. Without it, rows name a model from its id alone.
- `sessionId` (`string | null`): The session on screen; actions that address a call need it.
- `cancelTool?` (`(callId: string) => void`): Stops a running call (`ChatHost.cancelTool`).
- `openFile?` (`(path: string, event?: { ctrlKey?: boolean; metaKey?: boolean }) => void`): Opens a file the session wrote, by its path relative to the session's
  folder (a `generate_image` result). Without it the path is plain text.
- `openSession?` (`(sessionId: string) => void`): Shows another session, named by its id (a worker a tool call addresses).
- `resume?` (`(prompt: string) => void`): Sends a prompt as the user's next message.
- `runInTerminal?` (`(input: string) => void`): Opens a new terminal in the session's folder and types `input` into it
  (a reply's shell block, `blockTerminalInput`). Without it, blocks offer
  no Run in a terminal.
- `toolMediaUrl?` (`(callId: string, index: number) => string`): The address of a tool result's `index`-th image, video or audio block
  (its order among the result's media). With it, results show their media
  inline instead of `[image: …]` stand-ins.
- `toolOutput?` (`(callId: string, turnId?: string) => Promise<string | null>`): The whole text of a tool result that was clipped for transport (`ChatHost.toolOutput`). `turnId`: the call's turn, a hint where to look first.

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

### `TranscriptActionsProviderProps`

Interface.

Props for [`TranscriptActionsProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptActionsProvider).

```ts
interface TranscriptActionsProviderProps
```

**Properties**

- `children` (`ReactNode`): The transcript that reads the actions.
- `value` (`TranscriptActions`): The actions to provide. Memoize it: every row reading the context re-renders when it changes.

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

### `TranscriptFind`

Interface.

What [`useTranscriptFind`](https://zidane.si/docs/reference/ui-chat-transcript.md#useTranscriptFind) returns: hand `open`, `query` and `close` to your `TranscriptSearch`.

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

**Type parameters**

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

**Properties**

- `open` (`boolean`): Open on the session on show.
- `query` (`string | undefined`): The query it opened with.
- `close` (`() => void`): Closes it.
- `findIn` (`(target: TranscriptFindTarget<K>) => void`): Opens it on a session with a query (a palette match), even one being switched to.

Source: [ui/src/chat/transcript/useTranscriptFind.ts:29](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useTranscriptFind.ts#L29)

### `TranscriptFindKeyOptions`

Interface.

Options for [`useTranscriptFindKey`](https://zidane.si/docs/reference/ui-chat-transcript.md#useTranscriptFindKey).

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

**Type parameters**

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

**Properties**

- `sessionId` (`K | null`): The session on show, or `null` (only the tab scopes find then).
- `blocked?` (`() => boolean`): Whether something else owns input now (a modal is open).
- `onFind` (`(sessionId: K) => void`): Opens the find on a session's conversation.

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

### `TranscriptFindOptions`

Interface.

Options for [`useTranscriptFind`](https://zidane.si/docs/reference/ui-chat-transcript.md#useTranscriptFind).

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

**Type parameters**

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

**Properties**

- `sessionId` (`K | null`): The session on show, or `null`.
- `blocked?` (`() => boolean`): Whether something else owns input now (a modal is open): ⌘F does nothing.

Source: [ui/src/chat/transcript/useTranscriptFind.ts:21](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useTranscriptFind.ts#L21)

### `TranscriptFindTarget`

Interface.

Where the find is open, and with what.

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

**Type parameters**

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

**Properties**

- `query` (`string`): The text it searches for (empty from ⌘F).
- `sessionId` (`K`): The session whose conversation it searches.

Source: [ui/src/chat/transcript/useTranscriptFind.ts:13](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useTranscriptFind.ts#L13)

### `TranscriptRenderers`

Interface.

The set of renderer slots a transcript draws through. Each is a component or function an app can replace with [`TranscriptRenderersProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptRenderersProvider).

```ts
interface TranscriptRenderers
```

**Properties**

- `attachmentLabel` (`(name: string) => AttachmentLabelParts`): Returns the icon and name to show for a prompt's file attachment, given its file name.
- `CodeBlock` (`ComponentType<CodeBlockSlotProps>`): Renders a fenced block, a tool's input, or a file a tool read.
- `hasToolBody?` (`(tool: Owned & { approval?: ModelApproval; callId?: string; children?: readonly Owned & { kind: "tool"; id: string; name: string; displayName: string; formatted: ToolFormatLine | null; rawInput?: Record<string, unknown> | undefined; edit?: EditPayload | undefined; ... 11 more ...; children?: readonly (Owned & ...)[] | undefined; }[]; displayName: string; durationMs?: number; edit?: EditPayload; formatted: ToolFormatLine | null; id: string; kind: 'tool'; name: string; ok: boolean | null; parentId?: string; rawInput?: Record<string, unknown>; result: string | null; resultClipped?: boolean; resuming?: true; scriptProgress?: ScriptProgress; startedAt?: number; waitingFor?: { active: number; max: number } }) => boolean`): Tells whether `ToolBody` draws this tool call. Used together with `ToolBody`.
- `InlineText` (`ComponentType<InlineTextSlotProps>`): Renders a one-line receipt that may name files, commits, or links.
- `Markdown` (`ComponentType<MarkdownSlotProps>`): Renders markdown: a reply, a command's detail, or a compaction summary.
- `Prompt` (`ComponentType<PromptSlotProps>`): Renders a sent prompt's text inside its bubble.
- `SessionTitle` (`ComponentType<SessionTitleSlotProps>`): Renders the session a tool call addresses, as a link.
- `TextPreview?` (`ComponentType<TextPreviewSlotProps>`): Renders a text attachment in the lightbox; the kit's plain preview when absent.
- `ToolBody?` (`ComponentType<ToolBodySlotProps>`): Drawn for the calls `hasToolBody` accepts; without both, every call shows its input and output.

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

### `TranscriptRenderersProviderProps`

Interface.

Props for [`TranscriptRenderersProvider`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptRenderersProvider).

```ts
interface TranscriptRenderersProviderProps
```

**Properties**

- `children` (`ReactNode`): The transcript that reads the renderers.
- `value` (`Partial<TranscriptRenderers>`): The slots to replace. Slots left out keep the enclosing provider's renderer, or the default.

Source: [ui/src/chat/transcript/renderer-slots.tsx:14](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderer-slots.tsx#L14)

### `TranscriptRowProps`

Interface.

Props for [`TranscriptRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptRow).

```ts
interface TranscriptRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `ctx` (`RowContext`): The shared [`RowContext`](https://zidane.si/docs/reference/ui-chat-transcript.md#RowContext) of the transcript.
- `receipt` (`RunReceipt | undefined`): The run receipt docked under this row, if any.
- `renderRows?` (`(list: readonly Cluster[]) => ReactNode[]`): Renders nested clusters, for rows that hold other rows such as folds and message groups.
- `resumable` (`boolean`): This is the transcript's last row, so a failed run can offer a button to continue or retry.
- `row` (`Row`): The row to render. Its `kind` picks the component.
- `showCaret` (`boolean`): Shows the streaming caret on this reply, which is the last one still arriving.
- `status?` (`LiveRunStatus`): The live run's status, which the transcript's live fold names in its header. Absent on every other row.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `TranscriptRows`

Interface.

The rows a `Transcript` paints and what it derives from them.

```ts
interface TranscriptRows
```

**Properties**

- `clusters` (`readonly Cluster[]`): `visibleRows` grouped into subagent blocks (`clusterByOwner`).
- `lastStreamingRow` (`Row | null | undefined`): The reply still streaming: the only row with a caret.
- `receiptByRowId` (`ReadonlyMap<string, RunReceipt>`): Run receipts docked under their reply, by the reply row's id.
- `resumableId` (`string | null`): The failure row that offers to pick the work back up (the transcript's last word, once idle).
- `visibleRows` (`readonly Row[]`): The rows after every pass, in paint order.

Source: [ui/src/chat/transcript/use-transcript-rows.ts:48](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/use-transcript-rows.ts#L48)

### `TranscriptRowsInput`

Interface.

The display options that shape the rows.

```ts
interface TranscriptRowsInput
```

**Properties**

- `codemodeShowCalls` (`boolean`): Show the calls a codemode script makes (those running a subagent always show).
- `compact` (`boolean`): Compact density: fold each exchange's work behind one row.
- `groupToolCalls` (`boolean`): Batch tool rows across the whole exchange, not only adjacent ones.
- `showCacheNotices` (`boolean`): Show cache notices (cache expired / break, dropped reasoning).
- `showEditDiffs` (`boolean`): Show edit diffs on edit tool rows.
- `showRunReceipt` (`boolean`): Dock run receipts under their reply; off hides them.

Source: [ui/src/chat/transcript/use-transcript-rows.ts:32](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/use-transcript-rows.ts#L32)

### `TranscriptRowSlotProps`

Interface.

Props for [`TranscriptRowSlot`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptRowSlot): the [`TranscriptRowProps`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptRowProps) of its row, plus its lazy wrapper's.

```ts
interface TranscriptRowSlotProps extends Omit<TranscriptRowProps, 'className' | 'style'>
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `ctx` (`RowContext`, from `Omit`): The shared [`RowContext`](https://zidane.si/docs/reference/ui-chat-transcript.md#RowContext) of the transcript.
- `eager` (`boolean`): Mounts the row at once instead of waiting for it to approach (the transcript's tail).
- `estimatePx` (`number`): Height in pixels of the placeholder box before the row mounts.
- `receipt` (`RunReceipt | undefined`, from `Omit`): The run receipt docked under this row, if any.
- `renderRows?` (`(list: readonly Cluster[]) => ReactNode[]`, from `Omit`): Renders nested clusters, for rows that hold other rows such as folds and message groups.
- `resumable` (`boolean`, from `Omit`): This is the transcript's last row, so a failed run can offer a button to continue or retry.
- `row` (`Row`, from `Omit`): The row to render. Its `kind` picks the component.
- `sel` (`string | undefined`): Marks the row as part of the selected stop.
- `showCaret` (`boolean`, from `Omit`): Shows the streaming caret on this reply, which is the last one still arriving.
- `status?` (`LiveRunStatus`, from `Omit`): The live run's status, which the transcript's live fold names in its header. Absent on every other row.
- `stop` (`string | undefined`): The select-turn stop the row belongs to; set only in select mode.
- `style` (`CSSProperties`): Inline style for the row's wrapper, usually its content-visibility sizing.

Source: [ui/src/chat/transcript/TranscriptRow.tsx:147](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/TranscriptRow.tsx#L147)

### `TranscriptScrollInputs`

Interface.

What [`useTranscriptScroll`](https://zidane.si/docs/reference/ui-chat-transcript.md#useTranscriptScroll) reads from its container.

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

**Type parameters**

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

**Properties**

- `keepPosition` (`boolean`): Reopen a conversation where it was left (Keep scroll position).
- `loadEarlier` (`(sessionId: K, opts?: { onSettled?: (prepended: boolean) => void }) => boolean`): Loads the session's previous page; `false` when nothing went out.
- `page` (`SessionPageState`): The session's page state (`hasMore`, `loadingEarlier`, `firstSeq`).
- `selecting` (`boolean`): Select-turn mode drives this session's view: stick-to-bottom is paused, and resumes on exit if it was on.

Source: [ui/src/chat/transcript/useTranscriptScroll.ts:18](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useTranscriptScroll.ts#L18)

### `TranscriptSearchOptions`

Interface.

Opt-ins of a search opened from a palette match (see the module comment).

```ts
interface TranscriptSearchOptions
```

**Properties**

- `revealFirstMatch?` (`boolean`): Until a first match appears, rescans keep looking and jump to it when
  it does: the search opened with the conversation, whose transcript is
  still loading. Disarmed by that jump or by the query changing.
- `terms?` (`(query: string) => readonly string[]`): Match every term the tokenizer splits the query into (words, quoted
  phrases whole) instead of the query as one phrase. The app's content
  search tokenizer, so its matches are the ones highlighted.

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

### `TranscriptSearchProps`

Interface.

Props for [`TranscriptSearch`](https://zidane.si/docs/reference/ui-chat-transcript.md#TranscriptSearch).

```ts
interface TranscriptSearchProps
```

**Properties**

- `className?` (`string`): Extra classes on the overlay.
- `container` (`RefObject<HTMLElement | null>`): The transcript's scroll container — the walk + jump targets live inside it.
- `initialQuery?` (`string`): The query to open on: a palette match's.
- `onClose` (`() => void`): Closes the search.
- `revision` (`unknown`): Changes identity when the transcript re-renders (its events): matches track streaming updates.
- `style?` (`CSSProperties`): Inline style on the overlay.
- `terms?` (`(query: string) => readonly string[]`): Splits the opening query into the terms its content search matched (see `TranscriptSearchOptions.terms`).

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

### `TranscriptSearchState`

Interface.

What [`useTranscriptSearch`](https://zidane.si/docs/reference/ui-chat-transcript.md#useTranscriptSearch) returns: the match count and cursor, and the hop.

```ts
interface TranscriptSearchState
```

**Properties**

- `activeIndex` (`number`): Zero-based cursor into the match list.
- `capped` (`boolean`): True when the cap was hit — render the counter as "500+".
- `count` (`number`): Total matches found (capped at `MAX_MATCHES`).
- `goTo` (`(direction: -1 | 1) => void`): Hop to the next (+1) / previous (-1) match, wrapping.
- `hasNeedle` (`boolean`): Debounced needle is non-empty — gates the counter's visibility.

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

### `TranscriptTurnMenu`

Interface.

A turn's actions on its prompt bubble and settled replies (the app's turn menu).

```ts
interface TranscriptTurnMenu
```

**Properties**

- `onContextMenu` (`(event: MouseEvent<HTMLElement>, target: TurnMenuTarget) => void`): Right-click on a turn's bubble or reply.
- `prefetch?` (`(turnId: string) => void`): The pointer entered a turn's bubble or reply: warm what the menu will show.

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

### `TurnCommands`

Interface.

What [`createTurnCommands`](https://zidane.si/docs/reference/ui-chat-transcript.md#createTurnCommands) returns.

```ts
interface TurnCommands
```

**Properties**

- `copyTurn` (`(sessionId: string, turnId: string, fallback?: string) => Promise<boolean>`): Copies the turn. `false` when there was nothing to copy or the write failed.
- `editPrompt?` (`(sessionId: string, turnId: string, events: readonly ChatEvent[], fallbackText?: string) => Promise<void>`): Cuts the history just before the prompt and puts its text and attachments back in the session's
  composer. Rejects, keeping the history, when that composer is not open. Absent: the host cannot rewind.
- `rewindToTurn?` (`(sessionId: string, turnId: string) => Promise<void>`): Keeps the history up to and including the turn. Absent: the host cannot rewind.
- `turnText` (`(sessionId: string, turnId: string, fallback?: string) => Promise<string>`): The turn's text as the transcript copies it, `fallback` when it cannot be loaded.

Source: [ui/src/chat/transcript/turn-commands.ts:18](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/turn-commands.ts#L18)

### `TurnCommandsOptions`

Interface.

Options of [`createTurnCommands`](https://zidane.si/docs/reference/ui-chat-transcript.md#createTurnCommands).

```ts
interface TurnCommandsOptions
```

**Properties**

- `labels?` (`Pick<{ findInConversation: string; findInConversationClose: string; selectTurnCopied: string; selectTurnCopy: string; selectTurnDetails: string; selectTurnExit: string; selectTurnFork: string; selectTurnForkFailed: string; selectTurnMove: string; selectTurnNothingToCopy: string; selectTurnSelecting: string; turnMenuCopy: string; turnMenuCopySelection: string; turnMenuCopySelectionFailed: string; turnMenuDelete: string; turnMenuEdit: string; turnMenuEditNeedsComposer: string; turnMenuFork: string; turnMenuRewind: string; turnMenuSent: (age: string) => string; turnMenuStopFirst: (label: string) => string }, 'turnMenuEditNeedsComposer'>`): The edit's refusal when the composer is gone.
- `writeText?` (`(text: string) => Promise<void>`): Writes the clipboard. Default: `navigator.clipboard.writeText`.

Source: [ui/src/chat/transcript/turn-commands.ts:33](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/turn-commands.ts#L33)

### `TurnMenuActions`

Interface.

What the turn menu's items do, for one transcript. Memoize it: the items rebuild when it changes.

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

**Type parameters**

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

**Properties**

- `running` (`boolean`): A run is in progress: history edits are refused (the item says to stop it first).
- `copy` (`(sessionId: K, turnId: string, fallback: string) => Promise<unknown>`): Copies a turn's text (`fallback`: the row's own text).
- `deleteTurn?` (`(sessionId: K, turnId: string) => Promise<void>`): Deletes a turn. Absent: no Delete item.
- `editPrompt?` (`(sessionId: K, turnId: string, fallback: string) => Promise<void>`): Puts a prompt back in the composer and cuts history before it. Absent: no Edit item.
- `errorMessage` (`(error: unknown) => string`): The sentence for a failure (the host's refusals are written for the user).
- `fork?` (`(sessionId: K, turnId: string) => Promise<void>`): Forks the session from a turn and shows the fork. Absent: no Fork item.
- `reload` (`(sessionId: K) => Promise<void>`): Reloads the session's events after a history edit, so cut rows drop out at once.
- `rewind?` (`(sessionId: K, turnId: string) => Promise<void>`): Cuts history after a reply. Absent: no Rewind item.
- `sentAt?` (`(sessionId: K, turnId: string) => Promise<number | null>`): A stored turn's send time; `null` when not stored yet. Absent: no "Sent …" line.
- `showError` (`(sessionId: K, message: string) => void`): Shows a failed action where the user acted (an error row in the transcript).

Source: [ui/src/chat/transcript/TurnMenu.tsx:20](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/TurnMenu.tsx#L20)

### `TurnMenuTarget`

Interface.

What a turn-menu right-click landed on.

```ts
interface TurnMenuTarget
```

**Properties**

- `kind` (`'prompt' | 'reply'`): The user's prompt bubble (editable) or a settled reply (rewindable to).
- `text` (`string`): The row's text: what Copy falls back to before the turn loads.
- `turnId` (`string`): Id of the turn the row belongs to.

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

### `UserBashRowProps`

Interface.

Props for [`UserBashRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#UserBashRow).

```ts
interface UserBashRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `lineState?` (`LineState`): The command's state when the transcript draws no row icons: `running`
  sweeps over the command. A failure needs nothing, its badge says it.
- `row` (`Owned & { callId?: string; command: string; errored?: boolean; exit: BashExitMeta | null; id: string; kind: 'user-bash'; result: string | null; resultClipped?: boolean; running: boolean }`): The `!` shell run: its command, state, exit and output.
- `showFull` (`boolean`): Shows the whole output instead of its last lines (the app's "full shell output" setting).
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/user-bash.tsx:24](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/user-bash.tsx#L24)

### `UserPromptAttachmentsProps`

Interface.

Props for [`UserPromptAttachments`](https://zidane.si/docs/reference/ui-chat-transcript.md#UserPromptAttachments).

```ts
interface UserPromptAttachmentsProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `items` (`readonly ChatAttachment[]`): The attachments sent with the prompt. Images with a `dataUrl` show as thumbnails, the rest as chips; a PDF's or a text file's chip with a `dataUrl` opens it.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `UserPromptRowProps`

Interface.

Props for [`UserPromptRow`](https://zidane.si/docs/reference/ui-chat-transcript.md#UserPromptRow).

```ts
interface UserPromptRowProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `onBubbleContextMenu?` (`(event: MouseEvent<HTMLDivElement>) => void`): Called on right-click in the prompt bubble. The desktop app opens the turn's actions here.
- `onBubblePointerEnter?` (`() => void`): Called when the pointer enters the prompt bubble.
- `row` (`Owned & { attachments?: readonly ChatAttachment[]; id: string; kind: 'user-prompt'; origin?: PromptOrigin; refs?: readonly PromptSegmentRef[]; synthetic?: true; text: string }`): The `user-prompt` row to render: its text, mention refs, attachments, and whether the user typed it.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

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

### `WorkerDetailsProps`

Interface.

Props for [`WorkerDetails`](https://zidane.si/docs/reference/ui-chat-transcript.md#WorkerDetails).

```ts
interface WorkerDetailsProps
```

**Properties**

- `className?` (`string`): Extra classes on the root element.
- `item` (`FoldActionItem`): The fold step for the worker. Its `workerRows` hold the worker's lifecycle markers and output.
- `renderRows` (`(c: readonly Cluster[]) => ReactNode[]`): Renders the worker's folded clusters with the transcript's row components.
- `style?` (`CSSProperties`): Inline styles on the root element, merged after the component's own.

Source: [ui/src/chat/transcript/fold-worker.tsx:17](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/fold-worker.tsx#L17)

## Types

### `ChipOpener`

Type.

How a file chip opens what it names: a file at `at` (1-based) when the text gave a line (`schema.ts:258`).

```ts
type ChipOpener = (path: string, kind: 'file' | 'dir', event?: { ctrlKey?: boolean; metaKey?: boolean }, at?: { column?: number; line: number }) => Promise<boolean | void>
```

Source: [ui/src/chat/transcript/markdown-context.ts:10](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/markdown-context.ts#L10)

### `ComposerSearch`

Type.

What [`useComposerSearch`](https://zidane.si/docs/reference/ui-chat-transcript.md#useComposerSearch) returns.

```ts
type ComposerSearch = ReturnType<typeof useComposerSearch>
```

Source: [ui/src/chat/transcript/useComposerSearch.ts:22](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useComposerSearch.ts#L22)

### `DefaultInlineTextProps`

Type.

Props for [`DefaultInlineText`](https://zidane.si/docs/reference/ui-chat-transcript.md#DefaultInlineText): the [`InlineTextSlotProps`](https://zidane.si/docs/reference/ui-chat-transcript.md#InlineTextSlotProps).

```ts
type DefaultInlineTextProps = InlineTextSlotProps
```

Source: [ui/src/chat/transcript/renderers.tsx:144](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/renderers.tsx#L144)

### `DefaultPromptProps`

Type.

Props for [`DefaultPrompt`](https://zidane.si/docs/reference/ui-chat-transcript.md#DefaultPrompt): the [`PromptSlotProps`](https://zidane.si/docs/reference/ui-chat-transcript.md#PromptSlotProps).

```ts
type DefaultPromptProps = PromptSlotProps
```

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

### `DefaultSessionTitleProps`

Type.

Props for [`DefaultSessionTitle`](https://zidane.si/docs/reference/ui-chat-transcript.md#DefaultSessionTitle): the [`SessionTitleSlotProps`](https://zidane.si/docs/reference/ui-chat-transcript.md#SessionTitleSlotProps).

```ts
type DefaultSessionTitleProps = SessionTitleSlotProps
```

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

### `LineState`

Type.

A step's state that only its row icon shows: a call or a worker still
running, or one that failed. Without the icons the row's own line says it:
a light sweep over its name while it runs, a [`FailedMark`](https://zidane.si/docs/reference/ui-chat-transcript.md#FailedMark) once it failed.

```ts
type LineState = 'running' | 'failed'
```

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

### `OpenBadgeMenu`

Type.

Opens the badge menu for a badge at the event's point.

```ts
type OpenBadgeMenu = (event: React.MouseEvent, target: BadgeTarget, cwd?: string | null) => void
```

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

### `ScrollPosition`

Type.

Where a transcript's view is ([`useStickToBottom`](https://zidane.si/docs/reference/ui-chat-transcript.md#useStickToBottom)'s `readPosition`):
following the bottom, or the row under the reader's line and then each row
around it, out to the transcript's own.

```ts
type ScrollPosition = { pinned: true } | { pinned: false; rows: readonly RowPlace[] }
```

Source: [ui/src/chat/transcript/useStickToBottom.ts:64](https://github.com/Tahul/zidane/blob/main/ui/src/chat/transcript/useStickToBottom.ts#L64)

## Re-exports

These names are documented on the entry point that owns them.

- [zidane-ui/chat](https://zidane.si/docs/reference/ui-chat.md): [`parseToolMedia`](https://zidane.si/docs/reference/ui-chat.md#parseToolMedia), [`ToolMediaItem`](https://zidane.si/docs/reference/ui-chat.md#ToolMediaItem)
