@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
@@ -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(
@@ -26,13 +26,8 @@ Parameters:
26
26
  async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
27
27
  try {
28
28
  const apiKey = await findApiKey();
29
- if (!apiKey) {
30
- return {
31
- content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
32
- details: { error: "EXA_API_KEY not found", toolName: "exa_company" },
33
- };
34
- }
35
- const response = await callExaTool("company_research", params, apiKey);
29
+ // Exa MCP endpoint is publicly accessible; API key is optional
30
+ const response = await callExaTool("company_research_exa", params, apiKey);
36
31
 
37
32
  if (isSearchResponse(response)) {
38
33
  const formatted = formatSearchResults(response);
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";
@@ -26,13 +26,8 @@ Parameters:
26
26
  async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
27
27
  try {
28
28
  const apiKey = await findApiKey();
29
- if (!apiKey) {
30
- return {
31
- content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
32
- details: { error: "EXA_API_KEY not found", toolName: "exa_linkedin" },
33
- };
34
- }
35
- const response = await callExaTool("linkedin_search", params, apiKey);
29
+ // Exa MCP endpoint is publicly accessible; API key is optional
30
+ const response = await callExaTool("linkedin_search_exa", params, apiKey);
36
31
 
37
32
  if (isSearchResponse(response)) {
38
33
  const formatted = formatSearchResults(response);
@@ -18,8 +18,11 @@ export function findApiKey(): string | null {
18
18
  }
19
19
 
20
20
  /** Fetch available tools from Exa MCP */
21
- export async function fetchExaTools(apiKey: string, toolNames: string[]): Promise<MCPTool[]> {
22
- const url = `https://mcp.exa.ai/mcp?exaApiKey=${encodeURIComponent(apiKey)}&toolNames=${encodeURIComponent(toolNames.join(","))}`;
21
+ export async function fetchExaTools(apiKey: string | null, toolNames: string[]): Promise<MCPTool[]> {
22
+ const params = new URLSearchParams();
23
+ if (apiKey) params.set("exaApiKey", apiKey);
24
+ params.set("toolNames", toolNames.join(","));
25
+ const url = `https://mcp.exa.ai/mcp?${params.toString()}`;
23
26
  const response = (await callMCP(url, "tools/list")) as MCPToolsResponse;
24
27
 
25
28
  if (response.error) {
@@ -44,8 +47,15 @@ export async function fetchWebsetsTools(apiKey: string): Promise<MCPTool[]> {
44
47
  }
45
48
 
46
49
  /** Call a tool on Exa MCP (simplified: toolName as first arg for easier use) */
47
- export async function callExaTool(toolName: string, args: Record<string, unknown>, apiKey: string): Promise<unknown> {
48
- const url = `https://mcp.exa.ai/mcp?exaApiKey=${encodeURIComponent(apiKey)}&tools=${encodeURIComponent(toolName)}`;
50
+ export async function callExaTool(
51
+ toolName: string,
52
+ args: Record<string, unknown>,
53
+ apiKey: string | null,
54
+ ): Promise<unknown> {
55
+ const params = new URLSearchParams();
56
+ if (apiKey) params.set("exaApiKey", apiKey);
57
+ params.set("tools", toolName);
58
+ const url = `https://mcp.exa.ai/mcp?${params.toString()}`;
49
59
  const response = (await callMCP(url, "tools/call", {
50
60
  name: toolName,
51
61
  arguments: args,
@@ -188,7 +198,7 @@ const mcpSchemaCache = new Map<string, MCPTool>();
188
198
 
189
199
  /** Fetch and cache MCP tool schema */
190
200
  export async function fetchMCPToolSchema(
191
- apiKey: string,
201
+ apiKey: string | null,
192
202
  mcpToolName: string,
193
203
  isWebsetsTool = false,
194
204
  ): Promise<MCPTool | null> {
@@ -198,7 +208,7 @@ export async function fetchMCPToolSchema(
198
208
  }
199
209
 
200
210
  try {
201
- const tools = isWebsetsTool ? await fetchWebsetsTools(apiKey) : await fetchExaTools(apiKey, [mcpToolName]);
211
+ const tools = isWebsetsTool ? await fetchWebsetsTools(apiKey!) : await fetchExaTools(apiKey, [mcpToolName]);
202
212
  const tool = tools.find(t => t.name === mcpToolName);
203
213
  if (tool) {
204
214
  mcpSchemaCache.set(cacheKey, tool);
@@ -238,15 +248,15 @@ export class MCPWrappedTool implements CustomTool<TSchema, ExaRenderDetails> {
238
248
  ): Promise<CustomToolResult<ExaRenderDetails>> {
239
249
  try {
240
250
  const apiKey = await findApiKey();
241
- if (!apiKey) {
251
+ if (!apiKey && this.config.isWebsetsTool) {
242
252
  return {
243
- content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
244
- details: { error: "EXA_API_KEY not found", toolName: this.config.name },
253
+ content: [{ type: "text" as const, text: "Error: EXA_API_KEY required for Websets tools" }],
254
+ details: { error: "EXA_API_KEY required for Websets tools", toolName: this.config.name },
245
255
  };
246
256
  }
247
257
 
248
258
  const response = this.config.isWebsetsTool
249
- ? await callWebsetsTool(apiKey, this.config.mcpToolName, params as Record<string, unknown>)
259
+ ? await callWebsetsTool(apiKey!, this.config.mcpToolName, params as Record<string, unknown>)
250
260
  : await callExaTool(this.config.mcpToolName, params as Record<string, unknown>, apiKey);
251
261
 
252
262
  if (isSearchResponse(response)) {
@@ -277,7 +287,7 @@ export class MCPWrappedTool implements CustomTool<TSchema, ExaRenderDetails> {
277
287
  * Falls back to provided fallback schema if MCP fetch fails.
278
288
  */
279
289
  export async function createMCPToolFromServer(
280
- apiKey: string,
290
+ apiKey: string | null,
281
291
  config: MCPToolWrapperConfig,
282
292
  fallbackSchema: TSchema,
283
293
  fallbackDescription: string,