@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
@@ -262,15 +262,6 @@ export const SETTINGS_SCHEMA = {
262
262
  description: "Rewrite tool call arguments to normalized format in session history",
263
263
  },
264
264
  },
265
- repeatToolDescriptions: {
266
- type: "boolean",
267
- default: false,
268
- ui: {
269
- tab: "agent",
270
- label: "Repeat tool descriptions",
271
- description: "Render full tool descriptions in the system prompt instead of a tool name list",
272
- },
273
- },
274
265
  readLineNumbers: {
275
266
  type: "boolean",
276
267
  default: false,
@@ -397,6 +388,29 @@ export const SETTINGS_SCHEMA = {
397
388
  },
398
389
  "retry.baseDelayMs": { type: "number", default: 2000 },
399
390
 
391
+ // ─────────────────────────────────────────────────────────────────────────
392
+ // Verification loop settings
393
+ // ─────────────────────────────────────────────────────────────────────────
394
+ "verification.autoCheck": {
395
+ type: "boolean",
396
+ default: true,
397
+ ui: {
398
+ tab: "agent",
399
+ label: "Auto-verify changes",
400
+ description: "Automatically remind agent to verify changes before completing",
401
+ },
402
+ },
403
+ "verification.maxReminders": {
404
+ type: "number",
405
+ default: 2,
406
+ ui: {
407
+ tab: "agent",
408
+ label: "Verification max reminders",
409
+ description: "Maximum verification reminders before giving up",
410
+ submenu: true,
411
+ },
412
+ },
413
+
400
414
  // ─────────────────────────────────────────────────────────────────────────
401
415
  // Todo completion settings
402
416
  // ─────────────────────────────────────────────────────────────────────────
@@ -469,6 +483,15 @@ export const SETTINGS_SCHEMA = {
469
483
  default: true,
470
484
  ui: { tab: "tools", label: "Enable Fetch", description: "Enable the fetch tool for URL fetching" },
471
485
  },
486
+ "github.enabled": {
487
+ type: "boolean",
488
+ default: true,
489
+ ui: {
490
+ tab: "tools",
491
+ label: "Enable GitHub",
492
+ description: "Enable the GitHub API tool for repository exploration",
493
+ },
494
+ },
472
495
  "librarian.enabled": {
473
496
  type: "boolean",
474
497
  default: true,
@@ -488,15 +511,6 @@ export const SETTINGS_SCHEMA = {
488
511
  default: true,
489
512
  ui: { tab: "tools", label: "Enable LSP", description: "Enable the lsp tool for language server protocol" },
490
513
  },
491
- "calc.enabled": {
492
- type: "boolean",
493
- default: false,
494
- ui: {
495
- tab: "tools",
496
- label: "Enable Calculator",
497
- description: "Enable the calculator tool for basic calculations",
498
- },
499
- },
500
514
  "browser.enabled": {
501
515
  type: "boolean",
502
516
  default: true,
@@ -515,47 +529,10 @@ export const SETTINGS_SCHEMA = {
515
529
  description: "Launch browser in headless mode (disable to show browser UI)",
516
530
  },
517
531
  },
518
- "tools.intentTracing": {
519
- type: "boolean",
520
- default: true,
521
- ui: {
522
- tab: "tools",
523
- label: "Intent tracing",
524
- description: "Ask the agent to describe the intent of each tool call before executing it",
525
- },
526
- },
527
532
 
528
533
  // ─────────────────────────────────────────────────────────────────────────
529
534
  // Task tool settings
530
535
  // ─────────────────────────────────────────────────────────────────────────
531
- "task.isolation.enabled": {
532
- type: "boolean",
533
- default: false,
534
- ui: {
535
- tab: "tools",
536
- label: "Task isolation",
537
- description: "Run subagents in isolated git worktrees",
538
- submenu: true,
539
- },
540
- },
541
- "task.maxConcurrency": {
542
- type: "number",
543
- default: 32,
544
- ui: {
545
- tab: "tools",
546
- label: "Task max concurrency",
547
- description: "Concurrent limit for subagents",
548
- submenu: true,
549
- },
550
- },
551
- "task.disabledAgents": {
552
- type: "array",
553
- default: [] as string[],
554
- },
555
- "task.agentModelOverrides": {
556
- type: "record",
557
- default: {} as Record<string, string>,
558
- },
559
536
 
560
537
  // ─────────────────────────────────────────────────────────────────────────
561
538
  // Startup settings
@@ -737,19 +714,6 @@ export const SETTINGS_SCHEMA = {
737
714
  ui: { tab: "services", label: "Exa websets", description: "Webset management and enrichment tools" },
738
715
  },
739
716
 
740
- // ─────────────────────────────────────────────────────────────────────────
741
- // Code Mode settings
742
- // ─────────────────────────────────────────────────────────────────────────
743
- "codemode.enabled": {
744
- type: "boolean",
745
- default: true,
746
- ui: {
747
- tab: "agent",
748
- label: "Code Mode",
749
- description: "Replace tool-calling with code generation (LLM writes JS to orchestrate tools)",
750
- },
751
- },
752
-
753
717
  // Bash interceptor settings
754
718
  // ─────────────────────────────────────────────────────────────────────────
755
719
  "bash.virtualTerminal": {
@@ -963,16 +927,6 @@ export const SETTINGS_SCHEMA = {
963
927
  },
964
928
  },
965
929
 
966
- // ─────────────────────────────────────────────────────────────────────────
967
- // Commit settings (no UI - advanced)
968
- // ─────────────────────────────────────────────────────────────────────────
969
- "commit.mapReduceEnabled": { type: "boolean", default: true },
970
- "commit.mapReduceMinFiles": { type: "number", default: 4 },
971
- "commit.mapReduceMaxFileTokens": { type: "number", default: 50000 },
972
- "commit.mapReduceTimeoutMs": { type: "number", default: 120000 },
973
- "commit.mapReduceMaxConcurrency": { type: "number", default: 5 },
974
- "commit.changelogMaxDiffChars": { type: "number", default: 120000 },
975
-
976
930
  // ─────────────────────────────────────────────────────────────────────────
977
931
  // Thinking budgets (no UI - advanced)
978
932
  // ─────────────────────────────────────────────────────────────────────────
@@ -1148,15 +1102,6 @@ export interface SkillsSettings {
1148
1102
  includeSkills?: string[];
1149
1103
  }
1150
1104
 
1151
- export interface CommitSettings {
1152
- mapReduceEnabled: boolean;
1153
- mapReduceMinFiles: number;
1154
- mapReduceMaxFileTokens: number;
1155
- mapReduceTimeoutMs: number;
1156
- mapReduceMaxConcurrency: number;
1157
- changelogMaxDiffChars: number;
1158
- }
1159
-
1160
1105
  export interface TtsrSettings {
1161
1106
  enabled: boolean;
1162
1107
  contextMode: "discard" | "keep";
@@ -1214,7 +1159,6 @@ export interface GroupTypeMap {
1214
1159
  memories: MemoriesSettings;
1215
1160
  branchSummary: BranchSummarySettings;
1216
1161
  skills: SkillsSettings;
1217
- commit: CommitSettings;
1218
1162
  ttsr: TtsrSettings;
1219
1163
  exa: ExaSettings;
1220
1164
  statusLine: StatusLineSettings;
@@ -19,9 +19,9 @@ import { YAML } from "bun";
19
19
  import { type Settings as SettingsCapabilityItem, settingsCapability } from "../capability/settings";
20
20
  import type { ModelRole } from "../config/model-registry";
21
21
  import { loadCapability } from "../discovery";
22
- import { isLightTheme, setAutoThemeMapping, setColorBlindMode, setSymbolPreset } from "../modes/theme/theme";
23
22
  import { type EditMode, normalizeEditMode } from "../patch";
24
23
  import { AgentStorage } from "../session/agent-storage";
24
+ import { isLightTheme, setAutoThemeMapping, setColorBlindMode, setSymbolPreset } from "../theme/theme";
25
25
  import { withFileLock } from "./file-lock";
26
26
  import {
27
27
  type BashInterceptorRule,
@@ -37,7 +37,6 @@ import {
37
37
  export type {
38
38
  BashInterceptorRule,
39
39
  BranchSummarySettings,
40
- CommitSettings,
41
40
  CompactionSettings,
42
41
  ContextPromotionSettings,
43
42
  ExaSettings,
@@ -654,14 +653,14 @@ const SETTING_HOOKS: Partial<Record<SettingPath, SettingHook<any>>> = {
654
653
  },
655
654
  symbolPreset: value => {
656
655
  if (typeof value === "string" && (value === "unicode" || value === "nerd" || value === "ascii")) {
657
- setSymbolPreset(value).catch(err => {
656
+ setSymbolPreset(value).catch((err: unknown) => {
658
657
  logger.warn("Settings: symbolPreset hook failed", { preset: value, error: String(err) });
659
658
  });
660
659
  }
661
660
  },
662
661
  colorBlindMode: value => {
663
662
  if (typeof value === "boolean") {
664
- setColorBlindMode(value).catch(err => {
663
+ setColorBlindMode(value).catch((err: unknown) => {
665
664
  logger.warn("Settings: colorBlindMode hook failed", { enabled: value, error: String(err) });
666
665
  });
667
666
  }
@@ -9,8 +9,8 @@ import { getWorkProfile } from "@nghyane/arcane-natives";
9
9
  import { Container, Loader, type SelectItem, SelectList, Spacer, Text } from "@nghyane/arcane-tui";
10
10
  import { getSessionsDir } from "@nghyane/arcane-utils/dirs";
11
11
  import { DynamicBorder } from "../modes/components/dynamic-border";
12
- import { getSelectListTheme, getSymbolTheme, theme } from "../modes/theme/theme";
13
12
  import type { InteractiveModeContext } from "../modes/types";
13
+ import { getSelectListTheme, getSymbolTheme, theme } from "../theme/theme";
14
14
  import { openPath } from "../utils/open";
15
15
  import { DebugLogViewerComponent } from "./log-viewer";
16
16
  import { generateHeapSnapshotData, type ProfilerSession, startCpuProfile } from "./profiler";
@@ -1,5 +1,5 @@
1
1
  import { sanitizeText } from "@nghyane/arcane-natives";
2
- import { replaceTabs, truncateToWidth } from "../tools/render-utils";
2
+ import { replaceTabs, truncateToWidth } from "../ui/render-utils";
3
3
 
4
4
  export function formatDebugLogLine(line: string, maxWidth: number): string {
5
5
  const sanitized = sanitizeText(line);
@@ -1,7 +1,7 @@
1
1
  import { copyToClipboard, sanitizeText } from "@nghyane/arcane-natives";
2
2
  import { type Component, matchesKey, padding, truncateToWidth, visibleWidth } from "@nghyane/arcane-tui";
3
- import { theme } from "../modes/theme/theme";
4
- import { replaceTabs } from "../tools/render-utils";
3
+ import { theme } from "../theme/theme";
4
+ import { replaceTabs } from "../ui/render-utils";
5
5
  import {
6
6
  formatDebugLogExpandedLines,
7
7
  formatDebugLogLine,
@@ -10,6 +10,7 @@ import { readFile } from "../capability/fs";
10
10
  import { parseRuleConditionAndScope, type Rule, type RuleFrontmatter } from "../capability/rule";
11
11
  import type { Skill, SkillFrontmatter } from "../capability/skill";
12
12
  import type { LoadContext, LoadResult, SourceMeta } from "../capability/types";
13
+ import type { AgentKind } from "../task/types";
13
14
  import { parseFrontmatter } from "../utils/frontmatter";
14
15
  import type { IgnoreMatcher } from "../utils/ignore-files";
15
16
 
@@ -215,9 +216,17 @@ export function parseModelList(value: unknown): string[] | undefined {
215
216
  export interface ParsedAgentFields {
216
217
  name: string;
217
218
  description: string;
218
- tools?: string[];
219
+ tools: string[];
219
220
  model?: string[];
220
221
  thinkingLevel?: ThinkingLevel;
222
+ kind?: AgentKind;
223
+ }
224
+
225
+ const VALID_AGENT_KINDS: readonly string[] = ["local", "remote", "hybrid", "reasoning"];
226
+
227
+ function parseAgentKind(value: unknown): AgentKind | undefined {
228
+ if (typeof value === "string" && VALID_AGENT_KINDS.includes(value)) return value as AgentKind;
229
+ return undefined;
221
230
  }
222
231
 
223
232
  /**
@@ -232,12 +241,13 @@ export function parseAgentFields(frontmatter: Record<string, unknown>): ParsedAg
232
241
  return null;
233
242
  }
234
243
 
235
- const tools = parseArrayOrCSV(frontmatter.tools);
244
+ const tools = parseArrayOrCSV(frontmatter.tools) ?? [];
236
245
 
237
246
  const model = parseModelList(frontmatter.model);
238
247
  const thinkingLevel = parseThinkingLevel(frontmatter);
248
+ const kind = parseAgentKind(frontmatter.kind);
239
249
 
240
- return { name, description, tools, model, thinkingLevel };
250
+ return { name, description, tools, model, thinkingLevel, kind };
241
251
  }
242
252
 
243
253
  async function globIf(
package/src/exa/index.ts CHANGED
@@ -1,12 +1,7 @@
1
1
  /**
2
2
  * Exa MCP Tools
3
3
  *
4
- * 22 tools for Exa's MCP servers:
5
- * - 4 search tools (search, deep, code, crawl)
6
- * - 1 LinkedIn search tool
7
- * - 1 company research tool
8
- * - 2 researcher tools (start, poll)
9
- * - 14 websets tools (CRUD, items, search, enrichment, monitor)
4
+ * Provides Exa tools filtered by user settings.
10
5
  */
11
6
  import type { ExaSettings } from "../config/settings";
12
7
  import type { CustomTool } from "../extensibility/custom-tools/types";
@@ -17,15 +12,6 @@ import { searchTools } from "./search";
17
12
  import type { ExaRenderDetails } from "./types";
18
13
  import { websetsTools } from "./websets";
19
14
 
20
- /** All Exa tools (22 total) - static export for backward compatibility */
21
- export const exaTools: CustomTool<any, ExaRenderDetails>[] = [
22
- ...searchTools,
23
- linkedinTool,
24
- companyTool,
25
- ...researcherTools,
26
- ...websetsTools,
27
- ];
28
-
29
15
  /** Get Exa tools filtered by settings */
30
16
  export function getExaTools(settings: Required<ExaSettings>): CustomTool<any, ExaRenderDetails>[] {
31
17
  if (!settings.enabled) return [];
@@ -40,23 +26,3 @@ export function getExaTools(settings: Required<ExaSettings>): CustomTool<any, Ex
40
26
 
41
27
  return tools;
42
28
  }
43
-
44
- export { companyTool } from "./company";
45
- export { linkedinTool } from "./linkedin";
46
- export {
47
- callExaTool,
48
- callWebsetsTool,
49
- createMCPToolFromServer,
50
- fetchMCPToolSchema,
51
- findApiKey,
52
- formatSearchResults,
53
- isSearchResponse,
54
- MCPWrappedTool,
55
- } from "./mcp-client";
56
- export { renderExaCall, renderExaResult } from "./render";
57
- export { researcherTools } from "./researcher";
58
- // Re-export individual modules for selective importing
59
- export { searchTools } from "./search";
60
- // Re-export types and utilities
61
- export type { ExaRenderDetails, ExaSearchResponse, ExaSearchResult, MCPToolWrapperConfig } from "./types";
62
- export { websetsTools } from "./websets";
package/src/exa/render.ts CHANGED
@@ -5,41 +5,13 @@
5
5
  */
6
6
  import type { Component } from "@nghyane/arcane-tui";
7
7
  import { Text } from "@nghyane/arcane-tui";
8
- import { logger } from "@nghyane/arcane-utils";
9
8
  import type { RenderResultOptions } from "../extensibility/custom-tools/types";
10
- import type { Theme } from "../modes/theme/theme";
11
- import {
12
- formatCount,
13
- formatExpandHint,
14
- formatMoreItems,
15
- formatStatusIcon,
16
- getDomain,
17
- getPreviewLines,
18
- PREVIEW_LIMITS,
19
- TRUNCATE_LENGTHS,
20
- truncateToWidth,
21
- } from "../tools/render-utils";
9
+ import type { Theme } from "../theme/theme";
10
+ import { renderStatusLine } from "../tui";
11
+ import { formatCount, formatMoreItems, getDomain, truncateToWidth } from "../ui/render-utils";
22
12
  import type { ExaRenderDetails } from "./types";
23
13
 
24
- const COLLAPSED_PREVIEW_LINES = PREVIEW_LIMITS.COLLAPSED_LINES;
25
- const COLLAPSED_PREVIEW_LINE_LEN = TRUNCATE_LENGTHS.LONG;
26
- const EXPANDED_TEXT_LINES = 5;
27
- const EXPANDED_TEXT_LINE_LEN = 90;
28
- const MAX_TITLE_LEN = TRUNCATE_LENGTHS.TITLE;
29
- const MAX_HIGHLIGHT_LEN = TRUNCATE_LENGTHS.CONTENT;
30
-
31
- function renderErrorMessage(message: string, theme: Theme): Text {
32
- const clean = message.replace(/^Error:\s*/, "").trim();
33
- return new Text(
34
- `${formatStatusIcon("error", theme)} ${theme.fg("error", `Error: ${clean || "Unknown error"}`)}`,
35
- 0,
36
- 0,
37
- );
38
- }
39
-
40
- function renderEmptyMessage(message: string, theme: Theme): Text {
41
- return new Text(`${formatStatusIcon("warning", theme)} ${theme.fg("muted", message)}`, 0, 0);
42
- }
14
+ const MAX_COLLAPSED_RESULTS = 5;
43
15
 
44
16
  /** Render Exa result with tree-based layout */
45
17
  export function renderExaResult(
@@ -47,183 +19,51 @@ export function renderExaResult(
47
19
  options: RenderResultOptions,
48
20
  uiTheme: Theme,
49
21
  ): Component {
50
- const { expanded } = options;
51
22
  const details = result.details;
52
-
53
- if (details?.error) {
54
- logger.error("Exa render error", { error: details.error, toolName: details.toolName });
55
- return renderErrorMessage(details.error, uiTheme);
56
- }
57
-
58
23
  const response = details?.response;
59
- if (!response) {
60
- if (details?.raw) {
61
- const rawText = typeof details.raw === "string" ? details.raw : JSON.stringify(details.raw, null, 2);
62
- const rawLines = rawText.split("\n").filter(l => l.trim());
63
- const maxLines = expanded ? rawLines.length : Math.min(rawLines.length, COLLAPSED_PREVIEW_LINES);
64
- const displayLines = rawLines.slice(0, maxLines);
65
- const remaining = rawLines.length - maxLines;
66
- const expandHint = formatExpandHint(uiTheme, expanded, remaining > 0);
67
-
68
- let text = `${formatStatusIcon("info", uiTheme)} ${uiTheme.fg("dim", "Raw response")}${expandHint}`;
69
-
70
- for (let i = 0; i < displayLines.length; i++) {
71
- const isLast = i === displayLines.length - 1 && remaining === 0;
72
- const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
73
- text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg(
74
- "toolOutput",
75
- truncateToWidth(displayLines[i], COLLAPSED_PREVIEW_LINE_LEN),
76
- )}`;
77
- }
78
-
79
- if (remaining > 0) {
80
- text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg(
81
- "muted",
82
- formatMoreItems(remaining, "line"),
83
- )}`;
84
- }
85
-
86
- return new Text(text, 0, 0);
87
- }
88
- return renderEmptyMessage("No response data", uiTheme);
89
- }
90
-
91
- const results = response.results ?? [];
24
+ const results = response?.results ?? [];
92
25
  const resultCount = results.length;
93
- const cost = response.costDollars?.total;
94
- const time = response.searchTime;
95
-
96
- const icon = formatStatusIcon(resultCount > 0 ? "success" : "warning", uiTheme);
97
26
 
98
- const metaParts = [formatCount("result", resultCount)];
99
- if (cost !== undefined) metaParts.push(`cost:$${cost.toFixed(4)}`);
100
- if (time !== undefined) metaParts.push(`time:${time.toFixed(2)}s`);
101
- const summaryText = metaParts.join(uiTheme.sep.dot);
27
+ const icon = details?.error ? "error" : resultCount > 0 ? "success" : "warning";
102
28
 
103
- let hasMorePreview = false;
104
- if (!expanded && resultCount > 0) {
105
- const previewText = results[0].text ?? results[0].title ?? "";
106
- const totalLines = previewText.split("\n").filter(l => l.trim()).length;
107
- hasMorePreview = totalLines > COLLAPSED_PREVIEW_LINES || resultCount > 1;
108
- }
109
- const expandHint = formatExpandHint(uiTheme, expanded, hasMorePreview);
110
-
111
- let text = `${icon} ${uiTheme.fg("dim", summaryText)}${expandHint}`;
112
-
113
- if (!expanded) {
114
- if (resultCount === 0) {
115
- text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", "No results")}`;
116
- return new Text(text, 0, 0);
117
- }
118
-
119
- const first = results[0];
120
- const previewText = first.text ?? first.title ?? "";
121
- const previewLines = previewText
122
- ? getPreviewLines(previewText, COLLAPSED_PREVIEW_LINES, COLLAPSED_PREVIEW_LINE_LEN)
123
- : [];
124
- const safePreviewLines = previewLines.length > 0 ? previewLines : ["No preview text"];
125
- const totalLines = previewText.split("\n").filter(l => l.trim()).length;
126
- const remainingLines = Math.max(0, totalLines - previewLines.length);
127
- const extraItems: string[] = [];
128
- if (remainingLines > 0) {
129
- extraItems.push(formatMoreItems(remainingLines, "line"));
130
- }
131
- if (resultCount > 1) {
132
- extraItems.push(formatMoreItems(resultCount - 1, "result"));
133
- }
134
-
135
- for (let i = 0; i < safePreviewLines.length; i++) {
136
- const isLast = i === safePreviewLines.length - 1 && extraItems.length === 0;
137
- const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
138
- const line = safePreviewLines[i];
139
- const color = line === "No preview text" ? "muted" : "toolOutput";
140
- text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg(color, line)}`;
141
- }
29
+ const header = renderStatusLine(
30
+ {
31
+ icon,
32
+ title: "Exa Search",
33
+ meta: [formatCount("result", resultCount)],
34
+ },
35
+ uiTheme,
36
+ );
142
37
 
143
- for (let i = 0; i < extraItems.length; i++) {
144
- const isLast = i === extraItems.length - 1;
145
- const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
146
- text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg("muted", extraItems[i])}`;
147
- }
38
+ let text = header;
148
39
 
40
+ if (details?.error) {
41
+ const clean = details.error.replace(/^Error:\s*/, "").trim();
42
+ text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("error", clean || "Unknown error")}`;
149
43
  return new Text(text, 0, 0);
150
44
  }
151
45
 
152
- if (resultCount === 0) {
46
+ if (!response || resultCount === 0) {
153
47
  text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", "No results")}`;
154
48
  return new Text(text, 0, 0);
155
49
  }
156
50
 
157
- for (let i = 0; i < results.length; i++) {
51
+ const { expanded } = options;
52
+ const maxItems = expanded ? results.length : Math.min(results.length, MAX_COLLAPSED_RESULTS);
53
+ const remaining = results.length - maxItems;
54
+
55
+ for (let i = 0; i < maxItems; i++) {
158
56
  const res = results[i];
159
- const isLast = i === results.length - 1;
57
+ const isLast = i === maxItems - 1 && remaining === 0;
160
58
  const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
161
- const cont = isLast ? " " : uiTheme.tree.vertical;
162
-
163
- const title = truncateToWidth(res.title ?? "Untitled", MAX_TITLE_LEN);
59
+ const title = truncateToWidth(res.title ?? "Untitled", 70);
164
60
  const domain = res.url ? getDomain(res.url) : "";
165
- const domainPart = domain ? uiTheme.fg("dim", ` (${domain})`) : "";
166
-
61
+ const domainPart = domain ? ` ${uiTheme.fg("dim", `(${domain})`)}` : "";
167
62
  text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg("accent", title)}${domainPart}`;
63
+ }
168
64
 
169
- if (res.url) {
170
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
171
- "mdLinkUrl",
172
- res.url,
173
- )}`;
174
- }
175
-
176
- if (res.author) {
177
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
178
- "muted",
179
- `Author: ${res.author}`,
180
- )}`;
181
- }
182
-
183
- if (res.publishedDate) {
184
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
185
- "muted",
186
- `Published: ${res.publishedDate}`,
187
- )}`;
188
- }
189
-
190
- if (res.text) {
191
- const textLines = res.text.split("\n").filter(l => l.trim());
192
- const displayLines = textLines.slice(0, EXPANDED_TEXT_LINES);
193
- for (const line of displayLines) {
194
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
195
- "toolOutput",
196
- truncateToWidth(line.trim(), EXPANDED_TEXT_LINE_LEN),
197
- )}`;
198
- }
199
- if (textLines.length > EXPANDED_TEXT_LINES) {
200
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
201
- "muted",
202
- formatMoreItems(textLines.length - EXPANDED_TEXT_LINES, "line"),
203
- )}`;
204
- }
205
- }
206
-
207
- if (res.highlights?.length) {
208
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
209
- "accent",
210
- "Highlights",
211
- )}`;
212
- const maxHighlights = Math.min(res.highlights.length, 3);
213
- for (let j = 0; j < maxHighlights; j++) {
214
- const h = res.highlights[j];
215
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
216
- "muted",
217
- `${uiTheme.format.dash} ${truncateToWidth(h, MAX_HIGHLIGHT_LEN)}`,
218
- )}`;
219
- }
220
- if (res.highlights.length > maxHighlights) {
221
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
222
- "muted",
223
- formatMoreItems(res.highlights.length - maxHighlights, "highlight"),
224
- )}`;
225
- }
226
- }
65
+ if (remaining > 0) {
66
+ text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", formatMoreItems(remaining, "result"))}`;
227
67
  }
228
68
 
229
69
  return new Text(text, 0, 0);
@@ -2,8 +2,8 @@ import * as path from "node:path";
2
2
  import type { AgentState } from "@nghyane/arcane-agent";
3
3
  import { isEnoent } from "@nghyane/arcane-utils";
4
4
  import { APP_NAME } from "@nghyane/arcane-utils/dirs";
5
- import { getResolvedThemeColors, getThemeExportColors } from "../../modes/theme/theme";
6
5
  import { type SessionEntry, type SessionHeader, SessionManager } from "../../session/session-manager";
6
+ import { getResolvedThemeColors, getThemeExportColors } from "../../theme/theme";
7
7
  // Pre-generated template (created by scripts/generate-template.ts at publish time)
8
8
  import { TEMPLATE } from "./template.generated";
9
9
 
@@ -15,7 +15,7 @@ import type { ExecOptions } from "../../exec/exec";
15
15
  import { execCommand } from "../../exec/exec";
16
16
  import type { HookUIContext } from "../../extensibility/hooks/types";
17
17
  import { getAllPluginToolPaths } from "../../extensibility/plugins/loader";
18
- import { theme } from "../../modes/theme/theme";
18
+ import { theme } from "../../theme/theme";
19
19
  import type { CustomToolAPI, CustomToolFactory, LoadedCustomTool, ToolLoadError } from "./types";
20
20
 
21
21
  /**
@@ -12,9 +12,9 @@ import type { Rule } from "../../capability/rule";
12
12
  import type { ModelRegistry } from "../../config/model-registry";
13
13
  import type { ExecOptions, ExecResult } from "../../exec/exec";
14
14
  import type { HookUIContext } from "../../extensibility/hooks/types";
15
- import type { Theme } from "../../modes/theme/theme";
16
15
  import type { CompactionResult } from "../../session/compaction";
17
16
  import type { ReadonlySessionManager } from "../../session/session-manager";
17
+ import type { Theme } from "../../theme/theme";
18
18
  import type { TodoItem } from "../../tools/todo-write";
19
19
 
20
20
  /** Alias for clarity */
@@ -114,6 +114,10 @@ export interface RenderResultOptions {
114
114
  isPartial: boolean;
115
115
  /** Current spinner frame index for animated elements (0-9, only provided during partial results) */
116
116
  spinnerFrame?: number;
117
+ /** Tool display label (used by default renderer) */
118
+ label?: string;
119
+ /** Extra rendering context from ToolExecutionComponent (bash output, edit diff, etc.) */
120
+ renderContext?: Record<string, unknown>;
117
121
  }
118
122
 
119
123
  export type CustomToolResult<TDetails = any> = AgentToolResult<TDetails>;
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import type { AgentTool, AgentToolUpdateCallback } from "@nghyane/arcane-agent";
5
5
  import type { Static, TSchema } from "@sinclair/typebox";
6
- import type { Theme } from "../../modes/theme/theme";
6
+ import type { Theme } from "../../theme/theme";
7
7
  import { applyToolProxy } from "../tool-proxy";
8
8
  import type { CustomTool, CustomToolContext } from "./types";
9
9
 
@@ -6,8 +6,8 @@ import type { ImageContent, Model } from "@nghyane/arcane-ai";
6
6
  import type { KeyId } from "@nghyane/arcane-tui";
7
7
  import { logger } from "@nghyane/arcane-utils";
8
8
  import type { ModelRegistry } from "../../config/model-registry";
9
- import { type Theme, theme } from "../../modes/theme/theme";
10
9
  import type { SessionManager } from "../../session/session-manager";
10
+ import { type Theme, theme } from "../../theme/theme";
11
11
  import type {
12
12
  BeforeAgentStartEvent,
13
13
  BeforeAgentStartEventResult,