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