eve 0.26.0 → 0.26.2

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 (129) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/src/chunks/{use-eve-agent-CruinZmd.js → use-eve-agent-AeQLLhu9.js} +118 -92
  3. package/dist/src/chunks/{use-eve-agent-BkztZA0v.js → use-eve-agent-PMY2WkAt.js} +118 -92
  4. package/dist/src/cli/banner.d.ts +5 -0
  5. package/dist/src/cli/banner.js +1 -1
  6. package/dist/src/cli/commands/info.d.ts +2 -0
  7. package/dist/src/cli/commands/info.js +1 -1
  8. package/dist/src/cli/dev/tui/blocks.d.ts +56 -8
  9. package/dist/src/cli/dev/tui/blocks.js +7 -7
  10. package/dist/src/cli/dev/tui/diagnostic-presentation.d.ts +2 -0
  11. package/dist/src/cli/dev/tui/diagnostic-presentation.js +3 -2
  12. package/dist/src/cli/dev/tui/file-content-cache.d.ts +35 -0
  13. package/dist/src/cli/dev/tui/file-content-cache.js +3 -0
  14. package/dist/src/cli/dev/tui/line-diff.d.ts +24 -0
  15. package/dist/src/cli/dev/tui/line-diff.js +1 -0
  16. package/dist/src/cli/dev/tui/markdown.d.ts +2 -1
  17. package/dist/src/cli/dev/tui/markdown.js +7 -3
  18. package/dist/src/cli/dev/tui/prompt-placeholder.d.ts +12 -0
  19. package/dist/src/cli/dev/tui/prompt-placeholder.js +1 -0
  20. package/dist/src/cli/dev/tui/question-panel.d.ts +24 -0
  21. package/dist/src/cli/dev/tui/question-panel.js +1 -0
  22. package/dist/src/cli/dev/tui/rail.d.ts +15 -0
  23. package/dist/src/cli/dev/tui/rail.js +1 -0
  24. package/dist/src/cli/dev/tui/runner.d.ts +22 -65
  25. package/dist/src/cli/dev/tui/runner.js +1 -1
  26. package/dist/src/cli/dev/tui/setup-commands.js +1 -1
  27. package/dist/src/cli/dev/tui/setup-issues.js +1 -1
  28. package/dist/src/cli/dev/tui/status-line.js +1 -1
  29. package/dist/src/cli/dev/tui/stream-format.d.ts +16 -3
  30. package/dist/src/cli/dev/tui/stream-format.js +1 -1
  31. package/dist/src/cli/dev/tui/subagent-pump.d.ts +127 -0
  32. package/dist/src/cli/dev/tui/subagent-pump.js +1 -0
  33. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +34 -1
  34. package/dist/src/cli/dev/tui/terminal-renderer.js +11 -10
  35. package/dist/src/cli/dev/tui/test/mock-terminal.d.ts +7 -0
  36. package/dist/src/cli/dev/tui/test/mock-terminal.js +1 -1
  37. package/dist/src/cli/dev/tui/theme.d.ts +16 -2
  38. package/dist/src/cli/dev/tui/theme.js +1 -1
  39. package/dist/src/cli/dev/tui/todo-panel.d.ts +44 -0
  40. package/dist/src/cli/dev/tui/todo-panel.js +1 -0
  41. package/dist/src/cli/dev/tui/tool-block-groups.d.ts +40 -0
  42. package/dist/src/cli/dev/tui/tool-block-groups.js +1 -0
  43. package/dist/src/cli/dev/tui/tool-presentation.d.ts +67 -0
  44. package/dist/src/cli/dev/tui/tool-presentation.js +1 -0
  45. package/dist/src/cli/dev/tui/tool-rows.d.ts +15 -0
  46. package/dist/src/cli/dev/tui/tool-rows.js +2 -0
  47. package/dist/src/cli/dev/tui/turn-clock.d.ts +36 -0
  48. package/dist/src/cli/dev/tui/turn-clock.js +1 -0
  49. package/dist/src/cli/dev/tui/types.d.ts +2 -2
  50. package/dist/src/cli/dev/ui-options.js +1 -1
  51. package/dist/src/client/index.js +1 -1
  52. package/dist/src/client/message-action-parts.d.ts +43 -0
  53. package/dist/src/client/message-action-parts.js +1 -0
  54. package/dist/src/client/message-reducer.js +1 -1
  55. package/dist/src/client/session.js +1 -1
  56. package/dist/src/compiled/.vendor-stamp.json +6 -5
  57. package/dist/src/compiled/@chat-adapter/slack/blocks.d.ts +47 -2
  58. package/dist/src/compiled/@chat-adapter/slack/blocks.js +10 -8
  59. package/dist/src/compiled/@chat-adapter/slack/index.d.ts +168 -8
  60. package/dist/src/compiled/@chat-adapter/slack/index.js +28 -28
  61. package/dist/src/compiled/@chat-adapter/slack/{types-AntsVifS.d.ts → types-CdGmMyOr.d.ts} +1 -1
  62. package/dist/src/compiled/@chat-adapter/slack/webhook.d.ts +2 -2
  63. package/dist/src/compiled/@chat-adapter/twilio/index.d.ts +1 -1
  64. package/dist/src/compiled/@chat-adapter/twilio/index.js +1 -1
  65. package/dist/src/compiled/@chat-adapter/twilio/webhook.d.ts +2 -2
  66. package/dist/src/compiled/@vercel/sandbox/index.js +12 -12
  67. package/dist/src/compiled/_chunks/node/{auth-Cuszvn7l.js → auth-BuQkq4Gr.js} +2 -2
  68. package/dist/src/compiled/_chunks/node/{dist-CdH_Yoxt.js → dist-BweCayKF.js} +42 -35
  69. package/dist/src/compiled/_chunks/node/{dist-Drt-_JVK.js → dist-DvkWiagq.js} +6 -4
  70. package/dist/src/compiled/chat/index.d.ts +17 -6
  71. package/dist/src/compiled/chat/index.js +1 -1
  72. package/dist/src/compiled/chat/{jsx-runtime-CzthIo1o.d.ts → jsx-runtime-_JEEAotp.d.ts} +125 -5
  73. package/dist/src/compiled/marked/LICENSE.md +44 -0
  74. package/dist/src/compiled/marked/index.d.ts +24 -0
  75. package/dist/src/compiled/marked/index.js +59 -0
  76. package/dist/src/compiler/model-catalog.js +1 -1
  77. package/dist/src/evals/autoevals-client.js +1 -1
  78. package/dist/src/evals/session.js +1 -1
  79. package/dist/src/execution/sandbox/bindings/vercel-credentials.js +1 -1
  80. package/dist/src/execution/sandbox/bindings/vercel-lookup.js +1 -1
  81. package/dist/src/execution/session.d.ts +0 -2
  82. package/dist/src/execution/session.js +1 -1
  83. package/dist/src/execution/skills/instructions.d.ts +3 -3
  84. package/dist/src/execution/skills/instructions.js +2 -2
  85. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  86. package/dist/src/execution/workflow-steps.js +1 -1
  87. package/dist/src/harness/messages.d.ts +7 -0
  88. package/dist/src/harness/messages.js +1 -1
  89. package/dist/src/harness/stale-input-responses.js +2 -2
  90. package/dist/src/harness/tool-loop.js +2 -2
  91. package/dist/src/internal/application/compiled-artifacts.js +9 -3
  92. package/dist/src/internal/application/package.js +1 -1
  93. package/dist/src/internal/gateway.d.ts +19 -0
  94. package/dist/src/internal/gateway.js +1 -0
  95. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
  96. package/dist/src/internal/nitro/routes/info.js +1 -1
  97. package/dist/src/internal/resolve-model-endpoint-status.d.ts +46 -3
  98. package/dist/src/internal/resolve-model-endpoint-status.js +1 -1
  99. package/dist/src/internal/user-agent.d.ts +11 -0
  100. package/dist/src/internal/user-agent.js +1 -0
  101. package/dist/src/public/tools/defaults.d.ts +3 -3
  102. package/dist/src/runtime/framework-tools/index.d.ts +3 -2
  103. package/dist/src/runtime/framework-tools/index.js +1 -1
  104. package/dist/src/runtime/framework-tools/skill.d.ts +6 -1
  105. package/dist/src/runtime/framework-tools/skill.js +1 -1
  106. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  107. package/dist/src/setup/boxes/select-model.js +1 -1
  108. package/dist/src/setup/flows/link.d.ts +13 -3
  109. package/dist/src/setup/flows/link.js +1 -1
  110. package/dist/src/setup/flows/model.d.ts +4 -3
  111. package/dist/src/setup/flows/model.js +1 -1
  112. package/dist/src/setup/flows/provider.d.ts +3 -1
  113. package/dist/src/setup/flows/provider.js +2 -2
  114. package/dist/src/setup/gateway-models.js +1 -1
  115. package/dist/src/setup/scaffold/create/project.js +1 -1
  116. package/dist/src/setup/validate-gateway-key.js +1 -1
  117. package/dist/src/svelte/index.js +1 -1
  118. package/dist/src/svelte/use-eve-agent.js +1 -1
  119. package/dist/src/vue/index.js +1 -1
  120. package/dist/src/vue/use-eve-agent.js +1 -1
  121. package/docs/concepts/sessions-runs-and-streaming.md +7 -7
  122. package/docs/reference/cli.md +1 -1
  123. package/docs/schedules.mdx +1 -1
  124. package/docs/skills.mdx +1 -1
  125. package/package.json +6 -5
  126. package/dist/src/execution/sandbox/bindings/vercel-user-agent.d.ts +0 -6
  127. package/dist/src/execution/sandbox/bindings/vercel-user-agent.js +0 -1
  128. package/dist/src/execution/workflow-skill-root.d.ts +0 -6
  129. package/dist/src/execution/workflow-skill-root.js +0 -1
@@ -38,17 +38,27 @@ export interface ThemeColors {
38
38
  export interface ThemeGlyphs {
39
39
  /** `▲` — the Vercel/eve brand mark; prefixes the agent's own output. */
40
40
  brand: string;
41
- /** `▌` — left gutter bar marking a user message. */
41
+ /** `│` — left gutter bar marking a user message. */
42
42
  user: string;
43
43
  /** `○` — reasoning / "thinking" marker (Next.js "wait" glyph). */
44
44
  reasoning: string;
45
+ /** `▪` — static tool-activity mark (the settled form of the activity pulse). */
46
+ square: string;
47
+ /** `└` — closes a `│`-railed detail region under a tool header. */
48
+ corner: string;
49
+ /** `┌` — opens a region; pairs with `corner` at session boundaries. */
50
+ cornerOpen: string;
51
+ /** `⌝` — marks a provider endpoint authored in the agent's own code. */
52
+ external: string;
53
+ /** `⏺` — the in-progress todo item (pulses while the turn runs). */
54
+ dotActive: string;
45
55
  /** `✓` — a completed tool or success state. */
46
56
  success: string;
47
57
  /** `⨯` — an error or failed tool. */
48
58
  error: string;
49
59
  /** `⚠` — a warning / attention state. */
50
60
  warning: string;
51
- /** `◆` — a subagent region header. */
61
+ /** `※` — a subagent region header. */
52
62
  subagent: string;
53
63
  /** `│` — vertical rule drawn in the gutter to nest subagent output. */
54
64
  rule: string;
@@ -66,10 +76,14 @@ export interface ThemeGlyphs {
66
76
  option: string;
67
77
  /** `❯` — the input prompt mark. */
68
78
  prompt: string;
79
+ /** `›` — the prompt mark's quiet form while the buffer is empty. */
80
+ promptIdle: string;
69
81
  /** `⎿` — hangs a command's result under its invocation. */
70
82
  elbow: string;
71
83
  /** `▔` — strong full-width rule opening the bottom question panel. */
72
84
  hrule: string;
85
+ /** `─` — light rule segment framing the end-of-turn stats line. */
86
+ dash: string;
73
87
  /** `▏` — the synthetic input caret. */
74
88
  caret: string;
75
89
  /** `·` — inline separator for header / status segments. */
@@ -1 +1 @@
1
- function ansi(e,t,n){if(!n)return e=>e;let r=`[${e}m`,i=`[${t}m`;return e=>`${r}${e}${i}`}function ansi256(e,t){if(!t)return e=>e;let n=`[38;5;${e}m`;return e=>`${n}${e}`}const UNICODE_GLYPHS={brand:`▲`,user:`▌`,reasoning:`○`,success:`✓`,error:`⨯`,warning:`⚠`,subagent:`◆`,rule:`│`,question:`?`,connection:`●`,arrow:`→`,pointer:`▷`,selectedPointer:`▶`,option:`◦`,prompt:`❯`,elbow:`⎿`,hrule:`▔`,caret:`▏`,dot:`·`,ellipsis:`…`,arrowUp:`↑`,arrowDown:`↓`,fast:`↯`,trackFilled:`●`,trackCurrent:`◉`,trackEmpty:`○`,trackLine:`─`,enter:`↵`,validating:`▪`},ASCII_GLYPHS={brand:`>`,user:`|`,reasoning:`o`,success:`+`,error:`x`,warning:`!`,subagent:`*`,rule:`|`,question:`?`,connection:`*`,arrow:`->`,pointer:`>`,selectedPointer:`>`,option:`.`,prompt:`>`,elbow:"`-",hrule:`=`,caret:`_`,dot:`-`,ellipsis:`...`,arrowUp:`^`,arrowDown:`v`,fast:`>>`,trackFilled:`*`,trackCurrent:`O`,trackEmpty:`.`,trackLine:`-`,enter:`<-'`,validating:`o`},UNICODE_SPINNER=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`],ASCII_SPINNER=[`-`,`\\`,`|`,`/`];function createTheme(i={}){let a=i.color??!0,o=i.unicode??!0;return{color:a,unicode:o,colors:{reset:ansi(0,0,a),bold:ansi(1,22,a),dim:ansi(2,22,a),inverse:ansi(7,27,a),italic:ansi(3,23,a),white:ansi(97,39,a),gray:ansi(90,39,a),cyan:ansi(36,39,a),green:ansi(32,39,a),red:ansi(31,39,a),yellow:ansi(33,39,a),magenta:ansi(35,39,a),blue:ansi(34,39,a),orange:ansi256(208,a)},glyph:o?UNICODE_GLYPHS:ASCII_GLYPHS,spinner:o?UNICODE_SPINNER:ASCII_SPINNER}}function detectUnicode(e=process.env){let t=e.EVE_TUI_UNICODE;return t===`0`||t===`false`?!1:t===`1`||t===`true`?!0:e.TERM===`dumb`?!1:process.platform===`win32`?!!(e.WT_SESSION||e.TERM_PROGRAM===`vscode`):!0}export{createTheme,detectUnicode};
1
+ function ansi(e,t,n){if(!n)return e=>e;let r=`[${e}m`,i=`[${t}m`;return e=>`${r}${e}${i}`}function ansi256(e,t){if(!t)return e=>e;let n=`[38;5;${e}m`;return e=>`${n}${e}`}const UNICODE_GLYPHS={brand:`▲`,user:`│`,reasoning:`○`,square:`▪`,corner:`└`,cornerOpen:`┌`,external:`⌝`,dotActive:`⏺`,success:`✓`,error:`⨯`,warning:`⚠`,subagent:`※`,rule:`│`,question:`?`,connection:`●`,arrow:`→`,pointer:`▷`,selectedPointer:`▶`,option:`◦`,prompt:`❯`,promptIdle:`›`,elbow:`⎿`,hrule:`▔`,dash:`─`,caret:`▏`,dot:`·`,ellipsis:`…`,arrowUp:`↑`,arrowDown:`↓`,fast:`↯`,trackFilled:`●`,trackCurrent:`◉`,trackEmpty:`○`,trackLine:`─`,enter:`↵`,validating:`▪`},ASCII_GLYPHS={brand:`>`,user:`|`,reasoning:`o`,square:`*`,corner:"`",cornerOpen:`,`,external:`^`,dotActive:`*`,success:`+`,error:`x`,warning:`!`,subagent:`*`,rule:`|`,question:`?`,connection:`*`,arrow:`->`,pointer:`>`,selectedPointer:`>`,option:`.`,prompt:`>`,promptIdle:`>`,elbow:"`-",hrule:`=`,dash:`-`,caret:`_`,dot:`-`,ellipsis:`...`,arrowUp:`^`,arrowDown:`v`,fast:`>>`,trackFilled:`*`,trackCurrent:`O`,trackEmpty:`.`,trackLine:`-`,enter:`<-'`,validating:`o`},UNICODE_SPINNER=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`],ASCII_SPINNER=[`-`,`\\`,`|`,`/`];function createTheme(i={}){let a=i.color??!0,o=i.unicode??!0;return{color:a,unicode:o,colors:{reset:ansi(0,0,a),bold:ansi(1,22,a),dim:ansi(2,22,a),inverse:ansi(7,27,a),italic:ansi(3,23,a),white:ansi(97,39,a),gray:ansi(90,39,a),cyan:ansi(36,39,a),green:ansi(32,39,a),red:ansi(31,39,a),yellow:ansi(33,39,a),magenta:ansi(35,39,a),blue:ansi(34,39,a),orange:ansi256(208,a)},glyph:o?UNICODE_GLYPHS:ASCII_GLYPHS,spinner:o?UNICODE_SPINNER:ASCII_SPINNER}}function detectUnicode(e=process.env){let t=e.EVE_TUI_UNICODE;return t===`0`||t===`false`?!1:t===`1`||t===`true`?!0:e.TERM===`dumb`?!1:process.platform===`win32`?!!(e.WT_SESSION||e.TERM_PROGRAM===`vscode`):!0}export{createTheme,detectUnicode};
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The pinned todo panel: pure parsing and rendering for the task list the
3
+ * model maintains through the framework `todo` tool. The tool writes the
4
+ * whole list on every call, so the panel is driven entirely from tool-call
5
+ * inputs — no protocol addition and no durable client state. The renderer
6
+ * owns lifecycle (when a call updates the panel, when the finished list
7
+ * commits to the transcript); this module only reads inputs and paints rows.
8
+ */
9
+ import type { Theme } from "./theme.js";
10
+ /** One panel row parsed from the `todo` tool's replacement-write input. */
11
+ export interface TodoPanelItem {
12
+ readonly content: string;
13
+ readonly status: "pending" | "in_progress" | "completed" | "cancelled";
14
+ }
15
+ /**
16
+ * Extracts the panel items from a tool call when — and only when — it is a
17
+ * `todo` replacement write. Read-only calls (no `todos`) and malformed items
18
+ * return `undefined` so they fall through to the ordinary tool block.
19
+ */
20
+ export declare function readTodoToolItems(toolName: string, input: unknown): TodoPanelItem[] | undefined;
21
+ /** True when every item reached a terminal status (completed or cancelled). */
22
+ export declare function allTodoItemsSettled(items: readonly TodoPanelItem[]): boolean;
23
+ export interface TodoPanelRowsInput {
24
+ readonly items: readonly TodoPanelItem[];
25
+ readonly width: number;
26
+ readonly theme: Theme;
27
+ /** True while the turn is running: pulses the header and the active item. */
28
+ readonly working: boolean;
29
+ /** Current shared pulse frame (the glyph, or a space on the off beat). */
30
+ readonly pulse: string;
31
+ }
32
+ /**
33
+ * Paints the pinned panel, indented so its marks share the tool column.
34
+ * Settled items ride a `│` rail under the header; the
35
+ * first unsettled item closes the rail with `└` and everything after hangs
36
+ * indented — the list reads as progress flowing through the corner.
37
+ */
38
+ export declare function renderTodoPanelRows(input: TodoPanelRowsInput): string[];
39
+ /**
40
+ * The transcript form of a finished list: every item checked on the rail,
41
+ * closed by `└ Done`. Committed verbatim (pre-styled rows) once every item
42
+ * settles.
43
+ */
44
+ export declare function renderFinishedTodoRows(items: readonly TodoPanelItem[], width: number, theme: Theme): string[];
@@ -0,0 +1 @@
1
+ import"./rail.js";import{toolBaseName}from"./tool-presentation.js";import{clipVisible,stripTerminalControls}from"#cli/ui/terminal-text.js";const TODO_STATUSES=new Set([`pending`,`in_progress`,`completed`,`cancelled`]);function readTodoToolItems(t,i){if(toolBaseName(t)!==`todo`||typeof i!=`object`||!i||Array.isArray(i))return;let a=i.todos;if(!Array.isArray(a))return;let o=[];for(let e of a){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,i=t.content,a=t.status;if(typeof i!=`string`||typeof a!=`string`||!TODO_STATUSES.has(a))return;o.push({content:firstLine(stripTerminalControls(i)),status:a})}return o}function allTodoItemsSettled(e){return e.every(e=>e.status===`completed`||e.status===`cancelled`)}function renderTodoPanelRows(e){let{items:n,width:r,theme:i}=e,a=i.colors,o=i.glyph,s=n.filter(e=>e.status===`completed`||e.status===`cancelled`).length,c=[e.working?` ${a.gray(o.square)} ${a.dim(`Todo`)}`:` ${a.gray(o.square)} ${a.dim(`${s}/${n.length} tasks`)}`],l=!1;for(let t of n){let n=t.status===`completed`||t.status===`cancelled`,r;l?r=` `:n?r=a.dim(o.rule):(r=a.dim(o.corner),l=!0),c.push(` ${r} ${todoItemBody(t,e,i)}`)}return c.map(e=>clipVisible(e,r))}function renderFinishedTodoRows(e,n,r){let i=r.colors,a=r.glyph,o=[` ${i.green(a.success)} ${i.dim(`Todo`)}`];for(let t of e)o.push(` ${i.dim(a.rule)} ${settledMark(t,r)} ${i.dim(t.content)}`);return o.push(` ${i.dim(a.corner)} ${i.green(`Done`)}`),o.map(e=>clipVisible(e,n))}function settledMark(e,t){return e.status===`cancelled`?t.colors.red(t.glyph.error):t.colors.green(t.glyph.success)}function todoItemBody(e,t,n){let r=n.colors,i=n.glyph;switch(e.status){case`completed`:return`${r.green(i.success)} ${r.dim(e.content)}`;case`cancelled`:return`${r.red(i.error)} ${r.dim(e.content)}`;case`in_progress`:{let n=t.working?t.pulse.trim().length>0?i.dotActive:` `:i.dotActive;return`${r.yellow(n)} ${e.content}`}case`pending`:return`${r.dim(i.reasoning)} ${r.dim(e.content)}`}}function firstLine(e){return e.split(/\r?\n/u,1)[0]??``}export{allTodoItemsSettled,readTodoToolItems,renderFinishedTodoRows,renderTodoPanelRows};
@@ -0,0 +1,40 @@
1
+ import type { Block, DisplayBlock } from "./blocks.js";
2
+ export interface ToolBlockDisplayGroup {
3
+ readonly members: readonly Block[];
4
+ readonly display: DisplayBlock;
5
+ }
6
+ /**
7
+ * Coalesces presentation only; each member keeps its call id and lifecycle.
8
+ *
9
+ * A contiguous run of equivalent tool calls is partitioned by status, so a
10
+ * batch with interleaved outcomes renders as one succeeded aggregate and one
11
+ * failed aggregate instead of fragmenting on every status flip. A contiguous
12
+ * run of same-named subagent calls coalesces the repeated headers into one
13
+ * counted header, reorders the interleaved children call by call, and elides
14
+ * all but the newest {@link maxVisibleSubagentRunChildren} children behind a
15
+ * `… +N more` row. Captured log writes coalesce per
16
+ * {@link GroupToolBlocksOptions.logCoalescing}. Because of all this, a
17
+ * group's members are not always contiguous in the input: callers that
18
+ * consume a group must remove its members by identity, never by prefix
19
+ * length.
20
+ */
21
+ export interface GroupToolBlocksOptions {
22
+ /**
23
+ * How captured log writes coalesce. `"window"` (the default, for the live
24
+ * block window) merges every write of one source across the whole input
25
+ * into a single section appended after the rest — a process stream is
26
+ * continuous, so interleaved activity must not fragment it — and the
27
+ * section commits as one cluster at the turn boundary. `"runs"` (for
28
+ * committed-transcript rebuilds) merges only contiguous writes, so a
29
+ * `/loglevel` toggle re-renders history at its committed positions instead
30
+ * of relocating every past write to the end.
31
+ */
32
+ readonly logCoalescing?: "window" | "runs";
33
+ }
34
+ export declare function groupToolBlocksForDisplay(blocks: readonly Block[], options?: GroupToolBlocksOptions): ToolBlockDisplayGroup[];
35
+ /**
36
+ * A live subagent section shows only its most recently active child row;
37
+ * everything earlier collapses into a single `… (N more)` line under the
38
+ * header. The completed section's counted footnote carries the full story.
39
+ */
40
+ export declare const maxVisibleSubagentRunChildren = 1;
@@ -0,0 +1 @@
1
+ import{toolBaseName}from"./tool-presentation.js";function groupToolBlocksForDisplay(e,t={}){if((t.logCoalescing??`window`)===`window`){let t=new Map;for(let n of e){if(!isGroupableLogWrite(n))continue;let e=logBucketKey(n),r=t.get(e);r===void 0?t.set(e,[n]):r.push(n)}let n=new Map;for(let e of t.values())n.set(e.at(-1),coalesceLogBucket(e));return groupBlocks(e,n)}return groupBlocks(e)}function groupBlocks(e,t){let n=[];for(let r=0;r<e.length;){let i=e[r];if(isGroupableLogWrite(i)){if(t!==void 0){let e=t.get(i);e!==void 0&&n.push(e),r+=1;continue}let a=[i];for(;r+a.length<e.length&&isGroupableLogWrite(e[r+a.length]);)a.push(e[r+a.length]);n.push(...coalesceLogWrites(a)),r+=a.length;continue}if(i.kind===`subagent`&&i.subagentCallId!==void 0){let i=collectSubagentRun(e,r,t);n.push(...i.groups),r+=i.consumed;continue}if(isCondensableChildTool(i)){let t=[i];for(;r+t.length<e.length;){let n=e[r+t.length];if(n.subagentCallId!==i.subagentCallId||!isCondensableChildTool(n)&&!isItemizedChildFailure(n))break;t.push(n)}let a=e[r+t.length],o=t.filter(isCondensableChildTool);if(o.length>=2&&a?.kind===`subagent-step`&&a.subagentCallId===i.subagentCallId){n.push({members:o,display:condenseChildToolRun(o)});for(let e of t)isCondensableChildTool(e)||n.push({members:[e],display:e});r+=t.length;continue}}if(!isGroupable(i)){n.push({members:[i],display:i}),r+=1;continue}let a=[i];for(;r+a.length<e.length;){let t=e[r+a.length];if(!isGroupable(t)||!sameRun(i,t))break;a.push(t)}a.some(e=>e.status===`running`)&&a.length>1?n.push({members:a,display:aggregateLiveToolBlocks(a)}):n.push(...partitionRunByStatus(a)),r+=a.length}return n}function isGroupable(e){return(e.kind===`tool`||e.kind===`subagent-tool`)&&e.toolGroup!==void 0&&e.expanded!==!0&&(e.status===`running`||e.status===`error`||e.status===`done`&&e.result===void 0)}function sameRun(e,t){return t.kind===e.kind&&t.depth===e.depth&&t.live===e.live&&t.toolName===e.toolName}function partitionRunByStatus(e){let t=new Map;for(let n of e){let e=t.get(n.status);e===void 0?t.set(n.status,[n]):e.push(n)}return[...t.values()].map(e=>({members:e,display:e.length===1?e[0]:e[0].status===`done`?collapseSettledToolBlocks(e):aggregateToolBlocks(e)}))}const maxVisibleSubagentRunChildren=1;function isGroupableLogWrite(e){return e.kind===`log`&&e.id===void 0}function logBucketKey(e){return`${e.title??``}\u0000${e.logVisibility??``}`}function coalesceLogWrites(e){let t=new Map;for(let n of e){let e=logBucketKey(n),r=t.get(e);r===void 0?t.set(e,[n]):r.push(n)}return[...t.values()].map(coalesceLogBucket)}function coalesceLogBucket(e){if(e.length===1)return{members:e,display:e[0]};let t=e.at(-1),n={kind:`log`,live:e.some(e=>e.live!==!1),body:t.body??``,elided:e.length-1};return t.title!==void 0&&(n.title=t.title),t.logVisibility!==void 0&&(n.logVisibility=t.logVisibility),{members:e,display:n}}const RUN_PASS_THROUGH_KINDS=new Set([`log`,`sandbox`,`error`,`warning`,`notice`]);function collectSubagentRun(e,t,r){let i=e[t],a=[i],o=new Map([[i.subagentCallId,[]]]),s=[],c=1;for(;t+c<e.length;c+=1){let r=e[t+c];if(RUN_PASS_THROUGH_KINDS.has(r.kind)){s.push(r);continue}if(r.kind===`subagent`){if(r.subagentCallId===void 0||o.has(r.subagentCallId))break;a.push(r),o.set(r.subagentCallId,[]);continue}let i=r.subagentCallId===void 0?void 0:o.get(r.subagentCallId);if(i===void 0)break;i.push(r)}for(;s.length>0&&e[t+c-1]===s.at(-1);)s.pop(),--c;let l=[];for(let e of a){let t=o.get(e.subagentCallId),n=e.live!==!1||t.some(e=>e.live!==!1),r=n===(e.live!==!1)?e:{...e,live:n};if(e.status===`done`){let i=condensedChildSummary(t);l.push({members:[e],display:r}),l.push({members:t,display:{kind:`subagent-close`,subagentCallId:e.subagentCallId,live:n,body:i===void 0?`Done`:`Done. ${i}`}});continue}l.push({members:[e],display:r});let recency=e=>e.members.reduce((e,t)=>Math.max(e,updateRecency(t)),-1),i=groupToolBlocksForDisplay(t).slice().sort((e,t)=>recency(e)-recency(t)),a=i.slice(0,Math.max(0,i.length-1)),s=i.slice(a.length),c=a.flatMap(e=>e.members);c.length>0&&l.push({members:c,display:{kind:`subagent-step`,depth:1,live:n,elided:c.length}}),l.push(...s.slice(0,-1));let u=s.at(-1);u!==void 0&&l.push({members:u.members,display:{...u.display,closesRail:!0}})}for(let e of s){if(r!==void 0&&isGroupableLogWrite(e)){let t=r.get(e);t!==void 0&&l.push(t);continue}l.push({members:[e],display:e})}return{consumed:c,groups:l}}function aggregateToolBlocks(e){let t=e[0],n=t.toolGroup,r=e.length;return{...t,id:void 0,result:void 0,title:`${n.verb} ${r} ${r===1?n.singularNoun:n.pluralNoun}`,toolGroupItems:newestFirstItems(e)}}function aggregateLiveToolBlocks(e){return{...aggregateToolBlocks(e),status:`running`,live:!0}}function collapseSettledToolBlocks(e){let t=e[0],n=t.toolGroup,r=e.length,i=r===1?n.singularNoun:n.pluralNoun;return{...t,id:void 0,result:void 0,title:`${n.verb} ${r} ${i}`,doneTitle:`${n.pastVerb} ${r} ${i}`}}function isCondensableChildTool(e){return e.kind===`subagent-tool`&&e.status===`done`&&e.expanded!==!0}function isItemizedChildFailure(e){return e.kind===`subagent-tool`&&e.status===`error`&&e.expanded!==!0}function condensedRunTitle(e){let t=new Map;for(let n of e){let e=condensedKindCopy(n),r=`${e.pastVerb} ${e.pluralNoun}`,i=t.get(r);i===void 0?t.set(r,{copy:e,count:1}):i.count+=1}let n=[...t.values()].sort((e,t)=>t.count-e.count),r=n.slice(0,3).map(({copy:e,count:t})=>`${e.pastVerb} ${t} ${t===1?e.singularNoun:e.pluralNoun}`);return n.length>3?`${r.join(`, `)}, and more`:r.join(`, `)}function condensedChildSummary(e){let t=e.filter(e=>e.kind===`subagent-tool`);if(t.length===0)return;let n=t.filter(e=>e.status===`done`),r=t.filter(e=>e.status===`error`).length,i=[];return n.length>0&&i.push(condensedRunTitle(n)),r>0&&i.push(`${r} failed`),i.length>0?i.join(`, `):void 0}function condenseChildToolRun(e){let t=condensedRunTitle(e),n=e[0];return{kind:`subagent-tool`,subagentCallId:n.subagentCallId,depth:n.depth,live:n.live,status:`done`,title:t,doneTitle:t,subtitle:``}}function condensedKindCopy(t){let n=t.toolGroup;return n===void 0?toolBaseName(t.toolName??``)===`write_file`?{pastVerb:`Wrote`,singularNoun:`file`,pluralNoun:`files`}:{pastVerb:`Made`,singularNoun:`tool call`,pluralNoun:`tool calls`}:{pastVerb:n.pastVerb,singularNoun:n.singularNoun,pluralNoun:n.pluralNoun}}function updateRecency(e){return e.updateSeq??0}function newestFirstItems(e){return e.map((e,t)=>({member:e,order:updateRecency(e),position:t})).sort((e,t)=>t.order-e.order||t.position-e.position).map(({member:e})=>{let t={text:e.toolGroup.item};return e.status===`error`&&e.result!==void 0?{...t,result:e.result}:t})}export{groupToolBlocksForDisplay,maxVisibleSubagentRunChildren};
@@ -0,0 +1,67 @@
1
+ import { type ToolDetailLine } from "./line-diff.js";
2
+ /** Renderer-ready copy derived from a tool call without owning its lifecycle. */
3
+ export interface ToolPresentation {
4
+ readonly title: string;
5
+ readonly subtitle: string;
6
+ readonly summarizeResult: (output: unknown) => string | undefined;
7
+ readonly group?: ToolGroupPresentation;
8
+ /** Past-tense title used once the call settles successfully. */
9
+ readonly doneTitle?: string;
10
+ /** Salient body lines shown behind the `│` rail under the header. */
11
+ readonly detail?: readonly ToolDetailLine[];
12
+ /** When true, `detail` stays visible after the call settles (writes). */
13
+ readonly keepDetailWhenDone?: boolean;
14
+ }
15
+ /**
16
+ * Renderer-owned knowledge a presentation may fold in: what a write replaced
17
+ * (from the session's file-content cache) and whether the file existed (from
18
+ * the call's result, once it arrives).
19
+ */
20
+ export interface ToolPresentationContext {
21
+ readonly previousContent?: string;
22
+ readonly existed?: boolean;
23
+ /**
24
+ * True when the tool dispatches a named subagent (each subagent exposes a
25
+ * tool bearing its own name). The presentation reads as a delegation —
26
+ * `Delegate stock-price` — instead of a generic tool call.
27
+ */
28
+ readonly isSubagent?: boolean;
29
+ }
30
+ /** Copy needed to aggregate equivalent calls without merging their state. */
31
+ export interface ToolGroupPresentation {
32
+ readonly verb: string;
33
+ readonly pastVerb: string;
34
+ readonly singularNoun: string;
35
+ readonly pluralNoun: string;
36
+ readonly item: string;
37
+ }
38
+ /**
39
+ * Extracts a write tool call's full-replacement payload. Exported so the
40
+ * renderer can feed its file-content cache from the same contract the
41
+ * presentation reads.
42
+ */
43
+ export declare function readWriteFileInput(toolName: string, input: unknown): {
44
+ path: string;
45
+ content: string;
46
+ } | undefined;
47
+ /**
48
+ * Turns known tool contracts into concise activity copy. Unknown or malformed
49
+ * calls keep the generic formatter, so presentation can never break execution.
50
+ */
51
+ export declare function presentTool(toolName: string, input: unknown, context?: ToolPresentationContext): ToolPresentation;
52
+ /**
53
+ * Placeholder copy for a call whose input is still streaming from the model
54
+ * (`action.preparing`). Known tools lead with their activity verb so the row
55
+ * already reads as intent (`Fetch …`); unknown tools keep their name with a
56
+ * quiet hint. The full presentation replaces this once the input arrives.
57
+ */
58
+ export declare function presentPreparingTool(toolName: string, context?: ToolPresentationContext): ToolPresentation;
59
+ /**
60
+ * Tools whose whole story renders through a dedicated surface — the pinned
61
+ * todo panel, the question overlay — instead of a transcript tool block.
62
+ * Both the preparing announcement and the full call must agree on this
63
+ * set, or a panel-routed tool ghosts as a preparing block.
64
+ */
65
+ export declare function isPanelRoutedTool(toolName: string): boolean;
66
+ /** The tool's short name with any connection/server namespace stripped. */
67
+ export declare function toolBaseName(toolName: string): string;
@@ -0,0 +1 @@
1
+ import{summarizeToolArgs,summarizeToolResult}from"./tool-format.js";import{diffWriteDetail}from"./line-diff.js";import{stripTerminalControls}from"#cli/ui/terminal-text.js";const WRITE_FILE_VERB=`Write`,DELEGATE_VERB=`Delegate`,FINAL_OUTPUT_TITLE=`Return final output`,BUILTIN_TOOL_COPY={agent:{verb:`Delegate`,pastVerb:`Delegated`,argKey:`message`,singularNoun:`task`,pluralNoun:`tasks`},ask_question:{verb:`Ask`,pastVerb:`Asked`,argKey:`prompt`,singularNoun:`question`,pluralNoun:`questions`},bash:{verb:`Run`,pastVerb:`Ran`,argKey:`command`,singularNoun:`command`,pluralNoun:`commands`},connection_search:{verb:`Discover`,pastVerb:`Discovered`,argKey:`keywords`,singularNoun:`tool search`,pluralNoun:`tool searches`},glob:{verb:`Glob`,pastVerb:`Globbed`,argKey:`pattern`,singularNoun:`pattern`,pluralNoun:`patterns`},grep:{verb:`Grep`,pastVerb:`Grepped`,argKey:`pattern`,singularNoun:`pattern`,pluralNoun:`patterns`},load_skill:{verb:`Load`,pastVerb:`Loaded`,argKey:`skill`,singularNoun:`skill`,pluralNoun:`skills`},read_file:{verb:`Read`,pastVerb:`Read`,argKey:`filePath`,singularNoun:`file`,pluralNoun:`files`},web_fetch:{verb:`Fetch`,pastVerb:`Fetched`,argKey:`url`,singularNoun:`URL`,pluralNoun:`URLs`},web_search:{verb:`Search`,pastVerb:`Searched`,argKey:`query`,extractItem:e=>salientArg(e,`objective`)??salientArg(e,`search_query`)??salientArg(e,`searchQuery`)??webSearchActionArg(e),singularNoun:`query`,pluralNoun:`queries`}};function presentWriteFileTool(a,o,s){let c=readWriteFileInput(a,o);if(c===void 0)return{title:a,subtitle:summarizeToolArgs(o),summarizeResult:summarizeToolResult};let l=diffWriteDetail(s?.previousContent,c.content,s?.existed).map(e=>e.kind===`gap`?e:{...e,text:stripTerminalControls(e.text)});return{title:`${WRITE_FILE_VERB} ${salientLine(c.path)??c.path}`,doneTitle:`Wrote ${salientLine(c.path)??c.path}`,subtitle:``,summarizeResult:()=>void 0,detail:l,keepDetailWhenDone:!0}}function readWriteFileInput(e,t){if(toolBaseName(e)!==`write_file`||typeof t!=`object`||!t||Array.isArray(t))return;let n=t,r=n.filePath,i=n.content;if(!(typeof r!=`string`||r.trim().length===0)&&typeof i==`string`)return{path:r,content:i}}function presentTool(n,r,i){let c=toolBaseName(n);if(c===`todo`)return presentTodoTool(r);if(c===`write_file`)return presentWriteFileTool(n,r,i);if(i?.isSubagent===!0)return{title:`${DELEGATE_VERB} ${c}`,doneTitle:`Delegated ${c}`,subtitle:salientArg(r,`message`)??``,summarizeResult:()=>void 0};if(c===`final_output`)return{title:FINAL_OUTPUT_TITLE,subtitle:``,summarizeResult:()=>void 0};let l=BUILTIN_TOOL_COPY[c];if(l!==void 0){let e=salientArg(r,l.argKey)??l.extractItem?.(r);if(e!==void 0)return{title:`${l.verb} ${e}`,doneTitle:`${l.pastVerb} ${e}`,subtitle:``,summarizeResult:()=>void 0,group:{verb:l.verb,pastVerb:l.pastVerb,singularNoun:l.singularNoun,pluralNoun:l.pluralNoun,item:e}}}return{title:n,subtitle:summarizeToolArgs(r),summarizeResult:summarizeToolResult}}function presentPreparingTool(e,t){let n=toolBaseName(e);if(n===`final_output`)return{title:FINAL_OUTPUT_TITLE,subtitle:``,summarizeResult:()=>void 0};if(t?.isSubagent===!0)return{title:`${DELEGATE_VERB} ${n} …`,subtitle:``,summarizeResult:()=>void 0};let r=n===`write_file`?WRITE_FILE_VERB:BUILTIN_TOOL_COPY[n]?.verb;return{title:r===void 0?e:`${r} …`,subtitle:r===void 0?`preparing…`:``,summarizeResult:()=>void 0}}function isPanelRoutedTool(e){let t=toolBaseName(e);return t===`todo`||t===`ask_question`}function toolBaseName(e){return e.split(/[.:/]/u).at(-1)??e}function presentTodoTool(e){let t=typeof e==`object`&&e&&!Array.isArray(e)?e.todos:void 0;return Array.isArray(t)?{title:`Update todo list`,subtitle:`${t.length} task${t.length===1?``:`s`}`,summarizeResult:()=>void 0}:{title:`Read todo list`,subtitle:``,summarizeResult:()=>void 0}}function webSearchActionArg(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e.action;if(typeof t!=`object`||!t||Array.isArray(t))return;let n=t,r=n.queries;if(Array.isArray(r)){let e=r.filter(e=>typeof e==`string`).map(salientLine).filter(e=>e!==void 0).join(`, `);if(e.length>0)return e}for(let e of[`query`,`url`,`pattern`]){let t=n[e];if(typeof t==`string`){let e=salientLine(t);if(e!==void 0)return e}}}function salientArg(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return;let n=e[t];if(typeof n==`string`)return salientLine(n)}function salientLine(e){let t=stripTerminalControls(e).split(/\r?\n/u).find(e=>e.trim().length>0)?.trim()??``;return t.length>0?t:void 0}export{isPanelRoutedTool,presentPreparingTool,presentTool,readWriteFileInput,toolBaseName};
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Renders a tool block's terminal rows: the indented header (status glyph,
3
+ * verb-bold title, summarized args), the `│`-railed detail region —
4
+ * aggregated batch items or a write's diffed content — closed by a `└`
5
+ * corner, and the settled result line. Split from `blocks.ts` so the block
6
+ * model and its per-kind renderers stay separable concerns.
7
+ */
8
+ import type { DisplayBlock, RenderBlockContext } from "./blocks.js";
9
+ import type { Theme } from "./theme.js";
10
+ export declare function renderTool(block: DisplayBlock, width: number, theme: Theme, context: RenderBlockContext): string[];
11
+ /**
12
+ * An aggregated tool row lists at most this many member items; the rest
13
+ * collapse into a single `… (N more)` line above the closing corner.
14
+ */
15
+ export declare const maxVisibleToolGroupItems = 5;
@@ -0,0 +1,2 @@
1
+ import{formatValuePretty,truncate}from"./tool-format.js";import{elisionText}from"./rail.js";import{clipVisible,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";function renderTool(e,t,n,r){return(e.depth??0)===0?renderToolRows(e,t-1,n,r).map(e=>` ${e}`):renderToolRows(e,t,n,r)}function renderToolRows(e,n,i,a){let{icon:o,accent:s}=toolGlyph(e.status??`running`,i,a),c=e.status===`done`&&e.doneTitle!==void 0?e.doneTitle:e.title??`tool`,l=n-3,u=clipVisible(c,l),d=` ${o} ${boldLeadingWord(u,i)}`,f=l-u.length-2,p=e.subtitle??``;p.length>0&&f>=6&&(d+=` ${i.colors.gray(truncate(p,f))}`);let m=[d],h=[];return e.toolGroupItems===void 0?!e.expanded&&showToolDetail(e)&&h.push(...detailLineRows(e.detailLines??[],n,i)):h.push(...toolGroupItemRows(e.toolGroupItems,n,i)),h.length>0&&m.push(...h,` ${i.colors.dim(i.glyph.corner)}`),e.expanded?m.push(...renderToolExpanded(e,n,i)):e.status===`done`&&e.result&&e.result.length>0?m.push(resultLine(i.glyph.arrow,e.result,n,i,s)):e.status===`error`&&e.result?m.push(errorDetailLine(e.result,n,i)):e.status===`denied`&&m.push(resultLine(i.glyph.arrow,`denied`,n,i,i.colors.yellow)),m}function boldLeadingWord(e,t){let n=e.indexOf(` `);return n===-1?t.colors.bold(e):`${t.colors.bold(e.slice(0,n))}${t.colors.dim(e.slice(n))}`}function showToolDetail(e){if(e.detailLines===void 0||e.detailLines.length===0)return!1;let t=e.status??`running`;return t===`running`||t===`approval`?!0:e.keepDetailWhenDone===!0}const maxVisibleToolGroupItems=5;function railRow(e,t){return` ${t.colors.dim(t.glyph.rule)} ${e}`}function elisionRow(e,t){return railRow(elisionText(e,t),t)}function toolGroupItemRows(e,t,n){let r=e.slice(0,5),i=e.length-r.length,a=itemRows(r,t,n);return i>0&&a.push(elisionRow(i,n)),a}function detailLineRows(e,t,n){let i=n.colors,a=e.slice(0,10),o=e.length-a.length,s=a.some(e=>e.kind===`added`||e.kind===`removed`),c=Math.max(1,t-(s?5:4)),l=a.map(e=>{if(e.kind===`gap`)return railRow(i.dim(n.glyph.ellipsis),n);let t=clipVisible(e.text,c);switch(e.kind){case`added`:return` ${i.dim(n.glyph.rule)}${i.green(`+`)} ${i.green(t)}`;case`removed`:return` ${i.dim(n.glyph.rule)}${i.red(`-`)} ${i.red(t)}`;default:return s?` ${i.dim(n.glyph.rule)} ${i.gray(t)}`:railRow(i.gray(t),n)}});return o>0&&l.push(elisionRow(o,n)),l}function itemRows(e,n,r){let a=Math.max(1,n-4);if(!e.some(e=>e.result!==void 0&&e.result.length>0))return e.map(e=>railRow(r.colors.gray(truncate(e.text,a)),r));let o=Math.min(Math.max(...e.map(e=>visibleLength(e.text))),Math.max(8,a-9)),s=Math.max(8,a-o-1);return e.map(e=>{let n=truncate(e.text,o);if(e.result===void 0||e.result.length===0)return railRow(r.colors.gray(n),r);let a=n+` `.repeat(Math.max(0,o-visibleLength(n)));return railRow(`${r.colors.gray(a)} ${r.colors.red(truncate(e.result,s))}`,r)})}function renderToolExpanded(t,n,r){let i=[],push=(t,o,s)=>{if(o!==void 0){i.push(` ${r.colors.dim(t)}`);for(let t of formatValuePretty(o).split(`
2
+ `))for(let e of wrapVisibleLine(t,Math.max(1,n-4)))i.push(` ${s(e)}`)}};return push(`input`,t.toolInput,r.colors.gray),t.status===`error`&&t.result?push(`error`,t.result,r.colors.red):push(`output`,t.toolOutput,r.colors.gray),i}function resultLine(e,n,r,i,a){let o=r-4;return` ${i.colors.dim(e)} ${a(truncate(n,o))}`}function errorDetailLine(e,n,r){let i=n-5;return` ${r.colors.dim(r.glyph.corner)} ${r.colors.red(truncate(e,i))}`}function toolGlyph(e,t,n){switch(e){case`done`:return{icon:t.colors.gray(t.glyph.square),accent:t.colors.gray};case`error`:return{icon:t.colors.red(t.glyph.error),accent:t.colors.red};case`denied`:return{icon:t.colors.yellow(t.glyph.warning),accent:t.colors.yellow};case`approval`:return{icon:t.colors.yellow(t.glyph.question),accent:t.colors.yellow};default:return{icon:t.colors.yellow(n.activityPulse),accent:t.colors.gray}}}export{maxVisibleToolGroupItems,renderTool};
@@ -0,0 +1,36 @@
1
+ /**
2
+ * One turn's wall clock and summed token flow. "When did this turn start"
3
+ * is a single fact; this object is its single representation — armed once
4
+ * per turn (a prompt submit, or an `--input` turn arming itself), fed by
5
+ * step usage reports, and consumed exactly once by the end-of-turn coda.
6
+ * Multi-pass turns (question answers, connection authorizations) re-stream
7
+ * without re-arming, so one turn gets one coda.
8
+ */
9
+ export declare class TurnClock {
10
+ #private;
11
+ /** Starts the turn: resets the summed flow and stamps the clock. */
12
+ arm(): void;
13
+ get armed(): boolean;
14
+ get startedAtMs(): number | undefined;
15
+ get usage(): {
16
+ readonly inputTokens: number;
17
+ readonly outputTokens: number;
18
+ };
19
+ addUsage(usage: {
20
+ inputTokens?: number;
21
+ outputTokens?: number;
22
+ }): void;
23
+ /**
24
+ * Consumes the armed clock, returning the turn's elapsed time and summed
25
+ * flow — or `undefined` when no turn was armed (the coda's "already
26
+ * settled" signal). The flow survives the settle so a repaint between the
27
+ * coda and the next arm still reads the last turn's numbers.
28
+ */
29
+ settle(): {
30
+ elapsedMs: number;
31
+ inputTokens: number;
32
+ outputTokens: number;
33
+ } | undefined;
34
+ /** Drops the clock without a coda (conversation boundaries). */
35
+ reset(): void;
36
+ }
@@ -0,0 +1 @@
1
+ var TurnClock=class{#e;#t={inputTokens:0,outputTokens:0};arm(){this.#e=Date.now(),this.#t={inputTokens:0,outputTokens:0}}get armed(){return this.#e!==void 0}get startedAtMs(){return this.#e}get usage(){return this.#t}addUsage(e){this.#t.inputTokens+=e.inputTokens??0,this.#t.outputTokens+=e.outputTokens??0}settle(){let e=this.#e;if(e!==void 0)return this.#e=void 0,{elapsedMs:Date.now()-e,...this.#t}}reset(){this.#e=void 0,this.#t={inputTokens:0,outputTokens:0}}};export{TurnClock};
@@ -50,8 +50,8 @@ export type TuiDisplayOptions = {
50
50
  /**
51
51
  * The model context window size in tokens.
52
52
  *
53
- * When provided, the terminal UI shows the current total token usage as a
54
- * percentage of this context window.
53
+ * When provided, the end-of-turn stats line shows the context fill as a
54
+ * percentage of this window.
55
55
  */
56
56
  contextSize?: number;
57
57
  /**
@@ -1 +1 @@
1
- function resolveDevUiMode(e){return e.options.ui===!1||!e.interactive?`headless`:`tui`}function resolveTuiDisplayOptions(e){let t={logs:e.logs??`stderr`,reasoning:e.reasoning??`full`,tools:e.tools??`auto-collapsed`};return e.subagents!==void 0&&(t.subagents=e.subagents),e.connectionAuth!==void 0&&(t.connectionAuth=e.connectionAuth),e.assistantResponseStats!==void 0&&(t.assistantResponseStats=e.assistantResponseStats),e.contextSize!==void 0&&(t.contextSize=e.contextSize),t}export{resolveDevUiMode,resolveTuiDisplayOptions};
1
+ function resolveDevUiMode(e){return e.options.ui===!1||!e.interactive?`headless`:`tui`}function resolveTuiDisplayOptions(e){let t={logs:e.logs??`stderr`,reasoning:e.reasoning??`auto-collapsed`,tools:e.tools??`auto-collapsed`};return e.subagents!==void 0&&(t.subagents=e.subagents),e.connectionAuth!==void 0&&(t.connectionAuth=e.connectionAuth),e.assistantResponseStats!==void 0&&(t.assistantResponseStats=e.assistantResponseStats),e.contextSize!==void 0&&(t.contextSize=e.contextSize),t}export{resolveDevUiMode,resolveTuiDisplayOptions};
@@ -1 +1 @@
1
- import{AgentInfoResponseError}from"#client/agent-info-error.js";import{ClientError}from"#client/client-error.js";import{ClientSession}from"#client/session.js";import{Client}from"#client/client.js";import{EveAgentStore}from"#client/eve-agent-store.js";import{defaultMessageReducer}from"#client/message-reducer.js";import{createDataUrlFilePart,createTextWithFileContent}from"#client/file-parts.js";import{MessageResponse}from"#client/message-response.js";import{isCurrentTurnBoundaryEvent,isTurnFailureEvent}from"#protocol/message.js";import{inputOptionSchema,inputRequestSchema,inputResponseSchema,isInputRequest,isInputResponse}from"#runtime/input/types.js";import{resolveTextToResponse,resolveTextToResponses}from"#channel/resolve-text.js";export{AgentInfoResponseError,Client,ClientError,ClientSession,EveAgentStore,MessageResponse,createDataUrlFilePart,createTextWithFileContent,defaultMessageReducer,inputOptionSchema,inputRequestSchema,inputResponseSchema,isCurrentTurnBoundaryEvent,isInputRequest,isInputResponse,isTurnFailureEvent,resolveTextToResponse,resolveTextToResponses};
1
+ import{isCurrentTurnBoundaryEvent,isTurnFailureEvent}from"#protocol/message.js";import{AgentInfoResponseError}from"#client/agent-info-error.js";import{ClientError}from"#client/client-error.js";import{ClientSession}from"#client/session.js";import{Client}from"#client/client.js";import{EveAgentStore}from"#client/eve-agent-store.js";import{defaultMessageReducer}from"#client/message-reducer.js";import{createDataUrlFilePart,createTextWithFileContent}from"#client/file-parts.js";import{MessageResponse}from"#client/message-response.js";import{inputOptionSchema,inputRequestSchema,inputResponseSchema,isInputRequest,isInputResponse}from"#runtime/input/types.js";import{resolveTextToResponse,resolveTextToResponses}from"#channel/resolve-text.js";export{AgentInfoResponseError,Client,ClientError,ClientSession,EveAgentStore,MessageResponse,createDataUrlFilePart,createTextWithFileContent,defaultMessageReducer,inputOptionSchema,inputRequestSchema,inputResponseSchema,isCurrentTurnBoundaryEvent,isInputRequest,isInputResponse,isTurnFailureEvent,resolveTextToResponse,resolveTextToResponses};
@@ -0,0 +1,43 @@
1
+ import type { RuntimeActionRequest, RuntimeActionResult } from "#runtime/actions/types.js";
2
+ import type { InputRequest } from "#runtime/input/types.js";
3
+ import type { EveDynamicToolPart, EveMessageInputRequest, EveMessageToolMetadata } from "#client/message-reducer-types.js";
4
+ /**
5
+ * Normalized tool descriptor derived from a runtime action request or result.
6
+ *
7
+ * The default message reducer projects load-skill, subagent, remote-agent, and
8
+ * plain tool calls onto a single `dynamic-tool` UI part; this descriptor is the
9
+ * shared shape those variants collapse to before rendering.
10
+ */
11
+ export interface ActionDescriptor {
12
+ readonly kind: "load-skill" | "subagent-call" | "tool-call";
13
+ readonly name: string;
14
+ readonly toolName: string;
15
+ }
16
+ /** Projects a runtime input request onto its UI-facing subset. */
17
+ export declare function toMessageInputRequest(request: InputRequest): EveMessageInputRequest;
18
+ /** Builds tool metadata for a freshly projected tool part. */
19
+ export declare function createToolMetadata(descriptor: ActionDescriptor, extra?: {
20
+ readonly inputRequest?: EveMessageInputRequest;
21
+ }): EveMessageToolMetadata;
22
+ /**
23
+ * Merges freshly derived tool metadata over any metadata already attached to a
24
+ * tool part, preferring the new values while preserving earlier request and
25
+ * response context.
26
+ */
27
+ export declare function mergeToolMetadata(current: EveMessageToolMetadata | undefined, next: EveMessageToolMetadata): EveMessageToolMetadata;
28
+ /**
29
+ * Derives the approved-approval descriptor a resolved tool result carries
30
+ * forward, or `undefined` when the tool part never had an approval.
31
+ */
32
+ export declare function approvedApproval(part: EveDynamicToolPart | undefined): {
33
+ readonly id: string;
34
+ readonly approved: true;
35
+ readonly reason?: string;
36
+ readonly isAutomatic?: boolean;
37
+ } | undefined;
38
+ /** Maps a runtime action request onto its normalized tool descriptor. */
39
+ export declare function normalizeActionRequest(action: RuntimeActionRequest): ActionDescriptor;
40
+ /** Maps a runtime action result onto its normalized tool descriptor. */
41
+ export declare function normalizeActionResult(result: RuntimeActionResult): ActionDescriptor;
42
+ /** Best-effort string rendering of an unknown tool output for error display. */
43
+ export declare function stringifyUnknown(value: unknown): string;
@@ -0,0 +1 @@
1
+ function toMessageInputRequest(e){return{allowFreeform:e.allowFreeform,display:e.display,options:e.options,prompt:e.prompt,requestId:e.requestId}}function createToolMetadata(e,t){return{eve:{inputRequest:t?.inputRequest,kind:e.kind,name:e.name}}}function mergeToolMetadata(e,t){let n=t.eve?.kind??e?.eve?.kind??`unknown`,r=t.eve?.name??e?.eve?.name??`unknown`;return{eve:{...e?.eve,...t.eve,inputRequest:t.eve?.inputRequest??e?.eve?.inputRequest,inputResponse:t.eve?.inputResponse??e?.eve?.inputResponse,kind:n,name:r}}}function approvedApproval(e){if(e?.approval?.id)return{approved:!0,id:e.approval.id,isAutomatic:e.approval.isAutomatic,reason:e.approval.reason}}function normalizeActionRequest(e){switch(e.kind){case`load-skill`:return{kind:`load-skill`,name:`load_skill`,toolName:`eve:load-skill`};case`tool-call`:return{kind:`tool-call`,name:e.toolName,toolName:e.toolName};case`subagent-call`:return{kind:`subagent-call`,name:e.subagentName,toolName:`eve:subagent:${e.subagentName}`};case`remote-agent-call`:return{kind:`subagent-call`,name:e.remoteAgentName,toolName:`eve:subagent:${e.remoteAgentName}`}}}function normalizeActionResult(e){switch(e.kind){case`load-skill-result`:return{kind:`load-skill`,name:e.name??`load_skill`,toolName:`eve:load-skill`};case`tool-result`:return{kind:`tool-call`,name:e.toolName,toolName:e.toolName};case`subagent-result`:return{kind:`subagent-call`,name:e.subagentName,toolName:`eve:subagent:${e.subagentName}`}}}function stringifyUnknown(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return`Action failed.`}}export{approvedApproval,createToolMetadata,mergeToolMetadata,normalizeActionRequest,normalizeActionResult,stringifyUnknown,toMessageInputRequest};
@@ -1 +1 @@
1
- import{createAuthorizationCompletedPart,createAuthorizationRequiredPart}from"#client/authorization-message-parts.js";function defaultMessageReducer(){return{initial(){return{messages:[]}},reduce(e,t){return reduceMessageData(e,t)}}}function reduceMessageData(e,n){switch(n.type){case`client.message.submitted`:return upsertMessage(e,{id:optimisticUserMessageId(n.data.submissionId),metadata:{optimistic:!0,status:`submitted`},parts:[{type:`text`,text:n.data.message}],role:`user`});case`client.message.failed`:return upsertMessage(e,{id:optimisticUserMessageId(n.data.submissionId),metadata:{optimistic:!0,status:`failed`},parts:[{type:`text`,text:n.data.message}],role:`user`});case`client.input.responded`:{let t=e;for(let e of n.data.responses)t=respondToInputRequest(t,e);return t}case`message.received`:return upsertMessage(e,{id:`${n.data.turnId}:user`,metadata:{status:`complete`,turnId:n.data.turnId},parts:projectReceivedParts(n.data.parts,n.data.message),role:`user`});case`step.started`:return updateAssistantMessage(e,n.data.turnId,e=>ensureStepStartPart(e,n.data.stepIndex));case`reasoning.appended`:return updateAssistantMessage(e,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),{state:`streaming`,stepIndex:n.data.stepIndex,text:n.data.reasoningSoFar,type:`reasoning`}));case`reasoning.completed`:return updateAssistantMessage(e,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),{state:`done`,stepIndex:n.data.stepIndex,text:n.data.reasoning,type:`reasoning`}));case`actions.requested`:{let t=e;for(let e of n.data.actions){let r=normalizeActionRequest(e);t=updateAssistantMessage(t,n.data.turnId,t=>upsertPart(ensureStepStartPart(t,n.data.stepIndex),{input:`input`in e?e.input:void 0,state:`input-available`,stepIndex:n.data.stepIndex,toolCallId:e.callId,toolMetadata:createToolMetadata(r),toolName:r.toolName,type:`dynamic-tool`}))}return t}case`input.requested`:{let t=e;for(let e of n.data.requests){let r=normalizeActionRequest(e.action);t=updateAssistantMessage(t,n.data.turnId,t=>upsertPart(ensureStepStartPart(t,n.data.stepIndex),{approval:{id:e.requestId},input:e.action.input,state:`approval-requested`,stepIndex:n.data.stepIndex,toolCallId:e.action.callId,toolMetadata:createToolMetadata(r,{inputRequest:toMessageInputRequest(e)}),toolName:r.toolName,type:`dynamic-tool`}))}return t}case`action.result`:{let t=normalizeActionResult(n.data.result),r=findToolPart(e,n.data.result.callId),i=n.data.error?.code===`TOOL_EXECUTION_DENIED`,a=n.data.status===`failed`&&!i,o=r?.approval?.id??n.data.result.callId,s=mergeToolMetadata(r?.toolMetadata,createToolMetadata(t)),c={input:r?.input,stepIndex:n.data.stepIndex,toolCallId:n.data.result.callId,toolMetadata:s,toolName:r?.toolName??t.toolName,type:`dynamic-tool`},l;return l=i?{...c,approval:{approved:!1,id:o,reason:n.data.error?.message},state:`output-denied`}:a?{...c,approval:approvedApproval(r),errorText:n.data.error?.message??stringifyUnknown(n.data.result.output),state:`output-error`}:{...c,approval:approvedApproval(r),output:n.data.result.output,state:`output-available`},r===void 0?updateAssistantMessage(e,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),l)):updateToolPart(e,n.data.result.callId,l)}case`authorization.required`:return updateAssistantMessage(e,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),createAuthorizationRequiredPart(n)));case`authorization.completed`:return completeAuthorization(e,n);case`message.appended`:return updateAssistantMessage(e,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),{state:`streaming`,stepIndex:n.data.stepIndex,text:n.data.messageSoFar,type:`text`}));case`message.completed`:return updateAssistantMessage(e,n.data.turnId,e=>n.data.message===null?removeTextPart(e,n.data.stepIndex):upsertPart(ensureStepStartPart(e,n.data.stepIndex),{state:`done`,stepIndex:n.data.stepIndex,text:n.data.message,type:`text`}));case`result.completed`:return updateAssistantMetadata(e,n.data.turnId,{result:n.data.result});case`turn.completed`:return updateAssistantMetadata(e,n.data.turnId,{status:`complete`});case`turn.cancelled`:return updateAssistantMessage(e,n.data.turnId,e=>({...e,metadata:{...e.metadata,status:`complete`},parts:e.parts.map(e=>(e.type===`text`||e.type===`reasoning`)&&e.state===`streaming`?{...e,state:`done`}:e)}));case`turn.failed`:case`session.failed`:return e;default:return e}}function respondToInputRequest(e,t){let n=findToolPartByApprovalId(e,t.requestId);if(!n)return e;let r={id:t.requestId};return t.text!==void 0&&(r.reason=t.text),updateToolPart(e,n.toolCallId,{approval:r,input:n.input,state:`approval-responded`,stepIndex:n.stepIndex,toolCallId:n.toolCallId,toolMetadata:mergeToolMetadata(n.toolMetadata,{eve:{inputResponse:t,kind:n.toolMetadata?.eve?.kind??`unknown`,name:n.toolMetadata?.eve?.name??n.toolName}}),toolName:n.toolName,type:`dynamic-tool`})}function updateAssistantMessage(e,t,n){return upsertMessage(e,n(e.messages.find(e=>e.role===`assistant`&&e.metadata?.turnId===t)??createAssistantMessage(t)))}function updateAssistantMetadata(e,t,n){return updateAssistantMessage(e,t,e=>({...e,metadata:{...e.metadata,...n}}))}function createAssistantMessage(e){return{id:`${e}:assistant`,metadata:{status:`streaming`,turnId:e},parts:[],role:`assistant`}}function ensureStepStartPart(e,t){let n=e.parts.filter(e=>e.type===`step-start`).length;if(n>t)return e;let r=t-n+1;return{...e,parts:[...e.parts,...Array.from({length:r},()=>({type:`step-start`}))]}}function upsertPart(e,t){let n=e.parts.findIndex(e=>partKey(e)===partKey(t)),r=n===-1?[...e.parts,t]:[...e.parts.slice(0,n),t,...e.parts.slice(n+1)];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function removeTextPart(e,t){let n=e.parts.filter(e=>e.type!==`text`||e.stepIndex!==t);return n.length===e.parts.length?e:{...e,metadata:{...e.metadata,status:`complete`},parts:n}}function updateToolPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e.type===`dynamic-tool`&&e.toolCallId===t));return r?upsertMessage(e,upsertPart(r,n)):e}function completeAuthorization(t,n){let r=findLatestPendingAuthorizationPart(t,n.data.name),i=createAuthorizationCompletedPart(n,r);return r===void 0?updateAssistantMessage(t,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),i)):updateAuthorizationPart(t,r,i)}function updateAuthorizationPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e===t));return r?upsertMessage(e,upsertPart(r,n)):e}function findToolPart(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.toolCallId===t)return e}function findLatestPendingAuthorizationPart(e,t){for(let n=e.messages.length-1;n>=0;--n){let r=e.messages[n];if(r?.role===`assistant`)for(let e=r.parts.length-1;e>=0;--e){let n=r.parts[e];if(n?.type===`authorization`&&n.state===`required`&&n.name===t)return n}}}function findToolPartByApprovalId(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.approval?.id===t)return e}function projectReceivedParts(e,t){return e?.map(e=>e.type===`text`?{state:`done`,text:e.text,type:`text`}:{filename:e.filename,mediaType:e.mediaType,size:e.size,type:`file`,url:e.url})??[{state:`done`,text:t,type:`text`}]}function partKey(e){switch(e.type){case`text`:return`text:${e.stepIndex??0}`;case`reasoning`:return`reasoning:${e.stepIndex??0}`;case`file`:return`file:${e.stepIndex??0}:${e.filename??e.url??e.mediaType}`;case`step-start`:return`step-start`;case`authorization`:return`authorization:${e.turnId}:${e.stepIndex}:${e.name}`;case`dynamic-tool`:return`dynamic-tool:${e.toolCallId}`}}function upsertMessage(e,t){let n=e.messages.findIndex(e=>e.id===t.id);return n===-1?{messages:[...e.messages,t]}:{messages:[...e.messages.slice(0,n),t,...e.messages.slice(n+1)]}}function toMessageInputRequest(e){return{allowFreeform:e.allowFreeform,display:e.display,options:e.options,prompt:e.prompt,requestId:e.requestId}}function createToolMetadata(e,t){return{eve:{inputRequest:t?.inputRequest,kind:e.kind,name:e.name}}}function mergeToolMetadata(e,t){let n=t.eve?.kind??e?.eve?.kind??`unknown`,r=t.eve?.name??e?.eve?.name??`unknown`;return{eve:{...e?.eve,...t.eve,inputRequest:t.eve?.inputRequest??e?.eve?.inputRequest,inputResponse:t.eve?.inputResponse??e?.eve?.inputResponse,kind:n,name:r}}}function approvedApproval(e){if(e?.approval?.id)return{approved:!0,id:e.approval.id,isAutomatic:e.approval.isAutomatic,reason:e.approval.reason}}function normalizeActionRequest(e){switch(e.kind){case`load-skill`:return{kind:`load-skill`,name:`load_skill`,toolName:`eve:load-skill`};case`tool-call`:return{kind:`tool-call`,name:e.toolName,toolName:e.toolName};case`subagent-call`:return{kind:`subagent-call`,name:e.subagentName,toolName:`eve:subagent:${e.subagentName}`};case`remote-agent-call`:return{kind:`subagent-call`,name:e.remoteAgentName,toolName:`eve:subagent:${e.remoteAgentName}`}}}function normalizeActionResult(e){switch(e.kind){case`load-skill-result`:return{kind:`load-skill`,name:e.name??`load_skill`,toolName:`eve:load-skill`};case`tool-result`:return{kind:`tool-call`,name:e.toolName,toolName:e.toolName};case`subagent-result`:return{kind:`subagent-call`,name:e.subagentName,toolName:`eve:subagent:${e.subagentName}`}}}function optimisticUserMessageId(e){return`optimistic:${e}:user`}function stringifyUnknown(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return`Action failed.`}}export{defaultMessageReducer};
1
+ import{createAuthorizationCompletedPart,createAuthorizationRequiredPart}from"#client/authorization-message-parts.js";import{approvedApproval,createToolMetadata,mergeToolMetadata,normalizeActionRequest,normalizeActionResult,stringifyUnknown,toMessageInputRequest}from"#client/message-action-parts.js";function defaultMessageReducer(){return{initial(){return{messages:[]}},reduce(e,t){return reduceMessageData(e,t)}}}function reduceMessageData(e,s){switch(s.type){case`client.message.submitted`:return upsertMessage(e,{id:optimisticUserMessageId(s.data.submissionId),metadata:{optimistic:!0,status:`submitted`},parts:[{type:`text`,text:s.data.message}],role:`user`});case`client.message.failed`:return upsertMessage(e,{id:optimisticUserMessageId(s.data.submissionId),metadata:{optimistic:!0,status:`failed`},parts:[{type:`text`,text:s.data.message}],role:`user`});case`client.input.responded`:{let t=e;for(let e of s.data.responses)t=respondToInputRequest(t,e);return t}case`message.received`:return upsertMessage(e,{id:`${s.data.turnId}:user`,metadata:{status:`complete`,turnId:s.data.turnId},parts:projectReceivedParts(s.data.parts,s.data.message),role:`user`});case`step.started`:return updateAssistantMessage(e,s.data.turnId,e=>ensureStepStartPart(e,s.data.stepIndex));case`reasoning.appended`:return updateAssistantMessage(e,s.data.turnId,e=>upsertRun(ensureStepStartPart(e,s.data.stepIndex),{state:`streaming`,stepIndex:s.data.stepIndex,text:s.data.reasoningSoFar,type:`reasoning`}));case`reasoning.completed`:return updateAssistantMessage(e,s.data.turnId,e=>upsertRun(ensureStepStartPart(e,s.data.stepIndex),{state:`done`,stepIndex:s.data.stepIndex,text:s.data.reasoning,type:`reasoning`}));case`actions.requested`:{let t=e;for(let e of s.data.actions){let n=normalizeActionRequest(e);t=updateAssistantMessage(t,s.data.turnId,t=>upsertPart(ensureStepStartPart(t,s.data.stepIndex),{input:`input`in e?e.input:void 0,state:`input-available`,stepIndex:s.data.stepIndex,toolCallId:e.callId,toolMetadata:createToolMetadata(n),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`input.requested`:{let t=e;for(let e of s.data.requests){let n=normalizeActionRequest(e.action);t=updateAssistantMessage(t,s.data.turnId,t=>upsertPart(ensureStepStartPart(t,s.data.stepIndex),{approval:{id:e.requestId},input:e.action.input,state:`approval-requested`,stepIndex:s.data.stepIndex,toolCallId:e.action.callId,toolMetadata:createToolMetadata(n,{inputRequest:toMessageInputRequest(e)}),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`action.result`:{let t=normalizeActionResult(s.data.result),a=findToolPart(e,s.data.result.callId),o=s.data.error?.code===`TOOL_EXECUTION_DENIED`,c=s.data.status===`failed`&&!o,l=a?.approval?.id??s.data.result.callId,u=mergeToolMetadata(a?.toolMetadata,createToolMetadata(t)),d={input:a?.input,stepIndex:s.data.stepIndex,toolCallId:s.data.result.callId,toolMetadata:u,toolName:a?.toolName??t.toolName,type:`dynamic-tool`},f;return f=o?{...d,approval:{approved:!1,id:l,reason:s.data.error?.message},state:`output-denied`}:c?{...d,approval:approvedApproval(a),errorText:s.data.error?.message??stringifyUnknown(s.data.result.output),state:`output-error`}:{...d,approval:approvedApproval(a),output:s.data.result.output,state:`output-available`},a===void 0?updateAssistantMessage(e,s.data.turnId,e=>upsertPart(ensureStepStartPart(e,s.data.stepIndex),f)):updateToolPart(e,s.data.result.callId,f)}case`authorization.required`:return updateAssistantMessage(e,s.data.turnId,e=>upsertPart(ensureStepStartPart(e,s.data.stepIndex),createAuthorizationRequiredPart(s)));case`authorization.completed`:return completeAuthorization(e,s);case`message.appended`:return updateAssistantMessage(e,s.data.turnId,e=>upsertRun(ensureStepStartPart(e,s.data.stepIndex),{state:`streaming`,stepIndex:s.data.stepIndex,text:s.data.messageSoFar,type:`text`}));case`message.completed`:return updateAssistantMessage(e,s.data.turnId,e=>s.data.message===null?removeTextPart(e,s.data.stepIndex):upsertRun(ensureStepStartPart(e,s.data.stepIndex),{state:`done`,stepIndex:s.data.stepIndex,text:s.data.message,type:`text`}));case`result.completed`:return updateAssistantMetadata(e,s.data.turnId,{result:s.data.result});case`turn.completed`:return updateAssistantMetadata(e,s.data.turnId,{status:`complete`});case`turn.cancelled`:return updateAssistantMessage(e,s.data.turnId,e=>({...e,metadata:{...e.metadata,status:`complete`},parts:e.parts.map(e=>(e.type===`text`||e.type===`reasoning`)&&e.state===`streaming`?{...e,state:`done`}:e)}));case`turn.failed`:case`session.failed`:return e;default:return e}}function respondToInputRequest(e,t){let n=findToolPartByApprovalId(e,t.requestId);if(!n)return e;let r={id:t.requestId};return t.text!==void 0&&(r.reason=t.text),updateToolPart(e,n.toolCallId,{approval:r,input:n.input,state:`approval-responded`,stepIndex:n.stepIndex,toolCallId:n.toolCallId,toolMetadata:mergeToolMetadata(n.toolMetadata,{eve:{inputResponse:t,kind:n.toolMetadata?.eve?.kind??`unknown`,name:n.toolMetadata?.eve?.name??n.toolName}}),toolName:n.toolName,type:`dynamic-tool`})}function updateAssistantMessage(e,t,n){return upsertMessage(e,n(e.messages.find(e=>e.role===`assistant`&&e.metadata?.turnId===t)??createAssistantMessage(t)))}function updateAssistantMetadata(e,t,n){return updateAssistantMessage(e,t,e=>({...e,metadata:{...e.metadata,...n}}))}function createAssistantMessage(e){return{id:`${e}:assistant`,metadata:{status:`streaming`,turnId:e},parts:[],role:`assistant`}}function ensureStepStartPart(e,t){let n=e.parts.filter(e=>e.type===`step-start`).length;if(n>t)return e;let r=t-n+1;return{...e,parts:[...e.parts,...Array.from({length:r},()=>({type:`step-start`}))]}}function upsertPart(e,t){let n=e.parts.findIndex(e=>partKey(e)===partKey(t)),r=n===-1?[...e.parts,t]:[...e.parts.slice(0,n),t,...e.parts.slice(n+1)];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function upsertRun(e,t){let n=-1;for(let r=e.parts.length-1;r>=0;--r){let i=e.parts[r];if(i?.type===t.type&&i.stepIndex===t.stepIndex){n=r;break}}let r=n!==-1&&e.parts[n].state===`streaming`?[...e.parts.slice(0,n),t,...e.parts.slice(n+1)]:[...e.parts,t];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function removeTextPart(e,t){let n=e.parts.filter(e=>e.type!==`text`||e.stepIndex!==t);return n.length===e.parts.length?e:{...e,metadata:{...e.metadata,status:`complete`},parts:n}}function updateToolPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e.type===`dynamic-tool`&&e.toolCallId===t));return r?upsertMessage(e,upsertPart(r,n)):e}function completeAuthorization(t,n){let r=findLatestPendingAuthorizationPart(t,n.data.name),i=createAuthorizationCompletedPart(n,r);return r===void 0?updateAssistantMessage(t,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),i)):updateAuthorizationPart(t,r,i)}function updateAuthorizationPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e===t));return r?upsertMessage(e,upsertPart(r,n)):e}function findToolPart(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.toolCallId===t)return e}function findLatestPendingAuthorizationPart(e,t){for(let n=e.messages.length-1;n>=0;--n){let r=e.messages[n];if(r?.role===`assistant`)for(let e=r.parts.length-1;e>=0;--e){let n=r.parts[e];if(n?.type===`authorization`&&n.state===`required`&&n.name===t)return n}}}function findToolPartByApprovalId(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.approval?.id===t)return e}function projectReceivedParts(e,t){return e?.map(e=>e.type===`text`?{state:`done`,text:e.text,type:`text`}:{filename:e.filename,mediaType:e.mediaType,size:e.size,type:`file`,url:e.url})??[{state:`done`,text:t,type:`text`}]}function partKey(e){switch(e.type){case`text`:return`text:${e.stepIndex??0}`;case`reasoning`:return`reasoning:${e.stepIndex??0}`;case`file`:return`file:${e.stepIndex??0}:${e.filename??e.url??e.mediaType}`;case`step-start`:return`step-start`;case`authorization`:return`authorization:${e.turnId}:${e.stepIndex}:${e.name}`;case`dynamic-tool`:return`dynamic-tool:${e.toolCallId}`}}function upsertMessage(e,t){let n=e.messages.findIndex(e=>e.id===t.id);return n===-1?{messages:[...e.messages,t]}:{messages:[...e.messages.slice(0,n),t,...e.messages.slice(n+1)]}}function optimisticUserMessageId(e){return`optimistic:${e}:user`}export{defaultMessageReducer};
@@ -1 +1 @@
1
- import{EVE_CREATE_SESSION_ROUTE_PATH,createEveCancelTurnRoutePath,createEveContinueSessionRoutePath}from"#protocol/routes.js";import{ClientError}from"#client/client-error.js";import{advanceSession}from"#client/session-utils.js";import{createClientUrl}from"#client/url.js";import{MessageResponse}from"#client/message-response.js";import{EVE_SESSION_ID_HEADER,isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{CancelTurnResponseSchema}from"#protocol/cancel-turn.js";import{followStreamIterable}from"#client/open-stream.js";import{serializeOutputSchema}from"#shared/tool-schema.js";var ClientSession=class{#e;#t;constructor(e,t){this.#e=e,this.#t=t}get state(){return this.#t}async send(e){let t=normalizeSendTurnInput(e),n=this.#t,{continuationToken:r,sessionId:i}=await this.#n(t,n);return this.#t===n&&(this.#t={...n,sessionId:i}),new MessageResponse({continuationToken:r,createStream:()=>this.#r(i,r,n,t),sessionId:i})}async cancel(e){let n=this.#t.sessionId;if(!n)throw Error(`Session has no session ID. Send a message first.`);let i=createClientUrl(this.#e.host,createEveCancelTurnRoutePath(n)),o=await this.#e.resolveHeaders();o.set(`content-type`,`application/json`);let s=await fetch(i,withRedirectPolicy({headers:o,method:`POST`,body:e?JSON.stringify(e):void 0},this.#e.redirect)),c=await s.text();if(!s.ok)throw new ClientError(s.status,c,s.headers);let u;try{u=JSON.parse(c)}catch{throw Error(`Cancel route returned invalid JSON (${s.status}).`)}let d=CancelTurnResponseSchema.safeParse(u);if(!d.success||d.data.sessionId!==n)throw Error(`Cancel route returned an invalid response (${s.status}).`);return{sessionId:d.data.sessionId,status:d.data.status}}stream(e){let t=this.#t.sessionId;if(!t)throw Error(`Session has no session ID. Send a message first.`);return this.#i(t,e)}async#n(t,r){let i=r.sessionId?createEveContinueSessionRoutePath(r.sessionId):EVE_CREATE_SESSION_ROUTE_PATH,o=createClientUrl(this.#e.host,i),c=await this.#e.resolveHeaders(t.headers);c.set(`content-type`,`application/json`);let l=createHandleMessageBody({input:t,outputSchema:serializeOutputSchema(t.outputSchema),session:r});if(l===null)throw Error(`Session.send requires a non-empty message, inputResponses, or both.`);let u=await postTurnWithRetry({body:JSON.stringify(l),headers:c,mustDeliver:(t.inputResponses?.length??0)>0,redirect:this.#e.redirect,signal:t.signal,url:o}),f=await u.json(),p=(typeof f.sessionId==`string`?f.sessionId:void 0)??u.headers.get(EVE_SESSION_ID_HEADER)?.trim()??r.sessionId;if(!p)throw Error(`Message route did not return a session id.`);return{continuationToken:typeof f.continuationToken==`string`?f.continuationToken:void 0,sessionId:p}}async*#r(e,t,n,r){let a=[];try{for await(let t of followStreamIterable({host:this.#e.host,resolveHeaders:()=>this.#e.resolveHeaders(r.headers),redirect:this.#e.redirect,sessionId:e,signal:r.signal,startIndex:n.sessionId===e?n.streamIndex:0}))if(a.push(t),yield t,isCurrentTurnBoundaryEvent(t))break}finally{this.#t=advanceSession({continuationToken:t,events:a,preserveCompletedSessions:this.#e.preserveCompletedSessions,sessionId:e,session:n})}}async*#i(e,t){let n=this.#t,r=t?.startIndex??n.streamIndex,a=[];try{for await(let n of followStreamIterable({host:this.#e.host,resolveHeaders:()=>this.#e.resolveHeaders(),redirect:this.#e.redirect,sessionId:e,signal:t?.signal,startIndex:r}))a.push(n),yield n}finally{r>=0&&(this.#t=advanceSession({continuationToken:n.continuationToken,events:a,preserveCompletedSessions:this.#e.preserveCompletedSessions,session:{...n,sessionId:e,streamIndex:r},sessionId:e}))}}};async function postTurnWithRetry(e){let t=e.mustDeliver?10:1,n,i,a;for(let o=0;o<t;o+=1){let s=await fetch(e.url,{body:e.body,headers:e.headers,method:`POST`,redirect:e.redirect,signal:e.signal??null});if(s.ok)return s;if(n=s.status,i=await s.text(),a=s.headers,!isRetryableDeliveryFailure(s.status,i))throw new ClientError(s.status,i,s.headers);o<t-1&&await sleep(200)}throw new ClientError(n??0,i??`Failed to deliver session turn.`,a)}function isRetryableDeliveryFailure(e,t){return e===500&&/target session was not found/i.test(t)}async function sleep(e){await new Promise(t=>setTimeout(t,e))}function normalizeSendTurnInput(e){return typeof e==`string`?{message:e}:e}function createHandleMessageBody(e){let t={};return e.input.message!==void 0&&(t.message=e.input.message),e.input.inputResponses!==void 0&&e.input.inputResponses.length>0&&(t.inputResponses=e.input.inputResponses),e.input.clientContext!==void 0&&(t.clientContext=e.input.clientContext),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),e.session.continuationToken!==void 0&&(t.continuationToken=e.session.continuationToken),Object.keys(t).length===0||e.session.continuationToken===void 0&&t.message===void 0||e.session.continuationToken!==void 0&&t.message===void 0&&t.inputResponses===void 0?null:t}function withRedirectPolicy(e,t){return t===void 0?e:{...e,redirect:t}}export{ClientSession};
1
+ import{EVE_CREATE_SESSION_ROUTE_PATH,createEveCancelTurnRoutePath,createEveContinueSessionRoutePath}from"#protocol/routes.js";import{EVE_SESSION_ID_HEADER,isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{ClientError}from"#client/client-error.js";import{advanceSession}from"#client/session-utils.js";import{createClientUrl}from"#client/url.js";import{MessageResponse}from"#client/message-response.js";import{CancelTurnResponseSchema}from"#protocol/cancel-turn.js";import{followStreamIterable}from"#client/open-stream.js";import{serializeOutputSchema}from"#shared/tool-schema.js";var ClientSession=class{#e;#t;constructor(e,t){this.#e=e,this.#t=t}get state(){return this.#t}async send(e){let t=normalizeSendTurnInput(e),n=this.#t,{continuationToken:r,sessionId:i}=await this.#n(t,n);return this.#t===n&&(this.#t={...n,sessionId:i}),new MessageResponse({continuationToken:r,createStream:()=>this.#r(i,r,n,t),sessionId:i})}async cancel(e){let n=this.#t.sessionId;if(!n)throw Error(`Session has no session ID. Send a message first.`);let r=createClientUrl(this.#e.host,createEveCancelTurnRoutePath(n)),i=await this.#e.resolveHeaders();i.set(`content-type`,`application/json`);let o=await fetch(r,withRedirectPolicy({headers:i,method:`POST`,body:e?JSON.stringify(e):void 0},this.#e.redirect)),c=await o.text();if(!o.ok)throw new ClientError(o.status,c,o.headers);let u;try{u=JSON.parse(c)}catch{throw Error(`Cancel route returned invalid JSON (${o.status}).`)}let d=CancelTurnResponseSchema.safeParse(u);if(!d.success||d.data.sessionId!==n)throw Error(`Cancel route returned an invalid response (${o.status}).`);return{sessionId:d.data.sessionId,status:d.data.status}}stream(e){let t=this.#t.sessionId;if(!t)throw Error(`Session has no session ID. Send a message first.`);return this.#i(t,e)}async#n(t,i){let a=i.sessionId?createEveContinueSessionRoutePath(i.sessionId):EVE_CREATE_SESSION_ROUTE_PATH,o=createClientUrl(this.#e.host,a),c=await this.#e.resolveHeaders(t.headers);c.set(`content-type`,`application/json`);let l=createHandleMessageBody({input:t,outputSchema:serializeOutputSchema(t.outputSchema),session:i});if(l===null)throw Error(`Session.send requires a non-empty message, inputResponses, or both.`);let u=await postTurnWithRetry({body:JSON.stringify(l),headers:c,mustDeliver:(t.inputResponses?.length??0)>0,redirect:this.#e.redirect,signal:t.signal,url:o}),f=await u.json(),p=(typeof f.sessionId==`string`?f.sessionId:void 0)??u.headers.get(EVE_SESSION_ID_HEADER)?.trim()??i.sessionId;if(!p)throw Error(`Message route did not return a session id.`);return{continuationToken:typeof f.continuationToken==`string`?f.continuationToken:void 0,sessionId:p}}async*#r(e,t,n,r){let a=[];try{for await(let t of followStreamIterable({host:this.#e.host,resolveHeaders:()=>this.#e.resolveHeaders(r.headers),redirect:this.#e.redirect,sessionId:e,signal:r.signal,startIndex:n.sessionId===e?n.streamIndex:0}))if(a.push(t),yield t,isCurrentTurnBoundaryEvent(t))break}finally{this.#t=advanceSession({continuationToken:t,events:a,preserveCompletedSessions:this.#e.preserveCompletedSessions,sessionId:e,session:n})}}async*#i(e,t){let n=this.#t,r=t?.startIndex??n.streamIndex,i=[];try{for await(let n of followStreamIterable({host:this.#e.host,resolveHeaders:()=>this.#e.resolveHeaders(),redirect:this.#e.redirect,sessionId:e,signal:t?.signal,startIndex:r}))i.push(n),yield n}finally{r>=0&&(this.#t=advanceSession({continuationToken:n.continuationToken,events:i,preserveCompletedSessions:this.#e.preserveCompletedSessions,session:{...n,sessionId:e,streamIndex:r},sessionId:e}))}}};async function postTurnWithRetry(e){let t=e.mustDeliver?10:1,n,r,i;for(let o=0;o<t;o+=1){let s=await fetch(e.url,{body:e.body,headers:e.headers,method:`POST`,redirect:e.redirect,signal:e.signal??null});if(s.ok)return s;if(n=s.status,r=await s.text(),i=s.headers,!isRetryableDeliveryFailure(s.status,r))throw new ClientError(s.status,r,s.headers);o<t-1&&await sleep(200)}throw new ClientError(n??0,r??`Failed to deliver session turn.`,i)}function isRetryableDeliveryFailure(e,t){return e===500&&/target session was not found/i.test(t)}async function sleep(e){await new Promise(t=>setTimeout(t,e))}function normalizeSendTurnInput(e){return typeof e==`string`?{message:e}:e}function createHandleMessageBody(e){let t={};return e.input.message!==void 0&&(t.message=e.input.message),e.input.inputResponses!==void 0&&e.input.inputResponses.length>0&&(t.inputResponses=e.input.inputResponses),e.input.clientContext!==void 0&&(t.clientContext=e.input.clientContext),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),e.session.continuationToken!==void 0&&(t.continuationToken=e.session.continuationToken),Object.keys(t).length===0||e.session.continuationToken===void 0&&t.message===void 0||e.session.continuationToken!==void 0&&t.message===void 0&&t.inputResponses===void 0?null:t}function withRedirectPolicy(e,t){return t===void 0?e:{...e,redirect:t}}export{ClientSession};
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "moduleVersions": {
3
3
  "@ai-sdk/anthropic": "4.0.14",
4
- "chat": "4.31.0",
5
- "@chat-adapter/slack": "4.31.0",
6
- "@chat-adapter/state-memory": "4.31.0",
7
- "@chat-adapter/twilio": "4.31.0",
4
+ "chat": "4.34.0",
5
+ "@chat-adapter/slack": "4.34.0",
6
+ "@chat-adapter/state-memory": "4.34.0",
7
+ "@chat-adapter/twilio": "4.34.0",
8
8
  "chokidar": "5.0.0",
9
9
  "commander": "14.0.3",
10
10
  "experimental-ai-sdk-code-mode": "1.0.16",
@@ -15,6 +15,7 @@
15
15
  "jose": "6.2.3",
16
16
  "jsonc-parser": "3.3.1",
17
17
  "@types/json-schema": "7.0.15",
18
+ "marked": "17.0.6",
18
19
  "@ai-sdk/mcp": "2.0.12",
19
20
  "@ai-sdk/openai": "4.0.13",
20
21
  "@opentelemetry/api": "1.9.1",
@@ -37,5 +38,5 @@
37
38
  "zod": "4.4.3",
38
39
  "zod-validation-error": "5.0.0"
39
40
  },
40
- "scriptHash": "6982568a50b7109abb3a3b1fcb95d16a70e8a9408ea1d790fd26142339d46c01"
41
+ "scriptHash": "8da9abfc5a69e5b398d150c3d0988f4facdeec175e869134e17cea976897d5c4"
41
42
  }
@@ -8,7 +8,7 @@ interface SlackCardElement {
8
8
  title?: string;
9
9
  type: "card";
10
10
  }
11
- type SlackCardChild = SlackActionsElement | SlackDividerElement | SlackFieldsElement | SlackImageElement | SlackLinkElement | SlackSectionElement | SlackTableElement | SlackTextElement;
11
+ type SlackCardChild = SlackActionsElement | SlackChartElement | SlackDividerElement | SlackFieldsElement | SlackImageElement | SlackLinkElement | SlackSectionElement | SlackTableElement | SlackTextElement;
12
12
  interface SlackTextElement {
13
13
  content: string;
14
14
  style?: SlackTextStyle;
@@ -82,10 +82,55 @@ interface SlackFieldsElement {
82
82
  }
83
83
  interface SlackTableElement {
84
84
  align?: SlackTableAlignment[];
85
+ /** Accessible table caption for the data table block */
86
+ caption?: string;
85
87
  headers: string[];
88
+ /** Rows per page (1-100; Slack defaults to 5) */
89
+ pageSize?: number;
86
90
  rows: string[][];
87
91
  type: "table";
88
92
  }
93
+ interface SlackChartSegment {
94
+ /** Legend label (max 20 characters) */
95
+ label: string;
96
+ /** Segment value; must be greater than 0 */
97
+ value: number;
98
+ }
99
+ interface SlackChartDataPoint {
100
+ /** Category label; must match an entry in the chart's `categories` */
101
+ label: string;
102
+ /** Y-axis value (negative values are permitted) */
103
+ value: number;
104
+ }
105
+ interface SlackChartSeries {
106
+ /** One data point per category */
107
+ data: SlackChartDataPoint[];
108
+ /** Legend label; unique within the chart (max 20 characters) */
109
+ name: string;
110
+ }
111
+ interface SlackPieChartDefinition {
112
+ /** Pie segments (1-12) */
113
+ segments: SlackChartSegment[];
114
+ type: "pie";
115
+ }
116
+ interface SlackSeriesChartDefinition {
117
+ /** X-axis category labels in display order (max 20 characters each) */
118
+ categories: string[];
119
+ /** Data series (1-12); each series needs one point per category */
120
+ series: SlackChartSeries[];
121
+ type: "area" | "bar" | "line";
122
+ /** X-axis title (max 50 characters) */
123
+ xLabel?: string;
124
+ /** Y-axis title (max 50 characters) */
125
+ yLabel?: string;
126
+ }
127
+ type SlackChartDefinition = SlackPieChartDefinition | SlackSeriesChartDefinition;
128
+ interface SlackChartElement {
129
+ chart: SlackChartDefinition;
130
+ /** Chart title (max 50 characters) */
131
+ title: string;
132
+ type: "chart";
133
+ }
89
134
  interface SlackTextObject {
90
135
  emoji?: boolean;
91
136
  text: string;
@@ -157,4 +202,4 @@ declare function cardToSlackFallbackText(card: SlackCardElement, options?: Pick<
157
202
  declare const cardToFallbackText: typeof cardToSlackFallbackText;
158
203
  declare function convertSlackEmojiPlaceholders(text: string): string;
159
204
 
160
- export { SLACK_FREEFORM_ACTION_ID, SLACK_FREEFORM_ACTION_PREFIX, SLACK_FREEFORM_BLOCK_ID, SLACK_FREEFORM_CALLBACK_ID, SLACK_INPUT_ACTION_PREFIX, type SlackActionsElement, type SlackBlock, SlackBlockError, type SlackBlocksOptions, type SlackButtonElement, type SlackButtonStyle, type SlackCardChild, type SlackCardElement, type SlackDividerElement, type SlackFieldElement, type SlackFieldsElement, type SlackFreeformViewOptions, type SlackImageElement, type SlackInputAction, type SlackInputOption, type SlackInputRequest, type SlackInputResponse, type SlackLinkButtonElement, type SlackLinkElement, type SlackRadioSelectElement, type SlackSectionElement, type SlackSelectElement, type SlackSelectOptionElement, type SlackTableAlignment, type SlackTableElement, type SlackTextElement, type SlackTextObject, type SlackTextStyle, answeredSlackInputBlocks, buildSlackFreeformView, cardToBlockKit, cardToFallbackText, cardToSlackBlocks, cardToSlackFallbackText, convertSlackEmojiPlaceholders, inputRequestToSlackBlocks, parseSlackFreeformValue, parseSlackInputResponse };
205
+ export { SLACK_FREEFORM_ACTION_ID, SLACK_FREEFORM_ACTION_PREFIX, SLACK_FREEFORM_BLOCK_ID, SLACK_FREEFORM_CALLBACK_ID, SLACK_INPUT_ACTION_PREFIX, type SlackActionsElement, type SlackBlock, SlackBlockError, type SlackBlocksOptions, type SlackButtonElement, type SlackButtonStyle, type SlackCardChild, type SlackCardElement, type SlackChartDataPoint, type SlackChartDefinition, type SlackChartElement, type SlackChartSegment, type SlackChartSeries, type SlackDividerElement, type SlackFieldElement, type SlackFieldsElement, type SlackFreeformViewOptions, type SlackImageElement, type SlackInputAction, type SlackInputOption, type SlackInputRequest, type SlackInputResponse, type SlackLinkButtonElement, type SlackLinkElement, type SlackPieChartDefinition, type SlackRadioSelectElement, type SlackSectionElement, type SlackSelectElement, type SlackSelectOptionElement, type SlackSeriesChartDefinition, type SlackTableAlignment, type SlackTableElement, type SlackTextElement, type SlackTextObject, type SlackTextStyle, answeredSlackInputBlocks, buildSlackFreeformView, cardToBlockKit, cardToFallbackText, cardToSlackBlocks, cardToSlackFallbackText, convertSlackEmojiPlaceholders, inputRequestToSlackBlocks, parseSlackFreeformValue, parseSlackInputResponse };