@nghyane/arcane 0.1.13 → 0.1.15

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 (303) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/package.json +21 -70
  3. package/scripts/format-prompts.ts +1 -3
  4. package/src/cli/args.ts +2 -7
  5. package/src/cli/config-cli.ts +1 -1
  6. package/src/cli/plugin-cli.ts +1 -1
  7. package/src/cli/setup-cli.ts +1 -1
  8. package/src/cli/update-cli.ts +1 -1
  9. package/src/cli/web-search-cli.ts +1 -1
  10. package/src/cli.ts +0 -1
  11. package/src/commands/config.ts +1 -1
  12. package/src/commands/grep.ts +1 -1
  13. package/src/commands/jupyter.ts +1 -1
  14. package/src/commands/plugin.ts +1 -1
  15. package/src/commands/setup.ts +1 -1
  16. package/src/commands/shell.ts +1 -1
  17. package/src/commands/ssh.ts +1 -1
  18. package/src/commands/stats.ts +1 -1
  19. package/src/commands/update.ts +1 -1
  20. package/src/config/model-registry.ts +3 -4
  21. package/src/config/model-resolver.ts +36 -9
  22. package/src/config/prompt-templates.ts +1 -9
  23. package/src/config/settings-schema.ts +32 -88
  24. package/src/config/settings.ts +3 -4
  25. package/src/debug/index.ts +1 -1
  26. package/src/debug/log-formatting.ts +1 -1
  27. package/src/debug/log-viewer.ts +2 -2
  28. package/src/discovery/helpers.ts +13 -3
  29. package/src/exa/index.ts +1 -35
  30. package/src/exa/render.ts +30 -190
  31. package/src/export/html/index.ts +1 -1
  32. package/src/extensibility/custom-tools/loader.ts +1 -1
  33. package/src/extensibility/custom-tools/types.ts +5 -1
  34. package/src/extensibility/custom-tools/wrapper.ts +1 -1
  35. package/src/extensibility/extensions/runner.ts +1 -1
  36. package/src/extensibility/extensions/types.ts +1 -1
  37. package/src/extensibility/extensions/wrapper.ts +7 -15
  38. package/src/extensibility/hooks/runner.ts +1 -1
  39. package/src/extensibility/hooks/types.ts +1 -1
  40. package/src/extensibility/plugins/doctor.ts +1 -1
  41. package/src/index.ts +13 -13
  42. package/src/lsp/index.ts +77 -24
  43. package/src/lsp/render.ts +34 -583
  44. package/src/lsp/types.ts +3 -3
  45. package/src/lsp/utils.ts +1 -1
  46. package/src/main.ts +1 -1
  47. package/src/mcp/tool-bridge.ts +1 -24
  48. package/src/modes/components/assistant-message.ts +7 -7
  49. package/src/modes/components/bash-execution.ts +50 -112
  50. package/src/modes/components/bordered-loader.ts +1 -1
  51. package/src/modes/components/branch-summary-message.ts +16 -10
  52. package/src/modes/components/compaction-summary-message.ts +20 -12
  53. package/src/modes/components/context-group.ts +106 -0
  54. package/src/modes/components/custom-message.ts +4 -5
  55. package/src/modes/components/diff.ts +2 -2
  56. package/src/modes/components/dynamic-border.ts +1 -1
  57. package/src/modes/components/extensions/extension-dashboard.ts +1 -1
  58. package/src/modes/components/extensions/extension-list.ts +1 -1
  59. package/src/modes/components/extensions/inspector-panel.ts +1 -1
  60. package/src/modes/components/footer.ts +2 -2
  61. package/src/modes/components/history-search.ts +1 -1
  62. package/src/modes/components/hook-editor.ts +1 -1
  63. package/src/modes/components/hook-input.ts +1 -1
  64. package/src/modes/components/hook-message.ts +4 -5
  65. package/src/modes/components/hook-selector.ts +1 -1
  66. package/src/modes/components/index.ts +0 -2
  67. package/src/modes/components/keybinding-hints.ts +1 -1
  68. package/src/modes/components/login-dialog.ts +1 -1
  69. package/src/modes/components/mcp-add-wizard.ts +1 -1
  70. package/src/modes/components/model-selector.ts +1 -1
  71. package/src/modes/components/oauth-selector.ts +1 -1
  72. package/src/modes/components/plugin-settings.ts +1 -1
  73. package/src/modes/components/python-execution.ts +51 -91
  74. package/src/modes/components/queue-mode-selector.ts +1 -1
  75. package/src/modes/components/session-selector.ts +1 -1
  76. package/src/modes/components/settings-defs.ts +5 -10
  77. package/src/modes/components/settings-selector.ts +1 -1
  78. package/src/modes/components/show-images-selector.ts +1 -1
  79. package/src/modes/components/skill-message.ts +4 -4
  80. package/src/modes/components/status-line/segments.ts +2 -2
  81. package/src/modes/components/status-line/separators.ts +1 -1
  82. package/src/modes/components/status-line-segment-editor.ts +1 -1
  83. package/src/modes/components/status-line.ts +1 -1
  84. package/src/modes/components/theme-selector.ts +1 -1
  85. package/src/modes/components/thinking-selector.ts +1 -1
  86. package/src/modes/components/todo-display.ts +2 -4
  87. package/src/modes/components/todo-reminder.ts +4 -4
  88. package/src/modes/components/tool-execution.ts +118 -440
  89. package/src/modes/components/tool-image-display.ts +107 -0
  90. package/src/modes/components/tree-selector.ts +2 -2
  91. package/src/modes/components/ttsr-notification.ts +4 -17
  92. package/src/modes/components/user-message-selector.ts +1 -1
  93. package/src/modes/components/user-message.ts +9 -10
  94. package/src/modes/components/welcome.ts +1 -1
  95. package/src/modes/controllers/command-controller.ts +1 -1
  96. package/src/modes/controllers/event-controller.ts +58 -187
  97. package/src/modes/controllers/extension-ui-controller.ts +1 -1
  98. package/src/modes/controllers/input-controller.ts +3 -1
  99. package/src/modes/controllers/mcp-command-controller.ts +1 -1
  100. package/src/modes/controllers/selector-controller.ts +3 -26
  101. package/src/modes/controllers/ssh-command-controller.ts +1 -1
  102. package/src/modes/interactive-mode.ts +3 -7
  103. package/src/modes/print-mode.ts +5 -5
  104. package/src/modes/rpc/rpc-mode.ts +1 -1
  105. package/src/modes/types.ts +1 -2
  106. package/src/modes/utils/ui-helpers.ts +34 -32
  107. package/src/patch/edit-tool.ts +742 -0
  108. package/src/patch/index.ts +32 -898
  109. package/src/patch/schemas.ts +208 -0
  110. package/src/patch/shared.ts +83 -151
  111. package/src/prompts/agents/explore.md +22 -37
  112. package/src/prompts/agents/init.md +1 -1
  113. package/src/prompts/agents/librarian.md +29 -20
  114. package/src/prompts/agents/oracle.md +9 -2
  115. package/src/prompts/agents/reviewer.md +14 -48
  116. package/src/prompts/agents/task.md +16 -8
  117. package/src/prompts/compaction/branch-summary.md +4 -1
  118. package/src/prompts/compaction/compaction-summary.md +4 -1
  119. package/src/prompts/system/subagent-system-prompt.md +1 -1
  120. package/src/prompts/system/system-prompt.md +162 -178
  121. package/src/prompts/system/verification-reminder.md +6 -0
  122. package/src/sdk.ts +0 -9
  123. package/src/session/agent-session.ts +244 -1459
  124. package/src/session/model-controller.ts +406 -0
  125. package/src/session/retry-utils.ts +71 -0
  126. package/src/session/session-manager.ts +22 -186
  127. package/src/session/session-types.ts +312 -0
  128. package/src/session/stats.ts +387 -0
  129. package/src/session/streaming-edit.ts +258 -0
  130. package/src/session/ttsr.ts +213 -0
  131. package/src/slash-commands/builtin-registry.ts +0 -8
  132. package/src/stt/recorder.ts +2 -2
  133. package/src/system-prompt.ts +1 -14
  134. package/src/task/agents.ts +7 -33
  135. package/src/task/executor.ts +50 -438
  136. package/src/task/index.ts +104 -71
  137. package/src/task/progress-tracker.ts +390 -0
  138. package/src/task/render.ts +371 -187
  139. package/src/task/subprocess-tool-registry.ts +1 -1
  140. package/src/task/types.ts +14 -47
  141. package/src/tools/ask.ts +31 -42
  142. package/src/tools/bash-interactive.ts +2 -2
  143. package/src/tools/bash-interceptor.ts +2 -2
  144. package/src/tools/bash-normalize.ts +1 -1
  145. package/src/tools/bash-skill-urls.ts +2 -2
  146. package/src/tools/bash.ts +87 -136
  147. package/src/tools/browser.ts +54 -84
  148. package/src/tools/create-tools.ts +186 -0
  149. package/src/tools/default-renderer.ts +104 -0
  150. package/src/tools/explore.ts +11 -10
  151. package/src/tools/fetch.ts +24 -114
  152. package/src/tools/find.ts +48 -132
  153. package/src/tools/gemini-image.ts +5 -15
  154. package/src/tools/github.ts +450 -0
  155. package/src/tools/grep.ts +43 -179
  156. package/src/tools/index.ts +35 -198
  157. package/src/tools/json-tree.ts +3 -3
  158. package/src/tools/librarian.ts +18 -18
  159. package/src/tools/list-limit.ts +2 -2
  160. package/src/tools/notebook.ts +35 -87
  161. package/src/tools/oracle.ts +25 -25
  162. package/src/tools/output-meta.ts +89 -4
  163. package/src/tools/output-utils.ts +2 -2
  164. package/src/tools/python.ts +86 -637
  165. package/src/tools/read.ts +36 -119
  166. package/src/tools/reviewer-tool.ts +19 -21
  167. package/src/tools/search-code.ts +128 -0
  168. package/src/tools/ssh.ts +67 -126
  169. package/src/tools/subagent-tool.ts +197 -123
  170. package/src/tools/todo-write.ts +15 -31
  171. package/src/tools/tool-errors.ts +0 -30
  172. package/src/tools/undo-edit.ts +30 -67
  173. package/src/tools/write.ts +78 -127
  174. package/src/tui/code-cell.ts +4 -4
  175. package/src/tui/file-list.ts +2 -2
  176. package/src/tui/output-block.ts +1 -1
  177. package/src/tui/status-line.ts +1 -1
  178. package/src/tui/tree-list.ts +2 -2
  179. package/src/tui/types.ts +1 -1
  180. package/src/tui/utils.ts +1 -1
  181. package/src/{tools → ui}/render-utils.ts +87 -126
  182. package/src/utils/external-editor.ts +4 -4
  183. package/src/utils/file-mentions.ts +1 -1
  184. package/src/utils/index.ts +30 -0
  185. package/src/utils/tools-manager.ts +9 -19
  186. package/src/web/github-client.ts +290 -0
  187. package/src/web/scrapers/github.ts +11 -62
  188. package/src/web/search/auth.ts +1 -3
  189. package/src/web/search/index.ts +82 -46
  190. package/src/web/search/provider.ts +11 -16
  191. package/src/web/search/providers/grep.ts +160 -0
  192. package/src/web/search/render.ts +48 -235
  193. package/src/web/search/types.ts +1 -1
  194. package/src/commands/commit.ts +0 -36
  195. package/src/commit/agentic/agent.ts +0 -311
  196. package/src/commit/agentic/fallback.ts +0 -96
  197. package/src/commit/agentic/index.ts +0 -359
  198. package/src/commit/agentic/prompts/analyze-file.md +0 -22
  199. package/src/commit/agentic/prompts/session-user.md +0 -25
  200. package/src/commit/agentic/prompts/split-confirm.md +0 -1
  201. package/src/commit/agentic/prompts/system.md +0 -38
  202. package/src/commit/agentic/state.ts +0 -69
  203. package/src/commit/agentic/tools/analyze-file.ts +0 -118
  204. package/src/commit/agentic/tools/git-file-diff.ts +0 -194
  205. package/src/commit/agentic/tools/git-hunk.ts +0 -50
  206. package/src/commit/agentic/tools/git-overview.ts +0 -84
  207. package/src/commit/agentic/tools/index.ts +0 -56
  208. package/src/commit/agentic/tools/propose-changelog.ts +0 -128
  209. package/src/commit/agentic/tools/propose-commit.ts +0 -154
  210. package/src/commit/agentic/tools/recent-commits.ts +0 -81
  211. package/src/commit/agentic/tools/split-commit.ts +0 -280
  212. package/src/commit/agentic/topo-sort.ts +0 -44
  213. package/src/commit/agentic/trivial.ts +0 -51
  214. package/src/commit/agentic/validation.ts +0 -200
  215. package/src/commit/analysis/conventional.ts +0 -165
  216. package/src/commit/analysis/index.ts +0 -4
  217. package/src/commit/analysis/scope.ts +0 -242
  218. package/src/commit/analysis/summary.ts +0 -112
  219. package/src/commit/analysis/validation.ts +0 -66
  220. package/src/commit/changelog/detect.ts +0 -37
  221. package/src/commit/changelog/generate.ts +0 -110
  222. package/src/commit/changelog/index.ts +0 -234
  223. package/src/commit/changelog/parse.ts +0 -44
  224. package/src/commit/cli.ts +0 -93
  225. package/src/commit/git/diff.ts +0 -148
  226. package/src/commit/git/errors.ts +0 -9
  227. package/src/commit/git/index.ts +0 -211
  228. package/src/commit/git/operations.ts +0 -54
  229. package/src/commit/index.ts +0 -5
  230. package/src/commit/map-reduce/index.ts +0 -64
  231. package/src/commit/map-reduce/map-phase.ts +0 -178
  232. package/src/commit/map-reduce/reduce-phase.ts +0 -145
  233. package/src/commit/map-reduce/utils.ts +0 -9
  234. package/src/commit/message.ts +0 -11
  235. package/src/commit/model-selection.ts +0 -69
  236. package/src/commit/pipeline.ts +0 -243
  237. package/src/commit/prompts/analysis-system.md +0 -148
  238. package/src/commit/prompts/analysis-user.md +0 -38
  239. package/src/commit/prompts/changelog-system.md +0 -50
  240. package/src/commit/prompts/changelog-user.md +0 -18
  241. package/src/commit/prompts/file-observer-system.md +0 -24
  242. package/src/commit/prompts/file-observer-user.md +0 -8
  243. package/src/commit/prompts/reduce-system.md +0 -50
  244. package/src/commit/prompts/reduce-user.md +0 -17
  245. package/src/commit/prompts/summary-retry.md +0 -3
  246. package/src/commit/prompts/summary-system.md +0 -38
  247. package/src/commit/prompts/summary-user.md +0 -13
  248. package/src/commit/prompts/types-description.md +0 -2
  249. package/src/commit/types.ts +0 -109
  250. package/src/commit/utils/exclusions.ts +0 -42
  251. package/src/mcp/render.ts +0 -123
  252. package/src/modes/components/agent-dashboard.ts +0 -1130
  253. package/src/modes/components/codemode-group.ts +0 -369
  254. package/src/modes/components/read-tool-group.ts +0 -119
  255. package/src/modes/components/visual-truncate.ts +0 -63
  256. package/src/prompts/system/subagent-user-prompt.md +0 -8
  257. package/src/prompts/tools/ask.md +0 -44
  258. package/src/prompts/tools/bash.md +0 -24
  259. package/src/prompts/tools/browser.md +0 -33
  260. package/src/prompts/tools/calculator.md +0 -12
  261. package/src/prompts/tools/explore.md +0 -29
  262. package/src/prompts/tools/fetch.md +0 -16
  263. package/src/prompts/tools/find.md +0 -18
  264. package/src/prompts/tools/gemini-image.md +0 -23
  265. package/src/prompts/tools/grep.md +0 -28
  266. package/src/prompts/tools/hashline.md +0 -232
  267. package/src/prompts/tools/librarian.md +0 -24
  268. package/src/prompts/tools/lsp.md +0 -28
  269. package/src/prompts/tools/oracle.md +0 -26
  270. package/src/prompts/tools/patch.md +0 -74
  271. package/src/prompts/tools/python.md +0 -66
  272. package/src/prompts/tools/read.md +0 -36
  273. package/src/prompts/tools/replace.md +0 -38
  274. package/src/prompts/tools/reviewer.md +0 -41
  275. package/src/prompts/tools/ssh.md +0 -51
  276. package/src/prompts/tools/task-summary.md +0 -28
  277. package/src/prompts/tools/task.md +0 -146
  278. package/src/prompts/tools/todo-write.md +0 -65
  279. package/src/prompts/tools/undo-edit.md +0 -7
  280. package/src/prompts/tools/web-search.md +0 -19
  281. package/src/prompts/tools/write.md +0 -18
  282. package/src/task/batch.ts +0 -102
  283. package/src/task/discovery.ts +0 -126
  284. package/src/task/parallel.ts +0 -84
  285. package/src/task/template.ts +0 -32
  286. package/src/tools/calculator.ts +0 -537
  287. package/src/tools/jtd-to-typescript.ts +0 -198
  288. package/src/tools/renderers.ts +0 -60
  289. package/src/tools/tool-result.ts +0 -86
  290. /package/src/{modes/theme → theme}/dark.json +0 -0
  291. /package/src/{modes/theme → theme}/defaults/dark-catppuccin.json +0 -0
  292. /package/src/{modes/theme → theme}/defaults/dark-dracula.json +0 -0
  293. /package/src/{modes/theme → theme}/defaults/dark-gruvbox.json +0 -0
  294. /package/src/{modes/theme → theme}/defaults/dark-solarized.json +0 -0
  295. /package/src/{modes/theme → theme}/defaults/dark-tokyo-night.json +0 -0
  296. /package/src/{modes/theme → theme}/defaults/index.ts +0 -0
  297. /package/src/{modes/theme → theme}/defaults/light-catppuccin.json +0 -0
  298. /package/src/{modes/theme → theme}/defaults/light-github.json +0 -0
  299. /package/src/{modes/theme → theme}/defaults/light-solarized.json +0 -0
  300. /package/src/{modes/theme → theme}/light.json +0 -0
  301. /package/src/{modes/theme → theme}/mermaid-cache.ts +0 -0
  302. /package/src/{modes/theme → theme}/theme-schema.json +0 -0
  303. /package/src/{modes/theme → theme}/theme.ts +0 -0
@@ -7,6 +7,8 @@ import { MODEL_ROLES } from "../../config/model-registry";
7
7
  import { settings } from "../../config/settings";
8
8
  import { DebugSelectorComponent } from "../../debug";
9
9
  import { disableProvider, enableProvider } from "../../discovery";
10
+ import type { InteractiveModeContext } from "../../modes/types";
11
+ import { SessionManager } from "../../session/session-manager";
10
12
  import {
11
13
  getAvailableThemes,
12
14
  getSymbolTheme,
@@ -15,11 +17,8 @@ import {
15
17
  setSymbolPreset,
16
18
  setTheme,
17
19
  theme,
18
- } from "../../modes/theme/theme";
19
- import type { InteractiveModeContext } from "../../modes/types";
20
- import { SessionManager } from "../../session/session-manager";
20
+ } from "../../theme/theme";
21
21
  import { setPreferredImageProvider, setPreferredSearchProvider } from "../../tools";
22
- import { AgentDashboard } from "../components/agent-dashboard";
23
22
  import { AssistantMessageComponent } from "../components/assistant-message";
24
23
  import { ExtensionDashboard } from "../components/extensions";
25
24
  import { HistorySearchComponent } from "../components/history-search";
@@ -160,28 +159,6 @@ export class SelectorController {
160
159
  }
161
160
 
162
161
  /**
163
- * Show the Agent Control Center dashboard.
164
- */
165
- async showAgentsDashboard(): Promise<void> {
166
- const activeModel = this.ctx.session.model;
167
- const activeModelPattern = activeModel ? `${activeModel.provider}/${activeModel.id}` : undefined;
168
- const defaultModelPattern = this.ctx.settings.getModelRole("default");
169
- const dashboard = await AgentDashboard.create(getProjectDir(), this.ctx.settings, this.ctx.ui.terminal.rows, {
170
- modelRegistry: this.ctx.session.modelRegistry,
171
- activeModelPattern,
172
- defaultModelPattern,
173
- });
174
- this.showSelector(done => {
175
- dashboard.onClose = () => {
176
- done();
177
- this.ctx.ui.requestRender();
178
- };
179
- dashboard.onRequestRender = () => {
180
- this.ctx.ui.requestRender();
181
- };
182
- return { component: dashboard, focus: dashboard };
183
- });
184
- }
185
162
 
186
163
  /**
187
164
  * Handle setting changes from the settings selector.
@@ -8,8 +8,8 @@ import { getProjectDir, getSSHConfigPath } from "@nghyane/arcane-utils/dirs";
8
8
  import { type SSHHost, sshCapability } from "../../capability/ssh";
9
9
  import { loadCapability } from "../../discovery";
10
10
  import { addSSHHost, readSSHConfigFile, removeSSHHost, type SSHHostConfig } from "../../ssh/config-writer";
11
+ import { theme } from "../../theme/theme";
11
12
  import { DynamicBorder } from "../components/dynamic-border";
12
- import { theme } from "../theme/theme";
13
13
  import type { InteractiveModeContext } from "../types";
14
14
 
15
15
  function parseCommandArgs(argsString: string): string[] {
@@ -28,6 +28,9 @@ import { HistoryStorage } from "../session/history-storage";
28
28
  import type { SessionContext, SessionManager } from "../session/session-manager";
29
29
  import { getRecentSessions } from "../session/session-manager";
30
30
  import { STTController, type SttState } from "../stt";
31
+ import { setMermaidRenderCallback } from "../theme/mermaid-cache";
32
+ import type { Theme } from "../theme/theme";
33
+ import { getEditorTheme, getMarkdownTheme, onThemeChange, theme } from "../theme/theme";
31
34
  import { time } from "../utils/timings";
32
35
  import { setTerminalTitle } from "../utils/title-generator";
33
36
  import type { AssistantMessageComponent } from "./components/assistant-message";
@@ -48,9 +51,6 @@ import { InputController } from "./controllers/input-controller";
48
51
  import { MCPCommandController } from "./controllers/mcp-command-controller";
49
52
  import { SelectorController } from "./controllers/selector-controller";
50
53
  import { SSHCommandController } from "./controllers/ssh-command-controller";
51
- import { setMermaidRenderCallback } from "./theme/mermaid-cache";
52
- import type { Theme } from "./theme/theme";
53
- import { getEditorTheme, getMarkdownTheme, onThemeChange, theme } from "./theme/theme";
54
54
  import type { CompactionQueuedMessage, InteractiveModeContext, TodoItem } from "./types";
55
55
  import { UiHelpers } from "./utils/ui-helpers";
56
56
 
@@ -849,10 +849,6 @@ export class InteractiveMode implements InteractiveModeContext {
849
849
  void this.#selectorController.showExtensionsDashboard();
850
850
  }
851
851
 
852
- showAgentsDashboard(): void {
853
- void this.#selectorController.showAgentsDashboard();
854
- }
855
-
856
852
  showModelSelector(options?: { temporaryOnly?: boolean }): void {
857
853
  this.#selectorController.showModelSelector(options);
858
854
  }
@@ -180,12 +180,12 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
180
180
 
181
181
  // Ensure stdout is fully flushed before returning
182
182
  // This prevents race conditions where the process exits before all output is written
183
- await new Promise<void>((resolve, reject) => {
184
- process.stdout.write("", err => {
185
- if (err) reject(err);
186
- else resolve();
187
- });
183
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
184
+ process.stdout.write("", err => {
185
+ if (err) reject(err);
186
+ else resolve();
188
187
  });
188
+ await promise;
189
189
 
190
190
  await session.dispose();
191
191
  }
@@ -12,8 +12,8 @@
12
12
  */
13
13
  import { readJsonl, Snowflake } from "@nghyane/arcane-utils";
14
14
  import type { ExtensionUIContext, ExtensionUIDialogOptions } from "../../extensibility/extensions";
15
- import { type Theme, theme } from "../../modes/theme/theme";
16
15
  import type { AgentSession } from "../../session/agent-session";
16
+ import { type Theme, theme } from "../../theme/theme";
17
17
  import type {
18
18
  RpcCommand,
19
19
  RpcExtensionUIRequest,
@@ -9,6 +9,7 @@ import type { MCPManager } from "../mcp";
9
9
  import type { AgentSession, AgentSessionEvent } from "../session/agent-session";
10
10
  import type { HistoryStorage } from "../session/history-storage";
11
11
  import type { SessionContext, SessionManager } from "../session/session-manager";
12
+ import type { Theme } from "../theme/theme";
12
13
  import type { AssistantMessageComponent } from "./components/assistant-message";
13
14
  import type { BashExecutionComponent } from "./components/bash-execution";
14
15
  import type { CustomEditor } from "./components/custom-editor";
@@ -18,7 +19,6 @@ import type { HookSelectorComponent } from "./components/hook-selector";
18
19
  import type { PythonExecutionComponent } from "./components/python-execution";
19
20
  import type { StatusLineComponent } from "./components/status-line";
20
21
  import type { ToolExecutionHandle } from "./components/tool-execution";
21
- import type { Theme } from "./theme/theme";
22
22
 
23
23
  export type CompactionQueuedMessage = {
24
24
  text: string;
@@ -158,7 +158,6 @@ export interface InteractiveModeContext {
158
158
  showSettingsSelector(): void;
159
159
  showHistorySearch(): void;
160
160
  showExtensionsDashboard(): void;
161
- showAgentsDashboard(): void;
162
161
  showModelSelector(options?: { temporaryOnly?: boolean }): void;
163
162
  showUserMessageSelector(): void;
164
163
  showTreeSelector(): void;
@@ -6,18 +6,19 @@ import { AssistantMessageComponent } from "../../modes/components/assistant-mess
6
6
  import { BashExecutionComponent } from "../../modes/components/bash-execution";
7
7
  import { BranchSummaryMessageComponent } from "../../modes/components/branch-summary-message";
8
8
  import { CompactionSummaryMessageComponent } from "../../modes/components/compaction-summary-message";
9
+ import { ContextGroupComponent } from "../../modes/components/context-group";
9
10
  import { CustomMessageComponent } from "../../modes/components/custom-message";
10
11
  import { DynamicBorder } from "../../modes/components/dynamic-border";
11
12
  import { PythonExecutionComponent } from "../../modes/components/python-execution";
12
- import { ReadToolGroupComponent } from "../../modes/components/read-tool-group";
13
13
  import { SkillMessageComponent } from "../../modes/components/skill-message";
14
14
  import { ToolExecutionComponent } from "../../modes/components/tool-execution";
15
15
  import { UserMessageComponent } from "../../modes/components/user-message";
16
- import { theme } from "../../modes/theme/theme";
17
16
  import type { CompactionQueuedMessage, InteractiveModeContext } from "../../modes/types";
18
17
  import { type CustomMessage, SKILL_PROMPT_MESSAGE_TYPE, type SkillPromptDetails } from "../../session/messages";
19
18
  import type { SessionContext } from "../../session/session-manager";
20
19
  import { formatBytes } from "../../session/streaming-output";
20
+ import { theme } from "../../theme/theme";
21
+ import { getToolTier, isContextTool } from "../../ui/render-utils";
21
22
 
22
23
  type TextBlock = { type: "text"; text: string };
23
24
 
@@ -190,12 +191,13 @@ export class UiHelpers {
190
191
  this.ctx.updateEditorBorderColor();
191
192
  }
192
193
 
193
- let readGroup: ReadToolGroupComponent | null = null;
194
+ let currentGroup: ContextGroupComponent | undefined;
195
+ const toolGroups = new Map<string, ContextGroupComponent>();
196
+
194
197
  for (const message of sessionContext.messages) {
195
- // Assistant messages need special handling for tool calls
196
198
  if (message.role === "assistant") {
199
+ currentGroup = undefined;
197
200
  this.ctx.addMessageToChat(message);
198
- readGroup = null;
199
201
  const hasErrorStop = message.stopReason === "aborted" || message.stopReason === "error";
200
202
  const errorMessage = hasErrorStop
201
203
  ? message.stopReason === "aborted"
@@ -208,47 +210,36 @@ export class UiHelpers {
208
210
  : message.errorMessage || "Error"
209
211
  : null;
210
212
 
211
- // Render tool call components
213
+ // Render tool call components with context grouping
212
214
  for (const content of message.content) {
213
215
  if (content.type !== "toolCall") {
214
216
  continue;
215
217
  }
216
218
 
217
- if (content.name === "read") {
218
- if (!readGroup) {
219
- readGroup = new ReadToolGroupComponent();
220
- readGroup.setExpanded(this.ctx.toolOutputExpanded);
221
- this.ctx.chatContainer.addChild(readGroup);
222
- }
223
- readGroup.updateArgs(content.arguments, content.id);
224
- if (hasErrorStop && errorMessage) {
225
- readGroup.updateResult(
226
- { content: [{ type: "text", text: errorMessage }], isError: true },
227
- false,
228
- content.id,
229
- );
230
- } else {
231
- this.ctx.pendingTools.set(content.id, readGroup);
232
- }
233
- continue;
234
- }
235
-
236
- readGroup = null;
219
+ const tier = getToolTier(content.name);
237
220
  const tool = this.ctx.session.getToolByName(content.name);
238
221
  const component = new ToolExecutionComponent(
239
222
  content.name,
240
223
  content.arguments,
241
- {
242
- showImages: settings.get("terminal.showImages"),
243
- editFuzzyThreshold: settings.get("edit.fuzzyThreshold"),
244
- editAllowFuzzy: settings.get("edit.fuzzyMatch"),
245
- },
224
+ { showImages: settings.get("terminal.showImages"), tier },
246
225
  tool,
247
226
  this.ctx.ui,
248
227
  this.ctx.sessionManager.getCwd(),
249
228
  );
250
229
  component.setExpanded(this.ctx.toolOutputExpanded);
251
- this.ctx.chatContainer.addChild(component);
230
+
231
+ if (isContextTool(content.name)) {
232
+ if (!currentGroup) {
233
+ currentGroup = new ContextGroupComponent();
234
+ currentGroup.setExpanded(this.ctx.toolOutputExpanded);
235
+ this.ctx.chatContainer.addChild(currentGroup);
236
+ }
237
+ currentGroup.addTool(content.name, component);
238
+ toolGroups.set(content.id, currentGroup);
239
+ } else {
240
+ currentGroup = undefined;
241
+ this.ctx.chatContainer.addChild(component);
242
+ }
252
243
 
253
244
  if (hasErrorStop && errorMessage) {
254
245
  component.updateResult(
@@ -256,6 +247,11 @@ export class UiHelpers {
256
247
  false,
257
248
  content.id,
258
249
  );
250
+ const group = toolGroups.get(content.id);
251
+ if (group) {
252
+ group.markDone();
253
+ toolGroups.delete(content.id);
254
+ }
259
255
  } else {
260
256
  this.ctx.pendingTools.set(content.id, component);
261
257
  }
@@ -266,8 +262,14 @@ export class UiHelpers {
266
262
  if (component) {
267
263
  component.updateResult(message, false, message.toolCallId);
268
264
  this.ctx.pendingTools.delete(message.toolCallId);
265
+ const group = toolGroups.get(message.toolCallId);
266
+ if (group) {
267
+ group.markDone();
268
+ toolGroups.delete(message.toolCallId);
269
+ }
269
270
  }
270
271
  } else {
272
+ currentGroup = undefined;
271
273
  // All other messages use standard rendering
272
274
  this.ctx.addMessageToChat(message, options);
273
275
  }