@linxiraos/pi-tui 1.2.0 → 1.3.0

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 (276) hide show
  1. package/CHANGELOG.md +188 -120
  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/transcript-container.d.ts +2 -0
  21. package/dist/types/components/image.d.ts +2 -0
  22. package/dist/types/components/markdown.d.ts +49 -3
  23. package/dist/types/components/text.d.ts +2 -0
  24. package/dist/types/debug-server.d.ts +2 -0
  25. package/dist/types/keybinding-matchers.d.ts +6 -0
  26. package/dist/types/multiplexers/tmux.d.ts +1 -0
  27. package/dist/types/multiplexers/types.d.ts +6 -0
  28. package/dist/types/native/backend.d.ts +5 -4
  29. package/dist/types/native/blobs.d.ts +24 -12
  30. package/dist/types/overlays/agent-hub-projection.d.ts +10 -5
  31. package/dist/types/overlays/annotation-overlay.d.ts +19 -0
  32. package/dist/types/overlays/approval-dialog.d.ts +79 -0
  33. package/dist/types/overlays/ask-dialog.d.ts +11 -6
  34. package/dist/types/overlays/btw-history-panel.d.ts +2 -6
  35. package/dist/types/overlays/hook-editor.d.ts +7 -2
  36. package/dist/types/overlays/hook-input.d.ts +12 -4
  37. package/dist/types/overlays/job-tree.d.ts +50 -0
  38. package/dist/types/overlays/jobs-panel.d.ts +25 -11
  39. package/dist/types/overlays/login-dialog.d.ts +8 -3
  40. package/dist/types/overlays/mcp-add-wizard.d.ts +9 -1
  41. package/dist/types/overlays/model-browser.d.ts +6 -1
  42. package/dist/types/overlays/model-picker.d.ts +2 -0
  43. package/dist/types/overlays/pause-screen.d.ts +5 -0
  44. package/dist/types/overlays/plan-review-overlay.d.ts +4 -0
  45. package/dist/types/overlays/report-panel.d.ts +5 -1
  46. package/dist/types/overlays/reset-usage-selector.d.ts +7 -5
  47. package/dist/types/overlays/session-account-selector.d.ts +4 -0
  48. package/dist/types/overlays/session-info-overlay.d.ts +7 -3
  49. package/dist/types/overlays/session-selector.d.ts +3 -1
  50. package/dist/types/overlays/usage-dashboard.d.ts +6 -6
  51. package/dist/types/prompt/composer.d.ts +22 -26
  52. package/dist/types/prompt/custom-editor.d.ts +20 -10
  53. package/dist/types/prompt/image-references.d.ts +22 -0
  54. package/dist/types/prompt/internal-url-autocomplete.d.ts +1 -0
  55. package/dist/types/prompt/macos-spelling.d.ts +2 -1
  56. package/dist/types/prompt/prose-gate.d.ts +3 -0
  57. package/dist/types/prompt/queued-messages.d.ts +1 -1
  58. package/dist/types/prompt/typing-word.d.ts +25 -0
  59. package/dist/types/prompt/welcome.d.ts +35 -43
  60. package/dist/types/render/hanging-wrap.d.ts +7 -0
  61. package/dist/types/render/hyperlink.d.ts +2 -0
  62. package/dist/types/render/render-utils.d.ts +9 -1
  63. package/dist/types/render/utils.d.ts +1 -1
  64. package/dist/types/setup/scenes/splash.d.ts +6 -5
  65. package/dist/types/status-line/context-usage.d.ts +4 -1
  66. package/dist/types/status-line/host.d.ts +6 -4
  67. package/dist/types/status-line/startup.d.ts +6 -6
  68. package/dist/types/status-line/types.d.ts +3 -0
  69. package/dist/types/stdin-buffer.d.ts +7 -0
  70. package/dist/types/terminal-capabilities.d.ts +16 -1
  71. package/dist/types/terminal-multiplexer.d.ts +7 -0
  72. package/dist/types/terminal.d.ts +8 -4
  73. package/dist/types/theme/symbols.d.ts +1 -1
  74. package/dist/types/theme/theme.d.ts +11 -0
  75. package/dist/types/thinking.d.ts +5 -0
  76. package/dist/types/tmux.d.ts +39 -4
  77. package/dist/types/tools/ast-edit.d.ts +2 -2
  78. package/dist/types/tools/ast-grep.d.ts +2 -2
  79. package/dist/types/tools/bash.d.ts +6 -1
  80. package/dist/types/tools/edit.d.ts +2 -0
  81. package/dist/types/tools/eval.d.ts +53 -4
  82. package/dist/types/tools/find.d.ts +14 -4
  83. package/dist/types/tools/glob.d.ts +3 -3
  84. package/dist/types/tools/grep.d.ts +2 -2
  85. package/dist/types/tools/grouped-file-output.d.ts +9 -4
  86. package/dist/types/tools/native-view.d.ts +1 -1
  87. package/dist/types/tools/read.d.ts +32 -10
  88. package/dist/types/tools/renderer.d.ts +2 -0
  89. package/dist/types/tools/task.d.ts +31 -0
  90. package/dist/types/tools/write.d.ts +2 -0
  91. package/dist/types/tui.d.ts +20 -3
  92. package/package.json +10 -10
  93. package/src/app-keybindings.d.ts +18 -8
  94. package/src/app-keybindings.ts +20 -8
  95. package/src/apps/autoresearch-dashboard.ts +444 -27
  96. package/src/apps/debug/raw-sse.ts +2 -2
  97. package/src/apps/git/diff-pane.ts +39 -41
  98. package/src/apps/git/git-tui.ts +80 -14
  99. package/src/apps/git/sidebar.ts +10 -1
  100. package/src/apps/git/state.ts +12 -0
  101. package/src/autocomplete.d.ts +2 -0
  102. package/src/autocomplete.ts +21 -19
  103. package/src/bracketed-paste.ts +9 -2
  104. package/src/charts/chart-svg.d.ts +7 -13
  105. package/src/charts/chart-svg.ts +19 -22
  106. package/src/chat/advisor-message.d.ts +4 -1
  107. package/src/chat/advisor-message.ts +77 -24
  108. package/src/chat/assistant-message.d.ts +9 -4
  109. package/src/chat/assistant-message.ts +127 -31
  110. package/src/chat/bash-execution.ts +7 -2
  111. package/src/chat/figure-markdown.d.ts +7 -2
  112. package/src/chat/figure-markdown.ts +10 -3
  113. package/src/chat/image-loading.ts +9 -6
  114. package/src/chat/messages.d.ts +3 -1
  115. package/src/chat/messages.ts +4 -1
  116. package/src/chat/read-tool-group.d.ts +2 -2
  117. package/src/chat/read-tool-group.ts +97 -42
  118. package/src/chat/svg-figure.ts +3 -1
  119. package/src/chat/svg-source.ts +6 -3
  120. package/src/chat/table-chart.d.ts +11 -15
  121. package/src/chat/table-chart.ts +24 -57
  122. package/src/chat/tool-execution.d.ts +32 -20
  123. package/src/chat/tool-execution.ts +103 -36
  124. package/src/chat/user-message.d.ts +3 -2
  125. package/src/chat/user-message.ts +54 -34
  126. package/src/chrome/countdown-timer.ts +3 -3
  127. package/src/chrome/diff.d.ts +2 -3
  128. package/src/chrome/diff.ts +4 -9
  129. package/src/chrome/transcript-container.d.ts +2 -0
  130. package/src/chrome/transcript-container.ts +212 -28
  131. package/src/components/editor.ts +12 -12
  132. package/src/components/image.d.ts +2 -0
  133. package/src/components/image.ts +54 -20
  134. package/src/components/markdown.d.ts +49 -3
  135. package/src/components/markdown.ts +461 -11
  136. package/src/components/settings-list.ts +2 -4
  137. package/src/components/text.d.ts +2 -0
  138. package/src/components/text.ts +11 -1
  139. package/src/debug-server.d.ts +2 -0
  140. package/src/debug-server.ts +51 -69
  141. package/src/hotkeys-markdown.ts +2 -0
  142. package/src/keybinding-matchers.d.ts +6 -0
  143. package/src/keybinding-matchers.ts +19 -0
  144. package/src/multiplexers/tmux.d.ts +1 -0
  145. package/src/multiplexers/tmux.ts +3 -0
  146. package/src/multiplexers/types.d.ts +6 -0
  147. package/src/multiplexers/types.ts +6 -0
  148. package/src/native/backend.d.ts +5 -4
  149. package/src/native/backend.ts +13 -5
  150. package/src/native/blobs.d.ts +24 -12
  151. package/src/native/blobs.ts +56 -7
  152. package/src/native/reconcile.ts +43 -21
  153. package/src/overlays/advisor-config.ts +259 -8
  154. package/src/overlays/agent-hub-projection.d.ts +10 -5
  155. package/src/overlays/agent-hub-projection.ts +63 -12
  156. package/src/overlays/agent-hub.ts +2 -2
  157. package/src/overlays/annotation-overlay.ts +422 -168
  158. package/src/overlays/approval-dialog.ts +389 -0
  159. package/src/overlays/ask-dialog.ts +244 -105
  160. package/src/overlays/btw-history-panel.ts +208 -147
  161. package/src/overlays/extensions/extension-list.ts +4 -6
  162. package/src/overlays/hook-editor.ts +90 -32
  163. package/src/overlays/hook-input.ts +105 -19
  164. package/src/overlays/job-tree.ts +177 -0
  165. package/src/overlays/jobs-panel.ts +222 -142
  166. package/src/overlays/login-dialog.ts +201 -91
  167. package/src/overlays/mcp-add-wizard.ts +562 -279
  168. package/src/overlays/model-browser.ts +32 -7
  169. package/src/overlays/model-hub.ts +4 -10
  170. package/src/overlays/model-picker.ts +58 -21
  171. package/src/overlays/pause-screen.ts +81 -23
  172. package/src/overlays/plan-review-overlay.ts +16 -0
  173. package/src/overlays/plugin-selector.ts +17 -1
  174. package/src/overlays/plugin-settings.ts +8 -2
  175. package/src/overlays/queue-mode-selector.ts +10 -0
  176. package/src/overlays/report-panel.ts +6 -2
  177. package/src/overlays/reset-usage-selector.ts +130 -21
  178. package/src/overlays/session-account-selector.ts +36 -0
  179. package/src/overlays/session-info-overlay.ts +199 -76
  180. package/src/overlays/session-selector.ts +15 -10
  181. package/src/overlays/settings-selector.ts +3 -0
  182. package/src/overlays/show-images-selector.ts +1 -0
  183. package/src/overlays/snapcompact-shape-preview.ts +13 -6
  184. package/src/overlays/theme-selector.ts +6 -1
  185. package/src/overlays/thinking-selector.ts +8 -4
  186. package/src/overlays/tree-selector.ts +117 -2
  187. package/src/overlays/usage-dashboard.ts +498 -144
  188. package/src/prompt/composer-cache.ts +4 -6
  189. package/src/prompt/composer.ts +196 -96
  190. package/src/prompt/custom-editor.ts +168 -65
  191. package/src/prompt/image-references.d.ts +22 -0
  192. package/src/prompt/image-references.ts +79 -2
  193. package/src/prompt/internal-url-autocomplete.ts +1 -0
  194. package/src/prompt/macos-spelling.ts +28 -5
  195. package/src/prompt/prose-gate.ts +3 -0
  196. package/src/prompt/queued-messages.ts +9 -2
  197. package/src/prompt/tips.txt +1 -2
  198. package/src/prompt/typing-word.ts +59 -0
  199. package/src/prompt/welcome.ts +256 -423
  200. package/src/render/code-cell.ts +18 -5
  201. package/src/render/hanging-wrap.d.ts +7 -0
  202. package/src/render/hanging-wrap.ts +58 -0
  203. package/src/render/hyperlink.d.ts +2 -0
  204. package/src/render/hyperlink.ts +5 -0
  205. package/src/render/render-utils.d.ts +9 -1
  206. package/src/render/render-utils.ts +16 -2
  207. package/src/render/utils.d.ts +1 -1
  208. package/src/render/utils.ts +1 -1
  209. package/src/render/width-aware-text.ts +6 -5
  210. package/src/setup/scenes/splash.ts +137 -60
  211. package/src/status-line/component.ts +23 -10
  212. package/src/status-line/context-usage.ts +176 -73
  213. package/src/status-line/footer.ts +18 -35
  214. package/src/status-line/host.ts +6 -1
  215. package/src/status-line/segments.ts +16 -5
  216. package/src/status-line/startup.ts +6 -6
  217. package/src/status-line/types.ts +1 -0
  218. package/src/stdin-buffer.d.ts +7 -0
  219. package/src/stdin-buffer.ts +11 -1
  220. package/src/terminal-capabilities.d.ts +16 -1
  221. package/src/terminal-capabilities.ts +66 -28
  222. package/src/terminal-multiplexer.d.ts +7 -0
  223. package/src/terminal-multiplexer.ts +14 -0
  224. package/src/terminal.d.ts +8 -4
  225. package/src/terminal.ts +160 -46
  226. package/src/theme/symbols.d.ts +1 -1
  227. package/src/theme/symbols.ts +1 -0
  228. package/src/theme/theme-class.ts +1 -0
  229. package/src/theme/theme.d.ts +11 -0
  230. package/src/theme/theme.ts +46 -14
  231. package/src/thinking.d.ts +5 -0
  232. package/src/thinking.ts +9 -1
  233. package/src/tmux.d.ts +39 -4
  234. package/src/tmux.ts +110 -16
  235. package/src/tools/ask.ts +20 -9
  236. package/src/tools/ast-edit.d.ts +2 -2
  237. package/src/tools/ast-edit.ts +30 -7
  238. package/src/tools/ast-grep.d.ts +2 -2
  239. package/src/tools/ast-grep.ts +39 -35
  240. package/src/tools/bash.d.ts +6 -1
  241. package/src/tools/bash.ts +15 -9
  242. package/src/tools/debug.ts +2 -1
  243. package/src/tools/default-renderer.ts +3 -2
  244. package/src/tools/edit.d.ts +2 -0
  245. package/src/tools/edit.ts +100 -21
  246. package/src/tools/eval.d.ts +53 -4
  247. package/src/tools/eval.ts +173 -137
  248. package/src/tools/find.d.ts +14 -4
  249. package/src/tools/find.ts +71 -18
  250. package/src/tools/glob.d.ts +3 -3
  251. package/src/tools/glob.ts +51 -17
  252. package/src/tools/grep.d.ts +2 -2
  253. package/src/tools/grep.ts +99 -22
  254. package/src/tools/grouped-file-output.d.ts +9 -4
  255. package/src/tools/grouped-file-output.ts +21 -6
  256. package/src/tools/lsp.ts +30 -18
  257. package/src/tools/mcp.ts +2 -2
  258. package/src/tools/native-view.d.ts +1 -1
  259. package/src/tools/native-view.ts +2 -2
  260. package/src/tools/read.d.ts +32 -10
  261. package/src/tools/read.ts +89 -43
  262. package/src/tools/renderer.d.ts +2 -0
  263. package/src/tools/renderer.ts +2 -0
  264. package/src/tools/task.d.ts +31 -0
  265. package/src/tools/task.ts +40 -7
  266. package/src/tools/todo.ts +3 -2
  267. package/src/tools/wait.ts +16 -30
  268. package/src/tools/web-search.ts +2 -1
  269. package/src/tools/write.d.ts +2 -0
  270. package/src/tools/write.ts +36 -12
  271. package/src/tools/yield.ts +2 -2
  272. package/src/tui.d.ts +20 -3
  273. package/src/tui.ts +140 -36
  274. package/src/utils.ts +5 -3
  275. package/dist/types/tools/eval-format/code-mode-declarations.d.ts +0 -5
  276. package/src/tools/eval-format/code-mode-declarations.ts +0 -61
@@ -1,5 +1,6 @@
1
1
  import { type SgrMouseEvent } from "../index.js";
2
2
  import { OverlayPanel } from "../chrome/overlay-box.js";
3
+ import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
3
4
  /** Stored account identity rendered and matched by the session account picker. */
4
5
  export interface SessionPinAccount {
5
6
  position: number;
@@ -17,6 +18,9 @@ export interface SessionPinAccount {
17
18
  export declare class SessionAccountSelectorComponent extends OverlayPanel {
18
19
  #private;
19
20
  constructor(providerName: string, accounts: readonly SessionPinAccount[], onSelect: (account: SessionPinAccount) => void, onCancel: () => void);
21
+ describe(cx: DescribeContext): NativeNode | null;
22
+ /** Picker pointer events drive the list exactly as its keys do. */
23
+ handleNativeEvent(event: NativeUiEvent): void;
20
24
  /** Forward keyboard navigation and cancellation when the wrapper owns focus. */
21
25
  handleInput(keyData: string): void;
22
26
  /** Route mouse selection through the title rows into the account list. */
@@ -24,9 +24,13 @@ export declare class SessionInfoOverlay implements Component {
24
24
  setIgnoreTight(ignore: boolean): this;
25
25
  dispose(): void;
26
26
  /**
27
- * The sheet body (the overlay is the frame): the session id in mono
28
- * (click copies), each report heading as a section of key/value rows, a
29
- * context meter after the leading block, and a Close button (Esc).
27
+ * The sheet body (the overlay is the frame), in three tiers: who the session
28
+ * is (the id and file as copyable mono fields), how full its context window
29
+ * is (a meter under a right-aligned figure), then the report's sections as
30
+ * headed groups. Groups of plain counts (Messages, Tokens, Cost) share a
31
+ * two-column stats grid with right-aligned figures and their Total set off
32
+ * last; the rest (Provider, servers) are key/value rows. A Close button (Esc)
33
+ * ends it.
30
34
  */
31
35
  describe(cx: DescribeContext): NativeNode;
32
36
  /** The Close button runs Esc's path. */
@@ -127,6 +127,8 @@ export interface SessionSelectorOptions<T extends SessionSelectorEntry = Session
127
127
  allSessions?: T[];
128
128
  /** Picker heading; defaults to "Resume Session". */
129
129
  title?: string;
130
+ /** Primary action label; defaults to "Resume" (ANSI footer defaults to "select"). */
131
+ actionLabel?: string;
130
132
  /** Fixed scope label, or false to omit the scope suffix. */
131
133
  scopeLabel?: string | false;
132
134
  /**
@@ -152,7 +154,7 @@ export interface SessionSelectorOptions<T extends SessionSelectorEntry = Session
152
154
  /** Path of the live session, or a getter so detach/newSession stays accurate. */
153
155
  currentSessionPath?: string | (() => string | undefined);
154
156
  /**
155
- * The picker is the whole program (`zeta-c --resume`): the native picker
157
+ * The picker is the whole program (`zetacode --resume`): the native picker
156
158
  * fills the screen surface (`size:"screen"`) instead of floating as a
157
159
  * sheet over the transcript.
158
160
  */
@@ -122,12 +122,12 @@ export declare class UsageDashboardComponent implements Component {
122
122
  dispose(): void;
123
123
  render(width: number): readonly string[];
124
124
  /**
125
- * The sheet body (the terminal's `lg` overlay is the frame): a head row
126
- * (checked ago, Overview/Details tabs, Refresh), then either the provider
127
- * grid of frames with window meters and the activity heatmap, or the
128
- * per-provider detail tables, then Close like the other report sheets.
129
- * `meter`/`chart` fall back to `progress`/`table` on terminals without
130
- * them. Rebuilt only when its inputs change.
125
+ * The sheet body (the terminal's `lg` overlay is the frame): a toolbar
126
+ * (Overview/Details, freshness, Refresh), then either the overview — a
127
+ * strip of headline figures, the quota rows per provider, the activity
128
+ * calendar — or the per-provider detail tables, then Close like the other
129
+ * report sheets. `meter`/`chart` fall back to `progress`/`table` on
130
+ * terminals without them. Rebuilt only when its inputs change.
131
131
  */
132
132
  describe(cx: DescribeContext): NativeNode;
133
133
  /** Tab clicks switch views like Enter/Esc; the Refresh button runs `r`; Close closes from either view. */
@@ -6,7 +6,7 @@ import { type Component, type ResizeScrollbackMode, type TerminalFramePlan, type
6
6
  import type { NativeSurface, NativeSurfaceProvider } from "../native/node.js";
7
7
  import { CustomEditor } from "./custom-editor.js";
8
8
  import type { WordCompletionMethod } from "./word-completion.js";
9
- import { WelcomeComponent, type RecentSession, type LspServerInfo } from "./welcome.js";
9
+ import { WelcomeComponent } from "./welcome.js";
10
10
  /** Live settings that affect the composer before and after session adoption. */
11
11
  export interface ComposerPreferences {
12
12
  readonly quiet: boolean;
@@ -25,11 +25,6 @@ export declare const COMPOSER_DEFAULTS: ComposerPreferences;
25
25
  /** Welcome data that can be supplied initially or patched as startup resolves it. */
26
26
  export interface ComposerWelcomeUpdate {
27
27
  readonly version?: string;
28
- readonly modelName?: string;
29
- readonly providerName?: string;
30
- readonly recentSessions?: readonly RecentSession[];
31
- /** Detected project servers; `null` means LSP is disabled and hides the welcome section. */
32
- readonly lspServers?: readonly LspServerInfo[] | null;
33
28
  }
34
29
  /**
35
30
  * Status-bar inputs persisted by the last session. The first frame renders
@@ -55,18 +50,8 @@ export interface ComposerOptions {
55
50
  readonly exit?: (code: number) => void;
56
51
  readonly now?: () => number;
57
52
  }
58
- /** How {@link Composer.setRuntimeChildren} bills below-transcript roots against transcript retirement. */
53
+ /** How {@link Composer.setRuntimeChildren} lays out the roots below the transcript. */
59
54
  export interface RuntimeChildrenOptions {
60
- /**
61
- * Below-transcript roots whose growth is momentary (inline dialogs, a tall
62
- * multi-line editor). They are billed at their smallest height so expansion
63
- * clips the live tail instead of retiring rows a later shrink could not
64
- * reclaim (#11007). Every other root is billed at its current height, so
65
- * settled rows it displaces retire to native scrollback. Decision panels
66
- * declaring `retireDisplacedTranscript` opt out of this floor even when
67
- * mounted as a child of a transient editor container.
68
- */
69
- readonly transient?: readonly Component[];
70
55
  /**
71
56
  * Dock order on a TSP terminal (no status strip; the composer carries its
72
57
  * facts): the native dock stacks HUD pills, the working row and queued messages over
@@ -74,6 +59,20 @@ export interface RuntimeChildrenOptions {
74
59
  * to the roots below the transcript in render order.
75
60
  */
76
61
  readonly nativeDock?: readonly Component[];
62
+ /**
63
+ * Below-transcript roots the user opens and closes (the editor surface that
64
+ * drafts and dialogs swap into, docked reports). Their rows never become
65
+ * part of the post-run chrome floor, so collapsing them refills the screen.
66
+ */
67
+ readonly transientChrome?: readonly Component[];
68
+ /**
69
+ * Transient roots that clear themselves (todo and subagent HUDs, progress).
70
+ * Their first paint can be their tallest, e.g. a restored todo list on a
71
+ * resumed session, so unlike {@link transientChrome} it is never treated as
72
+ * their resting height: all of their rows stay out of the floor. Roots listed
73
+ * here are transient and need not also appear in `transientChrome`.
74
+ */
75
+ readonly selfClearingChrome?: readonly Component[];
77
76
  }
78
77
  /** Controls the first terminal paint for a composer that does not already own the terminal. */
79
78
  export interface ComposerStartOptions {
@@ -128,15 +127,6 @@ export declare class Composer implements TerminalFrameProvider, NativeSurfacePro
128
127
  * the screen rows left above them; `undefined` before `root` was laid out.
129
128
  */
130
129
  rowsBelow(root: Component): number | undefined;
131
- /**
132
- * Keep the input on the bottom row while the live rows cannot fill the
133
- * screen, as after an inline decision panel closes. A tall block that just
134
- * left the chrome above the editor (a command report) may have scrolled
135
- * rows into native history that cannot be pulled back; without the pin the
136
- * editor would jump up to where the shorter frame now ends. The pin lifts
137
- * once live rows fill the screen again.
138
- */
139
- pinInputToBottom(): void;
140
130
  /** Compose the bounded mutable viewport and the next ordered history append. */
141
131
  renderFrame(viewport: ViewportSize): TerminalFramePlan;
142
132
  /**
@@ -181,6 +171,12 @@ export declare class Composer implements TerminalFrameProvider, NativeSurfacePro
181
171
  setPreferences(update: Partial<ComposerPreferences>): void;
182
172
  /** Patch welcome data in place as version, session, and project discovery complete. */
183
173
  updateWelcome(update: ComposerWelcomeUpdate): void;
174
+ /**
175
+ * Mark whether a host agent run is in flight. Mid-run gaps with no streaming
176
+ * block (tool arguments not yet parseable, between tool calls) then do not
177
+ * count as the run ending when the post-run chrome floor is decided.
178
+ */
179
+ setRunActive(active: boolean): void;
184
180
  /** Replace optional header content around the stable welcome scene. */
185
181
  setHeaderExtras(before: readonly Component[], after: readonly Component[]): void;
186
182
  /** Update the canonical editor reference after InteractiveMode remounts a custom editor. */
@@ -24,6 +24,8 @@ export interface ComposerNativeState {
24
24
  readonly rate?: number;
25
25
  /** A turn is running: the send keycap becomes a Stop button. */
26
26
  readonly running: boolean;
27
+ /** Native dictation control; undefined hides it for hosts without speech-to-text. */
28
+ readonly dictation?: "idle" | "starting" | "recording" | "transcribing";
27
29
  /** The viewed subagent's lineage, outermost first and the viewed agent last; undefined on the main session. */
28
30
  readonly viewing?: readonly string[];
29
31
  /** The session's title, quoted in italics as the TSP placeholder; undefined until it has one. */
@@ -196,6 +198,8 @@ export declare class CustomEditor extends Editor {
196
198
  * item markers use the accent color so separate follow-ups remain visible while composing.
197
199
  * Called once per layout segment, so whole-buffer inputs are computed once per text revision. */
198
200
  decorateText: (text: string, context: EditorTextDecorationContext) => string;
201
+ /** Catch the typed word up with the caret first: its leaving the word (or a blur) re-describes the typo marks. */
202
+ describe(cx: DescribeContext): NativeNode;
199
203
  /**
200
204
  * TSP decorations: magic keywords shimmer (terminal-clocked) in the accent
201
205
  * color, chips and markers take their token colors, misspellings are marked,
@@ -220,7 +224,8 @@ export declare class CustomEditor extends Editor {
220
224
  * once after construction (and again after `setEditorComponent` swaps the
221
225
  * editor). Passing `undefined` clears any pending frame. */
222
226
  setShimmerRepaintHandler(handler: (() => void) | undefined): void;
223
- /** Editing is available during bootstrap; atomic sends wait until submission is wired and enabled. */
227
+ /** Editing is available during bootstrap; atomic sends wait until submission is wired and enabled
228
+ * and no dictation is still writing into the draft. */
224
229
  protected get nativeSendable(): boolean;
225
230
  /** Viewing a subagent, the draft goes to it: the placeholder names it; else the session's title, quoted in italics. */
226
231
  describePlaceholder: () => TspText;
@@ -238,17 +243,17 @@ export declare class CustomEditor extends Editor {
238
243
  * subagent is focused, the attachment chips, a `line` row of the
239
244
  * shell-mode chip and the input, and the `bar`: model chip, effort chip
240
245
  * (or the effort glyph as the model chip's icon), the generation rate,
241
- * the other status facts, usage, then send (Stop while a turn runs).
242
- * Clicks come back as `status.model`, `thinking.cycle`, `submit`,
243
- * `interrupt` and `focus:<id>` actions.
246
+ * the other status facts, usage, dictation, then send (Stop while a turn runs).
247
+ * Clicks come back as `status.model`, `thinking.cycle`, `dictation.toggle`,
248
+ * `submit`, `interrupt` and `focus:<id>` actions.
244
249
  */
245
250
  describeLayout: (input: NativeNode, cx: DescribeContext) => NativeEditorLayout;
246
251
  /**
247
- * Clicks on the composer's controls take the same paths as their keys: ⇧⇥,
248
- * ⏎ and Esc; the viewing header's links (`focus:<id>`) go to the host,
249
- * the status facts' clicks (`status.*`) to their source. Selection edits
250
- * go to the buffer; `send` submits its own prompt after saving the old draft
251
- * for recall and waiting for in-flight clipboard work.
252
+ * Dictation clicks go directly to the host, independent of keybindings.
253
+ * Other controls take the same paths as their keys; the viewing header's
254
+ * links (`focus:<id>`) go to the host, the status facts' clicks to their source.
255
+ * Selection edits go to the buffer; `send` submits its own prompt after
256
+ * saving the old draft for recall and waiting for in-flight clipboard work.
252
257
  */
253
258
  handleNativeEvent(event: NativeUiEvent): void;
254
259
  onEscape?: () => void;
@@ -275,6 +280,8 @@ export declare class CustomEditor extends Editor {
275
280
  onRetry?: () => void;
276
281
  /** Called when Caps Lock is pressed. */
277
282
  onCapsLock?: () => void;
283
+ /** Called directly by the native microphone/stop control, without synthesizing a keypress. */
284
+ onToggleDictation?: () => void;
278
285
  /** Called when left-arrow is pressed while the editor is empty (cursor necessarily at start). */
279
286
  onLeftAtStart?: () => void;
280
287
  /** Called when the viewing header asks to view agent `id` ({@link MAIN_AGENT_ID}: the main session). */
@@ -296,6 +303,8 @@ export declare class CustomEditor extends Editor {
296
303
  * Clear all custom key handlers.
297
304
  */
298
305
  clearCustomKeyHandlers(): void;
306
+ /** True while a clipboard-image or image-path paste is still landing; later keys queue behind it. */
307
+ get pasteInFlight(): boolean;
299
308
  capturesInput(data: string): boolean;
300
309
  handleInput(data: string): void;
301
310
  /**
@@ -305,7 +314,8 @@ export declare class CustomEditor extends Editor {
305
314
  * an Ask dialog opened over a non-empty prompt — so finishing or submitting
306
315
  * the draft cannot fire an editor-slot shortcut that clears
307
316
  * `editorContainer` and orphans the overlay. Only text editing, cursor
308
- * movement, submission, and the clear action reach the buffer.
317
+ * movement, submission, the clear action, and pastes (clipboard images and
318
+ * image paths attach as on the composer) reach the buffer.
309
319
  */
310
320
  handleDraftEdit(data: string): void;
311
321
  }
@@ -1,4 +1,5 @@
1
1
  import type { ImageContent } from "@linxiraos/pi-ai";
2
+ import type { TspSpan } from "@linxiraos/pi-wire";
2
3
  /** Materialized image destination returned by the host blob writer. */
3
4
  interface ImageBlobResult {
4
5
  displayPath: string;
@@ -23,4 +24,25 @@ type ImageBlobWriterSync = (data: Buffer, options?: {
23
24
  export declare function imageReferenceHyperlink(label: string, index: number, imageLinks: readonly (string | undefined)[] | undefined, renderLabel: (text: string) => string): string;
24
25
  export declare function materializeImageReferenceLinks(images: readonly ImageContent[] | undefined, putBlob: ImageBlobWriter): Promise<(string | undefined)[] | undefined>;
25
26
  export declare function materializeImageReferenceLinksSync(images: readonly ImageContent[] | undefined, putBlob: ImageBlobWriterSync): (string | undefined)[] | undefined;
27
+ /**
28
+ * Register the host's blob writer that backs links for images without a file of their
29
+ * own. Returns a disposer that unregisters it unless another writer replaced it since.
30
+ */
31
+ export declare function setImageBlobWriter(next: ImageBlobWriterSync): () => void;
32
+ /**
33
+ * Whether transcript images carry links under the current `tui.hyperlinks` policy: a
34
+ * native surface honours only an explicit `off`, text mode the resolved OSC 8 support.
35
+ * Renderers caching a linked image key their cache on it.
36
+ */
37
+ export declare function imageLinksEnabled(): boolean;
38
+ /**
39
+ * The file a transcript image opens: `sourcePath` when it was read from one, else a
40
+ * blob copy of its bytes written through the host. Undefined when links are disabled
41
+ * or no file exists, so a disabled policy never writes blobs.
42
+ */
43
+ export declare function transcriptImageLink(image: Pick<ImageContent, "data" | "mimeType">, sourcePath?: string): string | undefined;
44
+ /** `text` (an image's placeholder) as an OSC 8 link to the image's file; plain when hyperlinks are off or no file exists. */
45
+ export declare function linkedImageText(text: string, image: Pick<ImageContent, "data" | "mimeType">, sourcePath?: string): string;
46
+ /** Native counterpart of {@link linkedImageText}: a span linking to the image's file when one exists. */
47
+ export declare function linkedImageSpan(text: string, image: Pick<ImageContent, "data" | "mimeType">, sourcePath: string | undefined, s?: string): TspSpan;
26
48
  export {};
@@ -31,6 +31,7 @@ export interface InternalUrlCallerContext {
31
31
  cwd?: string;
32
32
  sessionFile?: string;
33
33
  sessionId?: string;
34
+ seanceSourceArtifactsDir?: string;
34
35
  }
35
36
  /**
36
37
  * Suggestions for the internal-url token ending at the cursor, or `null` when
@@ -30,7 +30,8 @@ export declare class MacOSSpellingProvider implements EditorTextAssistProvider {
30
30
  decorateTypos(text: string, context: SpellingDecorationContext, decorate?: (span: string) => string): string;
31
31
  /**
32
32
  * Misspelled prose ranges in `text` (offsets into it), in order and
33
- * non-overlapping. Schedules the verification check for uncached text; its
33
+ * non-overlapping, except ones touching `context.typing` (the word still
34
+ * being typed). Schedules the verification check for uncached text; its
34
35
  * result arrives through {@link onUpdate}.
35
36
  */
36
37
  typoRanges(text: string, context: SpellingDecorationContext): readonly native.SpellingRange[];
@@ -1,9 +1,12 @@
1
+ import type { TypingWord } from "./typing-word.js";
1
2
  /** Logical source location for one rendered editor segment. */
2
3
  export interface SpellingDecorationContext {
3
4
  editorText: string;
4
5
  lines: readonly string[];
5
6
  line: number;
6
7
  startCol: number;
8
+ /** The word being typed: typo marks touching it wait until the caret leaves it. */
9
+ typing?: TypingWord | undefined;
7
10
  }
8
11
  /**
9
12
  * Whether `text[start, end)` is a prose word: unmasked by {@link maskNonProse},
@@ -10,7 +10,7 @@ export interface QueuedMessageGroup {
10
10
  * Messages queued while the agent works, above the editor. ANSI: a heading
11
11
  * per group, numbered dim rows and the dequeue hint. Natively (§8.1): a
12
12
  * stack of pills, each `corner-down-right` · the text · `⌥↑ Edit`, the total
13
- * count in the first pill when more than one waits; the edit control sends
13
+ * (`N queued`, not a position) in the first pill when more than one waits; the edit control sends
14
14
  * `queue.edit`, answered like the dequeue key.
15
15
  */
16
16
  export declare class QueuedMessagesBand extends Container {
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The word being typed in the composer. Misspelling marks hold off on it until
3
+ * the caret leaves it (a space or punctuation, a caret move, losing focus), the
4
+ * way Slack and Chromium mark a typo only once its word is done; marks on other
5
+ * words stay while typing.
6
+ */
7
+ /** A word of one logical line, as UTF-16 columns `[start, end)`. */
8
+ export interface TypingWord {
9
+ line: number;
10
+ start: number;
11
+ end: number;
12
+ }
13
+ /** Follows an editor's text revision and caret to know which word is being typed. */
14
+ export declare class TypingWordTracker {
15
+ #private;
16
+ /** The word being typed, if any. */
17
+ get word(): TypingWord | undefined;
18
+ /**
19
+ * Catch up with the editor: an edit that leaves the caret in (or right after)
20
+ * a word starts typing it; a caret move out of that word, or losing focus,
21
+ * ends it. The first call only records the revision, so a restored draft is
22
+ * not held. Returns whether the held word changed.
23
+ */
24
+ update(revision: number, lines: readonly string[], line: number, col: number, focused: boolean): boolean;
25
+ }
@@ -1,63 +1,54 @@
1
- import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
1
+ import type { DescribeContext, NativeNode } from "../native/node.js";
2
2
  import type { Component } from "../tui.js";
3
+ /** Catalogue keys (`tip${line}`) of every tips.txt line, in file order. The
4
+ * host needs them to gate a tip by the product feature it advertises. */
5
+ export declare const TIP_CATALOGUE_KEYS: readonly string[];
3
6
  /**
4
- * Fixed number of session rows in the welcome box so its height stays stable
5
- * across recent-session updates.
7
+ * Host-installable tip gate: receives the tip's catalogue key and its raw
8
+ * tips.txt line; returning false removes it from the splash pool.
6
9
  */
7
- export declare const WELCOME_SESSION_SLOTS = 4;
10
+ export type TuiTipFilter = (key: string, raw: string) => boolean;
8
11
  /**
9
- * Fixed number of LSP-server rows, for the same reason. Overflow is sliced so
10
- * the box height is constant regardless of how many servers a project has.
12
+ * Install the host's tip gate (pass `undefined` to reset). Consulted for every
13
+ * candidate on every pick, so no roll can surface a rejected tip — used when a
14
+ * feature a tip advertises is switched off by configuration.
11
15
  */
12
- export declare const WELCOME_LSP_SLOTS = 4;
16
+ export declare function setTuiTipFilter(filter: TuiTipFilter | undefined): void;
13
17
  /** Pick a tip from `tips`, biased toward "[NEW]" tips by {@link NEW_TIP_WEIGHT};
14
18
  * `r` is a uniform sample in [0, 1). Returns "" when `tips` is empty.
15
19
  * Exported for tests. */
16
20
  export declare function pickWeightedTip(tips: readonly string[], r: number): string;
17
21
  /**
18
- * The welcome tip as lines of at most `width` columns: `Tip:` and the body
19
- * wrapped together, with no indent, so the banner can center each line.
20
- * `[]` when `width` leaves no room for a useful line.
22
+ * The welcome tip as lines of at most `width` columns: the `welcomeTipLabel`
23
+ * label and the body wrapped together, with no indent, so the banner can center
24
+ * each line. `isNew` drives the rainbow "welcomeNewTag" suffix; it is passed in
25
+ * because the marker lives in tips.txt, not in the resolved body. `[]` when
26
+ * `width` leaves no room for a useful line.
21
27
  */
22
- export declare function renderWelcomeTip(tip: string, width: number, phase?: number): string[];
23
- export interface RecentSession {
24
- name: string;
25
- timeAgo: string;
26
- /** Session file; a native click on the row resumes it. */
27
- path?: string;
28
- }
29
- export interface LspServerInfo {
30
- name: string;
31
- status: "ready" | "error" | "connecting" | "available";
32
- fileTypes: string[];
33
- }
28
+ export declare function renderWelcomeTip(tip: string, width: number, phase?: number, isNew?: boolean): string[];
34
29
  /**
35
- * Premium welcome screen with block-based ZETA logo and two-column layout.
30
+ * The session's welcome banner. In a terminal: the gradient mark beside the
31
+ * `Zeta` wordmark, with the version under the wordmark and the `Linxira-Zeta`
32
+ * identity subline centered below the pair (the mark alone when the lockup does
33
+ * not fit) and the tip of the session (dropped below {@link TIP_MIN_COLUMNS}
34
+ * columns). Natively: a card with the same mark, wordmark, version and tip
35
+ * ({@link WelcomeComponent.describe}).
36
36
  */
37
37
  export declare class WelcomeComponent implements Component {
38
38
  #private;
39
39
  private version;
40
- private modelName;
41
- private providerName;
42
- private recentSessions;
43
- /** Detected project servers; `null` means LSP is disabled and hides the section. */
44
- private lspServers;
45
- constructor(version: string, modelName?: string, providerName?: string, recentSessions?: RecentSession[],
46
- /** Detected project servers; `null` means LSP is disabled and hides the section. */
47
- lspServers?: LspServerInfo[] | null);
40
+ constructor(version: string);
48
41
  get tip(): string | undefined;
49
42
  invalidate(): void;
50
43
  /**
51
- * A `card` (`zeta.welcome`) titled with the app version. The brand column
52
- * (`zeta.welcome.brand`: greeting and the terminal's builtin `zeta` mark, which
53
- * it animates) sits beside the info column (`zeta.welcome.info`: prompt-sigil
54
- * keycaps, LSP servers, recent sessions); the tip of the session closes the card. Roles
55
- * carry the look (gradient logo, type scale, column hairline); a "[NEW]" tip
44
+ * A `card` (`zeta.welcome`) mirroring the terminal banner: the lockup
45
+ * (`zeta.welcome.lockup`: the terminal's builtin `zeta` mark, which it animates,
46
+ * beside the `Zeta` wordmark with the version and the `Linxira-Zeta`
47
+ * subline under it) and the tip of the session.
48
+ * Roles carry the look (gradient logo, type scale); a "[NEW]" tip
56
49
  * carries a terminal-clocked shimmering tag.
57
50
  */
58
51
  describe(_cx: DescribeContext): NativeNode;
59
- /** A click on a recent session resumes it. */
60
- handleNativeEvent(event: NativeUiEvent): void;
61
52
  /** The intro keeps the welcome block mutable; settling lets it retire to history. */
62
53
  isTranscriptBlockFinalized(): boolean;
63
54
  /**
@@ -76,14 +67,15 @@ export declare class WelcomeComponent implements Component {
76
67
  stopIntro(): void;
77
68
  /** Update the version embedded in the welcome border title. */
78
69
  setVersion(version: string): void;
79
- setModel(modelName: string, providerName: string): void;
80
- setRecentSessions(sessions: RecentSession[]): void;
81
- setLspServers(servers: LspServerInfo[] | null): void;
82
70
  render(termWidth: number): readonly string[];
83
71
  }
84
- /** Block-grid brand mark shared by the welcome and setup surfaces. */
72
+ /** Brand mark: FIGlet `ANSI Shadow` render of `Z` (generated). */
85
73
  export declare const ZETA_LOGO: string[];
86
- /** The block-grid brand mark as accent lines; `shimmer` declares the terminal-clocked shine sweep. */
74
+ /** Primary product name: FIGlet `ANSI Shadow` render of `Zeta` (generated). */
75
+ export declare const ZETA_WORDMARK: string[];
76
+ /** Secondary identity line: FIGlet `mini` render of `Linxira-Zeta` (generated). */
77
+ export declare const ZETA_SUBLINE: string[];
78
+ /** The generated brand mark as accent lines; `shimmer` declares the terminal-clocked shine sweep. */
87
79
  export declare function logoNode(lines: readonly string[], shimmer: boolean): NativeNode;
88
80
  export interface ShineConfig {
89
81
  /** Overall opacity of the shine overlay, in [0, 1]. */
@@ -0,0 +1,7 @@
1
+ import type { Theme } from "../theme/theme.js";
2
+ /** Wrap content under a distinct first-row prefix, preserving its column on continuation rows. */
3
+ export declare function wrapPrefixedLine(prefix: string, continuationPrefix: string, content: string, width: number): string[];
4
+ /** Preserve a tree connector's ancestor guides while hanging a long node beneath its label. */
5
+ export declare function wrapTreeLine(line: string, width: number, theme: Theme): string[] | undefined;
6
+ /** Hang a tree row beneath its connector, or a connector-less detail row beneath its guide rails. */
7
+ export declare function wrapGuidedLine(line: string, width: number, theme: Theme): string[];
@@ -70,6 +70,8 @@ export declare function urlHyperlinkAlways(url: string, displayText: string): st
70
70
  * Non-HTTP(S) or unparsable URLs yield a plain span.
71
71
  */
72
72
  export declare function urlLinkSpan(target: string, displayText: string, s?: string): TspSpan;
73
+ /** Whether native link spans and nodes may carry an `href`: everything but an explicit `off` policy. */
74
+ export declare function isNativeLinkEnabled(): boolean;
73
75
  /**
74
76
  * A native link span to a filesystem path as a plain `file://` URI (the
75
77
  * terminal opens it through the system; the location stays in the visible
@@ -105,14 +105,22 @@ export declare function cappedHeadLines(lines: readonly string[], max: number):
105
105
  };
106
106
  /** Get the first nonblank preview lines, trimmed and width-capped. */
107
107
  export declare function getPreviewLines(text: string, maxLines: number, maxLineLen: number, ellipsis?: Ellipsis): string[];
108
+ /** Collapse a possibly multi-line string into one line; whitespace runs (tabs included) become one space. */
109
+ export declare function flattenLine(text: string): string;
108
110
  /**
109
111
  * Collapse a possibly multi-line string into a single line, then truncate it to
110
112
  * `maxWidth` display cells. {@link truncateToWidth} alone caps width but
111
113
  * newlines are zero-width, so multi-line content (markdown briefs, tool args,
112
114
  * provider errors) would otherwise spill a single status row across several
113
- * visual lines. Whitespace runs collapse to one space, so tabs are handled too.
115
+ * visual lines.
114
116
  */
115
117
  export declare function previewLine(text: string, maxWidth: number, ellipsis?: Ellipsis): string;
118
+ /**
119
+ * Clip a result row to `maxWidth` only while collapsed. Expanded rows stay whole
120
+ * so the frame wraps them: the expand key ({@link formatExpandHint}) must reveal
121
+ * text, not re-clip it.
122
+ */
123
+ export declare function clipCollapsed(text: string, maxWidth: number, expanded: boolean | undefined): string;
116
124
  /**
117
125
  * Extract domain from URL, stripping www. prefix.
118
126
  */
@@ -32,7 +32,7 @@ export interface RenderCache {
32
32
  lines: string[];
33
33
  }
34
34
  /** Build indentation and continuing branches for ancestor levels. */
35
- export declare function buildTreePrefix(ancestors: boolean[], theme: Theme): string;
35
+ export declare function buildTreePrefix(ancestors: readonly boolean[], theme: Theme): string;
36
36
  /** Return the branch glyph for a final or continuing tree item. */
37
37
  export declare function getTreeBranch(isLast: boolean, theme: Theme): string;
38
38
  /** Return the continuation prefix for subsequent lines of a tree item. */
@@ -3,11 +3,12 @@ export declare const SETUP_SPLASH_MS = 2600;
3
3
  export declare const SETUP_TICK_MS = 33;
4
4
  export declare function renderStarfield(width: number, height: number, frame: number): string[];
5
5
  /**
6
- * Animated setup splash, in the spirit of the omp landing page: the brand ζ
7
- * mark rendered with the live diagonal gradient + shine sweep, rising out of a
8
- * rippling, gradient-lit water surface, under a faint twinkling starfield. The
9
- * mark and water share one continuous gradient so the sweep reads across the
10
- * whole scene; the water surface drifts each frame.
6
+ * Animated setup splash, in the spirit of the Zeta visual identity: the brand
7
+ * mark — the FIGlet-rendered Latin `Z`, the ASCII form of `Ζ` — with the live
8
+ * diagonal gradient + shine sweep, rising out of a rippling, gradient-lit water
9
+ * surface, under a faint twinkling starfield. The mark and water share one
10
+ * continuous gradient so the sweep reads across the whole scene; the water
11
+ * surface drifts each frame.
11
12
  */
12
13
  export declare function renderSetupSplash(width: number, height: number, elapsedMs: number): string[];
13
14
  /**
@@ -98,6 +98,7 @@ export interface CompactionBoundaries {
98
98
  export declare function computeCompactionBoundaries(compactionSettings: CompactionSettings, contextWindow: number, speculationLeadTokens?: number): CompactionBoundaries | null;
99
99
  /** Stable inputs used to cache non-message token estimates. */
100
100
  export interface NonMessageTokenSource {
101
+ readonly model?: Model;
101
102
  readonly systemPrompt?: readonly string[];
102
103
  readonly agent?: {
103
104
  readonly state?: {
@@ -137,6 +138,8 @@ export declare function invalidateToolSchemaMetadata(tools: ToolSchemaSource): v
137
138
  * {@link invalidateToolSchemaMetadata} when those inputs change.
138
139
  */
139
140
  export declare function estimateToolSchemaTokens(tools: ToolSchemaSource, tokenizer: Tokenizer, sourceRevision?: number): number;
141
+ /** Count schemas carried on every request, excluding server-side deferred catalogs. */
142
+ export declare function estimateContextToolSchemaTokens(tools: ToolSchemaSource, tokenizer: Tokenizer, model: Model | undefined, sourceRevision?: number): number;
140
143
  export declare function computeNonMessageTokens(session: NonMessageTokenSource, tokenizer: Tokenizer, sourceRevision?: number): number;
141
144
  /**
142
145
  * Shared helper for the four non-message token totals used by
@@ -155,7 +158,7 @@ export declare function computeNonMessageBreakdown(session: NonMessageTokenSourc
155
158
  * session and model.
156
159
  */
157
160
  export declare function computeContextBreakdown(session: ContextUsageSession, options: ContextUsageOptions): ContextBreakdown;
158
- /** The `/context` title: the model and its window once a model is selected. */
161
+ /** The `/context` title: the model once one is selected (the body leads with its window). */
159
162
  export declare function contextUsageHead(breakdown: ContextBreakdown): TspText;
160
163
  /**
161
164
  * Native context-usage panel for terminals without `meter`: the cell grid as
@@ -97,11 +97,13 @@ export interface FooterSession {
97
97
  autoResolvedThinkingLevel(): string | undefined;
98
98
  getContextUsage: StatusLineSession["getContextUsage"];
99
99
  modelRegistry: Pick<StatusLineSession["modelRegistry"], "isUsingOAuth">;
100
+ /**
101
+ * Cumulative session rollup. Unlike the active-window stats it spans every
102
+ * entry in the session, so compaction does not reset the counters, and it
103
+ * folds in usage carried by completed `task` tool results.
104
+ */
100
105
  sessionManager: {
101
- getEntries(): readonly {
102
- type: string;
103
- message?: AgentMessage;
104
- }[];
106
+ getUsageStatistics: StatusLineSession["sessionManager"]["getUsageStatistics"];
105
107
  };
106
108
  }
107
109
  /**
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Status line for the speculative first frame, before any session exists.
3
3
  *
4
- * InteractiveMode persists {@link StatusLineStartupData} (settings plus the last
5
- * session's model and thinking state); the next launch renders it through the
6
- * real {@link StatusLineComponent} as a fresh, unnamed session at the live
7
- * terminal width. Path and git branch are read live; context usage is reported
8
- * unknown so the gauge shows the window without a percent.
4
+ * InteractiveMode persists {@link StatusLineStartupData} (settings plus the
5
+ * resolved default role model and status inputs); the next launch renders it
6
+ * through the real {@link StatusLineComponent} as a fresh, unnamed session at
7
+ * the live terminal width. Path and git branch are read live; context usage is
8
+ * reported unknown so the gauge shows the window without a percent.
9
9
  *
10
10
  * @example
11
11
  * ```ts ignore
@@ -22,7 +22,7 @@ import type { StatusLineSettings } from "./types.js";
22
22
  export interface StatusLineStartupData {
23
23
  readonly settings: StatusLineSettings;
24
24
  readonly gitEnabled: boolean;
25
- /** Model of the last session; the next fresh session usually starts on it too. */
25
+ /** Model resolved for the next fresh session's default role. */
26
26
  readonly model?: Model;
27
27
  readonly thinkingLevel?: ThinkingLevel;
28
28
  readonly autoThinking: boolean;
@@ -31,6 +31,9 @@ export interface CollabStatus {
31
31
  stateOverride?: CollabSessionState | null;
32
32
  }
33
33
  export interface StatusLineSegmentOptions {
34
+ pi?: {
35
+ showProfile?: boolean;
36
+ };
34
37
  model?: {
35
38
  showThinkingLevel?: boolean;
36
39
  };