@linxiraos/pi-tui 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/CHANGELOG.md +245 -224
  2. package/README.md +36 -0
  3. package/THIRD-PARTY-NOTICES.txt +55 -5
  4. package/dist/types/app-keybindings.d.ts +18 -8
  5. package/dist/types/apps/git/diff-pane.d.ts +5 -0
  6. package/dist/types/apps/git/git-tui.d.ts +16 -2
  7. package/dist/types/apps/git/state.d.ts +11 -0
  8. package/dist/types/autocomplete.d.ts +2 -0
  9. package/dist/types/charts/chart-svg.d.ts +7 -13
  10. package/dist/types/chat/advisor-message.d.ts +4 -1
  11. package/dist/types/chat/assistant-message.d.ts +9 -4
  12. package/dist/types/chat/figure-markdown.d.ts +7 -2
  13. package/dist/types/chat/messages.d.ts +3 -1
  14. package/dist/types/chat/read-tool-group.d.ts +2 -2
  15. package/dist/types/chat/table-chart.d.ts +11 -15
  16. package/dist/types/chat/tool-execution.d.ts +32 -20
  17. package/dist/types/chat/user-message.d.ts +3 -2
  18. package/dist/types/chrome/countdown-timer.d.ts +3 -2
  19. package/dist/types/chrome/diff.d.ts +2 -3
  20. package/dist/types/chrome/status-notice.d.ts +2 -0
  21. package/dist/types/chrome/transcript-container.d.ts +2 -0
  22. package/dist/types/components/image.d.ts +2 -0
  23. package/dist/types/components/markdown.d.ts +49 -3
  24. package/dist/types/components/text.d.ts +2 -0
  25. package/dist/types/debug-server.d.ts +2 -0
  26. package/dist/types/keybinding-matchers.d.ts +6 -0
  27. package/dist/types/multiplexers/tmux.d.ts +1 -0
  28. package/dist/types/multiplexers/types.d.ts +6 -0
  29. package/dist/types/native/backend.d.ts +5 -4
  30. package/dist/types/native/blobs.d.ts +24 -12
  31. package/dist/types/overlays/agent-hub-projection.d.ts +10 -5
  32. package/dist/types/overlays/annotation-overlay.d.ts +19 -0
  33. package/dist/types/overlays/approval-dialog.d.ts +79 -0
  34. package/dist/types/overlays/ask-dialog.d.ts +11 -6
  35. package/dist/types/overlays/btw-history-panel.d.ts +2 -6
  36. package/dist/types/overlays/hook-editor.d.ts +7 -2
  37. package/dist/types/overlays/hook-input.d.ts +12 -4
  38. package/dist/types/overlays/job-tree.d.ts +50 -0
  39. package/dist/types/overlays/jobs-panel.d.ts +25 -11
  40. package/dist/types/overlays/login-dialog.d.ts +8 -3
  41. package/dist/types/overlays/mcp-add-wizard.d.ts +9 -1
  42. package/dist/types/overlays/model-browser.d.ts +6 -1
  43. package/dist/types/overlays/model-picker.d.ts +2 -0
  44. package/dist/types/overlays/pause-screen.d.ts +5 -0
  45. package/dist/types/overlays/plan-review-overlay.d.ts +4 -0
  46. package/dist/types/overlays/report-panel.d.ts +5 -1
  47. package/dist/types/overlays/reset-usage-selector.d.ts +7 -5
  48. package/dist/types/overlays/session-account-selector.d.ts +4 -0
  49. package/dist/types/overlays/session-info-overlay.d.ts +7 -3
  50. package/dist/types/overlays/session-selector.d.ts +3 -1
  51. package/dist/types/overlays/usage-dashboard.d.ts +6 -6
  52. package/dist/types/prompt/composer.d.ts +23 -20
  53. package/dist/types/prompt/custom-editor.d.ts +20 -10
  54. package/dist/types/prompt/image-references.d.ts +22 -0
  55. package/dist/types/prompt/internal-url-autocomplete.d.ts +1 -0
  56. package/dist/types/prompt/macos-spelling.d.ts +2 -1
  57. package/dist/types/prompt/prose-gate.d.ts +3 -0
  58. package/dist/types/prompt/queued-messages.d.ts +1 -1
  59. package/dist/types/prompt/typing-word.d.ts +25 -0
  60. package/dist/types/prompt/welcome.d.ts +26 -6
  61. package/dist/types/render/hanging-wrap.d.ts +7 -0
  62. package/dist/types/render/hyperlink.d.ts +2 -0
  63. package/dist/types/render/render-utils.d.ts +9 -1
  64. package/dist/types/render/utils.d.ts +1 -1
  65. package/dist/types/setup/scenes/splash.d.ts +6 -5
  66. package/dist/types/status-line/context-usage.d.ts +4 -1
  67. package/dist/types/status-line/host.d.ts +6 -4
  68. package/dist/types/status-line/startup.d.ts +6 -6
  69. package/dist/types/status-line/types.d.ts +3 -0
  70. package/dist/types/stdin-buffer.d.ts +7 -0
  71. package/dist/types/terminal-capabilities.d.ts +16 -1
  72. package/dist/types/terminal-multiplexer.d.ts +7 -0
  73. package/dist/types/terminal.d.ts +8 -4
  74. package/dist/types/theme/symbols.d.ts +1 -1
  75. package/dist/types/theme/theme.d.ts +11 -0
  76. package/dist/types/thinking.d.ts +5 -0
  77. package/dist/types/tmux.d.ts +39 -4
  78. package/dist/types/tools/ast-edit.d.ts +2 -2
  79. package/dist/types/tools/ast-grep.d.ts +2 -2
  80. package/dist/types/tools/bash.d.ts +6 -1
  81. package/dist/types/tools/edit.d.ts +2 -0
  82. package/dist/types/tools/eval.d.ts +53 -4
  83. package/dist/types/tools/find.d.ts +14 -4
  84. package/dist/types/tools/glob.d.ts +3 -3
  85. package/dist/types/tools/grep.d.ts +2 -2
  86. package/dist/types/tools/grouped-file-output.d.ts +9 -4
  87. package/dist/types/tools/native-view.d.ts +1 -1
  88. package/dist/types/tools/read.d.ts +32 -10
  89. package/dist/types/tools/renderer.d.ts +2 -0
  90. package/dist/types/tools/task.d.ts +31 -0
  91. package/dist/types/tools/web-search-types.d.ts +1 -0
  92. package/dist/types/tools/write.d.ts +2 -0
  93. package/dist/types/tui.d.ts +20 -3
  94. package/package.json +10 -10
  95. package/src/app-keybindings.d.ts +18 -8
  96. package/src/app-keybindings.ts +20 -8
  97. package/src/apps/autoresearch-dashboard.ts +444 -27
  98. package/src/apps/debug/raw-sse.ts +2 -2
  99. package/src/apps/git/diff-pane.ts +39 -41
  100. package/src/apps/git/git-tui.ts +80 -14
  101. package/src/apps/git/sidebar.ts +10 -1
  102. package/src/apps/git/state.ts +12 -0
  103. package/src/autocomplete.d.ts +2 -0
  104. package/src/autocomplete.ts +21 -19
  105. package/src/bracketed-paste.ts +9 -2
  106. package/src/charts/chart-svg.d.ts +7 -13
  107. package/src/charts/chart-svg.ts +19 -22
  108. package/src/charts/table-data.ts +17 -6
  109. package/src/chat/advisor-message.d.ts +4 -1
  110. package/src/chat/advisor-message.ts +77 -24
  111. package/src/chat/assistant-message.d.ts +9 -4
  112. package/src/chat/assistant-message.ts +127 -31
  113. package/src/chat/bash-execution.ts +7 -2
  114. package/src/chat/figure-markdown.d.ts +7 -2
  115. package/src/chat/figure-markdown.ts +10 -3
  116. package/src/chat/image-loading.ts +9 -6
  117. package/src/chat/messages.d.ts +3 -1
  118. package/src/chat/messages.ts +4 -1
  119. package/src/chat/read-tool-group.d.ts +2 -2
  120. package/src/chat/read-tool-group.ts +97 -42
  121. package/src/chat/svg-figure.ts +3 -1
  122. package/src/chat/svg-source.ts +6 -3
  123. package/src/chat/table-chart.d.ts +11 -15
  124. package/src/chat/table-chart.ts +24 -57
  125. package/src/chat/tool-execution.d.ts +32 -20
  126. package/src/chat/tool-execution.ts +103 -36
  127. package/src/chat/user-message.d.ts +3 -2
  128. package/src/chat/user-message.ts +54 -34
  129. package/src/chrome/countdown-timer.ts +3 -3
  130. package/src/chrome/diff.d.ts +2 -3
  131. package/src/chrome/diff.ts +4 -9
  132. package/src/chrome/status-notice.ts +5 -0
  133. package/src/chrome/transcript-container.d.ts +2 -0
  134. package/src/chrome/transcript-container.ts +212 -28
  135. package/src/components/editor.ts +12 -12
  136. package/src/components/image.d.ts +2 -0
  137. package/src/components/image.ts +54 -20
  138. package/src/components/markdown.d.ts +49 -3
  139. package/src/components/markdown.ts +482 -12
  140. package/src/components/settings-list.ts +2 -4
  141. package/src/components/text.d.ts +2 -0
  142. package/src/components/text.ts +11 -1
  143. package/src/debug-server.d.ts +2 -0
  144. package/src/debug-server.ts +51 -69
  145. package/src/hotkeys-markdown.ts +2 -0
  146. package/src/keybinding-matchers.d.ts +6 -0
  147. package/src/keybinding-matchers.ts +19 -0
  148. package/src/multiplexers/tmux.d.ts +1 -0
  149. package/src/multiplexers/tmux.ts +3 -0
  150. package/src/multiplexers/types.d.ts +6 -0
  151. package/src/multiplexers/types.ts +6 -0
  152. package/src/native/backend.d.ts +5 -4
  153. package/src/native/backend.ts +13 -5
  154. package/src/native/blobs.d.ts +24 -12
  155. package/src/native/blobs.ts +56 -7
  156. package/src/native/reconcile.ts +43 -21
  157. package/src/overlays/advisor-config.ts +259 -8
  158. package/src/overlays/agent-hub-projection.d.ts +10 -5
  159. package/src/overlays/agent-hub-projection.ts +63 -12
  160. package/src/overlays/annotation-overlay.ts +422 -168
  161. package/src/overlays/approval-dialog.ts +389 -0
  162. package/src/overlays/ask-dialog.ts +244 -105
  163. package/src/overlays/btw-history-panel.ts +208 -147
  164. package/src/overlays/extensions/extension-list.ts +4 -6
  165. package/src/overlays/hook-editor.ts +90 -32
  166. package/src/overlays/hook-input.ts +105 -19
  167. package/src/overlays/job-tree.ts +177 -0
  168. package/src/overlays/jobs-panel.ts +222 -142
  169. package/src/overlays/login-dialog.ts +201 -91
  170. package/src/overlays/mcp-add-wizard.ts +562 -279
  171. package/src/overlays/model-browser.ts +32 -7
  172. package/src/overlays/model-hub.ts +4 -10
  173. package/src/overlays/model-picker.ts +58 -21
  174. package/src/overlays/pause-screen.ts +81 -23
  175. package/src/overlays/plan-review-overlay.ts +16 -0
  176. package/src/overlays/plugin-selector.ts +17 -1
  177. package/src/overlays/queue-mode-selector.ts +10 -0
  178. package/src/overlays/report-panel.ts +6 -2
  179. package/src/overlays/reset-usage-selector.ts +130 -21
  180. package/src/overlays/session-account-selector.ts +36 -0
  181. package/src/overlays/session-info-overlay.ts +199 -76
  182. package/src/overlays/session-selector.ts +15 -10
  183. package/src/overlays/settings-selector.ts +3 -0
  184. package/src/overlays/show-images-selector.ts +1 -0
  185. package/src/overlays/snapcompact-shape-preview.ts +13 -6
  186. package/src/overlays/theme-selector.ts +6 -1
  187. package/src/overlays/thinking-selector.ts +8 -4
  188. package/src/overlays/tree-selector.ts +117 -2
  189. package/src/overlays/usage-dashboard.ts +498 -144
  190. package/src/prompt/composer-cache.ts +4 -1
  191. package/src/prompt/composer.ts +200 -74
  192. package/src/prompt/custom-editor.ts +168 -65
  193. package/src/prompt/image-references.d.ts +22 -0
  194. package/src/prompt/image-references.ts +79 -2
  195. package/src/prompt/internal-url-autocomplete.ts +1 -0
  196. package/src/prompt/macos-spelling.ts +28 -5
  197. package/src/prompt/prose-gate.ts +3 -0
  198. package/src/prompt/queued-messages.ts +9 -2
  199. package/src/prompt/tips.txt +1 -2
  200. package/src/prompt/typing-word.ts +59 -0
  201. package/src/prompt/welcome.ts +97 -45
  202. package/src/render/code-cell.ts +18 -5
  203. package/src/render/hanging-wrap.d.ts +7 -0
  204. package/src/render/hanging-wrap.ts +58 -0
  205. package/src/render/hyperlink.d.ts +2 -0
  206. package/src/render/hyperlink.ts +5 -0
  207. package/src/render/render-utils.d.ts +9 -1
  208. package/src/render/render-utils.ts +16 -2
  209. package/src/render/utils.d.ts +1 -1
  210. package/src/render/utils.ts +1 -1
  211. package/src/render/width-aware-text.ts +6 -5
  212. package/src/setup/scenes/splash.ts +22 -8
  213. package/src/status-line/component.ts +79 -11
  214. package/src/status-line/context-usage.ts +176 -73
  215. package/src/status-line/footer.ts +18 -35
  216. package/src/status-line/host.ts +6 -1
  217. package/src/status-line/segments.ts +16 -5
  218. package/src/status-line/startup.ts +6 -6
  219. package/src/status-line/types.ts +1 -0
  220. package/src/stdin-buffer.d.ts +7 -0
  221. package/src/stdin-buffer.ts +300 -62
  222. package/src/terminal-capabilities.d.ts +16 -1
  223. package/src/terminal-capabilities.ts +66 -28
  224. package/src/terminal-multiplexer.d.ts +7 -0
  225. package/src/terminal-multiplexer.ts +14 -0
  226. package/src/terminal.d.ts +8 -4
  227. package/src/terminal.ts +190 -63
  228. package/src/theme/symbols.d.ts +1 -1
  229. package/src/theme/symbols.ts +1 -0
  230. package/src/theme/theme-class.ts +1 -0
  231. package/src/theme/theme.d.ts +11 -0
  232. package/src/theme/theme.ts +46 -14
  233. package/src/thinking.d.ts +5 -0
  234. package/src/thinking.ts +9 -1
  235. package/src/tmux.d.ts +39 -4
  236. package/src/tmux.ts +110 -16
  237. package/src/tools/ask.ts +20 -9
  238. package/src/tools/ast-edit.d.ts +2 -2
  239. package/src/tools/ast-edit.ts +30 -7
  240. package/src/tools/ast-grep.d.ts +2 -2
  241. package/src/tools/ast-grep.ts +39 -35
  242. package/src/tools/bash.d.ts +6 -1
  243. package/src/tools/bash.ts +15 -9
  244. package/src/tools/debug.ts +2 -1
  245. package/src/tools/default-renderer.ts +3 -2
  246. package/src/tools/edit.d.ts +2 -0
  247. package/src/tools/edit.ts +100 -21
  248. package/src/tools/eval.d.ts +53 -4
  249. package/src/tools/eval.ts +173 -137
  250. package/src/tools/find.d.ts +14 -4
  251. package/src/tools/find.ts +71 -18
  252. package/src/tools/glob.d.ts +3 -3
  253. package/src/tools/glob.ts +51 -17
  254. package/src/tools/grep.d.ts +2 -2
  255. package/src/tools/grep.ts +99 -22
  256. package/src/tools/grouped-file-output.d.ts +9 -4
  257. package/src/tools/grouped-file-output.ts +21 -6
  258. package/src/tools/lsp.ts +30 -18
  259. package/src/tools/mcp.ts +2 -2
  260. package/src/tools/native-view.d.ts +1 -1
  261. package/src/tools/native-view.ts +2 -2
  262. package/src/tools/read.d.ts +32 -10
  263. package/src/tools/read.ts +89 -43
  264. package/src/tools/renderer.d.ts +2 -0
  265. package/src/tools/renderer.ts +2 -0
  266. package/src/tools/task.d.ts +31 -0
  267. package/src/tools/task.ts +40 -7
  268. package/src/tools/todo.ts +3 -2
  269. package/src/tools/wait.ts +16 -30
  270. package/src/tools/web-search-types.d.ts +1 -0
  271. package/src/tools/web-search-types.ts +1 -0
  272. package/src/tools/web-search.ts +2 -1
  273. package/src/tools/write.d.ts +2 -0
  274. package/src/tools/write.ts +36 -12
  275. package/src/tools/yield.ts +2 -2
  276. package/src/tui.d.ts +20 -3
  277. package/src/tui.ts +160 -43
  278. package/src/utils.ts +5 -3
  279. package/dist/types/tools/eval-format/code-mode-declarations.d.ts +0 -5
  280. package/src/tools/eval-format/code-mode-declarations.ts +0 -61
@@ -2,6 +2,51 @@ import { type TokensList } from "@linxiraos/pi-utils/marked";
2
2
  import type { DescribeContext, NativeNode } from "../native/node.js";
3
3
  import type { SymbolTheme } from "../symbols.js";
4
4
  import type { Component } from "../tui.js";
5
+ /**
6
+ * `text` as the streaming renderer lexes it: OSC 8 terminators unified and
7
+ * tabs expanded. {@link Markdown.getLastRenderStableText} is a prefix of this
8
+ * form, not of the raw source, so append-only publishers that mix settled
9
+ * prefixes with whole blocks must compare both in this form. Rendering it is
10
+ * byte-identical to rendering `text`.
11
+ */
12
+ export declare function streamingMarkdownSource(text: string): string;
13
+ /**
14
+ * Streaming `md` source for a native terminal, minus a still-growing table row:
15
+ * the unterminated last line when a GFM table (a run of pipe lines holding a
16
+ * header and its delimiter row, outer pipes optional) sits right above it,
17
+ * outside any open code fence. GFM continues a table on any non-blank line, so
18
+ * that line is a row whatever it holds so far. The terminal sizes columns by
19
+ * every row it gets, so a half-streamed row (an unclosed link shows its whole
20
+ * URL) would rewrap the table each frame, and TSP cannot ask it to skip one.
21
+ * The result keeps the newline before the held line, so it is a prefix of
22
+ * `text` and of the result for every append to it: streaming stays
23
+ * append-only. Pass untrimmed source: trimming first drops the newline that
24
+ * marks the last row finished, so that row would be held too.
25
+ */
26
+ export declare function holdPartialTableRow(text: string): string;
27
+ /**
28
+ * `text`, one inline run whose end is still streaming, with a trailing open
29
+ * link or math span closed the way the finished text most likely closes it,
30
+ * or `undefined` when nothing at its end is open. A link gains its missing
31
+ * `)` (one per open parenthesis in its destination), so it renders as the
32
+ * link it becomes instead of literal brackets and URL. A math body is cut back
33
+ * to its last valid form (a half-typed command, dangling `^`/`_`, or the first
34
+ * `$` of a `$$` closer dropped, open braces closed) and closed, so the
35
+ * rendered math grows in place instead of raw LaTeX turning into symbols at
36
+ * the closer. A `$` body needs a LaTeX character, so a price (`$5 per`) is
37
+ * never speculated. Only prose is: escaped openers and anything inside a code
38
+ * span, closed or still being written, stay literal.
39
+ */
40
+ export declare function speculativeInlineClose(text: string): string | undefined;
41
+ /**
42
+ * Streaming `md` source for a native terminal with the open link or math span
43
+ * at its end speculatively closed ({@link speculativeInlineClose}), as the TUI
44
+ * renders it. Only the last block is read (a span cannot cross a blank line),
45
+ * and source inside an open code fence is left as it is. Each frame rewrites
46
+ * only the guessed closers at the end, which the reconciler sends as a small
47
+ * `splice`.
48
+ */
49
+ export declare function speculativeStreamingSource(text: string): string;
5
50
  /** @internal exported for tests — the grown-line block-kind gate. */
6
51
  export declare function fastLineStartHazard(grownLine: string): boolean;
7
52
  /**
@@ -140,9 +185,10 @@ export declare class Markdown implements Component {
140
185
  */
141
186
  describe(_cx: DescribeContext): NativeNode;
142
187
  /**
143
- * Width-independent source prefix of the last render ending at a frozen
144
- * Markdown block boundary that no append can move: it stops in front of a
145
- * display-math opener whose block an append could still close. Only
188
+ * Width-independent source prefix of the last render that no append can
189
+ * change: up to a frozen Markdown block boundary, stopping in front of a
190
+ * display-math opener whose block an append could still close, or, while a
191
+ * list streams as the last block, up to its newest top-level item. Only
146
192
  * meaningful while streaming (transient render cache on); grows
147
193
  * monotonically under append-only `setText`.
148
194
  */
@@ -12,6 +12,8 @@ import type { Component } from "../tui.js";
12
12
  export declare class Text implements Component {
13
13
  #private;
14
14
  setIgnoreTight(ignore: boolean): this;
15
+ /** Override row wrapping when the source carries structural prefixes. */
16
+ setWrapLine(wrapLine: (line: string, width: number) => string[]): this;
15
17
  constructor(text?: string, paddingX?: number, paddingY?: number, customBgFn?: (text: string) => string);
16
18
  /** Return bounded text and layout state for debug inspection. */
17
19
  debugState(): Record<string, unknown>;
@@ -22,6 +22,8 @@ export interface TuiDebugTree {
22
22
  export declare class TuiDebugServer {
23
23
  #private;
24
24
  constructor(tui: TUI, path: string);
25
+ /** Resolves true once the socket accepts connections, false if listen failed or the server stopped first. */
26
+ get ready(): Promise<boolean>;
25
27
  start(): void;
26
28
  stop(): void;
27
29
  }
@@ -9,6 +9,8 @@ import type { KeyId } from "./app-keybindings.js";
9
9
  export declare function matchesAppInterrupt(data: string): boolean;
10
10
  /** Match `app.tools.expand`, falling back to Ctrl+O when the action is unbound. */
11
11
  export declare function matchesAppToolsExpand(data: string): boolean;
12
+ /** Effective tools-expand key: the first bound key, or Ctrl+O when unbound. */
13
+ export declare function appToolsExpandKey(): KeyId;
12
14
  /** Match the generic selector cancel keybinding. */
13
15
  export declare function matchesSelectCancel(data: string): boolean;
14
16
  /** Match the generic selector up-navigation keybinding. */
@@ -36,3 +38,7 @@ export declare function matchesAppExternalEditor(data: string): boolean;
36
38
  * effective follow-up binding.
37
39
  */
38
40
  export declare function matchesAppFollowUp(data: string): boolean;
41
+ /** Effective tool-approval keys: the `app.approval.approve` bindings, or Ctrl+Enter/Ctrl+Q when unbound. */
42
+ export declare function appApproveKeys(): readonly KeyId[];
43
+ /** Match the tool-approval key, recognizing modifier-tagged LF as Ctrl+Enter like {@link matchesAppFollowUp}. */
44
+ export declare function matchesAppApprove(data: string): boolean;
@@ -22,6 +22,7 @@ export declare const tmuxMultiplexer: {
22
22
  readonly passthrough: typeof wrapTmuxPassthrough;
23
23
  readonly settleMs: 100;
24
24
  };
25
+ readonly gatesBracketedPaste: true;
25
26
  readonly expandsRepPadding: true;
26
27
  readonly expiresSynchronizedOutput: true;
27
28
  readonly altRestoreEndsSynchronizedOutput: true;
@@ -73,6 +73,12 @@ export interface TerminalMultiplexerModule<Id extends string = string> {
73
73
  * session, and an unrecognized report does not turn it off.
74
74
  */
75
75
  readonly honorsSynchronizedOutput?: boolean;
76
+ /**
77
+ * Tracks DEC 2004 per pane and forwards paste markers only while it is set,
78
+ * yet may leave DECRQM 2004 unanswered, so bracketed paste is reasserted
79
+ * without waiting for a DECRPM confirmation.
80
+ */
81
+ readonly gatesBracketedPaste?: boolean;
76
82
  /**
77
83
  * The session does not reveal whether its client renders graphics while
78
84
  * outer-terminal identity variables leak in, so images and Kitty
@@ -47,10 +47,11 @@ export interface NativeBackendOptions {
47
47
  }
48
48
  /**
49
49
  * The reply a v1 terminal is assumed to give before its real `hello` arrives
50
- * (the `TERM_PROGRAM=tern` optimistic start): the whole vocabulary, the
51
- * default APC limit and credits, the terminal's width, the appearance omp
52
- * already detected, full motion, and `blobs`, so a resumed session's images
53
- * are asked about rather than resent before the reply comes.
50
+ * (the `TERM_PROGRAM=tern` optimistic start): the whole vocabulary except
51
+ * {@link UNASSUMED_KINDS}, the default APC limit and credits, the terminal's
52
+ * width, the appearance omp already detected, full motion, and `blobs`, so a
53
+ * resumed session's images are asked about rather than resent before the
54
+ * reply comes.
54
55
  */
55
56
  export declare function assumedTspHello(terminal: Terminal): TspHello;
56
57
  export declare class NativeBackend {
@@ -1,14 +1,5 @@
1
- /**
2
- * Content-addressed binary blobs (images) for `image` nodes.
3
- *
4
- * `describe()` registers the bytes and puts the returned id in `image.p.blob`;
5
- * the native backend delivers each referenced blob once per terminal
6
- * connection (asking the terminal first which it holds, or through its blob
7
- * cache), else uploads it with verb `b` before the frame that first
8
- * references it.
9
- */
10
1
  import type { TspProps } from "@linxiraos/pi-wire";
11
- import type { NativeNode } from "./node.js";
2
+ import type { NativeChild, NativeNode } from "./node.js";
12
3
  export interface NativeBlob {
13
4
  readonly id: string;
14
5
  readonly mime: string;
@@ -26,8 +17,29 @@ export declare function nativeImageNode(bytes: Uint8Array, mime: string, p?: Omi
26
17
  * so callers cache the node per payload ({@link NativeImageCache}).
27
18
  */
28
19
  export declare function base64ImageNode(data: string, mimeType: string, p?: Omit<TspProps<"image">, "blob" | "builtin" | "w" | "h">, key?: string): NativeNode;
29
- /** `image` nodes for base64 payloads, one per slot key, rebuilt only when the slot's payload changes. */
20
+ /**
21
+ * Props that make an `image` node open the file at `filePath` (as a `file://` URL, the TSP
22
+ * open-target form): a click zooms the image in the terminal, and the file opens from its
23
+ * context menu. Empty without a file.
24
+ */
25
+ export declare function openableImageProps(filePath: string | undefined): Pick<TspProps<"image">, "href" | "actions">;
26
+ /**
27
+ * `image` nodes for base64 payloads, one per slot key, rebuilt only when the slot's payload
28
+ * or the link policy changes. Each opens its file (`sourcePath`, else a blob copy).
29
+ */
30
30
  export declare class NativeImageCache {
31
31
  #private;
32
- get(key: string, data: string, mimeType: string): NativeNode;
32
+ get(key: string, data: string, mimeType: string, sourcePath?: string): NativeNode;
33
33
  }
34
+ /** The disk file a tool result's image was read from (`read` details `mediaPath`), when it has one. */
35
+ export declare function readMediaPath(details: unknown): string | undefined;
36
+ /**
37
+ * A `media` node the host loads by path, capped at the inline image preview
38
+ * height. Callers check `cx.supports("media")` first.
39
+ */
40
+ export declare function nativeMediaNode(path: string, key: string): NativeNode;
41
+ /** Blob ids of the `image` nodes and paths of the `media` nodes under `children` (described nodes only). */
42
+ export declare function shownMedia(children: readonly NativeChild[] | undefined): {
43
+ blobs: Set<string>;
44
+ paths: Set<string>;
45
+ };
@@ -1,6 +1,9 @@
1
1
  import type { AgentMetricsSummary, AgentRecordLike, AgentStatus } from "./agent-hub-types.js";
2
2
  import type { ObservableSession } from "./session-observer-registry.js";
3
3
  export type AgentMetrics = AgentMetricsSummary;
4
+ export interface AgentCostSnapshot {
5
+ cost: number | undefined;
6
+ }
4
7
  export interface AggregateMetrics extends AgentMetrics {
5
8
  reportedAgents: number;
6
9
  /** Rows whose duration is an observer-measured active runtime. */
@@ -17,14 +20,16 @@ export declare const STATUS_ORDER: Record<AgentStatus, number>;
17
20
  export declare function progressMetrics(observed: ObservableSession | undefined): AgentMetrics | undefined;
18
21
  /** Live session used to cache a row's direct assistant usage, including with observer progress. */
19
22
  export declare function hubFallbackStatsSession<TRecord extends AgentRecordLike>(ref: TRecord, observed: ObservableSession | undefined): NonNullable<TRecord["session"]> | undefined;
20
- /**
21
- * Preserve progress/history for non-cost metrics, overlaying cumulative direct-session cost.
22
- * Persisted `history.metrics.cost` is a leaf-scoped snapshot, so it never overrides live
23
- * progress; only the cumulative direct-cost sources do.
24
- */
23
+ /** Full Agent Hub row metrics; see {@link projectRowMetrics} for source precedence. */
25
24
  export declare function hubRowMetrics<TRecord extends AgentRecordLike>(ref: TRecord, observed: ObservableSession | undefined, sessionMetrics: WeakMap<object, {
26
25
  metrics: AgentMetrics | undefined;
27
26
  }>): AgentMetrics | undefined;
27
+ /** Cost-only projection for frequent status updates; full roster metrics keep their own cache. */
28
+ export declare function aggregateCost<TRecord extends AgentRecordLike>(args: {
29
+ rows: readonly TRecord[];
30
+ observedById: ReadonlyMap<string, ObservableSession>;
31
+ sessionCosts: WeakMap<object, AgentCostSnapshot>;
32
+ }): number;
28
33
  export declare function aggregateMetrics<TRecord extends AgentRecordLike>(args: {
29
34
  rows: readonly TRecord[];
30
35
  observedById: ReadonlyMap<string, ObservableSession>;
@@ -2,6 +2,7 @@ import { type Focusable, type TUI } from "../index.js";
2
2
  import { type KeybindingsManager } from "../app-keybindings.js";
3
3
  import { type Theme } from "../theme/theme.js";
4
4
  import type { CodeReviewAnnotation, CodeReviewOverlayResult, ReviewDiffFile, TextReviewAnnotation, TextReviewOverlayResult, TextReviewSource } from "./annotation-types.js";
5
+ import type { TspSpan } from "@linxiraos/pi-wire";
5
6
  import { type NativeNode, type NativeUiEvent } from "../native/node.js";
6
7
  export declare const CONTINUE_CODE_REVIEW_ACTION = "Continue with LLM review";
7
8
  export declare const PASTE_CODE_REVIEW_ACTION = "Paste annotations into prompt";
@@ -21,6 +22,12 @@ export interface TextReviewOverlayCallbacks extends AnnotationOverlayCallbacks {
21
22
  }
22
23
  /** Splits a text source into the overlay's 1-based annotatable lines. */
23
24
  export declare function splitTextLines(text: string): string[];
25
+ /** The native sheet: full-pane glass, titled by the review kind with what is under review after it. */
26
+ interface NativeSheet {
27
+ readonly role: "zeta.overlay.codeReview" | "zeta.overlay.annotateText";
28
+ readonly size: "full";
29
+ readonly head: TspSpan[];
30
+ }
24
31
  /** A fullscreen, annotated diff picker that only relies on public OMP APIs. */
25
32
  export declare class AnnotationOverlay implements Focusable {
26
33
  #private;
@@ -44,7 +51,19 @@ export declare class AnnotationOverlay implements Focusable {
44
51
  */
45
52
  replaceTextSource(text: string): number;
46
53
  handleInput(data: string): void;
54
+ /**
55
+ * The terminal draws the frame: a full-pane glass sheet titled `Code review`
56
+ * (or `Annotate text`), then what is under review as a quieter subtitle.
57
+ */
58
+ get nativeOverlay(): NativeSheet;
59
+ /**
60
+ * The sheet's body: the file rail (totals over the changed files) beside
61
+ * the current file's diff (text: its numbered lines), the note composer
62
+ * docked under the lines while a note is open, and a footer of key hints
63
+ * and the actions.
64
+ */
47
65
  describe(): NativeNode;
48
66
  handleNativeEvent(event: NativeUiEvent): void;
49
67
  render(width: number): readonly string[];
50
68
  }
69
+ export {};
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Tool-approval prompt in the composer's place, presented like the ask
3
+ * dialog: the approval title and its details over a list of choices —
4
+ * Approve, an optional "approve for this session", and Deny — and an action
5
+ * bar. The arrows move between the choices and Enter takes the highlighted
6
+ * one; `app.approval.approve` (Ctrl+Enter by default) approves this call
7
+ * outright and Esc denies. Enter and the approve chord only arm
8
+ * {@link APPROVE_ARM_MS} after mount, so a key meant for the composer (Enter,
9
+ * or the follow-up chord pressed mid-run) as the prompt appears never answers
10
+ * it. With an {@link ApprovalDialogDraft}, every other key edits the composer
11
+ * mounted beneath the dialog, so a message can deny the call and steer the
12
+ * turn instead: while the composer holds a draft, the arrows and Enter edit and
13
+ * send it, and the highlight sits on Deny, relabeled to say Enter sends.
14
+ * The prompt stays a few rows so the composer keeps its room; Page Up/Down
15
+ * scroll the details, and with a full prompt the expand key
16
+ * (`app.tools.expand`) swaps it in, wrapped.
17
+ */
18
+ import { type Component, type TUI } from "../index.js";
19
+ import { type NativeNode, type NativeUiEvent } from "../native/node.js";
20
+ /** Enter and the approve key are ignored this long after mount, so a key sent as the prompt appears cannot answer it. */
21
+ export declare const APPROVE_ARM_MS = 500;
22
+ interface ApprovalDialogCallbacks {
23
+ onApprove(): void;
24
+ onDeny(): void;
25
+ }
26
+ /** The composer mounted beneath the dialog: it receives every key the dialog does not own. */
27
+ export interface ApprovalDialogDraft {
28
+ /** True while the composer holds a draft — text, attachments, or a paste still landing: keys then edit and send it. */
29
+ hasDraft(): boolean;
30
+ handleInput(keyData: string): void;
31
+ }
32
+ interface ApprovalDialogOptions {
33
+ tui?: TUI;
34
+ /** The prompt with every detail in full, which the expand key swaps in (wrapped) for the summarized one. */
35
+ fullPrompt?: string;
36
+ /** Deny once this many ms pass without input (any key restarts the countdown). */
37
+ timeout?: number;
38
+ /** Called when {@link timeout} expires, before the dialog denies. */
39
+ onTimeout?: () => void;
40
+ /** Called when the countdown starts, as the dialog mounts. */
41
+ onTimeoutStart?: () => void;
42
+ /** Called each time a key restarts the countdown. */
43
+ onTimeoutReset?: () => void;
44
+ /** Route typing to the composer instead of dropping it. */
45
+ draft?: ApprovalDialogDraft;
46
+ /** Offer to approve this and later like calls for the rest of the session, as the row between Approve and Deny. */
47
+ session?: {
48
+ label: string;
49
+ onApprove(): void;
50
+ };
51
+ }
52
+ export declare class ApprovalDialogComponent implements Component {
53
+ #private;
54
+ private readonly callbacks;
55
+ private readonly options;
56
+ /** `prompt`: the approval title on its first line, the details after it. */
57
+ constructor(prompt: string, callbacks: ApprovalDialogCallbacks, options?: ApprovalDialogOptions);
58
+ invalidate(): void;
59
+ dispose(): void;
60
+ handleInput(keyData: string): void;
61
+ /**
62
+ * Swap the summarized prompt for every detail, wrapped, or back, as the expand key does here;
63
+ * for hosts that intercept that key first. Restarts the countdown like any key. False (nothing
64
+ * changes) without a full prompt, so the host's own expand handling (tool previews) can run.
65
+ */
66
+ toggleDetails(): boolean;
67
+ render(width: number): readonly string[];
68
+ /**
69
+ * In the dock, in the composer's place and framed as the composer is (an
70
+ * `zeta.editor.*` root role), like the ask dialog, rather than a card over
71
+ * the transcript: the title, the details, the choices with the keyboard's
72
+ * highlight (a click takes one), then Details (with a full prompt), Deny,
73
+ * and the primary Approve, whose keys show in their tooltips.
74
+ */
75
+ describe(): NativeNode;
76
+ /** Deny, Approve, and Details run exactly what Esc, the approve key, and the expand key run; a click on a choice takes it. */
77
+ handleNativeEvent(event: NativeUiEvent): void;
78
+ }
79
+ export {};
@@ -88,7 +88,6 @@ export declare class AskDialogComponent implements Component {
88
88
  #private;
89
89
  private readonly callbacks;
90
90
  private readonly options;
91
- readonly retireDisplacedTranscript = true;
92
91
  constructor(questions: ExtensionAskDialogQuestion[], callbacks: AskDialogCallbacks, options?: AskDialogOptions);
93
92
  invalidate(): void;
94
93
  dispose(): void;
@@ -102,17 +101,23 @@ export declare class AskDialogComponent implements Component {
102
101
  render(width: number): readonly string[];
103
102
  /**
104
103
  * In the dock, in the composer's place and framed as the composer is: a
105
- * `col` with the prompt editor's root role (`zeta.editor`), so the terminal
106
- * gives it the composer's insets and spacing. Not a modal `overlay` sheet:
107
- * one anchored at the bottom covered the transcript rows that explain the
108
- * question and blocked scrolling until the question was answered.
104
+ * `col` with an `zeta.editor.*` root role (`zeta.editor.ask`, collapsed
105
+ * `zeta.editor.ask.hidden`), so the terminal draws the composer's shell
106
+ * around it. Not a modal `overlay` sheet: one anchored at the bottom
107
+ * covered the transcript rows that explain the question and blocked
108
+ * scrolling until the question was answered.
109
+ *
110
+ * Anatomy: the question tabs (several questions), the question, its
111
+ * answers as radio/check rows, and the action bar as the footer (the
112
+ * countdown, Hide, then Note, Skip and the primary Submit/Next).
109
113
  */
110
114
  describe(cx: DescribeContext): NativeNode;
111
115
  /**
112
116
  * Pointer actions: a tab click switches to it; a click on an answer row is
113
117
  * Enter on it (Space for a multi-select option, so it toggles; its
114
118
  * double-click `activate` is Enter); the action bar's Submit, Note and Skip
115
- * run exactly what Enter, `n` and Esc run on the highlighted row.
119
+ * run exactly what Enter, `n` and Esc run on the highlighted row; Hide/Show
120
+ * collapse and restore the dialog.
116
121
  */
117
122
  handleNativeEvent(event: NativeUiEvent): void;
118
123
  }
@@ -40,12 +40,8 @@ export declare class BtwHistoryPanel implements Component, Focusable {
40
40
  /** Enhanced clipboard pastes belong only to the active composer. */
41
41
  pasteText(text: string): void;
42
42
  handleInput(data: string): void;
43
- /** A large glass sheet titled "BTW history". */
44
- readonly nativeOverlay: {
45
- readonly role: "zeta.overlay.btwHistory";
46
- readonly size: "lg";
47
- readonly head: "BTW history";
48
- };
43
+ /** A large glass sheet (the list beside the reader), palette-sized while there is nothing to list. */
44
+ get nativeOverlay(): NonNullable<Component["nativeOverlay"]>;
49
45
  describe(): NativeNode;
50
46
  handleNativeEvent(event: NativeUiEvent): void;
51
47
  render(width: number): readonly string[];
@@ -10,7 +10,7 @@
10
10
  import type { ImageContent } from "@linxiraos/pi-ai";
11
11
  import { type Focusable, type TUI } from "../index.js";
12
12
  import { OverlayPanel } from "../chrome/overlay-box.js";
13
- import type { DescribeContext, NativeNode } from "../native/node.js";
13
+ import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
14
14
  /**
15
15
  * `prefix` and `question` flattened onto one line, wrapped to the terminal's width and cut to
16
16
  * {@link MAX_PROMPT_TITLE_ROWS} rows (the last ends in `…` when cut). For terminal rendering only:
@@ -58,8 +58,13 @@ export declare class HookEditorComponent extends OverlayPanel implements Focusab
58
58
  /** Focus state mirrored to the nested editor during rendering. */
59
59
  focused: boolean;
60
60
  constructor(tui: TUI, title: string, prefill: string | undefined, onSubmit: (value: string, images?: ImageContent[]) => void, onCancel: () => void, options?: HookEditorOptions);
61
- /** The editor (which describes itself) under the title and detail lines, with the key hints below. */
61
+ /**
62
+ * A sheet in the composer's place: the title (or, answering a question, the question under the
63
+ * prompt's name) over a hairline, the editor, and Open in editor · Cancel · Submit.
64
+ */
62
65
  describe(_cx: DescribeContext): NativeNode;
66
+ /** The action bar's buttons run what their keys run. */
67
+ handleNativeEvent(event: NativeUiEvent): void;
63
68
  /** Keep the nested editor's software/hardware cursor mode aligned with the dialog focus target. */
64
69
  setUseTerminalCursor(useTerminalCursor: boolean): void;
65
70
  /** Render the dialog after forwarding its focus state to the nested editor. */
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Simple text input component for hooks.
2
+ * One-line text prompt an extension (hook) asks the user.
3
3
  */
4
4
  import { type TUI } from "../index.js";
5
5
  import { OverlayPanel } from "../chrome/overlay-box.js";
6
- import type { DescribeContext, NativeNode } from "../native/node.js";
6
+ import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
7
7
  export interface HookInputOptions {
8
8
  tui?: TUI;
9
9
  timeout?: number;
@@ -11,13 +11,21 @@ export interface HookInputOptions {
11
11
  }
12
12
  export declare class HookInputComponent extends OverlayPanel {
13
13
  #private;
14
- constructor(title: string, _placeholder: string | undefined, onSubmit: (value: string) => void, onCancel: () => void, opts?: HookInputOptions);
14
+ constructor(title: string, placeholder: string | undefined, onSubmit: (value: string) => void, onCancel: () => void, opts?: HookInputOptions);
15
15
  handleInput(keyData: string): void;
16
16
  /** Route non-bracketed paste transports (e.g. kitty's OSC 5522 enhanced clipboard)
17
17
  * into the inner field, mirroring bracketed-paste semantics. Pasting counts as
18
18
  * interaction, so the timeout countdown resets like any keystroke. */
19
19
  pasteText(text: string): void;
20
+ /** Submit and Cancel run what Enter and the interrupt key run. */
21
+ handleNativeEvent(event: NativeUiEvent): void;
20
22
  dispose(): void;
21
- /** A card over the form, headed by the title plus the countdown `elapsed` while a timeout runs. */
23
+ /**
24
+ * A sheet in the composer's place, built like the extension editor's: the
25
+ * title's first line (the countdown at its end while a timeout runs) over
26
+ * any further lines as detail, the field written on the sheet (tinted, the
27
+ * reason under it, while a submit was refused), and Cancel · Submit, whose
28
+ * keys live in their tooltips.
29
+ */
22
30
  describe(_cx: DescribeContext): NativeNode;
23
31
  }
@@ -0,0 +1,50 @@
1
+ import type { Theme } from "../theme/theme.js";
2
+ /** What the tree reads off a job. */
3
+ export interface JobTreeJob {
4
+ readonly id: string;
5
+ readonly status: "running" | "completed" | "failed" | "cancelled";
6
+ readonly startTime: number;
7
+ /** Registry id of the agent that owns the job; absent or the root id: a top-level job. */
8
+ readonly ownerId?: string;
9
+ /** Registry id of the subagent a task job runs: the job heads that agent's subtree. */
10
+ readonly agentId?: string;
11
+ }
12
+ /** A subagent in the tree, by registry id: an owner of listed jobs, or an ancestor linking one to the root. */
13
+ export interface JobTreeAgent {
14
+ readonly id: string;
15
+ readonly parentId?: string;
16
+ }
17
+ /** Where a row sits: its depth and the rails drawn left of it. */
18
+ export interface JobTreePlace {
19
+ /** 0 for the top level. */
20
+ readonly depth: number;
21
+ /** Per enclosing level below the top, whether that level's rail continues past this row. */
22
+ readonly rails: readonly boolean[];
23
+ /** Whether this row is the last of its siblings. */
24
+ readonly last: boolean;
25
+ /** Whether rows nest under this one. */
26
+ readonly parent: boolean;
27
+ }
28
+ /** One tree row: a job (a task job also heads its subagent), or a header for a subagent with no listed task job. */
29
+ export type JobTreeRow<J extends JobTreeJob> = (JobTreePlace & {
30
+ readonly kind: "job";
31
+ readonly job: J;
32
+ readonly agent?: JobTreeAgent;
33
+ }) | (JobTreePlace & {
34
+ readonly kind: "agent";
35
+ readonly agent: JobTreeAgent;
36
+ });
37
+ /**
38
+ * `jobs` as tree rows in display order. `rootId` is the viewing agent: its
39
+ * jobs, ownerless jobs and jobs of owners outside `agents` sit at the top
40
+ * level, as do agents whose parent is the root or unknown.
41
+ */
42
+ export declare function buildJobTree<J extends JobTreeJob>(jobs: readonly J[], agents: readonly JobTreeAgent[], rootId: string | undefined): JobTreeRow<J>[];
43
+ /** The connector drawn before a row's head: nothing at the top level, else rails then a branch. */
44
+ export declare function jobTreeGuide(row: JobTreePlace, theme: Theme): string;
45
+ /**
46
+ * The prefix of lines under a row's head (its label, a wrapped command): the
47
+ * rails that continue past it, then the rail down to its children or blank,
48
+ * two columns wide so a top-level leaf's lines indent by two.
49
+ */
50
+ export declare function jobTreeIndent(row: JobTreePlace, theme: Theme): string;
@@ -1,5 +1,6 @@
1
1
  import type { Component } from "../tui.js";
2
2
  import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
3
+ import { type JobTreeAgent } from "./job-tree.js";
3
4
  /** One async job as the session snapshots it. */
4
5
  export interface JobsPanelJob {
5
6
  readonly id: string;
@@ -8,13 +9,19 @@ export interface JobsPanelJob {
8
9
  readonly label: string;
9
10
  readonly startTime: number;
10
11
  readonly endTime?: number;
12
+ /** Registry id of the agent that owns the job. */
13
+ readonly ownerId?: string;
11
14
  /** Registry id of the subagent a task job runs. */
12
15
  readonly agentId?: string;
13
16
  }
14
- /** Running and recently settled jobs. */
17
+ /** Running and recently settled jobs of an agent and its subagents. */
15
18
  export interface JobsPanelSnapshot {
16
19
  readonly running: readonly JobsPanelJob[];
17
20
  readonly recent: readonly JobsPanelJob[];
21
+ /** The agent the sheet is for: its jobs sit at the top level, and only they can be cancelled. */
22
+ readonly rootId?: string;
23
+ /** Subagents owning listed jobs, with the ancestors linking them to the root. */
24
+ readonly agents?: readonly JobTreeAgent[];
18
25
  }
19
26
  /** What the sheet shows about the selected job beyond its row. */
20
27
  export interface JobsPanelDetail {
@@ -35,19 +42,26 @@ export interface JobsSheetSource {
35
42
  load(): JobsPanelSnapshot;
36
43
  /** The selected job's detail; runs once per frame, undefined once the job is gone. */
37
44
  inspect(id: string): JobsPanelDetail | undefined;
38
- /** Cancel a running job. */
39
- cancel(id: string): void;
45
+ /**
46
+ * Cancel a running job. Omitted by a read-only sheet (a focused subagent
47
+ * view, which only watches that agent): it lists the jobs and offers no way
48
+ * to stop them.
49
+ */
50
+ cancel?(id: string): void;
40
51
  /** Dismiss the sheet. */
41
52
  close(): void;
42
53
  }
43
54
  /**
44
55
  * The jobs pill's sheet: a centred `lg` glass sheet titled Background jobs.
45
- * A selectable list of every job (running first) sits over the selected
46
- * job's detail: status and live elapsed (a task job's `agent` node), cwd,
47
- * live pids, exit code, the full command and a tail-following output pane.
48
- * It re-reads the session every frame, so the caller re-renders it on a
49
- * timer while it is open. ↑/↓ select, X cancels the selected running job,
50
- * Esc or Close dismisses; nothing enters the transcript.
56
+ * A master–detail split (it stacks in a narrow pane): the selectable job tree
57
+ * beside the selected job's detail — a status pill with live elapsed and
58
+ * Cancel job, its command or task, facts (agent, cwd, live pids, exit code,
59
+ * artifact) and a tail-following output pane. With no jobs it shows an empty
60
+ * state. It re-reads the session every frame, so the caller re-renders it on
61
+ * a timer while it is open. ↑/↓ select, X cancels the selected running job,
62
+ * Esc or Close dismisses; nothing enters the transcript. A source without
63
+ * `cancel` renders read-only, and a subagent's job never offers Cancel: only
64
+ * the root's own jobs can be stopped here.
51
65
  */
52
66
  export declare class JobsSheet implements Component {
53
67
  #private;
@@ -58,8 +72,8 @@ export declare class JobsSheet implements Component {
58
72
  readonly head: "Background jobs";
59
73
  };
60
74
  constructor(source: JobsSheetSource);
61
- describe(cx: DescribeContext): NativeNode;
62
- /** Rows for a terminal without the native surface: one per job, then the selected job's facts and output tail. */
75
+ describe(_cx: DescribeContext): NativeNode;
76
+ /** Rows for a terminal without the native surface: the job tree, then the selected job's facts and output tail. */
63
77
  render(width: number): readonly string[];
64
78
  invalidate(): void;
65
79
  handleInput(data: string): void;
@@ -40,9 +40,14 @@ export declare class LoginDialogComponent extends OverlayPanel {
40
40
  showProgress(message: string): void;
41
41
  /**
42
42
  * A glass sheet over the composer (the dialog replaces the editor in the
43
- * dock; the `overlay` hoists into the terminal's layer): numbered steps —
44
- * open or copy the sign-in link, the device code, the live wait, the paste
45
- * field — and Cancel.
43
+ * dock; the `overlay` hoists into the terminal's layer). Top to bottom: one
44
+ * sentence saying what to do, the device code as a large click-to-copy
45
+ * well, the sign-in link as a read-only field with Copy, the questions
46
+ * (answered ones as label/value lines, the live one as a field), and the
47
+ * flow's status — finished stages checked, the current one spinning. The
48
+ * footer holds Cancel and one primary action: Continue while a field waits
49
+ * for an answer (Open sign-in page then leads the footer as a plain
50
+ * button), else Open sign-in page.
46
51
  */
47
52
  describe(): NativeNode;
48
53
  /** Cancel and Continue run what Esc and Enter run. */
@@ -83,8 +83,16 @@ interface MCPAddWizardOAuthOptions {
83
83
  export declare class MCPAddWizard extends OverlayPanel {
84
84
  #private;
85
85
  constructor(deps: MCPAddWizardDeps, onComplete: (name: string, config: MCPAddWizardConfig, scope: Scope) => void, onCancel: () => void, onOAuth?: (authUrl: string, tokenUrl: string, clientId: string, clientSecret: string, scopes: string, options?: MCPAddWizardOAuthOptions) => Promise<MCPAddWizardOAuthResult>, onTestConnection?: (config: MCPAddWizardConfig) => Promise<void>, onRender?: () => void, initialName?: string);
86
+ /**
87
+ * The sheet: the phase strip, the step's title and lead, its body (field,
88
+ * status, summary), its choices, and a footer whose buttons run what
89
+ * Escape, Enter and Ctrl+C run.
90
+ */
86
91
  describe(_cx: DescribeContext): NativeNode;
87
- /** A click on a choice is Enter on it, exactly as highlighting it with the arrows and pressing Enter. */
92
+ /**
93
+ * A click on a choice is Enter on it, exactly as highlighting it with the
94
+ * arrows and pressing Enter; the footer's buttons run what their keys run.
95
+ */
88
96
  handleNativeEvent(event: NativeUiEvent): void;
89
97
  handleInput(keyData: string): void;
90
98
  }