@markusylisiurunen/tau 0.3.39 → 0.3.41

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 (138) hide show
  1. package/README.md +34 -38
  2. package/dist/core/agent/agent_runtime.js +0 -22
  3. package/dist/core/agent/agent_runtime.js.map +1 -1
  4. package/dist/core/cli.js +2 -2
  5. package/dist/core/cli.js.map +1 -1
  6. package/dist/core/commands/registry.js +22 -20
  7. package/dist/core/commands/registry.js.map +1 -1
  8. package/dist/core/config/builtin_themes.js +936 -998
  9. package/dist/core/config/builtin_themes.js.map +1 -1
  10. package/dist/core/history/migrations.js +57 -0
  11. package/dist/core/history/migrations.js.map +1 -0
  12. package/dist/core/history/setup.js +18 -0
  13. package/dist/core/history/setup.js.map +1 -1
  14. package/dist/core/personas.js +8 -53
  15. package/dist/core/personas.js.map +1 -1
  16. package/dist/core/runtime/chat_runtime.js +0 -6
  17. package/dist/core/runtime/chat_runtime.js.map +1 -1
  18. package/dist/core/session/direct_bash.js +8 -8
  19. package/dist/core/session/direct_bash.js.map +1 -1
  20. package/dist/core/session/runner.js +6 -1
  21. package/dist/core/session/runner.js.map +1 -1
  22. package/dist/core/static/code_mode/history/documentation.md +3 -3
  23. package/dist/core/static/code_mode/nook/documentation.md +6 -4
  24. package/dist/core/static/code_mode/web/documentation.md +3 -3
  25. package/dist/core/tools/bash.js +80 -63
  26. package/dist/core/tools/bash.js.map +1 -1
  27. package/dist/core/tools/code_mode.js +45 -12
  28. package/dist/core/tools/code_mode.js.map +1 -1
  29. package/dist/core/tools/edit.js +72 -84
  30. package/dist/core/tools/edit.js.map +1 -1
  31. package/dist/core/tools/goal.js +97 -16
  32. package/dist/core/tools/goal.js.map +1 -1
  33. package/dist/core/tools/history.js +13 -15
  34. package/dist/core/tools/history.js.map +1 -1
  35. package/dist/core/tools/interrupt_agent.js +56 -37
  36. package/dist/core/tools/interrupt_agent.js.map +1 -1
  37. package/dist/core/tools/list_agents.js +28 -13
  38. package/dist/core/tools/list_agents.js.map +1 -1
  39. package/dist/core/tools/nook.js +15 -15
  40. package/dist/core/tools/nook.js.map +1 -1
  41. package/dist/core/tools/presentation.js +226 -0
  42. package/dist/core/tools/presentation.js.map +1 -0
  43. package/dist/core/tools/registry.js.map +1 -1
  44. package/dist/core/tools/send_input_to_agent.js +57 -47
  45. package/dist/core/tools/send_input_to_agent.js.map +1 -1
  46. package/dist/core/tools/spawn_agent.js +81 -52
  47. package/dist/core/tools/spawn_agent.js.map +1 -1
  48. package/dist/core/tools/subagent_ui.js +14 -38
  49. package/dist/core/tools/subagent_ui.js.map +1 -1
  50. package/dist/core/tools/view_image.js +45 -45
  51. package/dist/core/tools/view_image.js.map +1 -1
  52. package/dist/core/tools/wait_for_agents.js +94 -56
  53. package/dist/core/tools/wait_for_agents.js.map +1 -1
  54. package/dist/core/tools/web.js +11 -13
  55. package/dist/core/tools/web.js.map +1 -1
  56. package/dist/core/tools/write.js +41 -39
  57. package/dist/core/tools/write.js.map +1 -1
  58. package/dist/core/utils/gemini_speech.js +1 -1
  59. package/dist/core/utils/gemini_speech.js.map +1 -1
  60. package/dist/core/utils/subagent_utils.js +3 -3
  61. package/dist/core/utils/subagent_utils.js.map +1 -1
  62. package/dist/core/version.js +1 -1
  63. package/dist/execution/cloudflare_sandbox_execution_environment.js +1 -1
  64. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -1
  65. package/dist/history/worker/index.js +149 -192
  66. package/dist/history/worker/index.js.map +1 -1
  67. package/dist/host/client_tool_broker.js +29 -31
  68. package/dist/host/client_tool_broker.js.map +1 -1
  69. package/dist/host/local_session_host.js +11 -5
  70. package/dist/host/local_session_host.js.map +1 -1
  71. package/dist/main.js +6 -6
  72. package/dist/main.js.map +1 -1
  73. package/dist/tui/chat_controller/diff_review_service.js +1 -1
  74. package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
  75. package/dist/tui/chat_controller/history_labels.js +13 -0
  76. package/dist/tui/chat_controller/history_labels.js.map +1 -1
  77. package/dist/tui/chat_view.js +24 -50
  78. package/dist/tui/chat_view.js.map +1 -1
  79. package/dist/tui/session_chat_app.js +3 -4
  80. package/dist/tui/session_chat_app.js.map +1 -1
  81. package/dist/tui/session_chat_controller.js +80 -111
  82. package/dist/tui/session_chat_controller.js.map +1 -1
  83. package/dist/tui/terminal_appearance.js +44 -25
  84. package/dist/tui/terminal_appearance.js.map +1 -1
  85. package/dist/tui/ui/autocomplete_item.js +2 -0
  86. package/dist/tui/ui/autocomplete_item.js.map +1 -0
  87. package/dist/tui/ui/chat_container.js +1 -14
  88. package/dist/tui/ui/chat_container.js.map +1 -1
  89. package/dist/tui/ui/chat_message_model.js +4 -12
  90. package/dist/tui/ui/chat_message_model.js.map +1 -1
  91. package/dist/tui/ui/components/autocomplete_list.js +138 -0
  92. package/dist/tui/ui/components/autocomplete_list.js.map +1 -0
  93. package/dist/tui/ui/components/editor.js +33 -40
  94. package/dist/tui/ui/components/editor.js.map +1 -1
  95. package/dist/tui/ui/components/one_line_segments.js +0 -67
  96. package/dist/tui/ui/components/one_line_segments.js.map +1 -1
  97. package/dist/tui/ui/custom_editor.js +15 -11
  98. package/dist/tui/ui/custom_editor.js.map +1 -1
  99. package/dist/tui/ui/diff_review_message.js +1 -11
  100. package/dist/tui/ui/diff_review_message.js.map +1 -1
  101. package/dist/tui/ui/footer.js +63 -13
  102. package/dist/tui/ui/footer.js.map +1 -1
  103. package/dist/tui/ui/rewind_picker.js +17 -47
  104. package/dist/tui/ui/rewind_picker.js.map +1 -1
  105. package/dist/tui/ui/slash_autocomplete.js +43 -64
  106. package/dist/tui/ui/slash_autocomplete.js.map +1 -1
  107. package/dist/tui/ui/subagent_editor_pane.js +3 -3
  108. package/dist/tui/ui/theme/index.js +1 -1
  109. package/dist/tui/ui/theme/index.js.map +1 -1
  110. package/dist/tui/ui/theme/palette.js +245 -8
  111. package/dist/tui/ui/theme/palette.js.map +1 -1
  112. package/dist/tui/ui/theme/theme.js +3 -30
  113. package/dist/tui/ui/theme/theme.js.map +1 -1
  114. package/dist/tui/ui/tool_card.js +137 -0
  115. package/dist/tui/ui/tool_card.js.map +1 -0
  116. package/dist/tui/ui/user_message.js +3 -6
  117. package/dist/tui/ui/user_message.js.map +1 -1
  118. package/package.json +2 -2
  119. package/dist/core/utils/tool_preview.js +0 -73
  120. package/dist/core/utils/tool_preview.js.map +0 -1
  121. package/dist/tui/chat_controller/command_hints.js +0 -35
  122. package/dist/tui/chat_controller/command_hints.js.map +0 -1
  123. package/dist/tui/ui/bash_execution.js +0 -129
  124. package/dist/tui/ui/bash_execution.js.map +0 -1
  125. package/dist/tui/ui/components/dynamic_border.js +0 -11
  126. package/dist/tui/ui/components/dynamic_border.js.map +0 -1
  127. package/dist/tui/ui/components/header_box.js +0 -107
  128. package/dist/tui/ui/components/header_box.js.map +0 -1
  129. package/dist/tui/ui/components/header_line.js +0 -60
  130. package/dist/tui/ui/components/header_line.js.map +0 -1
  131. package/dist/tui/ui/components/padded_container.js +0 -24
  132. package/dist/tui/ui/components/padded_container.js.map +0 -1
  133. package/dist/tui/ui/file_execution.js +0 -176
  134. package/dist/tui/ui/file_execution.js.map +0 -1
  135. package/dist/tui/ui/tool_output.js +0 -163
  136. package/dist/tui/ui/tool_output.js.map +0 -1
  137. package/dist/tui/ui/tool_ui_registry.js +0 -786
  138. package/dist/tui/ui/tool_ui_registry.js.map +0 -1
@@ -1,786 +0,0 @@
1
- import { TOOL_NAME_BASH, TOOL_NAME_EDIT, TOOL_NAME_INTERRUPT_AGENT, TOOL_NAME_LIST_AGENTS, TOOL_NAME_SEND_INPUT_TO_AGENT, TOOL_NAME_SPAWN_AGENT, TOOL_NAME_VIEW_IMAGE, TOOL_NAME_WAIT_FOR_AGENTS, TOOL_NAME_WRITE, } from "../../core/tools/tool_names.js";
2
- import { buildBashAbortedView, buildBashBlockedView, buildBashExecutionView, buildBashRunningView, } from "./bash_execution.js";
3
- import { buildEditBlockedView, buildEditSuccessView, buildViewImageBlockedView, buildViewImageSuccessView, buildWriteBlockedView, buildWriteSuccessView, } from "./file_execution.js";
4
- import { buildSection, buildToolHeaderLine, inlineText, renderToolUiCompactText, renderToolUiTextLines, } from "./tool_output.js";
5
- const TOOL_UI_LANGUAGE = {
6
- [TOOL_NAME_BASH]: {
7
- name: "bash",
8
- labels: {
9
- queued: "queued",
10
- running: "running",
11
- succeeded: "ran",
12
- failed: "failed",
13
- blocked: "blocked",
14
- cancelled: "cancelled",
15
- },
16
- },
17
- [TOOL_NAME_WRITE]: {
18
- name: "write",
19
- labels: {
20
- queued: "queued write",
21
- running: "writing",
22
- succeeded: "wrote",
23
- failed: "failed to write",
24
- blocked: "write blocked",
25
- cancelled: "write cancelled",
26
- },
27
- },
28
- [TOOL_NAME_EDIT]: {
29
- name: "edit",
30
- labels: {
31
- queued: "queued edit",
32
- running: "editing",
33
- succeeded: "edited",
34
- failed: "failed to edit",
35
- blocked: "edit blocked",
36
- cancelled: "edit cancelled",
37
- },
38
- },
39
- [TOOL_NAME_VIEW_IMAGE]: {
40
- name: "view image",
41
- labels: {
42
- queued: "queued view image",
43
- running: "viewing",
44
- succeeded: "viewed",
45
- failed: "failed to view",
46
- blocked: "view image blocked",
47
- cancelled: "view image cancelled",
48
- },
49
- },
50
- [TOOL_NAME_SPAWN_AGENT]: {
51
- name: "spawn agent",
52
- labels: {
53
- queued: "queued spawn",
54
- running: "spawning",
55
- succeeded: "spawned",
56
- failed: "spawn failed",
57
- blocked: "spawn blocked",
58
- cancelled: "spawn cancelled",
59
- },
60
- },
61
- [TOOL_NAME_SEND_INPUT_TO_AGENT]: {
62
- name: "send input",
63
- labels: {
64
- queued: "queued input",
65
- running: "sending input",
66
- succeeded: "sent input",
67
- failed: "failed to send input",
68
- blocked: "send input blocked",
69
- cancelled: "send input cancelled",
70
- },
71
- },
72
- [TOOL_NAME_WAIT_FOR_AGENTS]: {
73
- name: "wait for agents",
74
- labels: {
75
- queued: "queued wait",
76
- running: "waiting",
77
- succeeded: "finished waiting",
78
- failed: "wait failed",
79
- blocked: "wait blocked",
80
- cancelled: "wait cancelled",
81
- },
82
- },
83
- [TOOL_NAME_LIST_AGENTS]: {
84
- name: "list agents",
85
- labels: {
86
- queued: "queued list",
87
- running: "listing",
88
- succeeded: "listed",
89
- failed: "failed to list",
90
- blocked: "list blocked",
91
- cancelled: "list cancelled",
92
- },
93
- },
94
- [TOOL_NAME_INTERRUPT_AGENT]: {
95
- name: "interrupt agent",
96
- labels: {
97
- queued: "queued interruption",
98
- running: "interrupting",
99
- succeeded: "interrupted",
100
- failed: "failed to interrupt",
101
- blocked: "interruption blocked",
102
- cancelled: "interruption cancelled",
103
- },
104
- },
105
- };
106
- const GENERIC_TOOL_STATUS_LABELS = {
107
- queued: "queued",
108
- running: "running",
109
- succeeded: "completed",
110
- failed: "failed",
111
- blocked: "blocked",
112
- cancelled: "cancelled",
113
- };
114
- function getToolUiLanguage(toolName) {
115
- return Object.hasOwn(TOOL_UI_LANGUAGE, toolName) ? TOOL_UI_LANGUAGE[toolName] : undefined;
116
- }
117
- function getToolStatusLabel(toolName, status) {
118
- if (status === "streaming")
119
- return "preparing";
120
- return getToolUiLanguage(toolName)?.labels[status] ?? GENERIC_TOOL_STATUS_LABELS[status];
121
- }
122
- function buildSimpleToolRunningView(theme, label, target) {
123
- const { palette, text } = theme;
124
- const runningColor = (s) => palette.actionRunning(s);
125
- const header = buildToolHeaderLine({
126
- bulletStyle: runningColor,
127
- bullet: "⏵",
128
- label,
129
- labelStyle: palette.textMuted,
130
- accent: inlineText(target),
131
- accentStyle: palette.brandAccent,
132
- });
133
- return {
134
- borderColor: runningColor,
135
- expanded: { title: runningColor(text.bold(`${label} ${target}`)) },
136
- compact: { header },
137
- };
138
- }
139
- function buildToolPendingView(theme, label, target) {
140
- const { palette, text } = theme;
141
- const pendingColor = (s) => palette.textMuted(s);
142
- const header = buildToolHeaderLine({
143
- bulletStyle: pendingColor,
144
- bullet: "⏵",
145
- label,
146
- labelStyle: palette.textMuted,
147
- accent: inlineText(target),
148
- accentStyle: palette.brandAccent,
149
- });
150
- return {
151
- borderColor: pendingColor,
152
- expanded: { title: pendingColor(text.bold(`${label} ${target}`)) },
153
- compact: { header },
154
- };
155
- }
156
- const CODE_MODE_COMPACT_CODE_LINES = 10;
157
- function buildCodeModeCompactHeader(theme, status, label) {
158
- const { palette } = theme;
159
- const statusStyle = status === "completed"
160
- ? palette.actionSuccess
161
- : status === "failed" || status === "blocked"
162
- ? palette.actionError
163
- : status === "running"
164
- ? palette.actionRunning
165
- : palette.textMuted;
166
- const bullet = status === "completed" ? "✓" : status === "failed" || status === "blocked" ? "✗" : "⏵";
167
- return buildToolHeaderLine({
168
- bulletStyle: statusStyle,
169
- bullet,
170
- label: status,
171
- labelStyle: palette.textMuted,
172
- accent: label,
173
- accentStyle: palette.brandAccent,
174
- });
175
- }
176
- function buildCodeModeCompactPreview(theme, code) {
177
- const trimmed = code.trim();
178
- if (!trimmed)
179
- return undefined;
180
- const lines = trimmed.split(/\r?\n/);
181
- const preview = lines
182
- .slice(0, CODE_MODE_COMPACT_CODE_LINES)
183
- .map((line) => ` ${theme.palette.textMuted("›")} ${theme.palette.textDim(line)}`);
184
- const remaining = lines.length - preview.length;
185
- if (remaining > 0) {
186
- preview.push(` ${theme.palette.textMuted("›")} ${theme.palette.textDim(`… ${remaining} more line${remaining === 1 ? "" : "s"}`)}`);
187
- }
188
- return preview.join("\n");
189
- }
190
- function joinCodeModeCompactSections(...sections) {
191
- const present = sections.filter((section) => Boolean(section?.trim()));
192
- return present.length > 0 ? present.join("\n\n") : undefined;
193
- }
194
- function buildClientToolFinishedView(args) {
195
- const { theme, toolName, status, uiText } = args;
196
- const { palette, text } = theme;
197
- const isSuccess = status === "success";
198
- const borderColor = isSuccess
199
- ? (s) => palette.actionSuccess(s)
200
- : (s) => palette.actionError(s);
201
- const header = buildToolHeaderLine({
202
- bulletStyle: borderColor,
203
- bullet: isSuccess ? "✓" : "✗",
204
- label: isSuccess ? "completed" : "failed",
205
- labelStyle: palette.textMuted,
206
- accent: inlineText(toolName),
207
- accentStyle: palette.brandAccent,
208
- });
209
- const compactText = renderToolUiCompactText({
210
- uiText,
211
- theme,
212
- previewStyle: isSuccess ? palette.textDim : palette.actionError,
213
- statusStyle: palette.textMuted,
214
- });
215
- const fullText = renderToolUiTextLines({
216
- uiText,
217
- kind: "full",
218
- theme,
219
- baseStyle: isSuccess ? palette.actionOutput : palette.actionError,
220
- });
221
- return {
222
- borderColor,
223
- expanded: {
224
- title: borderColor(text.bold(`${isSuccess ? "completed" : "failed"} ${toolName}`)),
225
- sections: fullText ? [fullText] : [],
226
- },
227
- compact: { header, extraText: compactText },
228
- };
229
- }
230
- function buildSimpleToolFinishedView(args) {
231
- const { theme, label, target, status, statusLabel, message } = args;
232
- const { palette, text } = theme;
233
- const successColor = (s) => palette.actionSuccess(s);
234
- const errorColor = (s) => palette.actionError(s);
235
- const isSuccess = status === "success";
236
- const borderColor = isSuccess ? successColor : errorColor;
237
- const headerLabel = statusLabel ??
238
- (isSuccess ? label : status === "blocked" ? `${label} blocked` : `${label} failed`);
239
- const header = buildToolHeaderLine({
240
- bulletStyle: borderColor,
241
- bullet: isSuccess ? "✓" : "✗",
242
- label: headerLabel,
243
- labelStyle: palette.textMuted,
244
- accent: inlineText(target),
245
- accentStyle: palette.brandAccent,
246
- });
247
- const messageLine = message
248
- ? isSuccess
249
- ? palette.textMuted(message)
250
- : errorColor(message)
251
- : undefined;
252
- const section = buildSection(messageLine ? [messageLine] : []);
253
- return {
254
- borderColor,
255
- expanded: {
256
- title: borderColor(text.bold(`${label} ${target}`)),
257
- sections: section ? [section] : [],
258
- },
259
- compact: {
260
- header,
261
- extraText: messageLine ? ` ${messageLine}` : undefined,
262
- },
263
- };
264
- }
265
- function formatSubagentTitle(title) {
266
- const trimmed = title?.trim() ?? "";
267
- return trimmed || "(subagent)";
268
- }
269
- function ensureSubagentUiText(args) {
270
- if (args.uiText) {
271
- return args.uiText;
272
- }
273
- const fallbackLine = args.message?.trim() || (args.status === "success" ? "ok" : "failed");
274
- return {
275
- previewLines: [{ text: fallbackLine }],
276
- statusLine: args.statusLine,
277
- fullLines: [{ text: fallbackLine }],
278
- };
279
- }
280
- function buildSubagentRunningView(args) {
281
- const { theme, label, title } = args;
282
- const { palette, text } = theme;
283
- const runningColor = (s) => palette.actionRunning(s);
284
- const target = formatSubagentTitle(title);
285
- const header = buildToolHeaderLine({
286
- bulletStyle: runningColor,
287
- bullet: "⏵",
288
- label,
289
- labelStyle: palette.textMuted,
290
- accent: inlineText(target),
291
- accentStyle: palette.brandAccent,
292
- });
293
- return {
294
- borderColor: runningColor,
295
- expanded: { title: runningColor(text.bold(target)) },
296
- compact: { header },
297
- };
298
- }
299
- function buildSubagentFinishedView(args) {
300
- const { theme, label, failureLabel, title, status, uiText } = args;
301
- const { palette, text } = theme;
302
- const successColor = (s) => palette.actionSuccess(s);
303
- const errorColor = (s) => palette.actionError(s);
304
- const isSuccess = status === "success";
305
- const borderColor = isSuccess ? successColor : errorColor;
306
- const headerLabel = isSuccess ? label : failureLabel;
307
- const target = formatSubagentTitle(title);
308
- const header = buildToolHeaderLine({
309
- bulletStyle: borderColor,
310
- bullet: isSuccess ? "✓" : "✗",
311
- label: headerLabel,
312
- labelStyle: palette.textMuted,
313
- accent: inlineText(target),
314
- accentStyle: palette.brandAccent,
315
- });
316
- const compactText = renderToolUiCompactText({
317
- uiText,
318
- theme,
319
- previewStyle: palette.textDim,
320
- statusStyle: palette.textMuted,
321
- });
322
- const fullText = renderToolUiTextLines({
323
- uiText,
324
- kind: "full",
325
- theme,
326
- baseStyle: palette.actionOutput,
327
- });
328
- return {
329
- borderColor,
330
- expanded: {
331
- title: borderColor(text.bold(target)),
332
- sections: fullText ? [fullText] : [],
333
- },
334
- compact: {
335
- header,
336
- extraText: compactText,
337
- },
338
- };
339
- }
340
- const TOOL_STARTED_ACTIVITY_TYPES = new Set([
341
- "bash_started",
342
- "spawn_agent_started",
343
- "send_input_to_agent_started",
344
- "wait_for_agents_started",
345
- "list_agents_started",
346
- "interrupt_agent_started",
347
- "code_mode_started",
348
- ]);
349
- function isStartedActivity(activity) {
350
- return Boolean(activity && TOOL_STARTED_ACTIVITY_TYPES.has(activity.type));
351
- }
352
- function terminalStatusFromActivity(activity) {
353
- switch (activity.type) {
354
- case "tool_call_streaming":
355
- case "tool_call_queued":
356
- case "bash_started":
357
- case "spawn_agent_started":
358
- case "send_input_to_agent_started":
359
- case "wait_for_agents_started":
360
- case "list_agents_started":
361
- case "interrupt_agent_started":
362
- case "code_mode_started":
363
- return undefined;
364
- case "tool_call_blocked":
365
- case "bash_blocked":
366
- case "spawn_agent_blocked":
367
- case "send_input_to_agent_blocked":
368
- case "wait_for_agents_blocked":
369
- case "list_agents_blocked":
370
- case "interrupt_agent_blocked":
371
- case "code_mode_blocked":
372
- case "view_image_blocked":
373
- case "write_blocked":
374
- case "edit_blocked":
375
- return "blocked";
376
- case "bash_aborted":
377
- return "cancelled";
378
- case "bash_execution":
379
- return activity.exitCode === 0 ? "succeeded" : "failed";
380
- case "client_tool_finished":
381
- case "spawn_agent_finished":
382
- case "send_input_to_agent_finished":
383
- case "wait_for_agents_finished":
384
- case "list_agents_finished":
385
- case "interrupt_agent_finished":
386
- case "code_mode_finished":
387
- return activity.status === "success" ? "succeeded" : "failed";
388
- case "view_image_success":
389
- case "write_success":
390
- case "edit_success":
391
- return "succeeded";
392
- }
393
- }
394
- function addCodePreview(view, model, theme, status) {
395
- if (model.code === undefined)
396
- return view;
397
- return {
398
- ...view,
399
- compact: {
400
- header: buildCodeModeCompactHeader(theme, status, model.toolName),
401
- extraText: buildCodeModeCompactPreview(theme, model.code),
402
- },
403
- };
404
- }
405
- function buildGenericTerminalView(theme, model) {
406
- const { palette, text } = theme;
407
- const succeeded = model.status === "succeeded";
408
- const borderColor = succeeded
409
- ? (value) => palette.actionSuccess(value)
410
- : (value) => palette.actionError(value);
411
- const label = getToolStatusLabel(model.toolName, model.status);
412
- const target = model.code === undefined ? model.headerTarget : model.toolName;
413
- const resultText = model.resultText?.trim();
414
- const compactResult = resultText
415
- ? resultText
416
- .split(/\r?\n/)
417
- .slice(0, 8)
418
- .map((line) => ` ${palette.textDim(line)}`)
419
- .join("\n")
420
- : undefined;
421
- return {
422
- borderColor,
423
- expanded: {
424
- title: borderColor(text.bold(`${label} ${target}`)),
425
- sections: resultText ? [palette.actionOutput(resultText)] : [],
426
- },
427
- compact: {
428
- header: buildToolHeaderLine({
429
- bulletStyle: borderColor,
430
- bullet: succeeded ? "✓" : "✗",
431
- label,
432
- labelStyle: palette.textMuted,
433
- accent: inlineText(target),
434
- accentStyle: palette.brandAccent,
435
- }),
436
- extraText: compactResult,
437
- },
438
- };
439
- }
440
- export class ToolUiRegistry {
441
- renderers = new Map();
442
- register(type, renderer) {
443
- this.renderers.set(type, renderer);
444
- }
445
- render(event, context) {
446
- const renderer = this.renderers.get(event.type);
447
- if (!renderer) {
448
- throw new Error(`missing tool ui renderer for event type '${event.type}'.`);
449
- }
450
- return renderer(event, context);
451
- }
452
- renderModel(model, context) {
453
- if (model.status === "streaming") {
454
- const target = getToolUiLanguage(model.toolName)?.name ?? model.toolName;
455
- return buildToolPendingView(context.theme, "preparing", target);
456
- }
457
- if (model.status === "queued") {
458
- return addCodePreview(buildToolPendingView(context.theme, getToolStatusLabel(model.toolName, model.status), model.headerTarget), model, context.theme, "queued");
459
- }
460
- if (model.status === "running") {
461
- if (isStartedActivity(model.activity)) {
462
- return this.render(model.activity, context);
463
- }
464
- return addCodePreview(buildSimpleToolRunningView(context.theme, getToolStatusLabel(model.toolName, model.status), model.headerTarget), model, context.theme, "running");
465
- }
466
- if (model.activity && terminalStatusFromActivity(model.activity) === model.status) {
467
- return this.render(model.activity, context);
468
- }
469
- return buildGenericTerminalView(context.theme, model);
470
- }
471
- renderBashAborted(command, reason, context) {
472
- const headerTarget = command.split(/\r?\n/)[0] ?? command;
473
- return buildBashAbortedView(context.theme, command, reason, headerTarget);
474
- }
475
- }
476
- export function createToolUiRegistry() {
477
- const registry = new ToolUiRegistry();
478
- registry.register("tool_call_streaming", (event, context) => {
479
- const uiEvent = event;
480
- const target = getToolUiLanguage(uiEvent.toolName)?.name ?? uiEvent.toolName;
481
- return buildToolPendingView(context.theme, "preparing", target);
482
- });
483
- registry.register("tool_call_queued", (event, context) => {
484
- const uiEvent = event;
485
- const view = buildToolPendingView(context.theme, getToolStatusLabel(uiEvent.toolName, "queued"), uiEvent.headerTarget);
486
- if (uiEvent.code === undefined)
487
- return view;
488
- return {
489
- ...view,
490
- compact: {
491
- header: buildCodeModeCompactHeader(context.theme, "queued", uiEvent.toolName),
492
- extraText: buildCodeModeCompactPreview(context.theme, uiEvent.code),
493
- },
494
- };
495
- });
496
- registry.register("tool_call_blocked", (event, context) => {
497
- const uiEvent = event;
498
- return buildSimpleToolFinishedView({
499
- theme: context.theme,
500
- label: uiEvent.toolName,
501
- target: uiEvent.toolName,
502
- status: "blocked",
503
- statusLabel: getToolStatusLabel(uiEvent.toolName, "blocked"),
504
- message: uiEvent.reason,
505
- });
506
- });
507
- registry.register("client_tool_finished", (event, context) => {
508
- const uiEvent = event;
509
- return buildClientToolFinishedView({
510
- theme: context.theme,
511
- toolName: uiEvent.toolName,
512
- status: uiEvent.status,
513
- uiText: uiEvent.uiText,
514
- });
515
- });
516
- registry.register("bash_started", (event, context) => {
517
- const uiEvent = event;
518
- return buildBashRunningView(context.theme, uiEvent.command, uiEvent.headerTarget);
519
- });
520
- registry.register("bash_execution", (event, context) => {
521
- const uiEvent = event;
522
- return buildBashExecutionView(context.theme, uiEvent.command, uiEvent.exitCode, uiEvent.uiText, uiEvent.labelOverride, uiEvent.headerTarget);
523
- });
524
- registry.register("bash_aborted", (event, context) => {
525
- const uiEvent = event;
526
- return buildBashAbortedView(context.theme, uiEvent.command, uiEvent.reason, uiEvent.headerTarget);
527
- });
528
- registry.register("bash_blocked", (event, context) => {
529
- const uiEvent = event;
530
- return buildBashBlockedView(context.theme, uiEvent.command, uiEvent.reason, uiEvent.headerTarget);
531
- });
532
- registry.register("spawn_agent_started", (event, context) => {
533
- const uiEvent = event;
534
- return buildSubagentRunningView({
535
- theme: context.theme,
536
- label: getToolStatusLabel(TOOL_NAME_SPAWN_AGENT, "running"),
537
- title: uiEvent.headerTarget,
538
- });
539
- });
540
- registry.register("spawn_agent_finished", (event, context) => {
541
- const uiEvent = event;
542
- const title = formatSubagentTitle(uiEvent.headerTarget);
543
- return buildSubagentFinishedView({
544
- theme: context.theme,
545
- label: getToolStatusLabel(TOOL_NAME_SPAWN_AGENT, "succeeded"),
546
- failureLabel: getToolStatusLabel(TOOL_NAME_SPAWN_AGENT, "failed"),
547
- title,
548
- status: uiEvent.status,
549
- uiText: ensureSubagentUiText({
550
- uiText: uiEvent.uiText,
551
- status: uiEvent.status,
552
- message: uiEvent.message,
553
- }),
554
- });
555
- });
556
- registry.register("spawn_agent_blocked", (event, context) => {
557
- const uiEvent = event;
558
- const title = formatSubagentTitle(uiEvent.headerTarget);
559
- return buildSimpleToolFinishedView({
560
- theme: context.theme,
561
- label: "spawn",
562
- target: title,
563
- status: "blocked",
564
- statusLabel: getToolStatusLabel(TOOL_NAME_SPAWN_AGENT, "blocked"),
565
- message: uiEvent.reason,
566
- });
567
- });
568
- registry.register("send_input_to_agent_started", (event, context) => {
569
- const uiEvent = event;
570
- const title = formatSubagentTitle(uiEvent.headerTarget);
571
- return buildSubagentRunningView({
572
- theme: context.theme,
573
- label: getToolStatusLabel(TOOL_NAME_SEND_INPUT_TO_AGENT, "running"),
574
- title,
575
- });
576
- });
577
- registry.register("send_input_to_agent_finished", (event, context) => {
578
- const uiEvent = event;
579
- const title = formatSubagentTitle(uiEvent.headerTarget);
580
- return buildSubagentFinishedView({
581
- theme: context.theme,
582
- label: getToolStatusLabel(TOOL_NAME_SEND_INPUT_TO_AGENT, "succeeded"),
583
- failureLabel: getToolStatusLabel(TOOL_NAME_SEND_INPUT_TO_AGENT, "failed"),
584
- title,
585
- status: uiEvent.status,
586
- uiText: ensureSubagentUiText({
587
- uiText: uiEvent.uiText,
588
- status: uiEvent.status,
589
- message: uiEvent.message,
590
- }),
591
- });
592
- });
593
- registry.register("send_input_to_agent_blocked", (event, context) => {
594
- const uiEvent = event;
595
- const title = formatSubagentTitle(uiEvent.headerTarget);
596
- return buildSimpleToolFinishedView({
597
- theme: context.theme,
598
- label: "send input",
599
- target: title,
600
- status: "blocked",
601
- statusLabel: getToolStatusLabel(TOOL_NAME_SEND_INPUT_TO_AGENT, "blocked"),
602
- message: uiEvent.reason,
603
- });
604
- });
605
- registry.register("wait_for_agents_started", (event, context) => {
606
- const uiEvent = event;
607
- const title = uiEvent.headerTarget;
608
- return buildSubagentRunningView({
609
- theme: context.theme,
610
- label: getToolStatusLabel(TOOL_NAME_WAIT_FOR_AGENTS, "running"),
611
- title,
612
- });
613
- });
614
- registry.register("wait_for_agents_finished", (event, context) => {
615
- const uiEvent = event;
616
- const title = uiEvent.headerTarget;
617
- return buildSubagentFinishedView({
618
- theme: context.theme,
619
- label: getToolStatusLabel(TOOL_NAME_WAIT_FOR_AGENTS, "succeeded"),
620
- failureLabel: getToolStatusLabel(TOOL_NAME_WAIT_FOR_AGENTS, "failed"),
621
- title,
622
- status: uiEvent.status,
623
- uiText: ensureSubagentUiText({
624
- uiText: uiEvent.uiText,
625
- status: uiEvent.status,
626
- message: uiEvent.message,
627
- }),
628
- });
629
- });
630
- registry.register("wait_for_agents_blocked", (event, context) => {
631
- const uiEvent = event;
632
- const title = uiEvent.headerTarget;
633
- return buildSimpleToolFinishedView({
634
- theme: context.theme,
635
- label: "wait",
636
- target: title,
637
- status: "blocked",
638
- statusLabel: getToolStatusLabel(TOOL_NAME_WAIT_FOR_AGENTS, "blocked"),
639
- message: uiEvent.reason,
640
- });
641
- });
642
- registry.register("list_agents_started", (event, context) => {
643
- const uiEvent = event;
644
- return buildSubagentRunningView({
645
- theme: context.theme,
646
- label: getToolStatusLabel(TOOL_NAME_LIST_AGENTS, "running"),
647
- title: uiEvent.headerTarget,
648
- });
649
- });
650
- registry.register("list_agents_finished", (event, context) => {
651
- const uiEvent = event;
652
- return buildSubagentFinishedView({
653
- theme: context.theme,
654
- label: getToolStatusLabel(TOOL_NAME_LIST_AGENTS, "succeeded"),
655
- failureLabel: getToolStatusLabel(TOOL_NAME_LIST_AGENTS, "failed"),
656
- title: uiEvent.headerTarget,
657
- status: uiEvent.status,
658
- uiText: ensureSubagentUiText({
659
- uiText: uiEvent.uiText,
660
- status: uiEvent.status,
661
- message: uiEvent.message,
662
- }),
663
- });
664
- });
665
- registry.register("list_agents_blocked", (event, context) => {
666
- const uiEvent = event;
667
- return buildSimpleToolFinishedView({
668
- theme: context.theme,
669
- label: "list",
670
- target: uiEvent.headerTarget,
671
- status: "blocked",
672
- statusLabel: getToolStatusLabel(TOOL_NAME_LIST_AGENTS, "blocked"),
673
- message: uiEvent.reason,
674
- });
675
- });
676
- registry.register("interrupt_agent_started", (event, context) => {
677
- const uiEvent = event;
678
- return buildSubagentRunningView({
679
- theme: context.theme,
680
- label: getToolStatusLabel(TOOL_NAME_INTERRUPT_AGENT, "running"),
681
- title: uiEvent.headerTarget,
682
- });
683
- });
684
- registry.register("interrupt_agent_finished", (event, context) => {
685
- const uiEvent = event;
686
- const title = formatSubagentTitle(uiEvent.headerTarget);
687
- const fallbackMessage = uiEvent.finalStatus && uiEvent.finalStatus !== "succeeded"
688
- ? `final status: ${uiEvent.finalStatus}`
689
- : uiEvent.message;
690
- return buildSubagentFinishedView({
691
- theme: context.theme,
692
- label: getToolStatusLabel(TOOL_NAME_INTERRUPT_AGENT, "succeeded"),
693
- failureLabel: getToolStatusLabel(TOOL_NAME_INTERRUPT_AGENT, "failed"),
694
- title,
695
- status: uiEvent.status,
696
- uiText: ensureSubagentUiText({
697
- uiText: uiEvent.uiText,
698
- status: uiEvent.status,
699
- message: fallbackMessage,
700
- }),
701
- });
702
- });
703
- registry.register("interrupt_agent_blocked", (event, context) => {
704
- const uiEvent = event;
705
- const title = formatSubagentTitle(uiEvent.headerTarget);
706
- return buildSimpleToolFinishedView({
707
- theme: context.theme,
708
- label: "interrupt",
709
- target: title,
710
- status: "blocked",
711
- statusLabel: getToolStatusLabel(TOOL_NAME_INTERRUPT_AGENT, "blocked"),
712
- message: uiEvent.reason,
713
- });
714
- });
715
- registry.register("code_mode_started", (event, context) => {
716
- const uiEvent = event;
717
- const view = buildSimpleToolRunningView(context.theme, uiEvent.toolName, uiEvent.headerTarget);
718
- return {
719
- ...view,
720
- compact: {
721
- header: buildCodeModeCompactHeader(context.theme, "running", uiEvent.toolName),
722
- extraText: buildCodeModeCompactPreview(context.theme, uiEvent.code),
723
- },
724
- };
725
- });
726
- registry.register("code_mode_finished", (event, context) => {
727
- const uiEvent = event;
728
- const view = buildClientToolFinishedView({
729
- theme: context.theme,
730
- toolName: uiEvent.toolName,
731
- status: uiEvent.status,
732
- uiText: uiEvent.uiText,
733
- });
734
- const status = uiEvent.status === "success" ? "completed" : "failed";
735
- return {
736
- ...view,
737
- compact: {
738
- header: buildCodeModeCompactHeader(context.theme, status, uiEvent.toolName),
739
- extraText: joinCodeModeCompactSections(buildCodeModeCompactPreview(context.theme, uiEvent.code), view.compact.extraText),
740
- },
741
- };
742
- });
743
- registry.register("code_mode_blocked", (event, context) => {
744
- const uiEvent = event;
745
- const view = buildSimpleToolFinishedView({
746
- theme: context.theme,
747
- label: uiEvent.toolName,
748
- target: uiEvent.headerTarget,
749
- status: "blocked",
750
- message: uiEvent.reason,
751
- });
752
- return {
753
- ...view,
754
- compact: {
755
- header: buildCodeModeCompactHeader(context.theme, "blocked", uiEvent.toolName),
756
- extraText: joinCodeModeCompactSections(buildCodeModeCompactPreview(context.theme, uiEvent.code), view.compact.extraText),
757
- },
758
- };
759
- });
760
- registry.register("write_success", (event, context) => {
761
- const uiEvent = event;
762
- return buildWriteSuccessView(context.theme, uiEvent.path, uiEvent.uiText, uiEvent.headerTarget);
763
- });
764
- registry.register("write_blocked", (event, context) => {
765
- const uiEvent = event;
766
- return buildWriteBlockedView(context.theme, uiEvent.path, uiEvent.reason, uiEvent.headerTarget);
767
- });
768
- registry.register("edit_success", (event, context) => {
769
- const uiEvent = event;
770
- return buildEditSuccessView(context.theme, uiEvent.path, uiEvent.uiText, uiEvent.headerTarget);
771
- });
772
- registry.register("edit_blocked", (event, context) => {
773
- const uiEvent = event;
774
- return buildEditBlockedView(context.theme, uiEvent.path, uiEvent.reason, uiEvent.headerTarget);
775
- });
776
- registry.register("view_image_success", (event, context) => {
777
- const uiEvent = event;
778
- return buildViewImageSuccessView(context.theme, uiEvent.path, uiEvent.uiText, uiEvent.headerTarget);
779
- });
780
- registry.register("view_image_blocked", (event, context) => {
781
- const uiEvent = event;
782
- return buildViewImageBlockedView(context.theme, uiEvent.path, uiEvent.reason, uiEvent.headerTarget);
783
- });
784
- return registry;
785
- }
786
- //# sourceMappingURL=tool_ui_registry.js.map