@nghyane/arcane 0.1.13 → 0.1.14

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 (323) 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 +48 -113
  50. package/src/modes/components/bordered-loader.ts +1 -1
  51. package/src/modes/components/branch-summary-message.ts +13 -10
  52. package/src/modes/components/compaction-summary-message.ts +14 -13
  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 +49 -92
  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/frontmatter.md +1 -1
  113. package/src/prompts/agents/init.md +2 -2
  114. package/src/prompts/agents/librarian.md +30 -21
  115. package/src/prompts/agents/oracle.md +9 -2
  116. package/src/prompts/agents/reviewer.md +15 -49
  117. package/src/prompts/agents/task.md +17 -9
  118. package/src/prompts/compaction/branch-summary-context.md +1 -1
  119. package/src/prompts/compaction/branch-summary-preamble.md +1 -1
  120. package/src/prompts/compaction/branch-summary.md +4 -1
  121. package/src/prompts/compaction/compaction-short-summary.md +1 -1
  122. package/src/prompts/compaction/compaction-summary-context.md +1 -1
  123. package/src/prompts/compaction/compaction-summary.md +4 -1
  124. package/src/prompts/compaction/compaction-turn-prefix.md +1 -1
  125. package/src/prompts/compaction/compaction-update-summary.md +1 -1
  126. package/src/prompts/memories/consolidation.md +1 -1
  127. package/src/prompts/memories/read_path.md +1 -1
  128. package/src/prompts/memories/stage_one_input.md +1 -1
  129. package/src/prompts/memories/stage_one_system.md +1 -1
  130. package/src/prompts/review-request.md +1 -1
  131. package/src/prompts/system/agent-creation-architect.md +1 -1
  132. package/src/prompts/system/agent-creation-user.md +1 -1
  133. package/src/prompts/system/custom-system-prompt.md +1 -1
  134. package/src/prompts/system/file-operations.md +1 -1
  135. package/src/prompts/system/subagent-system-prompt.md +2 -2
  136. package/src/prompts/system/summarization-system.md +1 -1
  137. package/src/prompts/system/system-prompt.md +163 -178
  138. package/src/prompts/system/title-system.md +1 -1
  139. package/src/prompts/system/ttsr-interrupt.md +1 -1
  140. package/src/prompts/system/verification-reminder.md +6 -0
  141. package/src/prompts/system/web-search.md +1 -1
  142. package/src/sdk.ts +0 -9
  143. package/src/session/agent-session.ts +244 -1459
  144. package/src/session/model-controller.ts +406 -0
  145. package/src/session/retry-utils.ts +71 -0
  146. package/src/session/session-manager.ts +22 -186
  147. package/src/session/session-types.ts +312 -0
  148. package/src/session/stats.ts +387 -0
  149. package/src/session/streaming-edit.ts +258 -0
  150. package/src/session/ttsr.ts +213 -0
  151. package/src/slash-commands/builtin-registry.ts +0 -8
  152. package/src/stt/recorder.ts +2 -2
  153. package/src/system-prompt.ts +1 -14
  154. package/src/task/agents.ts +7 -33
  155. package/src/task/executor.ts +50 -438
  156. package/src/task/index.ts +104 -71
  157. package/src/task/progress-tracker.ts +390 -0
  158. package/src/task/render.ts +371 -187
  159. package/src/task/subprocess-tool-registry.ts +1 -1
  160. package/src/task/types.ts +14 -47
  161. package/src/tools/ask.ts +31 -42
  162. package/src/tools/bash-interactive.ts +2 -2
  163. package/src/tools/bash-interceptor.ts +2 -2
  164. package/src/tools/bash-normalize.ts +1 -1
  165. package/src/tools/bash-skill-urls.ts +2 -2
  166. package/src/tools/bash.ts +87 -136
  167. package/src/tools/browser.ts +54 -84
  168. package/src/tools/create-tools.ts +186 -0
  169. package/src/tools/default-renderer.ts +104 -0
  170. package/src/tools/explore.ts +11 -10
  171. package/src/tools/fetch.ts +24 -114
  172. package/src/tools/find.ts +48 -132
  173. package/src/tools/gemini-image.ts +5 -15
  174. package/src/tools/github.ts +450 -0
  175. package/src/tools/grep.ts +43 -179
  176. package/src/tools/index.ts +35 -198
  177. package/src/tools/json-tree.ts +3 -3
  178. package/src/tools/librarian.ts +18 -18
  179. package/src/tools/list-limit.ts +2 -2
  180. package/src/tools/notebook.ts +35 -87
  181. package/src/tools/oracle.ts +25 -25
  182. package/src/tools/output-meta.ts +89 -4
  183. package/src/tools/output-utils.ts +2 -2
  184. package/src/tools/python.ts +86 -637
  185. package/src/tools/read.ts +36 -119
  186. package/src/tools/reviewer-tool.ts +19 -21
  187. package/src/tools/search-code.ts +128 -0
  188. package/src/tools/ssh.ts +67 -126
  189. package/src/tools/subagent-tool.ts +197 -123
  190. package/src/tools/todo-write.ts +15 -31
  191. package/src/tools/tool-errors.ts +0 -30
  192. package/src/tools/undo-edit.ts +30 -67
  193. package/src/tools/write.ts +78 -127
  194. package/src/tui/code-cell.ts +4 -4
  195. package/src/tui/file-list.ts +2 -2
  196. package/src/tui/output-block.ts +1 -1
  197. package/src/tui/status-line.ts +1 -1
  198. package/src/tui/tree-list.ts +2 -2
  199. package/src/tui/types.ts +1 -1
  200. package/src/tui/utils.ts +1 -1
  201. package/src/{tools → ui}/render-utils.ts +87 -126
  202. package/src/utils/external-editor.ts +4 -4
  203. package/src/utils/file-mentions.ts +1 -1
  204. package/src/utils/index.ts +30 -0
  205. package/src/utils/tools-manager.ts +9 -19
  206. package/src/web/github-client.ts +290 -0
  207. package/src/web/scrapers/github.ts +11 -62
  208. package/src/web/search/auth.ts +1 -3
  209. package/src/web/search/index.ts +82 -46
  210. package/src/web/search/provider.ts +11 -16
  211. package/src/web/search/providers/grep.ts +160 -0
  212. package/src/web/search/render.ts +48 -235
  213. package/src/web/search/types.ts +1 -1
  214. package/src/commands/commit.ts +0 -36
  215. package/src/commit/agentic/agent.ts +0 -311
  216. package/src/commit/agentic/fallback.ts +0 -96
  217. package/src/commit/agentic/index.ts +0 -359
  218. package/src/commit/agentic/prompts/analyze-file.md +0 -22
  219. package/src/commit/agentic/prompts/session-user.md +0 -25
  220. package/src/commit/agentic/prompts/split-confirm.md +0 -1
  221. package/src/commit/agentic/prompts/system.md +0 -38
  222. package/src/commit/agentic/state.ts +0 -69
  223. package/src/commit/agentic/tools/analyze-file.ts +0 -118
  224. package/src/commit/agentic/tools/git-file-diff.ts +0 -194
  225. package/src/commit/agentic/tools/git-hunk.ts +0 -50
  226. package/src/commit/agentic/tools/git-overview.ts +0 -84
  227. package/src/commit/agentic/tools/index.ts +0 -56
  228. package/src/commit/agentic/tools/propose-changelog.ts +0 -128
  229. package/src/commit/agentic/tools/propose-commit.ts +0 -154
  230. package/src/commit/agentic/tools/recent-commits.ts +0 -81
  231. package/src/commit/agentic/tools/split-commit.ts +0 -280
  232. package/src/commit/agentic/topo-sort.ts +0 -44
  233. package/src/commit/agentic/trivial.ts +0 -51
  234. package/src/commit/agentic/validation.ts +0 -200
  235. package/src/commit/analysis/conventional.ts +0 -165
  236. package/src/commit/analysis/index.ts +0 -4
  237. package/src/commit/analysis/scope.ts +0 -242
  238. package/src/commit/analysis/summary.ts +0 -112
  239. package/src/commit/analysis/validation.ts +0 -66
  240. package/src/commit/changelog/detect.ts +0 -37
  241. package/src/commit/changelog/generate.ts +0 -110
  242. package/src/commit/changelog/index.ts +0 -234
  243. package/src/commit/changelog/parse.ts +0 -44
  244. package/src/commit/cli.ts +0 -93
  245. package/src/commit/git/diff.ts +0 -148
  246. package/src/commit/git/errors.ts +0 -9
  247. package/src/commit/git/index.ts +0 -211
  248. package/src/commit/git/operations.ts +0 -54
  249. package/src/commit/index.ts +0 -5
  250. package/src/commit/map-reduce/index.ts +0 -64
  251. package/src/commit/map-reduce/map-phase.ts +0 -178
  252. package/src/commit/map-reduce/reduce-phase.ts +0 -145
  253. package/src/commit/map-reduce/utils.ts +0 -9
  254. package/src/commit/message.ts +0 -11
  255. package/src/commit/model-selection.ts +0 -69
  256. package/src/commit/pipeline.ts +0 -243
  257. package/src/commit/prompts/analysis-system.md +0 -148
  258. package/src/commit/prompts/analysis-user.md +0 -38
  259. package/src/commit/prompts/changelog-system.md +0 -50
  260. package/src/commit/prompts/changelog-user.md +0 -18
  261. package/src/commit/prompts/file-observer-system.md +0 -24
  262. package/src/commit/prompts/file-observer-user.md +0 -8
  263. package/src/commit/prompts/reduce-system.md +0 -50
  264. package/src/commit/prompts/reduce-user.md +0 -17
  265. package/src/commit/prompts/summary-retry.md +0 -3
  266. package/src/commit/prompts/summary-system.md +0 -38
  267. package/src/commit/prompts/summary-user.md +0 -13
  268. package/src/commit/prompts/types-description.md +0 -2
  269. package/src/commit/types.ts +0 -109
  270. package/src/commit/utils/exclusions.ts +0 -42
  271. package/src/mcp/render.ts +0 -123
  272. package/src/modes/components/agent-dashboard.ts +0 -1130
  273. package/src/modes/components/codemode-group.ts +0 -369
  274. package/src/modes/components/read-tool-group.ts +0 -119
  275. package/src/modes/components/visual-truncate.ts +0 -63
  276. package/src/prompts/system/subagent-user-prompt.md +0 -8
  277. package/src/prompts/tools/ask.md +0 -44
  278. package/src/prompts/tools/bash.md +0 -24
  279. package/src/prompts/tools/browser.md +0 -33
  280. package/src/prompts/tools/calculator.md +0 -12
  281. package/src/prompts/tools/explore.md +0 -29
  282. package/src/prompts/tools/fetch.md +0 -16
  283. package/src/prompts/tools/find.md +0 -18
  284. package/src/prompts/tools/gemini-image.md +0 -23
  285. package/src/prompts/tools/grep.md +0 -28
  286. package/src/prompts/tools/hashline.md +0 -232
  287. package/src/prompts/tools/librarian.md +0 -24
  288. package/src/prompts/tools/lsp.md +0 -28
  289. package/src/prompts/tools/oracle.md +0 -26
  290. package/src/prompts/tools/patch.md +0 -74
  291. package/src/prompts/tools/python.md +0 -66
  292. package/src/prompts/tools/read.md +0 -36
  293. package/src/prompts/tools/replace.md +0 -38
  294. package/src/prompts/tools/reviewer.md +0 -41
  295. package/src/prompts/tools/ssh.md +0 -51
  296. package/src/prompts/tools/task-summary.md +0 -28
  297. package/src/prompts/tools/task.md +0 -146
  298. package/src/prompts/tools/todo-write.md +0 -65
  299. package/src/prompts/tools/undo-edit.md +0 -7
  300. package/src/prompts/tools/web-search.md +0 -19
  301. package/src/prompts/tools/write.md +0 -18
  302. package/src/task/batch.ts +0 -102
  303. package/src/task/discovery.ts +0 -126
  304. package/src/task/parallel.ts +0 -84
  305. package/src/task/template.ts +0 -32
  306. package/src/tools/calculator.ts +0 -537
  307. package/src/tools/jtd-to-typescript.ts +0 -198
  308. package/src/tools/renderers.ts +0 -60
  309. package/src/tools/tool-result.ts +0 -86
  310. /package/src/{modes/theme → theme}/dark.json +0 -0
  311. /package/src/{modes/theme → theme}/defaults/dark-catppuccin.json +0 -0
  312. /package/src/{modes/theme → theme}/defaults/dark-dracula.json +0 -0
  313. /package/src/{modes/theme → theme}/defaults/dark-gruvbox.json +0 -0
  314. /package/src/{modes/theme → theme}/defaults/dark-solarized.json +0 -0
  315. /package/src/{modes/theme → theme}/defaults/dark-tokyo-night.json +0 -0
  316. /package/src/{modes/theme → theme}/defaults/index.ts +0 -0
  317. /package/src/{modes/theme → theme}/defaults/light-catppuccin.json +0 -0
  318. /package/src/{modes/theme → theme}/defaults/light-github.json +0 -0
  319. /package/src/{modes/theme → theme}/defaults/light-solarized.json +0 -0
  320. /package/src/{modes/theme → theme}/light.json +0 -0
  321. /package/src/{modes/theme → theme}/mermaid-cache.ts +0 -0
  322. /package/src/{modes/theme → theme}/theme-schema.json +0 -0
  323. /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
  }