@theoremjs/react 0.3.0 → 0.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 (258) hide show
  1. package/README.md +728 -202
  2. package/client/composer-hints.js +1 -1
  3. package/client/decision-images.d.ts +76 -0
  4. package/client/decision-images.js +139 -0
  5. package/client/decision-transport.d.ts +26 -4
  6. package/client/decision-transport.js +79 -6
  7. package/client/embedding-input.d.ts +84 -0
  8. package/client/embedding-input.js +194 -0
  9. package/client/embedding-space.d.ts +82 -0
  10. package/client/embedding-space.js +389 -0
  11. package/client/embedding-transport.d.ts +40 -0
  12. package/client/embedding-transport.js +71 -0
  13. package/client/failure.d.ts +7 -10
  14. package/client/failure.js +9 -9
  15. package/client/host-call.d.ts +1 -1
  16. package/client/host-call.js +7 -2
  17. package/client/host-transport.d.ts +2 -0
  18. package/client/host-transport.js +3 -2
  19. package/client/index.d.ts +19 -11
  20. package/client/index.js +14 -10
  21. package/client/ink-waveform.d.ts +1 -1
  22. package/client/ink-waveform.js +1 -2
  23. package/client/live/apply-live-turn-tool-event.js +1 -1
  24. package/client/live/live-captions.d.ts +30 -0
  25. package/client/live/live-captions.js +105 -1
  26. package/client/live/live-mic-forward.d.ts +1 -0
  27. package/client/live/live-mic-forward.js +11 -2
  28. package/client/live/live-page-tool.d.ts +34 -0
  29. package/client/live/live-page-tool.js +11 -0
  30. package/client/live/live-state.d.ts +4 -2
  31. package/client/live/live-state.js +2 -0
  32. package/client/live/live-video.js +1 -1
  33. package/client/live/run-live-tool-call.d.ts +7 -2
  34. package/client/live/run-live-tool-call.js +48 -10
  35. package/client/live/use-live-caption-log.d.ts +17 -0
  36. package/client/live/use-live-caption-log.js +51 -0
  37. package/client/live-client.d.ts +52 -4
  38. package/client/live-client.js +250 -59
  39. package/client/live-messages.d.ts +51 -13
  40. package/client/live-messages.js +42 -9
  41. package/client/page-dispatch.d.ts +15 -0
  42. package/client/page-dispatch.js +63 -0
  43. package/client/run-commit.d.ts +16 -43
  44. package/client/run-commit.js +26 -101
  45. package/client/run-session.d.ts +40 -41
  46. package/client/run-session.js +104 -112
  47. package/client/schema-fields.js +27 -6
  48. package/client/shaped-data.js +37 -8
  49. package/client/source-citations.js +1 -1
  50. package/client/space-geometry.d.ts +39 -0
  51. package/client/space-geometry.js +183 -0
  52. package/client/state-fields.js +1 -1
  53. package/client/tool-result.js +30 -12
  54. package/client/tool-resume.d.ts +18 -1
  55. package/client/tool-resume.js +4 -1
  56. package/client/trace-feed.d.ts +1 -1
  57. package/client/trace-story.d.ts +2 -2
  58. package/client/trace-story.js +43 -19
  59. package/client/trace-view.d.ts +2 -2
  60. package/client/trace-view.js +56 -16
  61. package/client/transcript-groups.d.ts +28 -2
  62. package/client/transcript-groups.js +63 -13
  63. package/client/transcript-schema.d.ts +10 -0
  64. package/client/transcript-schema.js +120 -0
  65. package/client/transport.d.ts +114 -26
  66. package/client/transport.js +106 -32
  67. package/client/turn-client.d.ts +17 -8
  68. package/client/turn-client.js +26 -31
  69. package/client/voice-recorder.d.ts +1 -1
  70. package/client/voice-recorder.js +2 -5
  71. package/client/wire-line.js +5 -5
  72. package/client/worklets/mic-capture.js +9 -9
  73. package/components/InkWaveform.d.ts +12 -1
  74. package/components/InkWaveform.js +65 -42
  75. package/components/live/use-live-runner-controls.d.ts +3 -4
  76. package/components/live/use-live-runner-controls.js +6 -10
  77. package/components/live/use-live-runner-model.d.ts +10 -6
  78. package/components/live/use-live-runner-model.js +29 -14
  79. package/components/live/use-live-runner-ui.d.ts +10 -8
  80. package/components/live/use-live-runner-ui.js +19 -11
  81. package/components/live/use-live-session-client.d.ts +4 -4
  82. package/components/live/use-live-session-client.js +11 -8
  83. package/components/use-composer-voice.d.ts +4 -4
  84. package/components/use-composer-voice.js +8 -8
  85. package/components/use-editor-selection.js +4 -1
  86. package/components/use-voice-playback.d.ts +2 -1
  87. package/components/use-voice-playback.js +4 -4
  88. package/hooks/use-described.d.ts +5 -1
  89. package/hooks/use-described.js +11 -9
  90. package/hooks/use-embedding-index.d.ts +27 -0
  91. package/hooks/use-embedding-index.js +43 -0
  92. package/hooks/use-one-call.d.ts +31 -0
  93. package/hooks/use-one-call.js +76 -0
  94. package/hooks/use-page-tool-warnings.d.ts +6 -0
  95. package/hooks/use-page-tool-warnings.js +25 -0
  96. package/hooks/use-second-ticker.d.ts +2 -0
  97. package/hooks/use-second-ticker.js +13 -0
  98. package/hooks/use-theorem-chat-actions.d.ts +25 -21
  99. package/hooks/use-theorem-chat-actions.js +67 -45
  100. package/hooks/use-theorem-chat-state.d.ts +6 -6
  101. package/hooks/use-theorem-chat-state.js +13 -9
  102. package/hooks/use-theorem-chat.d.ts +48 -14
  103. package/hooks/use-theorem-chat.js +329 -141
  104. package/hooks/use-theorem-decision.d.ts +5 -10
  105. package/hooks/use-theorem-decision.js +4 -67
  106. package/hooks/use-theorem-embedding.d.ts +18 -0
  107. package/hooks/use-theorem-embedding.js +12 -0
  108. package/hooks/use-theorem-host.d.ts +5 -4
  109. package/hooks/use-theorem-host.js +26 -8
  110. package/hooks/use-theorem-interface.d.ts +6 -3
  111. package/hooks/use-theorem-interface.js +12 -22
  112. package/index.d.ts +6 -3
  113. package/index.js +5 -2
  114. package/live.d.ts +1 -0
  115. package/live.js +1 -1
  116. package/package.json +6 -5
  117. package/server/checkpoint-ownership.d.ts +6 -0
  118. package/server/checkpoint-ownership.js +42 -0
  119. package/server/conversation-store.d.ts +92 -0
  120. package/server/conversation-store.js +131 -0
  121. package/server/conversation.d.ts +193 -0
  122. package/server/conversation.js +552 -0
  123. package/server/decision-handler.d.ts +12 -4
  124. package/server/decision-handler.js +29 -38
  125. package/server/embedding-handler.d.ts +33 -0
  126. package/server/embedding-handler.js +45 -0
  127. package/server/handler.d.ts +58 -20
  128. package/server/handler.js +441 -238
  129. package/server/mod.d.ts +15 -6
  130. package/server/mod.js +13 -5
  131. package/server/page-dispatch.d.ts +22 -0
  132. package/server/page-dispatch.js +127 -0
  133. package/server/request-body.d.ts +2 -0
  134. package/server/request-body.js +42 -0
  135. package/server/request-check.d.ts +6 -1
  136. package/server/request-check.js +27 -12
  137. package/server/session-authority.d.ts +8 -0
  138. package/server/session-authority.js +78 -0
  139. package/server/session-boundary.d.ts +26 -0
  140. package/server/session-boundary.js +64 -0
  141. package/server/session-identity.d.ts +16 -0
  142. package/server/session-identity.js +41 -0
  143. package/server/session-limits.d.ts +12 -0
  144. package/server/session-limits.js +59 -0
  145. package/server/session-store.d.ts +69 -20
  146. package/server/session-store.js +220 -5
  147. package/server/single-action.d.ts +21 -0
  148. package/server/single-action.js +30 -0
  149. package/server/steer-inbox.js +1 -1
  150. package/server/tool-operations.d.ts +6 -0
  151. package/server/tool-operations.js +132 -0
  152. package/server/turn-input.d.ts +10 -0
  153. package/server/turn-input.js +29 -0
  154. package/styles/ink-controls.css +78 -78
  155. package/ui/CardWall.d.ts +10 -0
  156. package/ui/CardWall.js +61 -0
  157. package/ui/ChatComposerBar.d.ts +28 -5
  158. package/ui/ChatComposerBar.js +85 -30
  159. package/ui/ChatTranscript.d.ts +14 -1
  160. package/ui/ChatTranscript.js +110 -57
  161. package/ui/ConsoleFrame.d.ts +61 -4
  162. package/ui/ConsoleFrame.js +109 -9
  163. package/ui/DecisionAnswers.d.ts +40 -2
  164. package/ui/DecisionAnswers.js +166 -35
  165. package/ui/DecisionImages.d.ts +16 -0
  166. package/ui/DecisionImages.js +46 -0
  167. package/ui/EmbeddingDocuments.d.ts +78 -0
  168. package/ui/EmbeddingDocuments.js +278 -0
  169. package/ui/EmbeddingQuery.d.ts +27 -0
  170. package/ui/EmbeddingQuery.js +95 -0
  171. package/ui/EmbeddingResults.d.ts +41 -0
  172. package/ui/EmbeddingResults.js +165 -0
  173. package/ui/EmbeddingSpace.d.ts +26 -0
  174. package/ui/EmbeddingSpace.js +106 -0
  175. package/ui/LiveCaptionsPanel.d.ts +22 -0
  176. package/ui/LiveCaptionsPanel.js +27 -0
  177. package/ui/LiveRunner.d.ts +6 -4
  178. package/ui/LiveRunner.js +42 -55
  179. package/ui/PaneState.d.ts +33 -0
  180. package/ui/PaneState.js +50 -0
  181. package/ui/SchemaFields.d.ts +1 -1
  182. package/ui/SchemaFields.js +54 -26
  183. package/ui/ShapedData.js +73 -28
  184. package/ui/SidePanel.d.ts +74 -5
  185. package/ui/SidePanel.js +82 -9
  186. package/ui/StateFields.d.ts +10 -2
  187. package/ui/StateFields.js +56 -13
  188. package/ui/TheoremChat.d.ts +65 -14
  189. package/ui/TheoremChat.js +66 -78
  190. package/ui/TheoremDecision.d.ts +12 -20
  191. package/ui/TheoremDecision.js +78 -35
  192. package/ui/TheoremEmbedding.d.ts +27 -0
  193. package/ui/TheoremEmbedding.js +122 -0
  194. package/ui/TheoremHost.d.ts +22 -5
  195. package/ui/TheoremHost.js +127 -37
  196. package/ui/ToolGateCard.d.ts +5 -1
  197. package/ui/ToolGateCard.js +30 -23
  198. package/ui/ToolResult.js +12 -10
  199. package/ui/ToolResultCharts.js +29 -12
  200. package/ui/TraceCharts.d.ts +2 -2
  201. package/ui/TraceCharts.js +48 -17
  202. package/ui/TraceGuardrails.d.ts +3 -2
  203. package/ui/TraceGuardrails.js +24 -6
  204. package/ui/TraceInspector.d.ts +11 -1
  205. package/ui/TraceInspector.js +45 -28
  206. package/ui/TraceInspectorPanel.d.ts +31 -9
  207. package/ui/TraceInspectorPanel.js +77 -39
  208. package/ui/TraceOverview.d.ts +7 -3
  209. package/ui/TraceOverview.js +44 -14
  210. package/ui/TraceSpanDetail.js +24 -22
  211. package/ui/TraceStory.js +9 -8
  212. package/ui/TraceValues.js +19 -9
  213. package/ui/TraceWaterfall.js +12 -9
  214. package/ui/VoiceNote.js +4 -4
  215. package/ui/approval-heading.d.ts +4 -0
  216. package/ui/approval-heading.js +9 -0
  217. package/ui/arrive.d.ts +18 -0
  218. package/ui/arrive.js +46 -0
  219. package/ui/built/theme.css +86 -68
  220. package/ui/built/theme.css.d.ts +9 -0
  221. package/ui/built/theorem.d.ts +3 -3
  222. package/ui/built/theorem.js +34 -5
  223. package/ui/built/theorem.variants.d.ts +8 -2
  224. package/ui/code-language.d.ts +12 -0
  225. package/ui/code-language.js +50 -0
  226. package/ui/disclosure-motion.js +53 -9
  227. package/ui/embedding-space-gl.d.ts +37 -0
  228. package/ui/embedding-space-gl.js +663 -0
  229. package/ui/embedding-space-view.d.ts +8 -0
  230. package/ui/embedding-space-view.js +8 -0
  231. package/ui/glide.d.ts +7 -0
  232. package/ui/glide.js +44 -0
  233. package/ui/icons.js +2 -1
  234. package/ui/index.d.ts +20 -9
  235. package/ui/index.js +20 -10
  236. package/ui/labels-provider.js +5 -2
  237. package/ui/labels.d.ts +374 -85
  238. package/ui/labels.js +1028 -188
  239. package/ui/markdown-plugins.d.ts +9 -0
  240. package/ui/markdown-plugins.js +13 -0
  241. package/ui/mcp-icon.d.ts +6 -0
  242. package/ui/mcp-icon.js +8 -0
  243. package/ui/row-keys.d.ts +19 -0
  244. package/ui/row-keys.js +33 -0
  245. package/ui/theme.d.ts +1 -1
  246. package/ui/theme.js +2 -2
  247. package/ui/theorem-theme.js +32 -10
  248. package/ui/trace-palette.d.ts +2 -16
  249. package/ui/trace-palette.js +2 -16
  250. package/ui/trace-patterns.d.ts +11 -3
  251. package/ui/trace-patterns.js +16 -3
  252. package/ui/transcript-copy-text.js +1 -0
  253. package/ui/wall-columns.d.ts +8 -0
  254. package/ui/wall-columns.js +19 -0
  255. package/client/walk-away.d.ts +0 -34
  256. package/client/walk-away.js +0 -48
  257. package/server/walk-away.d.ts +0 -22
  258. package/server/walk-away.js +0 -41
package/ui/labels.d.ts CHANGED
@@ -3,13 +3,13 @@
3
3
  * the same mechanism that words Astryx's own components (`@astryx.*`), so one
4
4
  * override table replaces any line on screen, per locale. Messages are ICU
5
5
  * (`{handle}`, `{n, plural, …}`); `params` names the values each one is given.
6
- * Failures are worded by the profile lexicon, not here.
6
+ * Failures are worded by the profile labels, not here.
7
7
  *
8
8
  * @module
9
9
  */
10
10
  import type { ComposerDrawerSummary } from '../client/composer-drawer.ts';
11
11
  import type { LiveState } from '../client/live/live-state.ts';
12
- import type { WorkStatus } from '../client/transcript-groups.ts';
12
+ import type { TurnUsage, WorkStatus } from '../client/transcript-groups.ts';
13
13
  export declare const THEOREM_UI_CATALOG: {
14
14
  readonly '@theorem.agent.handle': {
15
15
  readonly defaultMessage: "@{handle}";
@@ -57,14 +57,6 @@ export declare const THEOREM_UI_CATALOG: {
57
57
  readonly defaultMessage: "More send options";
58
58
  readonly description: "Menu button beside send.";
59
59
  };
60
- readonly '@theorem.composer.model': {
61
- readonly defaultMessage: "Model";
62
- readonly description: "Model selector (screen readers).";
63
- };
64
- readonly '@theorem.composer.effort': {
65
- readonly defaultMessage: "Effort";
66
- readonly description: "Effort selector (screen readers).";
67
- };
68
60
  readonly '@theorem.composer.menu.queue': {
69
61
  readonly defaultMessage: "Queue";
70
62
  readonly description: "Send menu item.";
@@ -193,6 +185,10 @@ export declare const THEOREM_UI_CATALOG: {
193
185
  readonly defaultMessage: "now";
194
186
  readonly description: "Message time during its first minute.";
195
187
  };
188
+ readonly '@theorem.transcript.failed': {
189
+ readonly defaultMessage: "failed";
190
+ readonly description: "Message status: the turn failed. The reason shows on hover.";
191
+ };
196
192
  readonly '@theorem.transcript.generated_image': {
197
193
  readonly defaultMessage: "Generated image";
198
194
  readonly description: "Alt text for a generated image.";
@@ -229,13 +225,18 @@ export declare const THEOREM_UI_CATALOG: {
229
225
  readonly defaultMessage: "Error";
230
226
  readonly description: "A failed tool call's failure, in its detail.";
231
227
  };
228
+ readonly '@theorem.transcript.tokens': {
229
+ readonly defaultMessage: "{count, plural, one {# token} other {# tokens}}";
230
+ readonly description: "Tokens a reply used, under it, or an agent tool's called agent used, on its call row.";
231
+ readonly params: readonly ["count"];
232
+ };
232
233
  readonly '@theorem.data.view': {
233
234
  readonly defaultMessage: "View as";
234
235
  readonly description: "Switch between tool data drawn by its shape and its JSON.";
235
236
  };
236
237
  readonly '@theorem.data.shaped': {
237
238
  readonly defaultMessage: "Data";
238
- readonly description: "Tool data drawn as fields, sections and tables.";
239
+ readonly description: "Tool data drawn as fields, sections, and tables.";
239
240
  };
240
241
  readonly '@theorem.data.json': {
241
242
  readonly defaultMessage: "JSON";
@@ -320,62 +321,33 @@ export declare const THEOREM_UI_CATALOG: {
320
321
  readonly description: "Minutes and seconds.";
321
322
  readonly params: readonly ["minutes", "seconds"];
322
323
  };
323
- readonly '@theorem.gate.approval.badge': {
324
- readonly defaultMessage: "Approval required";
325
- readonly description: "Tool approval card badge.";
326
- };
327
324
  readonly '@theorem.gate.approval.title': {
328
- readonly defaultMessage: "Tool:";
329
- readonly description: "Before the tool name on the approval card.";
325
+ readonly defaultMessage: "{agent} wants to {request}";
326
+ readonly description: "Approval card heading. {agent} is the agent's handle; {request} is what the call would do, e.g. 'check the weather'.";
327
+ readonly params: readonly ["agent", "request"];
328
+ };
329
+ readonly '@theorem.gate.approval.title_no_agent': {
330
+ readonly defaultMessage: "The agent wants to {request}";
331
+ readonly description: "Approval card heading when the host names no agent.";
332
+ readonly params: readonly ["request"];
333
+ };
334
+ readonly '@theorem.gate.approval.use_tool': {
335
+ readonly defaultMessage: "use {tool}";
336
+ readonly description: "The {request} in the heading when the tool sets no labels.request. {tool} is the tool's name in words.";
337
+ readonly params: readonly ["tool"];
330
338
  };
331
339
  readonly '@theorem.gate.approval.input': {
332
- readonly defaultMessage: "Input arguments";
340
+ readonly defaultMessage: "Details";
333
341
  readonly description: "Expands the arguments the tool would run with.";
334
342
  };
335
343
  readonly '@theorem.gate.approval.deny': {
336
- readonly defaultMessage: "Deny";
344
+ readonly defaultMessage: "Reject";
337
345
  readonly description: "Approval card button.";
338
346
  };
339
347
  readonly '@theorem.gate.approval.approve': {
340
348
  readonly defaultMessage: "Approve";
341
349
  readonly description: "Approval card button.";
342
350
  };
343
- readonly '@theorem.gate.approval.denied': {
344
- readonly defaultMessage: "Denied";
345
- readonly description: "After denying.";
346
- };
347
- readonly '@theorem.gate.approval.approved_session': {
348
- readonly defaultMessage: "Approved for this session";
349
- readonly description: "After approving a tool whose consent lasts the session.";
350
- };
351
- readonly '@theorem.gate.approval.approved_once': {
352
- readonly defaultMessage: "Approved once";
353
- readonly description: "After approving a single run.";
354
- };
355
- readonly '@theorem.gate.tag.confirmation': {
356
- readonly defaultMessage: "confirmation";
357
- readonly description: "Gate kind tag.";
358
- };
359
- readonly '@theorem.gate.tag.permission': {
360
- readonly defaultMessage: "permission";
361
- readonly description: "Gate kind tag.";
362
- };
363
- readonly '@theorem.gate.tag.auth': {
364
- readonly defaultMessage: "auth";
365
- readonly description: "Gate kind tag.";
366
- };
367
- readonly '@theorem.gate.tag.auto': {
368
- readonly defaultMessage: "auto";
369
- readonly description: "Tool permission tag.";
370
- };
371
- readonly '@theorem.gate.tag.session_consent': {
372
- readonly defaultMessage: "session_consent";
373
- readonly description: "Tool permission tag.";
374
- };
375
- readonly '@theorem.gate.tag.always_confirm': {
376
- readonly defaultMessage: "always_confirm";
377
- readonly description: "Tool permission tag.";
378
- };
379
351
  readonly '@theorem.gate.tag.bearer': {
380
352
  readonly defaultMessage: "bearer";
381
353
  readonly description: "Credential type tag.";
@@ -388,13 +360,10 @@ export declare const THEOREM_UI_CATALOG: {
388
360
  readonly defaultMessage: "oauth2";
389
361
  readonly description: "Credential type tag.";
390
362
  };
391
- readonly '@theorem.gate.auth.badge': {
392
- readonly defaultMessage: "Sign-in required";
393
- readonly description: "Credential card badge.";
394
- };
395
363
  readonly '@theorem.gate.auth.title': {
396
- readonly defaultMessage: "Authentication:";
397
- readonly description: "Before the tool name on the credential card.";
364
+ readonly defaultMessage: "Sign in to use {tool}";
365
+ readonly description: "Credential card heading. {tool} is the tool's name in words.";
366
+ readonly params: readonly ["tool"];
398
367
  };
399
368
  readonly '@theorem.gate.auth.resource': {
400
369
  readonly defaultMessage: "Resource: {resource}";
@@ -429,7 +398,7 @@ export declare const THEOREM_UI_CATALOG: {
429
398
  };
430
399
  readonly '@theorem.gate.auth.secret_note': {
431
400
  readonly defaultMessage: " ";
432
- readonly description: "Under the secret field: how the host handles the credential. Blank by default, since only the host knows; the playground says it is used for one call.";
401
+ readonly description: "Under the secret field: how the host handles the credential. Blank by default, since only the host knows; the studio says it is used for one call.";
433
402
  };
434
403
  readonly '@theorem.gate.auth.submit': {
435
404
  readonly defaultMessage: "Submit & continue";
@@ -503,6 +472,10 @@ export declare const THEOREM_UI_CATALOG: {
503
472
  readonly description: "The state is larger than the profile's limit.";
504
473
  readonly params: readonly ["limit"];
505
474
  };
475
+ readonly '@theorem.decision.answers': {
476
+ readonly defaultMessage: "Answers";
477
+ readonly description: "The decision response column.";
478
+ };
506
479
  readonly '@theorem.decision.decide': {
507
480
  readonly defaultMessage: "Decide";
508
481
  readonly description: "Asks the questions about the state.";
@@ -542,11 +515,291 @@ export declare const THEOREM_UI_CATALOG: {
542
515
  readonly defaultMessage: "Noul";
543
516
  readonly description: "A question answered with one number.";
544
517
  };
518
+ readonly '@theorem.decision.type.box': {
519
+ readonly defaultMessage: "Box";
520
+ readonly description: "A question answered with one box in an image.";
521
+ };
522
+ readonly '@theorem.decision.box_edges': {
523
+ readonly defaultMessage: "Left {left}, top {top}, right {right}, bottom {bottom}";
524
+ readonly description: "Where a box sits in its image, each edge as a share of the image from its top-left corner.";
525
+ readonly params: readonly ["left", "top", "right", "bottom"];
526
+ };
527
+ readonly '@theorem.decision.add_image': {
528
+ readonly defaultMessage: "Add an image";
529
+ readonly description: "The drop area under the state: each image dropped or chosen becomes a state field.";
530
+ };
531
+ readonly '@theorem.decision.add_image_hint': {
532
+ readonly defaultMessage: "Drop a PNG or JPEG, or choose one. It becomes a field the questions can name.";
533
+ readonly description: "What the drop area under the state says it does.";
534
+ };
535
+ readonly '@theorem.decision.replace_image': {
536
+ readonly defaultMessage: "Replace";
537
+ readonly description: "An image field's file input, which swaps in another PNG or JPEG.";
538
+ };
539
+ readonly '@theorem.decision.image_bad': {
540
+ readonly defaultMessage: "{file} is not a PNG or JPEG.";
541
+ readonly description: "A file attached as an image that is neither.";
542
+ readonly params: readonly ["file"];
543
+ };
544
+ readonly '@theorem.decision.edit_question': {
545
+ readonly defaultMessage: "Edit {question}";
546
+ readonly description: "The button on an answer that opens its question where it is set up. The page shows it only when it can.";
547
+ readonly params: readonly ["question"];
548
+ };
549
+ readonly '@theorem.decision.box_in': {
550
+ readonly defaultMessage: "The box, cut from the image";
551
+ readonly description: "The alt text of the part of the image a box answer covers.";
552
+ };
553
+ readonly '@theorem.decision.open_box': {
554
+ readonly defaultMessage: "See the box in the whole image";
555
+ readonly description: "The cut-out box on an answer, which opens the whole image with the box outlined.";
556
+ };
557
+ readonly '@theorem.decision.box_marked': {
558
+ readonly defaultMessage: "The whole image, the box outlined and the rest shaded";
559
+ readonly description: "The alt text of the whole image a box answer opens.";
560
+ };
545
561
  readonly '@theorem.decision.tokens': {
546
562
  readonly defaultMessage: "{count, plural, one {# token} other {# tokens}}";
547
563
  readonly description: "Input tokens the decision used, in the line under the answers.";
548
564
  readonly params: readonly ["count"];
549
565
  };
566
+ readonly '@theorem.embedding.documents': {
567
+ readonly defaultMessage: "Documents";
568
+ readonly description: "What a search looks through: the texts and files to embed (card title).";
569
+ };
570
+ readonly '@theorem.embedding.document': {
571
+ readonly defaultMessage: "Document {number}";
572
+ readonly description: "One document, by its place in the list.";
573
+ readonly params: readonly ["number"];
574
+ };
575
+ readonly '@theorem.embedding.text': {
576
+ readonly defaultMessage: "Text";
577
+ readonly description: "Text to split into documents (field label).";
578
+ };
579
+ readonly '@theorem.embedding.text_placeholder': {
580
+ readonly defaultMessage: "Paste text to search through";
581
+ readonly description: "The empty text field on the documents card.";
582
+ };
583
+ readonly '@theorem.embedding.split': {
584
+ readonly defaultMessage: "Split by";
585
+ readonly description: "Where the text is cut into documents (field label).";
586
+ };
587
+ readonly '@theorem.embedding.split_whole': {
588
+ readonly defaultMessage: "Nothing: one document";
589
+ readonly description: "The text is one document.";
590
+ };
591
+ readonly '@theorem.embedding.split_lines': {
592
+ readonly defaultMessage: "Lines";
593
+ readonly description: "Each line of the text is a document.";
594
+ };
595
+ readonly '@theorem.embedding.split_paragraphs': {
596
+ readonly defaultMessage: "Paragraphs";
597
+ readonly description: "Each run of text between blank lines is a document.";
598
+ };
599
+ readonly '@theorem.embedding.split_commas': {
600
+ readonly defaultMessage: "Commas";
601
+ readonly description: "Each piece of the text between commas is a document.";
602
+ };
603
+ readonly '@theorem.embedding.split_custom': {
604
+ readonly defaultMessage: "A separator you type";
605
+ readonly description: "The text is cut wherever a separator of the user’s own appears.";
606
+ };
607
+ readonly '@theorem.embedding.separator': {
608
+ readonly defaultMessage: "Separator";
609
+ readonly description: "The text the documents are cut at (field label).";
610
+ };
611
+ readonly '@theorem.embedding.files': {
612
+ readonly defaultMessage: "Files";
613
+ readonly description: "Adds files as documents (field label).";
614
+ };
615
+ readonly '@theorem.embedding.drop_files': {
616
+ readonly defaultMessage: "Drop files here, or click to upload";
617
+ readonly description: "The file field's prompt.";
618
+ };
619
+ readonly '@theorem.embedding.unreadable': {
620
+ readonly defaultMessage: "{name} couldn't be read.";
621
+ readonly description: "A chosen file the browser could not read.";
622
+ readonly params: readonly ["name"];
623
+ };
624
+ readonly '@theorem.embedding.remove': {
625
+ readonly defaultMessage: "Remove {name}";
626
+ readonly description: "Takes a document off the list.";
627
+ readonly params: readonly ["name"];
628
+ };
629
+ readonly '@theorem.embedding.from_file': {
630
+ readonly defaultMessage: "From {name}";
631
+ readonly description: "A document that is a piece of a text file, under its text.";
632
+ readonly params: readonly ["name"];
633
+ };
634
+ readonly '@theorem.embedding.from_json': {
635
+ readonly defaultMessage: "From the JSON";
636
+ readonly description: "The documents of a pasted list, as a group.";
637
+ };
638
+ readonly '@theorem.embedding.group': {
639
+ readonly defaultMessage: "{source} · {count, plural, one {# document} other {# documents}}";
640
+ readonly description: "A group of documents from one source, above its first few.";
641
+ readonly params: readonly ["source", "count"];
642
+ };
643
+ readonly '@theorem.embedding.held_file': {
644
+ readonly defaultMessage: "Held by the provider";
645
+ readonly description: "A file the provider already holds, referred to by address, beside its type.";
646
+ };
647
+ readonly '@theorem.embedding.more': {
648
+ readonly defaultMessage: "{count, plural, one {# more document} other {# more documents}}";
649
+ readonly description: "Documents past the ones the list shows.";
650
+ readonly params: readonly ["count"];
651
+ };
652
+ readonly '@theorem.embedding.invalid_json': {
653
+ readonly defaultMessage: "Not a list of documents: each is text, or an object with parts.";
654
+ readonly description: "The documents' JSON doesn't read as the inputs an embedding takes.";
655
+ };
656
+ readonly '@theorem.embedding.no_documents': {
657
+ readonly defaultMessage: "Add text or files to search through.";
658
+ readonly description: "There are no documents yet.";
659
+ };
660
+ readonly '@theorem.embedding.empty': {
661
+ readonly defaultMessage: "{name} is empty.";
662
+ readonly description: "A document or the query has no text and no file.";
663
+ readonly params: readonly ["name"];
664
+ };
665
+ readonly '@theorem.embedding.text_off': {
666
+ readonly defaultMessage: "{name} has text, and this profile embeds files only.";
667
+ readonly description: "A document or the query has text the profile does not take.";
668
+ readonly params: readonly ["name"];
669
+ };
670
+ readonly '@theorem.embedding.too_many': {
671
+ readonly defaultMessage: "One request takes at most {max} documents.";
672
+ readonly description: "A request holds more inputs than the profile's model takes in one call.";
673
+ readonly params: readonly ["max"];
674
+ };
675
+ readonly '@theorem.embedding.ready': {
676
+ readonly defaultMessage: "{count, plural, one {# document} other {# documents}} in {requests, plural, one {# request} other {# requests}}";
677
+ readonly description: "The documents are ready: how many, and how many requests the profile’s limits make them.";
678
+ readonly params: readonly ["count", "requests"];
679
+ };
680
+ readonly '@theorem.embedding.index': {
681
+ readonly defaultMessage: "Index";
682
+ readonly description: "Embeds the documents so they can be searched.";
683
+ };
684
+ readonly '@theorem.embedding.indexing': {
685
+ readonly defaultMessage: "Indexing…";
686
+ readonly description: "The index button while the documents are embedded.";
687
+ };
688
+ readonly '@theorem.embedding.indexing_progress': {
689
+ readonly defaultMessage: "Indexing {done}/{total}…";
690
+ readonly description: "The pane while the documents are embedded: the request in flight, of all of them.";
691
+ readonly params: readonly ["done", "total"];
692
+ };
693
+ readonly '@theorem.embedding.stop': {
694
+ readonly defaultMessage: "Stop";
695
+ readonly description: "Cancels the running index or search.";
696
+ };
697
+ readonly '@theorem.embedding.query': {
698
+ readonly defaultMessage: "Query";
699
+ readonly description: "What to search the documents for (card title).";
700
+ };
701
+ readonly '@theorem.embedding.query_placeholder': {
702
+ readonly defaultMessage: "What to search for";
703
+ readonly description: "The empty query field.";
704
+ };
705
+ readonly '@theorem.embedding.query_file': {
706
+ readonly defaultMessage: "Search with a file";
707
+ readonly description: "Adds a file to the query, such as an image to find documents like it.";
708
+ };
709
+ readonly '@theorem.embedding.query_invalid_json': {
710
+ readonly defaultMessage: "Not a query: text, or an object with parts.";
711
+ readonly description: "The query's JSON doesn't read as one embedding input.";
712
+ };
713
+ readonly '@theorem.embedding.stale': {
714
+ readonly defaultMessage: "The documents changed. Index them again.";
715
+ readonly description: "The documents differ from the ones last embedded.";
716
+ };
717
+ readonly '@theorem.embedding.remodelled': {
718
+ readonly defaultMessage: "The model changed. Index the documents again.";
719
+ readonly description: "The last query came from another model than the one the documents were embedded with.";
720
+ };
721
+ readonly '@theorem.embedding.search': {
722
+ readonly defaultMessage: "Search";
723
+ readonly description: "Embeds the query and ranks the documents by it.";
724
+ };
725
+ readonly '@theorem.embedding.searching': {
726
+ readonly defaultMessage: "Searching…";
727
+ readonly description: "The search button while the query is embedded.";
728
+ };
729
+ readonly '@theorem.embedding.results': {
730
+ readonly defaultMessage: "Results";
731
+ readonly description: "The index and the matches (heading).";
732
+ };
733
+ readonly '@theorem.embedding.indexed': {
734
+ readonly defaultMessage: "{count, plural, one {# document} other {# documents}}";
735
+ readonly description: "How many documents the index holds, its card’s figure.";
736
+ readonly params: readonly ["count"];
737
+ };
738
+ readonly '@theorem.embedding.view': {
739
+ readonly defaultMessage: "View";
740
+ readonly description: "Switches the index card between the space and the list of vectors.";
741
+ };
742
+ readonly '@theorem.embedding.space': {
743
+ readonly defaultMessage: "Space";
744
+ readonly description: "The index drawn in three dimensions, alike documents together.";
745
+ };
746
+ readonly '@theorem.embedding.list': {
747
+ readonly defaultMessage: "List";
748
+ readonly description: "The index as a list of documents and their vectors.";
749
+ };
750
+ readonly '@theorem.embedding.space_label': {
751
+ readonly defaultMessage: "{count, plural, one {# document} other {# documents}} drawn in three dimensions by where their vectors differ most: each document is joined to the one most like it when that pair is far more alike than the typical pair in this index, heavier the more alike, documents the lines connect share a colour, and three circles mark the planes of the axes.";
752
+ readonly description: "What the space shows, for screen readers.";
753
+ readonly params: readonly ["count"];
754
+ };
755
+ readonly '@theorem.embedding.space_query': {
756
+ readonly defaultMessage: "The query lands among its matches, with a line to each match far more alike than its typical document.";
757
+ readonly description: "What the space shows after a search, for screen readers.";
758
+ };
759
+ readonly '@theorem.embedding.space_off': {
760
+ readonly defaultMessage: "This browser can’t draw the space, so the vectors are listed.";
761
+ readonly description: "WebGL2 is unavailable, so the index card shows the list.";
762
+ };
763
+ readonly '@theorem.embedding.copy_vector': {
764
+ readonly defaultMessage: "Copy vector";
765
+ readonly description: "Copies one document's vector as JSON.";
766
+ };
767
+ readonly '@theorem.embedding.copy_vectors': {
768
+ readonly defaultMessage: "Copy all";
769
+ readonly description: "Copies every vector in the index as JSON, in document order.";
770
+ };
771
+ readonly '@theorem.embedding.copied': {
772
+ readonly defaultMessage: "Copied";
773
+ readonly description: "Right after copying a vector.";
774
+ };
775
+ readonly '@theorem.embedding.width': {
776
+ readonly defaultMessage: "{dimensions, plural, one {# dimension} other {# dimensions}}";
777
+ readonly description: "How wide a vector is, after its first values in the list.";
778
+ readonly params: readonly ["dimensions"];
779
+ };
780
+ readonly '@theorem.embedding.matches': {
781
+ readonly defaultMessage: "Matches";
782
+ readonly description: "The documents most like the query, best first (card title).";
783
+ };
784
+ readonly '@theorem.embedding.matches_shown': {
785
+ readonly defaultMessage: "Top {shown} of {count}";
786
+ readonly description: "The matches card lists the best documents only.";
787
+ readonly params: readonly ["shown", "count"];
788
+ };
789
+ readonly '@theorem.embedding.best': {
790
+ readonly defaultMessage: "Best: {name}";
791
+ readonly description: "The document most like the query, under the matches figure.";
792
+ readonly params: readonly ["name"];
793
+ };
794
+ readonly '@theorem.embedding.no_matches': {
795
+ readonly defaultMessage: "No document has a vector as wide as the query’s.";
796
+ readonly description: "The query and the documents were embedded by models of different widths.";
797
+ };
798
+ readonly '@theorem.embedding.tokens': {
799
+ readonly defaultMessage: "{count, plural, one {# token} other {# tokens}}";
800
+ readonly description: "Input tokens a call used, in the line under the results.";
801
+ readonly params: readonly ["count"];
802
+ };
550
803
  readonly '@theorem.host.tool': {
551
804
  readonly defaultMessage: "Tool";
552
805
  readonly description: "Picks which of the host’s tools to call (field label).";
@@ -604,38 +857,43 @@ export declare const THEOREM_UI_CATALOG: {
604
857
  readonly defaultMessage: "MCP";
605
858
  readonly description: "A tool served by an MCP server.";
606
859
  };
607
- readonly '@theorem.host.access.read-only': {
608
- readonly defaultMessage: "Read-only";
860
+ readonly '@theorem.tool.access.read-only': {
861
+ readonly defaultMessage: "Read only";
609
862
  readonly description: "A tool that only reads.";
610
863
  };
611
- readonly '@theorem.host.access.read-write': {
612
- readonly defaultMessage: "Read-write";
864
+ readonly '@theorem.tool.access.read-write': {
865
+ readonly defaultMessage: "Read and write";
613
866
  readonly description: "A tool that can change things.";
614
867
  };
615
- readonly '@theorem.host.access.destructive': {
868
+ readonly '@theorem.tool.access.destructive': {
616
869
  readonly defaultMessage: "Destructive";
617
870
  readonly description: "A tool that can delete or overwrite.";
618
871
  };
619
872
  readonly '@theorem.host.status.running': {
620
- readonly defaultMessage: "Running";
873
+ readonly defaultMessage: "running";
621
874
  readonly description: "A tool call in progress.";
622
875
  };
623
876
  readonly '@theorem.host.status.gate': {
624
- readonly defaultMessage: "Waiting";
877
+ readonly defaultMessage: "waiting";
625
878
  readonly description: "A tool call paused on approval or sign-in.";
626
879
  };
627
880
  readonly '@theorem.host.status.complete': {
628
- readonly defaultMessage: "Done";
881
+ readonly defaultMessage: "done";
629
882
  readonly description: "A tool call that returned.";
630
883
  };
631
884
  readonly '@theorem.host.status.error': {
632
- readonly defaultMessage: "Failed";
885
+ readonly defaultMessage: "failed";
633
886
  readonly description: "A tool call that failed.";
634
887
  };
635
888
  readonly '@theorem.host.status.cancel': {
636
- readonly defaultMessage: "Stopped";
889
+ readonly defaultMessage: "stopped";
637
890
  readonly description: "A tool call that was cancelled.";
638
891
  };
892
+ readonly '@theorem.host.finished': {
893
+ readonly defaultMessage: "{activity} in {duration}";
894
+ readonly description: "A finished tool call: what it did, and how long it took.";
895
+ readonly params: readonly ["activity", "duration"];
896
+ };
639
897
  readonly '@theorem.panel.trace.name': {
640
898
  readonly defaultMessage: "Trace";
641
899
  readonly description: "Trace side panel (screen readers).";
@@ -652,6 +910,11 @@ export declare const THEOREM_UI_CATALOG: {
652
910
  readonly defaultMessage: "Resize trace";
653
911
  readonly description: "Trace panel drag handle.";
654
912
  };
913
+ readonly '@theorem.panel.resize': {
914
+ readonly defaultMessage: "Resize {name}";
915
+ readonly description: "Drag handle for a named console panel.";
916
+ readonly params: readonly ["name"];
917
+ };
655
918
  readonly '@theorem.panel.trace.empty.title': {
656
919
  readonly defaultMessage: "No trace yet";
657
920
  readonly description: "Empty trace panel.";
@@ -682,7 +945,7 @@ export declare const THEOREM_UI_CATALOG: {
682
945
  readonly description: "Search field matching any text a span holds.";
683
946
  };
684
947
  readonly '@theorem.panel.trace.search.text.description': {
685
- readonly defaultMessage: "Names, values and stored text.";
948
+ readonly defaultMessage: "Names, values, and stored text.";
686
949
  readonly description: "What the any-text search field matches.";
687
950
  };
688
951
  readonly '@theorem.panel.trace.no_match': {
@@ -695,7 +958,7 @@ export declare const THEOREM_UI_CATALOG: {
695
958
  };
696
959
  readonly '@theorem.panel.trace.show_text': {
697
960
  readonly defaultMessage: "Show text";
698
- readonly description: "Reveals stored text, JSON or messages.";
961
+ readonly description: "Reveals stored text, JSON, or messages.";
699
962
  };
700
963
  readonly '@theorem.panel.trace.hide_text': {
701
964
  readonly defaultMessage: "Hide text";
@@ -837,9 +1100,17 @@ export declare const THEOREM_UI_CATALOG: {
837
1100
  readonly description: "A guardrail check: the tool the checked text came from.";
838
1101
  readonly params: readonly ["tool"];
839
1102
  };
1103
+ readonly '@theorem.panel.trace.guardrails.tainted': {
1104
+ readonly defaultMessage: "Tainted";
1105
+ readonly description: "A guardrail check: a tool that writes or deletes was called after the turn read remote content.";
1106
+ };
1107
+ readonly '@theorem.panel.trace.guardrails.steered': {
1108
+ readonly defaultMessage: "Steered";
1109
+ readonly description: "A guardrail check: a tool that writes or deletes was called after the turn read remote content that looked like instructions.";
1110
+ };
840
1111
  readonly '@theorem.panel.trace.guardrails.detail': {
841
1112
  readonly defaultMessage: "{checks, plural, one {# check} other {# checks}} · {flagged, plural, =0 {all passed} other {# acted}}";
842
- readonly description: "Under the guardrail time: how many checks ran, and how many redacted, flagged or blocked.";
1113
+ readonly description: "Under the guardrail time: how many checks ran, and how many redacted, flagged, or blocked.";
843
1114
  readonly params: readonly ["checks", "flagged"];
844
1115
  };
845
1116
  readonly '@theorem.panel.trace.tokens.detail': {
@@ -849,7 +1120,7 @@ export declare const THEOREM_UI_CATALOG: {
849
1120
  };
850
1121
  readonly '@theorem.panel.trace.time': {
851
1122
  readonly defaultMessage: "Where the time went";
852
- readonly description: "Bar splitting a turn into model, tool and other time.";
1123
+ readonly description: "Bar splitting a turn into model, tool, and other time.";
853
1124
  };
854
1125
  readonly '@theorem.panel.trace.time.model': {
855
1126
  readonly defaultMessage: "Model";
@@ -861,7 +1132,7 @@ export declare const THEOREM_UI_CATALOG: {
861
1132
  };
862
1133
  readonly '@theorem.panel.trace.time.guardrails': {
863
1134
  readonly defaultMessage: "Guardrails";
864
- readonly description: "Time guardrail checks took: on the input, the stream and the answer.";
1135
+ readonly description: "Time guardrail checks took: on the input, the stream, and the answer.";
865
1136
  };
866
1137
  readonly '@theorem.panel.trace.time.hooks': {
867
1138
  readonly defaultMessage: "Hooks";
@@ -903,11 +1174,11 @@ export declare const THEOREM_UI_CATALOG: {
903
1174
  };
904
1175
  readonly '@theorem.panel.trace.charts.turnTime': {
905
1176
  readonly defaultMessage: "Time per turn";
906
- readonly description: "Chart of each turn: its model, tool and other time stacked.";
1177
+ readonly description: "Chart of each turn: its model, tool, and other time stacked.";
907
1178
  };
908
1179
  readonly '@theorem.panel.trace.charts.callTime': {
909
1180
  readonly defaultMessage: "Time per call";
910
- readonly description: "Chart of each tool call of a host's trace: its tool, check and hook time stacked.";
1181
+ readonly description: "Chart of each tool call of a host's trace: its tool, check, and hook time stacked.";
911
1182
  };
912
1183
  readonly '@theorem.panel.trace.charts.turnTokens': {
913
1184
  readonly defaultMessage: "Tokens per turn";
@@ -980,7 +1251,7 @@ export declare const THEOREM_UI_CATALOG: {
980
1251
  };
981
1252
  readonly '@theorem.panel.trace.details': {
982
1253
  readonly defaultMessage: "All details";
983
- readonly description: "A span's every attribute, event and link.";
1254
+ readonly description: "A span's every attribute, event, and link.";
984
1255
  };
985
1256
  readonly '@theorem.panel.trace.close': {
986
1257
  readonly defaultMessage: "Close";
@@ -1058,14 +1329,14 @@ export declare const THEOREM_UI_CATALOG: {
1058
1329
  readonly defaultMessage: "End call";
1059
1330
  readonly description: "Hangs up.";
1060
1331
  };
1061
- readonly '@theorem.live.controls': {
1062
- readonly defaultMessage: "Call controls";
1063
- readonly description: "The control toolbar (screen readers).";
1064
- };
1065
1332
  readonly '@theorem.live.new_session': {
1066
1333
  readonly defaultMessage: "New session";
1067
1334
  readonly description: "Captions divider between calls.";
1068
1335
  };
1336
+ readonly '@theorem.live.controls': {
1337
+ readonly defaultMessage: "Call controls";
1338
+ readonly description: "The control toolbar (screen readers).";
1339
+ };
1069
1340
  readonly '@theorem.live.camera_preview': {
1070
1341
  readonly defaultMessage: "Camera preview";
1071
1342
  readonly description: "Self-view (screen readers).";
@@ -1079,6 +1350,10 @@ export declare const THEOREM_UI_CATALOG: {
1079
1350
  readonly defaultMessage: "connecting";
1080
1351
  readonly description: "Call status.";
1081
1352
  };
1353
+ readonly '@theorem.live.state.reconnecting': {
1354
+ readonly defaultMessage: "reconnecting";
1355
+ readonly description: "Call status: the call dropped and is being taken up again.";
1356
+ };
1082
1357
  readonly '@theorem.live.state.requesting_mic': {
1083
1358
  readonly defaultMessage: "requesting mic";
1084
1359
  readonly description: "Call status.";
@@ -1108,7 +1383,7 @@ export declare const THEOREM_UI_CATALOG: {
1108
1383
  readonly description: "Call status.";
1109
1384
  };
1110
1385
  };
1111
- /** The default UI's catalog: each line's default message, description and values. */
1386
+ /** The default UI's catalog: each line's default message, description, and values. */
1112
1387
  export type TheoremUiCatalog = typeof THEOREM_UI_CATALOG;
1113
1388
  /** Every line the default UI writes. */
1114
1389
  export type TheoremLabelKey = keyof TheoremUiCatalog;
@@ -1133,8 +1408,22 @@ export type TheoremLabels = {
1133
1408
  };
1134
1409
  /** A single kind is just its word ("queued"); a mix spells out each count ("2 queued · 1 attached"). */
1135
1410
  export declare function composerDrawerLabel(t: LabelText, summary: ComposerDrawerSummary): string;
1411
+ /** What a reply or a called agent used: its tokens, then its cost when the provider gave one. */
1412
+ export declare function usageLine(t: LabelText, locale: string, tokens: TurnUsage): string;
1136
1413
  /** Wall-clock duration, matching Seance's builder-trace formatter: "<0.1ms", "0.4ms", "850ms", "3.2s", "12s", "1m 5s". */
1137
1414
  export declare function workDuration(t: LabelText, durationMs: number): string;
1415
+ /** A console result's quiet line: model, time, tokens, and cost, leaving out what it lacks. */
1416
+ export declare function resultMeta(t: LabelText, usd: Intl.NumberFormat, result: {
1417
+ model: string;
1418
+ usage?: {
1419
+ inputTokens?: number;
1420
+ costUsd?: number;
1421
+ };
1422
+ elapsedMs?: number | null;
1423
+ tokens: (count: number) => string;
1424
+ }): string;
1425
+ /** Whole-second ticker while a turn runs: "0s", "12s", "1m 5s". */
1426
+ export declare function liveDuration(t: LabelText, durationMs: number): string;
1138
1427
  /** "Working for 12s" while streaming (when the start is known), "Worked for 3.2s" after. */
1139
1428
  export declare function workStatusLabel(t: LabelText, status: WorkStatus | null): string;
1140
1429
  /** A live call's status line; `calling_tool` names the tool. */