@nghyane/arcane 0.1.0

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 (738) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +12 -0
  3. package/examples/README.md +21 -0
  4. package/examples/custom-tools/README.md +109 -0
  5. package/examples/custom-tools/hello/index.ts +20 -0
  6. package/examples/custom-tools/todo/index.ts +206 -0
  7. package/examples/extensions/README.md +143 -0
  8. package/examples/extensions/api-demo.ts +89 -0
  9. package/examples/extensions/chalk-logger.ts +25 -0
  10. package/examples/extensions/hello.ts +32 -0
  11. package/examples/extensions/pirate.ts +43 -0
  12. package/examples/extensions/plan-mode.ts +550 -0
  13. package/examples/extensions/reload-runtime.ts +37 -0
  14. package/examples/extensions/todo.ts +296 -0
  15. package/examples/extensions/tools.ts +144 -0
  16. package/examples/extensions/with-deps/index.ts +35 -0
  17. package/examples/extensions/with-deps/package-lock.json +31 -0
  18. package/examples/extensions/with-deps/package.json +16 -0
  19. package/examples/hooks/README.md +56 -0
  20. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  21. package/examples/hooks/confirm-destructive.ts +58 -0
  22. package/examples/hooks/custom-compaction.ts +116 -0
  23. package/examples/hooks/dirty-repo-guard.ts +51 -0
  24. package/examples/hooks/file-trigger.ts +40 -0
  25. package/examples/hooks/git-checkpoint.ts +52 -0
  26. package/examples/hooks/handoff.ts +150 -0
  27. package/examples/hooks/permission-gate.ts +33 -0
  28. package/examples/hooks/protected-paths.ts +29 -0
  29. package/examples/hooks/qna.ts +119 -0
  30. package/examples/hooks/status-line.ts +39 -0
  31. package/examples/sdk/01-minimal.ts +21 -0
  32. package/examples/sdk/02-custom-model.ts +49 -0
  33. package/examples/sdk/03-custom-prompt.ts +43 -0
  34. package/examples/sdk/04-skills.ts +43 -0
  35. package/examples/sdk/06-extensions.ts +80 -0
  36. package/examples/sdk/06-hooks.ts +61 -0
  37. package/examples/sdk/07-context-files.ts +35 -0
  38. package/examples/sdk/08-prompt-templates.ts +36 -0
  39. package/examples/sdk/08-slash-commands.ts +41 -0
  40. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  41. package/examples/sdk/11-sessions.ts +47 -0
  42. package/examples/sdk/README.md +150 -0
  43. package/package.json +464 -0
  44. package/scripts/format-prompts.ts +184 -0
  45. package/scripts/generate-docs-index.ts +40 -0
  46. package/scripts/generate-template.ts +32 -0
  47. package/src/bun-imports.d.ts +22 -0
  48. package/src/capability/context-file.ts +39 -0
  49. package/src/capability/extension-module.ts +33 -0
  50. package/src/capability/extension.ts +47 -0
  51. package/src/capability/fs.ts +89 -0
  52. package/src/capability/hook.ts +39 -0
  53. package/src/capability/index.ts +432 -0
  54. package/src/capability/instruction.ts +36 -0
  55. package/src/capability/mcp.ts +60 -0
  56. package/src/capability/prompt.ts +34 -0
  57. package/src/capability/rule.ts +223 -0
  58. package/src/capability/settings.ts +34 -0
  59. package/src/capability/skill.ts +48 -0
  60. package/src/capability/slash-command.ts +39 -0
  61. package/src/capability/ssh.ts +41 -0
  62. package/src/capability/system-prompt.ts +34 -0
  63. package/src/capability/tool.ts +37 -0
  64. package/src/capability/types.ts +156 -0
  65. package/src/cli/args.ts +259 -0
  66. package/src/cli/config-cli.ts +357 -0
  67. package/src/cli/file-processor.ts +124 -0
  68. package/src/cli/grep-cli.ts +152 -0
  69. package/src/cli/jupyter-cli.ts +106 -0
  70. package/src/cli/list-models.ts +103 -0
  71. package/src/cli/plugin-cli.ts +661 -0
  72. package/src/cli/session-picker.ts +42 -0
  73. package/src/cli/setup-cli.ts +376 -0
  74. package/src/cli/shell-cli.ts +174 -0
  75. package/src/cli/ssh-cli.ts +179 -0
  76. package/src/cli/stats-cli.ts +197 -0
  77. package/src/cli/update-cli.ts +286 -0
  78. package/src/cli/web-search-cli.ts +143 -0
  79. package/src/cli.ts +65 -0
  80. package/src/commands/commit.ts +36 -0
  81. package/src/commands/config.ts +51 -0
  82. package/src/commands/grep.ts +41 -0
  83. package/src/commands/jupyter.ts +32 -0
  84. package/src/commands/launch.ts +139 -0
  85. package/src/commands/plugin.ts +70 -0
  86. package/src/commands/setup.ts +42 -0
  87. package/src/commands/shell.ts +29 -0
  88. package/src/commands/ssh.ts +60 -0
  89. package/src/commands/stats.ts +29 -0
  90. package/src/commands/update.ts +21 -0
  91. package/src/commands/web-search.ts +42 -0
  92. package/src/commit/agentic/agent.ts +311 -0
  93. package/src/commit/agentic/fallback.ts +96 -0
  94. package/src/commit/agentic/index.ts +359 -0
  95. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  96. package/src/commit/agentic/prompts/session-user.md +25 -0
  97. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  98. package/src/commit/agentic/prompts/system.md +38 -0
  99. package/src/commit/agentic/state.ts +69 -0
  100. package/src/commit/agentic/tools/analyze-file.ts +118 -0
  101. package/src/commit/agentic/tools/git-file-diff.ts +194 -0
  102. package/src/commit/agentic/tools/git-hunk.ts +50 -0
  103. package/src/commit/agentic/tools/git-overview.ts +84 -0
  104. package/src/commit/agentic/tools/index.ts +56 -0
  105. package/src/commit/agentic/tools/propose-changelog.ts +128 -0
  106. package/src/commit/agentic/tools/propose-commit.ts +154 -0
  107. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  108. package/src/commit/agentic/tools/split-commit.ts +280 -0
  109. package/src/commit/agentic/topo-sort.ts +44 -0
  110. package/src/commit/agentic/trivial.ts +51 -0
  111. package/src/commit/agentic/validation.ts +200 -0
  112. package/src/commit/analysis/conventional.ts +165 -0
  113. package/src/commit/analysis/index.ts +4 -0
  114. package/src/commit/analysis/scope.ts +242 -0
  115. package/src/commit/analysis/summary.ts +112 -0
  116. package/src/commit/analysis/validation.ts +66 -0
  117. package/src/commit/changelog/detect.ts +37 -0
  118. package/src/commit/changelog/generate.ts +110 -0
  119. package/src/commit/changelog/index.ts +234 -0
  120. package/src/commit/changelog/parse.ts +44 -0
  121. package/src/commit/cli.ts +93 -0
  122. package/src/commit/git/diff.ts +148 -0
  123. package/src/commit/git/errors.ts +9 -0
  124. package/src/commit/git/index.ts +211 -0
  125. package/src/commit/git/operations.ts +54 -0
  126. package/src/commit/index.ts +5 -0
  127. package/src/commit/map-reduce/index.ts +64 -0
  128. package/src/commit/map-reduce/map-phase.ts +178 -0
  129. package/src/commit/map-reduce/reduce-phase.ts +145 -0
  130. package/src/commit/map-reduce/utils.ts +9 -0
  131. package/src/commit/message.ts +11 -0
  132. package/src/commit/model-selection.ts +69 -0
  133. package/src/commit/pipeline.ts +243 -0
  134. package/src/commit/prompts/analysis-system.md +148 -0
  135. package/src/commit/prompts/analysis-user.md +38 -0
  136. package/src/commit/prompts/changelog-system.md +50 -0
  137. package/src/commit/prompts/changelog-user.md +18 -0
  138. package/src/commit/prompts/file-observer-system.md +24 -0
  139. package/src/commit/prompts/file-observer-user.md +8 -0
  140. package/src/commit/prompts/reduce-system.md +50 -0
  141. package/src/commit/prompts/reduce-user.md +17 -0
  142. package/src/commit/prompts/summary-retry.md +3 -0
  143. package/src/commit/prompts/summary-system.md +38 -0
  144. package/src/commit/prompts/summary-user.md +13 -0
  145. package/src/commit/prompts/types-description.md +2 -0
  146. package/src/commit/types.ts +109 -0
  147. package/src/commit/utils/exclusions.ts +42 -0
  148. package/src/config/file-lock.ts +121 -0
  149. package/src/config/keybindings.ts +280 -0
  150. package/src/config/model-registry.ts +1140 -0
  151. package/src/config/model-resolver.ts +812 -0
  152. package/src/config/prompt-templates.ts +526 -0
  153. package/src/config/resolve-config-value.ts +92 -0
  154. package/src/config/settings-schema.ts +1236 -0
  155. package/src/config/settings.ts +706 -0
  156. package/src/config.ts +414 -0
  157. package/src/cursor.ts +239 -0
  158. package/src/debug/index.ts +431 -0
  159. package/src/debug/log-formatting.ts +60 -0
  160. package/src/debug/log-viewer.ts +903 -0
  161. package/src/debug/profiler.ts +158 -0
  162. package/src/debug/report-bundle.ts +366 -0
  163. package/src/debug/system-info.ts +112 -0
  164. package/src/discovery/agents-md.ts +68 -0
  165. package/src/discovery/agents.ts +199 -0
  166. package/src/discovery/builtin.ts +815 -0
  167. package/src/discovery/claude-plugins.ts +205 -0
  168. package/src/discovery/claude.ts +506 -0
  169. package/src/discovery/cline.ts +83 -0
  170. package/src/discovery/codex.ts +532 -0
  171. package/src/discovery/cursor.ts +218 -0
  172. package/src/discovery/gemini.ts +395 -0
  173. package/src/discovery/github.ts +117 -0
  174. package/src/discovery/helpers.ts +698 -0
  175. package/src/discovery/index.ts +89 -0
  176. package/src/discovery/mcp-json.ts +156 -0
  177. package/src/discovery/opencode.ts +394 -0
  178. package/src/discovery/ssh.ts +160 -0
  179. package/src/discovery/vscode.ts +103 -0
  180. package/src/discovery/windsurf.ts +145 -0
  181. package/src/exa/company.ts +57 -0
  182. package/src/exa/index.ts +62 -0
  183. package/src/exa/linkedin.ts +57 -0
  184. package/src/exa/mcp-client.ts +289 -0
  185. package/src/exa/render.ts +244 -0
  186. package/src/exa/researcher.ts +89 -0
  187. package/src/exa/search.ts +330 -0
  188. package/src/exa/types.ts +166 -0
  189. package/src/exa/websets.ts +247 -0
  190. package/src/exec/bash-executor.ts +184 -0
  191. package/src/exec/exec.ts +53 -0
  192. package/src/export/custom-share.ts +65 -0
  193. package/src/export/html/index.ts +162 -0
  194. package/src/export/html/template.css +889 -0
  195. package/src/export/html/template.generated.ts +2 -0
  196. package/src/export/html/template.html +45 -0
  197. package/src/export/html/template.js +1329 -0
  198. package/src/export/html/template.macro.ts +24 -0
  199. package/src/export/html/vendor/highlight.min.js +1213 -0
  200. package/src/export/html/vendor/marked.min.js +6 -0
  201. package/src/export/ttsr.ts +434 -0
  202. package/src/extensibility/custom-commands/bundled/review/index.ts +433 -0
  203. package/src/extensibility/custom-commands/index.ts +15 -0
  204. package/src/extensibility/custom-commands/loader.ts +231 -0
  205. package/src/extensibility/custom-commands/types.ts +111 -0
  206. package/src/extensibility/custom-tools/index.ts +22 -0
  207. package/src/extensibility/custom-tools/loader.ts +235 -0
  208. package/src/extensibility/custom-tools/types.ts +226 -0
  209. package/src/extensibility/custom-tools/wrapper.ts +45 -0
  210. package/src/extensibility/extensions/index.ts +136 -0
  211. package/src/extensibility/extensions/loader.ts +520 -0
  212. package/src/extensibility/extensions/runner.ts +774 -0
  213. package/src/extensibility/extensions/types.ts +1293 -0
  214. package/src/extensibility/extensions/wrapper.ts +188 -0
  215. package/src/extensibility/hooks/index.ts +16 -0
  216. package/src/extensibility/hooks/loader.ts +273 -0
  217. package/src/extensibility/hooks/runner.ts +441 -0
  218. package/src/extensibility/hooks/tool-wrapper.ts +106 -0
  219. package/src/extensibility/hooks/types.ts +817 -0
  220. package/src/extensibility/plugins/doctor.ts +65 -0
  221. package/src/extensibility/plugins/git-url.ts +281 -0
  222. package/src/extensibility/plugins/index.ts +33 -0
  223. package/src/extensibility/plugins/installer.ts +192 -0
  224. package/src/extensibility/plugins/loader.ts +338 -0
  225. package/src/extensibility/plugins/manager.ts +716 -0
  226. package/src/extensibility/plugins/parser.ts +105 -0
  227. package/src/extensibility/plugins/types.ts +190 -0
  228. package/src/extensibility/skills.ts +385 -0
  229. package/src/extensibility/slash-commands.ts +287 -0
  230. package/src/extensibility/tool-proxy.ts +25 -0
  231. package/src/index.ts +275 -0
  232. package/src/internal-urls/agent-protocol.ts +136 -0
  233. package/src/internal-urls/artifact-protocol.ts +97 -0
  234. package/src/internal-urls/docs-index.generated.ts +54 -0
  235. package/src/internal-urls/docs-protocol.ts +84 -0
  236. package/src/internal-urls/index.ts +31 -0
  237. package/src/internal-urls/json-query.ts +126 -0
  238. package/src/internal-urls/memory-protocol.ts +133 -0
  239. package/src/internal-urls/router.ts +70 -0
  240. package/src/internal-urls/rule-protocol.ts +55 -0
  241. package/src/internal-urls/skill-protocol.ts +111 -0
  242. package/src/internal-urls/types.ts +52 -0
  243. package/src/ipy/executor.ts +556 -0
  244. package/src/ipy/gateway-coordinator.ts +426 -0
  245. package/src/ipy/kernel.ts +892 -0
  246. package/src/ipy/modules.ts +109 -0
  247. package/src/ipy/prelude.py +831 -0
  248. package/src/ipy/prelude.ts +3 -0
  249. package/src/ipy/runtime.ts +222 -0
  250. package/src/lsp/client.ts +867 -0
  251. package/src/lsp/clients/biome-client.ts +202 -0
  252. package/src/lsp/clients/index.ts +50 -0
  253. package/src/lsp/clients/lsp-linter-client.ts +93 -0
  254. package/src/lsp/clients/swiftlint-client.ts +120 -0
  255. package/src/lsp/config.ts +397 -0
  256. package/src/lsp/defaults.json +464 -0
  257. package/src/lsp/edits.ts +109 -0
  258. package/src/lsp/index.ts +1268 -0
  259. package/src/lsp/lspmux.ts +250 -0
  260. package/src/lsp/render.ts +689 -0
  261. package/src/lsp/types.ts +414 -0
  262. package/src/lsp/utils.ts +549 -0
  263. package/src/main.ts +773 -0
  264. package/src/mcp/client.ts +239 -0
  265. package/src/mcp/config-writer.ts +215 -0
  266. package/src/mcp/config.ts +363 -0
  267. package/src/mcp/index.ts +55 -0
  268. package/src/mcp/json-rpc.ts +84 -0
  269. package/src/mcp/loader.ts +124 -0
  270. package/src/mcp/manager.ts +490 -0
  271. package/src/mcp/oauth-discovery.ts +274 -0
  272. package/src/mcp/oauth-flow.ts +229 -0
  273. package/src/mcp/render.ts +123 -0
  274. package/src/mcp/tool-bridge.ts +372 -0
  275. package/src/mcp/tool-cache.ts +121 -0
  276. package/src/mcp/transports/http.ts +332 -0
  277. package/src/mcp/transports/index.ts +6 -0
  278. package/src/mcp/transports/stdio.ts +281 -0
  279. package/src/mcp/types.ts +248 -0
  280. package/src/memories/index.ts +1099 -0
  281. package/src/memories/storage.ts +563 -0
  282. package/src/modes/components/agent-dashboard.ts +1130 -0
  283. package/src/modes/components/assistant-message.ts +144 -0
  284. package/src/modes/components/bash-execution.ts +218 -0
  285. package/src/modes/components/bordered-loader.ts +41 -0
  286. package/src/modes/components/branch-summary-message.ts +45 -0
  287. package/src/modes/components/codemode-group.ts +369 -0
  288. package/src/modes/components/compaction-summary-message.ts +51 -0
  289. package/src/modes/components/countdown-timer.ts +46 -0
  290. package/src/modes/components/custom-editor.ts +181 -0
  291. package/src/modes/components/custom-message.ts +91 -0
  292. package/src/modes/components/diff.ts +186 -0
  293. package/src/modes/components/dynamic-border.ts +25 -0
  294. package/src/modes/components/extensions/extension-dashboard.ts +325 -0
  295. package/src/modes/components/extensions/extension-list.ts +484 -0
  296. package/src/modes/components/extensions/index.ts +9 -0
  297. package/src/modes/components/extensions/inspector-panel.ts +321 -0
  298. package/src/modes/components/extensions/state-manager.ts +586 -0
  299. package/src/modes/components/extensions/types.ts +191 -0
  300. package/src/modes/components/footer.ts +315 -0
  301. package/src/modes/components/history-search.ts +157 -0
  302. package/src/modes/components/hook-editor.ts +101 -0
  303. package/src/modes/components/hook-input.ts +72 -0
  304. package/src/modes/components/hook-message.ts +100 -0
  305. package/src/modes/components/hook-selector.ts +155 -0
  306. package/src/modes/components/index.ts +41 -0
  307. package/src/modes/components/keybinding-hints.ts +65 -0
  308. package/src/modes/components/login-dialog.ts +164 -0
  309. package/src/modes/components/mcp-add-wizard.ts +1295 -0
  310. package/src/modes/components/model-selector.ts +625 -0
  311. package/src/modes/components/oauth-selector.ts +210 -0
  312. package/src/modes/components/plugin-settings.ts +477 -0
  313. package/src/modes/components/python-execution.ts +196 -0
  314. package/src/modes/components/queue-mode-selector.ts +56 -0
  315. package/src/modes/components/read-tool-group.ts +119 -0
  316. package/src/modes/components/session-selector.ts +242 -0
  317. package/src/modes/components/settings-defs.ts +340 -0
  318. package/src/modes/components/settings-selector.ts +529 -0
  319. package/src/modes/components/show-images-selector.ts +45 -0
  320. package/src/modes/components/skill-message.ts +90 -0
  321. package/src/modes/components/status-line/index.ts +4 -0
  322. package/src/modes/components/status-line/presets.ts +94 -0
  323. package/src/modes/components/status-line/segments.ts +352 -0
  324. package/src/modes/components/status-line/separators.ts +55 -0
  325. package/src/modes/components/status-line/types.ts +75 -0
  326. package/src/modes/components/status-line-segment-editor.ts +354 -0
  327. package/src/modes/components/status-line.ts +421 -0
  328. package/src/modes/components/theme-selector.ts +63 -0
  329. package/src/modes/components/thinking-selector.ts +64 -0
  330. package/src/modes/components/todo-display.ts +115 -0
  331. package/src/modes/components/todo-reminder.ts +40 -0
  332. package/src/modes/components/tool-execution.ts +703 -0
  333. package/src/modes/components/tree-selector.ts +904 -0
  334. package/src/modes/components/ttsr-notification.ts +80 -0
  335. package/src/modes/components/user-message-selector.ts +146 -0
  336. package/src/modes/components/user-message.ts +22 -0
  337. package/src/modes/components/visual-truncate.ts +63 -0
  338. package/src/modes/components/welcome.ts +247 -0
  339. package/src/modes/controllers/command-controller.ts +1120 -0
  340. package/src/modes/controllers/event-controller.ts +479 -0
  341. package/src/modes/controllers/extension-ui-controller.ts +778 -0
  342. package/src/modes/controllers/input-controller.ts +671 -0
  343. package/src/modes/controllers/mcp-command-controller.ts +1315 -0
  344. package/src/modes/controllers/selector-controller.ts +712 -0
  345. package/src/modes/controllers/ssh-command-controller.ts +452 -0
  346. package/src/modes/index.ts +15 -0
  347. package/src/modes/interactive-mode.ts +1027 -0
  348. package/src/modes/print-mode.ts +191 -0
  349. package/src/modes/rpc/rpc-client.ts +583 -0
  350. package/src/modes/rpc/rpc-mode.ts +700 -0
  351. package/src/modes/rpc/rpc-types.ts +236 -0
  352. package/src/modes/theme/dark.json +95 -0
  353. package/src/modes/theme/defaults/alabaster.json +93 -0
  354. package/src/modes/theme/defaults/amethyst.json +96 -0
  355. package/src/modes/theme/defaults/anthracite.json +93 -0
  356. package/src/modes/theme/defaults/basalt.json +91 -0
  357. package/src/modes/theme/defaults/birch.json +95 -0
  358. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  359. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  360. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  361. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  362. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  363. package/src/modes/theme/defaults/dark-copper.json +95 -0
  364. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  365. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  366. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  367. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  368. package/src/modes/theme/defaults/dark-ember.json +95 -0
  369. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  370. package/src/modes/theme/defaults/dark-forest.json +96 -0
  371. package/src/modes/theme/defaults/dark-github.json +105 -0
  372. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  373. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  374. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  375. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  376. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  377. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  378. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  379. package/src/modes/theme/defaults/dark-nord.json +97 -0
  380. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  381. package/src/modes/theme/defaults/dark-one.json +100 -0
  382. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  383. package/src/modes/theme/defaults/dark-reef.json +91 -0
  384. package/src/modes/theme/defaults/dark-retro.json +92 -0
  385. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  386. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  387. package/src/modes/theme/defaults/dark-slate.json +95 -0
  388. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  389. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  390. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  391. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  392. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  393. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  394. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  395. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  396. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  397. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  398. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  399. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  400. package/src/modes/theme/defaults/graphite.json +92 -0
  401. package/src/modes/theme/defaults/index.ts +195 -0
  402. package/src/modes/theme/defaults/light-arctic.json +107 -0
  403. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  404. package/src/modes/theme/defaults/light-canyon.json +91 -0
  405. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  406. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  407. package/src/modes/theme/defaults/light-coral.json +95 -0
  408. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  409. package/src/modes/theme/defaults/light-dawn.json +90 -0
  410. package/src/modes/theme/defaults/light-dunes.json +91 -0
  411. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  412. package/src/modes/theme/defaults/light-forest.json +100 -0
  413. package/src/modes/theme/defaults/light-frost.json +95 -0
  414. package/src/modes/theme/defaults/light-github.json +115 -0
  415. package/src/modes/theme/defaults/light-glacier.json +91 -0
  416. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  417. package/src/modes/theme/defaults/light-haze.json +90 -0
  418. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  419. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  420. package/src/modes/theme/defaults/light-lavender.json +95 -0
  421. package/src/modes/theme/defaults/light-meadow.json +91 -0
  422. package/src/modes/theme/defaults/light-mint.json +95 -0
  423. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  424. package/src/modes/theme/defaults/light-ocean.json +99 -0
  425. package/src/modes/theme/defaults/light-one.json +99 -0
  426. package/src/modes/theme/defaults/light-opal.json +91 -0
  427. package/src/modes/theme/defaults/light-orchard.json +91 -0
  428. package/src/modes/theme/defaults/light-paper.json +95 -0
  429. package/src/modes/theme/defaults/light-prism.json +90 -0
  430. package/src/modes/theme/defaults/light-retro.json +98 -0
  431. package/src/modes/theme/defaults/light-sand.json +95 -0
  432. package/src/modes/theme/defaults/light-savanna.json +91 -0
  433. package/src/modes/theme/defaults/light-solarized.json +102 -0
  434. package/src/modes/theme/defaults/light-soleil.json +90 -0
  435. package/src/modes/theme/defaults/light-sunset.json +99 -0
  436. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  437. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  438. package/src/modes/theme/defaults/light-wetland.json +91 -0
  439. package/src/modes/theme/defaults/light-zenith.json +89 -0
  440. package/src/modes/theme/defaults/limestone.json +94 -0
  441. package/src/modes/theme/defaults/mahogany.json +97 -0
  442. package/src/modes/theme/defaults/marble.json +93 -0
  443. package/src/modes/theme/defaults/obsidian.json +91 -0
  444. package/src/modes/theme/defaults/onyx.json +91 -0
  445. package/src/modes/theme/defaults/pearl.json +93 -0
  446. package/src/modes/theme/defaults/porcelain.json +91 -0
  447. package/src/modes/theme/defaults/quartz.json +96 -0
  448. package/src/modes/theme/defaults/sandstone.json +95 -0
  449. package/src/modes/theme/defaults/titanium.json +90 -0
  450. package/src/modes/theme/light.json +93 -0
  451. package/src/modes/theme/mermaid-cache.ts +111 -0
  452. package/src/modes/theme/theme-schema.json +429 -0
  453. package/src/modes/theme/theme.ts +2333 -0
  454. package/src/modes/types.ts +216 -0
  455. package/src/modes/utils/ui-helpers.ts +529 -0
  456. package/src/patch/applicator.ts +1482 -0
  457. package/src/patch/diff.ts +425 -0
  458. package/src/patch/fuzzy.ts +784 -0
  459. package/src/patch/hashline.ts +972 -0
  460. package/src/patch/index.ts +964 -0
  461. package/src/patch/normalize.ts +397 -0
  462. package/src/patch/normative.ts +72 -0
  463. package/src/patch/parser.ts +532 -0
  464. package/src/patch/shared.ts +400 -0
  465. package/src/patch/types.ts +292 -0
  466. package/src/priority.json +35 -0
  467. package/src/prompts/agents/explore.md +48 -0
  468. package/src/prompts/agents/frontmatter.md +9 -0
  469. package/src/prompts/agents/init.md +36 -0
  470. package/src/prompts/agents/librarian.md +53 -0
  471. package/src/prompts/agents/oracle.md +51 -0
  472. package/src/prompts/agents/reviewer.md +70 -0
  473. package/src/prompts/agents/task.md +14 -0
  474. package/src/prompts/compaction/branch-summary-context.md +5 -0
  475. package/src/prompts/compaction/branch-summary-preamble.md +2 -0
  476. package/src/prompts/compaction/branch-summary.md +30 -0
  477. package/src/prompts/compaction/compaction-short-summary.md +9 -0
  478. package/src/prompts/compaction/compaction-summary-context.md +5 -0
  479. package/src/prompts/compaction/compaction-summary.md +38 -0
  480. package/src/prompts/compaction/compaction-turn-prefix.md +17 -0
  481. package/src/prompts/compaction/compaction-update-summary.md +45 -0
  482. package/src/prompts/memories/consolidation.md +30 -0
  483. package/src/prompts/memories/read_path.md +11 -0
  484. package/src/prompts/memories/stage_one_input.md +6 -0
  485. package/src/prompts/memories/stage_one_system.md +21 -0
  486. package/src/prompts/review-request.md +64 -0
  487. package/src/prompts/system/agent-creation-architect.md +65 -0
  488. package/src/prompts/system/agent-creation-user.md +6 -0
  489. package/src/prompts/system/custom-system-prompt.md +68 -0
  490. package/src/prompts/system/file-operations.md +10 -0
  491. package/src/prompts/system/subagent-submit-reminder.md +11 -0
  492. package/src/prompts/system/subagent-system-prompt.md +31 -0
  493. package/src/prompts/system/subagent-user-prompt.md +8 -0
  494. package/src/prompts/system/summarization-system.md +3 -0
  495. package/src/prompts/system/system-prompt.md +300 -0
  496. package/src/prompts/system/title-system.md +2 -0
  497. package/src/prompts/system/ttsr-interrupt.md +7 -0
  498. package/src/prompts/system/web-search.md +28 -0
  499. package/src/prompts/tools/ask.md +44 -0
  500. package/src/prompts/tools/bash.md +24 -0
  501. package/src/prompts/tools/browser.md +33 -0
  502. package/src/prompts/tools/calculator.md +12 -0
  503. package/src/prompts/tools/explore.md +29 -0
  504. package/src/prompts/tools/fetch.md +16 -0
  505. package/src/prompts/tools/find.md +18 -0
  506. package/src/prompts/tools/gemini-image.md +23 -0
  507. package/src/prompts/tools/grep.md +28 -0
  508. package/src/prompts/tools/hashline.md +232 -0
  509. package/src/prompts/tools/librarian.md +24 -0
  510. package/src/prompts/tools/lsp.md +28 -0
  511. package/src/prompts/tools/oracle.md +26 -0
  512. package/src/prompts/tools/patch.md +74 -0
  513. package/src/prompts/tools/python.md +66 -0
  514. package/src/prompts/tools/read.md +36 -0
  515. package/src/prompts/tools/replace.md +38 -0
  516. package/src/prompts/tools/reviewer.md +41 -0
  517. package/src/prompts/tools/ssh.md +51 -0
  518. package/src/prompts/tools/task-summary.md +28 -0
  519. package/src/prompts/tools/task.md +275 -0
  520. package/src/prompts/tools/todo-write.md +65 -0
  521. package/src/prompts/tools/undo-edit.md +7 -0
  522. package/src/prompts/tools/web-search.md +19 -0
  523. package/src/prompts/tools/write.md +18 -0
  524. package/src/sdk.ts +1287 -0
  525. package/src/secrets/index.ts +116 -0
  526. package/src/secrets/obfuscator.ts +269 -0
  527. package/src/secrets/regex.ts +21 -0
  528. package/src/session/agent-session.ts +4669 -0
  529. package/src/session/agent-storage.ts +621 -0
  530. package/src/session/artifacts.ts +132 -0
  531. package/src/session/auth-storage.ts +1433 -0
  532. package/src/session/blob-store.ts +103 -0
  533. package/src/session/compaction/branch-summarization.ts +315 -0
  534. package/src/session/compaction/compaction.ts +864 -0
  535. package/src/session/compaction/index.ts +7 -0
  536. package/src/session/compaction/pruning.ts +91 -0
  537. package/src/session/compaction/utils.ts +171 -0
  538. package/src/session/history-storage.ts +170 -0
  539. package/src/session/messages.ts +317 -0
  540. package/src/session/session-manager.ts +2276 -0
  541. package/src/session/session-storage.ts +342 -0
  542. package/src/session/streaming-output.ts +565 -0
  543. package/src/slash-commands/builtin-registry.ts +439 -0
  544. package/src/ssh/config-writer.ts +183 -0
  545. package/src/ssh/connection-manager.ts +444 -0
  546. package/src/ssh/ssh-executor.ts +127 -0
  547. package/src/ssh/sshfs-mount.ts +135 -0
  548. package/src/stt/downloader.ts +71 -0
  549. package/src/stt/index.ts +3 -0
  550. package/src/stt/recorder.ts +351 -0
  551. package/src/stt/setup.ts +52 -0
  552. package/src/stt/stt-controller.ts +160 -0
  553. package/src/stt/transcribe.py +70 -0
  554. package/src/stt/transcriber.ts +91 -0
  555. package/src/system-prompt.ts +685 -0
  556. package/src/task/agents.ts +155 -0
  557. package/src/task/batch.ts +102 -0
  558. package/src/task/commands.ts +134 -0
  559. package/src/task/discovery.ts +126 -0
  560. package/src/task/executor.ts +908 -0
  561. package/src/task/index.ts +223 -0
  562. package/src/task/output-manager.ts +107 -0
  563. package/src/task/parallel.ts +84 -0
  564. package/src/task/render.ts +326 -0
  565. package/src/task/subprocess-tool-registry.ts +88 -0
  566. package/src/task/template.ts +32 -0
  567. package/src/task/types.ts +144 -0
  568. package/src/tools/ask.ts +523 -0
  569. package/src/tools/bash-interactive.ts +419 -0
  570. package/src/tools/bash-interceptor.ts +105 -0
  571. package/src/tools/bash-normalize.ts +107 -0
  572. package/src/tools/bash-skill-urls.ts +177 -0
  573. package/src/tools/bash.ts +347 -0
  574. package/src/tools/browser.ts +1374 -0
  575. package/src/tools/calculator.ts +537 -0
  576. package/src/tools/context.ts +39 -0
  577. package/src/tools/explore.ts +23 -0
  578. package/src/tools/fetch.ts +1091 -0
  579. package/src/tools/find.ts +540 -0
  580. package/src/tools/fs-cache-invalidation.ts +28 -0
  581. package/src/tools/gemini-image.ts +907 -0
  582. package/src/tools/grep.ts +489 -0
  583. package/src/tools/index.ts +337 -0
  584. package/src/tools/json-tree.ts +231 -0
  585. package/src/tools/jtd-to-json-schema.ts +247 -0
  586. package/src/tools/jtd-to-typescript.ts +198 -0
  587. package/src/tools/librarian.ts +33 -0
  588. package/src/tools/list-limit.ts +40 -0
  589. package/src/tools/notebook.ts +287 -0
  590. package/src/tools/oracle.ts +40 -0
  591. package/src/tools/output-meta.ts +459 -0
  592. package/src/tools/output-utils.ts +63 -0
  593. package/src/tools/path-utils.ts +116 -0
  594. package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
  595. package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
  596. package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
  597. package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
  598. package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
  599. package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
  600. package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
  601. package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
  602. package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
  603. package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
  604. package/src/tools/puppeteer/10_stealth_plugins.txt +206 -0
  605. package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
  606. package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
  607. package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
  608. package/src/tools/python.ts +1118 -0
  609. package/src/tools/read.ts +1193 -0
  610. package/src/tools/render-utils.ts +680 -0
  611. package/src/tools/renderers.ts +60 -0
  612. package/src/tools/reviewer-tool.ts +41 -0
  613. package/src/tools/ssh.ts +326 -0
  614. package/src/tools/subagent-tool.ts +169 -0
  615. package/src/tools/submit-result.ts +152 -0
  616. package/src/tools/todo-write.ts +255 -0
  617. package/src/tools/tool-errors.ts +92 -0
  618. package/src/tools/tool-result.ts +86 -0
  619. package/src/tools/undo-edit.ts +145 -0
  620. package/src/tools/undo-history.ts +22 -0
  621. package/src/tools/write.ts +274 -0
  622. package/src/tui/code-cell.ts +108 -0
  623. package/src/tui/file-list.ts +47 -0
  624. package/src/tui/index.ts +11 -0
  625. package/src/tui/output-block.ts +144 -0
  626. package/src/tui/status-line.ts +39 -0
  627. package/src/tui/tree-list.ts +53 -0
  628. package/src/tui/types.ts +16 -0
  629. package/src/tui/utils.ts +116 -0
  630. package/src/utils/changelog.ts +98 -0
  631. package/src/utils/event-bus.ts +33 -0
  632. package/src/utils/external-editor.ts +59 -0
  633. package/src/utils/file-display-mode.ts +36 -0
  634. package/src/utils/file-mentions.ts +384 -0
  635. package/src/utils/frontmatter.ts +101 -0
  636. package/src/utils/fuzzy.ts +108 -0
  637. package/src/utils/ignore-files.ts +119 -0
  638. package/src/utils/image-convert.ts +27 -0
  639. package/src/utils/image-resize.ts +236 -0
  640. package/src/utils/mime.ts +30 -0
  641. package/src/utils/open.ts +20 -0
  642. package/src/utils/shell-snapshot.ts +199 -0
  643. package/src/utils/timings.ts +26 -0
  644. package/src/utils/title-generator.ts +167 -0
  645. package/src/utils/tools-manager.ts +362 -0
  646. package/src/web/scrapers/artifacthub.ts +215 -0
  647. package/src/web/scrapers/arxiv.ts +88 -0
  648. package/src/web/scrapers/aur.ts +175 -0
  649. package/src/web/scrapers/biorxiv.ts +141 -0
  650. package/src/web/scrapers/bluesky.ts +284 -0
  651. package/src/web/scrapers/brew.ts +177 -0
  652. package/src/web/scrapers/cheatsh.ts +78 -0
  653. package/src/web/scrapers/chocolatey.ts +158 -0
  654. package/src/web/scrapers/choosealicense.ts +110 -0
  655. package/src/web/scrapers/cisa-kev.ts +100 -0
  656. package/src/web/scrapers/clojars.ts +180 -0
  657. package/src/web/scrapers/coingecko.ts +184 -0
  658. package/src/web/scrapers/crates-io.ts +128 -0
  659. package/src/web/scrapers/crossref.ts +149 -0
  660. package/src/web/scrapers/devto.ts +177 -0
  661. package/src/web/scrapers/discogs.ts +307 -0
  662. package/src/web/scrapers/discourse.ts +221 -0
  663. package/src/web/scrapers/dockerhub.ts +160 -0
  664. package/src/web/scrapers/fdroid.ts +158 -0
  665. package/src/web/scrapers/firefox-addons.ts +214 -0
  666. package/src/web/scrapers/flathub.ts +239 -0
  667. package/src/web/scrapers/github-gist.ts +68 -0
  668. package/src/web/scrapers/github.ts +490 -0
  669. package/src/web/scrapers/gitlab.ts +456 -0
  670. package/src/web/scrapers/go-pkg.ts +275 -0
  671. package/src/web/scrapers/hackage.ts +94 -0
  672. package/src/web/scrapers/hackernews.ts +208 -0
  673. package/src/web/scrapers/hex.ts +121 -0
  674. package/src/web/scrapers/huggingface.ts +385 -0
  675. package/src/web/scrapers/iacr.ts +86 -0
  676. package/src/web/scrapers/index.ts +249 -0
  677. package/src/web/scrapers/jetbrains-marketplace.ts +169 -0
  678. package/src/web/scrapers/lemmy.ts +220 -0
  679. package/src/web/scrapers/lobsters.ts +186 -0
  680. package/src/web/scrapers/mastodon.ts +310 -0
  681. package/src/web/scrapers/maven.ts +152 -0
  682. package/src/web/scrapers/mdn.ts +172 -0
  683. package/src/web/scrapers/metacpan.ts +253 -0
  684. package/src/web/scrapers/musicbrainz.ts +272 -0
  685. package/src/web/scrapers/npm.ts +114 -0
  686. package/src/web/scrapers/nuget.ts +205 -0
  687. package/src/web/scrapers/nvd.ts +243 -0
  688. package/src/web/scrapers/ollama.ts +265 -0
  689. package/src/web/scrapers/open-vsx.ts +119 -0
  690. package/src/web/scrapers/opencorporates.ts +275 -0
  691. package/src/web/scrapers/openlibrary.ts +319 -0
  692. package/src/web/scrapers/orcid.ts +298 -0
  693. package/src/web/scrapers/osv.ts +192 -0
  694. package/src/web/scrapers/packagist.ts +174 -0
  695. package/src/web/scrapers/pub-dev.ts +185 -0
  696. package/src/web/scrapers/pubmed.ts +177 -0
  697. package/src/web/scrapers/pypi.ts +129 -0
  698. package/src/web/scrapers/rawg.ts +124 -0
  699. package/src/web/scrapers/readthedocs.ts +125 -0
  700. package/src/web/scrapers/reddit.ts +104 -0
  701. package/src/web/scrapers/repology.ts +262 -0
  702. package/src/web/scrapers/rfc.ts +209 -0
  703. package/src/web/scrapers/rubygems.ts +117 -0
  704. package/src/web/scrapers/searchcode.ts +217 -0
  705. package/src/web/scrapers/sec-edgar.ts +274 -0
  706. package/src/web/scrapers/semantic-scholar.ts +190 -0
  707. package/src/web/scrapers/snapcraft.ts +200 -0
  708. package/src/web/scrapers/sourcegraph.ts +373 -0
  709. package/src/web/scrapers/spdx.ts +121 -0
  710. package/src/web/scrapers/spotify.ts +217 -0
  711. package/src/web/scrapers/stackoverflow.ts +124 -0
  712. package/src/web/scrapers/terraform.ts +304 -0
  713. package/src/web/scrapers/tldr.ts +51 -0
  714. package/src/web/scrapers/twitter.ts +97 -0
  715. package/src/web/scrapers/types.ts +200 -0
  716. package/src/web/scrapers/utils.ts +142 -0
  717. package/src/web/scrapers/vimeo.ts +152 -0
  718. package/src/web/scrapers/vscode-marketplace.ts +195 -0
  719. package/src/web/scrapers/w3c.ts +163 -0
  720. package/src/web/scrapers/wikidata.ts +357 -0
  721. package/src/web/scrapers/wikipedia.ts +95 -0
  722. package/src/web/scrapers/youtube.ts +312 -0
  723. package/src/web/search/auth.ts +178 -0
  724. package/src/web/search/index.ts +598 -0
  725. package/src/web/search/provider.ts +77 -0
  726. package/src/web/search/providers/anthropic.ts +284 -0
  727. package/src/web/search/providers/base.ts +22 -0
  728. package/src/web/search/providers/brave.ts +165 -0
  729. package/src/web/search/providers/codex.ts +377 -0
  730. package/src/web/search/providers/exa.ts +158 -0
  731. package/src/web/search/providers/gemini.ts +437 -0
  732. package/src/web/search/providers/jina.ts +99 -0
  733. package/src/web/search/providers/kimi.ts +196 -0
  734. package/src/web/search/providers/perplexity.ts +546 -0
  735. package/src/web/search/providers/synthetic.ts +136 -0
  736. package/src/web/search/providers/zai.ts +352 -0
  737. package/src/web/search/render.ts +299 -0
  738. package/src/web/search/types.ts +437 -0
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Exa Websets Tools
3
+ *
4
+ * CRUD operations for websets, items, searches, enrichments, and monitoring.
5
+ */
6
+ import { type TObject, type TProperties, Type } from "@sinclair/typebox";
7
+ import type { CustomTool } from "../extensibility/custom-tools/types";
8
+ import { callWebsetsTool, findApiKey } from "./mcp-client";
9
+ import type { ExaRenderDetails } from "./types";
10
+
11
+ /** Helper to create a websets tool with proper execute signature */
12
+ function createWebsetTool(
13
+ name: string,
14
+ label: string,
15
+ description: string,
16
+ parameters: TObject<TProperties>,
17
+ mcpToolName: string,
18
+ ): CustomTool<any, ExaRenderDetails> {
19
+ return {
20
+ name,
21
+ label,
22
+ description,
23
+ parameters,
24
+ async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
25
+ try {
26
+ const apiKey = await findApiKey();
27
+ if (!apiKey) {
28
+ return {
29
+ content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
30
+ details: { error: "EXA_API_KEY not found", toolName: name },
31
+ };
32
+ }
33
+ const result = await callWebsetsTool(apiKey, mcpToolName, params as Record<string, unknown>);
34
+ return {
35
+ content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }],
36
+ details: { raw: result, toolName: name },
37
+ };
38
+ } catch (error) {
39
+ const message = error instanceof Error ? error.message : String(error);
40
+ return {
41
+ content: [{ type: "text" as const, text: `Error: ${message}` }],
42
+ details: { error: message, toolName: name },
43
+ };
44
+ }
45
+ },
46
+ };
47
+ }
48
+
49
+ // CRUD Operations
50
+ const websetCreateTool = createWebsetTool(
51
+ "webset_create",
52
+ "Create Webset",
53
+ "Create a new webset collection for organizing web content.",
54
+ Type.Object({
55
+ name: Type.String({ description: "Name of the webset" }),
56
+ description: Type.Optional(Type.String({ description: "Optional description" })),
57
+ }),
58
+ "create_webset",
59
+ );
60
+
61
+ const websetListTool = createWebsetTool(
62
+ "webset_list",
63
+ "List Websets",
64
+ "List all websets in your account.",
65
+ Type.Object({}),
66
+ "list_websets",
67
+ );
68
+
69
+ const websetGetTool = createWebsetTool(
70
+ "webset_get",
71
+ "Get Webset",
72
+ "Get details of a specific webset by ID.",
73
+ Type.Object({
74
+ id: Type.String({ description: "Webset ID" }),
75
+ }),
76
+ "get_webset",
77
+ );
78
+
79
+ const websetUpdateTool = createWebsetTool(
80
+ "webset_update",
81
+ "Update Webset",
82
+ "Update a webset's name or description.",
83
+ Type.Object({
84
+ id: Type.String({ description: "Webset ID" }),
85
+ name: Type.Optional(Type.String({ description: "New name" })),
86
+ description: Type.Optional(Type.String({ description: "New description" })),
87
+ }),
88
+ "update_webset",
89
+ );
90
+
91
+ const websetDeleteTool = createWebsetTool(
92
+ "webset_delete",
93
+ "Delete Webset",
94
+ "Delete a webset and all its contents.",
95
+ Type.Object({
96
+ id: Type.String({ description: "Webset ID" }),
97
+ }),
98
+ "delete_webset",
99
+ );
100
+
101
+ // Item Management
102
+ const websetItemsListTool = createWebsetTool(
103
+ "webset_items_list",
104
+ "List Webset Items",
105
+ "List items in a webset with optional pagination.",
106
+ Type.Object({
107
+ webset_id: Type.String({ description: "Webset ID" }),
108
+ limit: Type.Optional(Type.Number({ description: "Number of items to return" })),
109
+ offset: Type.Optional(Type.Number({ description: "Pagination offset" })),
110
+ }),
111
+ "list_webset_items",
112
+ );
113
+
114
+ const websetItemGetTool = createWebsetTool(
115
+ "webset_item_get",
116
+ "Get Webset Item",
117
+ "Get a specific item from a webset.",
118
+ Type.Object({
119
+ webset_id: Type.String({ description: "Webset ID" }),
120
+ item_id: Type.String({ description: "Item ID" }),
121
+ }),
122
+ "get_item",
123
+ );
124
+
125
+ // Search Operations
126
+ const websetSearchCreateTool = createWebsetTool(
127
+ "webset_search_create",
128
+ "Create Webset Search",
129
+ "Create a new search within a webset.",
130
+ Type.Object({
131
+ webset_id: Type.String({ description: "Webset ID" }),
132
+ query: Type.String({ description: "Search query" }),
133
+ }),
134
+ "create_search",
135
+ );
136
+
137
+ const websetSearchGetTool = createWebsetTool(
138
+ "webset_search_get",
139
+ "Get Webset Search",
140
+ "Get the status and results of a webset search.",
141
+ Type.Object({
142
+ webset_id: Type.String({ description: "Webset ID" }),
143
+ search_id: Type.String({ description: "Search ID" }),
144
+ }),
145
+ "get_search",
146
+ );
147
+
148
+ const websetSearchCancelTool = createWebsetTool(
149
+ "webset_search_cancel",
150
+ "Cancel Webset Search",
151
+ "Cancel a running webset search.",
152
+ Type.Object({
153
+ webset_id: Type.String({ description: "Webset ID" }),
154
+ search_id: Type.String({ description: "Search ID" }),
155
+ }),
156
+ "cancel_search",
157
+ );
158
+
159
+ // Enrichment Operations
160
+ const websetEnrichmentCreateTool = createWebsetTool(
161
+ "webset_enrichment_create",
162
+ "Create Enrichment",
163
+ "Create a new enrichment task for a webset.",
164
+ Type.Object({
165
+ webset_id: Type.String({ description: "Webset ID" }),
166
+ name: Type.String({ description: "Enrichment name" }),
167
+ prompt: Type.String({ description: "Enrichment prompt" }),
168
+ }),
169
+ "create_enrichment",
170
+ );
171
+
172
+ const websetEnrichmentGetTool = createWebsetTool(
173
+ "webset_enrichment_get",
174
+ "Get Enrichment",
175
+ "Get the status and results of an enrichment task.",
176
+ Type.Object({
177
+ webset_id: Type.String({ description: "Webset ID" }),
178
+ enrichment_id: Type.String({ description: "Enrichment ID" }),
179
+ }),
180
+ "get_enrichment",
181
+ );
182
+
183
+ const websetEnrichmentUpdateTool = createWebsetTool(
184
+ "webset_enrichment_update",
185
+ "Update Enrichment",
186
+ "Update an enrichment's name or prompt.",
187
+ Type.Object({
188
+ webset_id: Type.String({ description: "Webset ID" }),
189
+ enrichment_id: Type.String({ description: "Enrichment ID" }),
190
+ name: Type.Optional(Type.String({ description: "New name" })),
191
+ prompt: Type.Optional(Type.String({ description: "New prompt" })),
192
+ }),
193
+ "update_enrichment",
194
+ );
195
+
196
+ const websetEnrichmentDeleteTool = createWebsetTool(
197
+ "webset_enrichment_delete",
198
+ "Delete Enrichment",
199
+ "Delete an enrichment task.",
200
+ Type.Object({
201
+ webset_id: Type.String({ description: "Webset ID" }),
202
+ enrichment_id: Type.String({ description: "Enrichment ID" }),
203
+ }),
204
+ "delete_enrichment",
205
+ );
206
+
207
+ const websetEnrichmentCancelTool = createWebsetTool(
208
+ "webset_enrichment_cancel",
209
+ "Cancel Enrichment",
210
+ "Cancel a running enrichment task.",
211
+ Type.Object({
212
+ webset_id: Type.String({ description: "Webset ID" }),
213
+ enrichment_id: Type.String({ description: "Enrichment ID" }),
214
+ }),
215
+ "cancel_enrichment",
216
+ );
217
+
218
+ // Monitoring
219
+ const websetMonitorCreateTool = createWebsetTool(
220
+ "webset_monitor_create",
221
+ "Create Monitor",
222
+ "Create a monitoring task for a webset with optional webhook notifications.",
223
+ Type.Object({
224
+ webset_id: Type.String({ description: "Webset ID" }),
225
+ webhook_url: Type.Optional(Type.String({ description: "Webhook URL for notifications" })),
226
+ }),
227
+ "create_monitor",
228
+ );
229
+
230
+ export const websetsTools: CustomTool<any, ExaRenderDetails>[] = [
231
+ websetCreateTool,
232
+ websetListTool,
233
+ websetGetTool,
234
+ websetUpdateTool,
235
+ websetDeleteTool,
236
+ websetItemsListTool,
237
+ websetItemGetTool,
238
+ websetSearchCreateTool,
239
+ websetSearchGetTool,
240
+ websetSearchCancelTool,
241
+ websetEnrichmentCreateTool,
242
+ websetEnrichmentGetTool,
243
+ websetEnrichmentUpdateTool,
244
+ websetEnrichmentDeleteTool,
245
+ websetEnrichmentCancelTool,
246
+ websetMonitorCreateTool,
247
+ ];
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Bash command execution with streaming support and cancellation.
3
+ *
4
+ * Uses brush-core via native bindings for shell execution.
5
+ */
6
+ import { Shell } from "@nghyane/arcane-natives";
7
+ import { Settings } from "../config/settings";
8
+ import { OutputSink } from "../session/streaming-output";
9
+ import { getOrCreateSnapshot } from "../utils/shell-snapshot";
10
+
11
+ export interface BashExecutorOptions {
12
+ cwd?: string;
13
+ timeout?: number;
14
+ onChunk?: (chunk: string) => void;
15
+ signal?: AbortSignal;
16
+ /** Session key suffix to isolate shell sessions per agent */
17
+ sessionKey?: string;
18
+ /** Additional environment variables to inject */
19
+ env?: Record<string, string>;
20
+ /** Artifact path/id for full output storage */
21
+ artifactPath?: string;
22
+ artifactId?: string;
23
+ }
24
+
25
+ export interface BashResult {
26
+ output: string;
27
+ exitCode: number | undefined;
28
+ cancelled: boolean;
29
+ truncated: boolean;
30
+ totalLines: number;
31
+ totalBytes: number;
32
+ outputLines: number;
33
+ outputBytes: number;
34
+ artifactId?: string;
35
+ }
36
+
37
+ const HARD_TIMEOUT_GRACE_MS = 5_000;
38
+
39
+ const shellSessions = new Map<string, Shell>();
40
+
41
+ export async function executeBash(command: string, options?: BashExecutorOptions): Promise<BashResult> {
42
+ const settings = await Settings.init();
43
+ const { shell, env: shellEnv, prefix } = settings.getShellConfig();
44
+ const snapshotPath = shell.includes("bash") ? await getOrCreateSnapshot(shell, shellEnv) : null;
45
+
46
+ // Apply command prefix if configured
47
+ const prefixedCommand = prefix ? `${prefix} ${command}` : command;
48
+ const finalCommand = prefixedCommand;
49
+
50
+ // Create output sink for truncation and artifact handling
51
+ const sink = new OutputSink({
52
+ onChunk: options?.onChunk,
53
+ artifactPath: options?.artifactPath,
54
+ artifactId: options?.artifactId,
55
+ });
56
+
57
+ let pendingChunks = Promise.resolve();
58
+ const enqueueChunk = (chunk: string) => {
59
+ pendingChunks = pendingChunks.then(() => sink.push(chunk)).catch(() => {});
60
+ };
61
+
62
+ if (options?.signal?.aborted) {
63
+ return {
64
+ exitCode: undefined,
65
+ cancelled: true,
66
+ ...(await sink.dump("Command cancelled")),
67
+ };
68
+ }
69
+
70
+ const sessionKey = buildSessionKey(shell, prefix, snapshotPath, shellEnv, options?.sessionKey);
71
+ let shellSession = shellSessions.get(sessionKey);
72
+ if (!shellSession) {
73
+ shellSession = new Shell({ sessionEnv: shellEnv, snapshotPath: snapshotPath ?? undefined });
74
+ shellSessions.set(sessionKey, shellSession);
75
+ }
76
+ const signal = options?.signal;
77
+ const abortHandler = () => {
78
+ shellSession.abort(signal?.reason instanceof Error ? signal.reason.message : undefined);
79
+ };
80
+ if (signal) {
81
+ signal.addEventListener("abort", abortHandler, { once: true });
82
+ }
83
+
84
+ let hardTimeoutTimer: NodeJS.Timeout | undefined;
85
+ const hardTimeoutDeferred = Promise.withResolvers<"hard-timeout">();
86
+ const baseTimeoutMs = Math.max(1_000, options?.timeout ?? 300_000);
87
+ const hardTimeoutMs = baseTimeoutMs + HARD_TIMEOUT_GRACE_MS;
88
+ hardTimeoutTimer = setTimeout(() => {
89
+ shellSession.abort(`Hard timeout after ${Math.round(hardTimeoutMs / 1000)}s`);
90
+ hardTimeoutDeferred.resolve("hard-timeout");
91
+ }, hardTimeoutMs);
92
+
93
+ let resetSession = false;
94
+
95
+ try {
96
+ const runPromise = shellSession.run(
97
+ {
98
+ command: finalCommand,
99
+ cwd: options?.cwd,
100
+ env: options?.env,
101
+ timeoutMs: options?.timeout,
102
+ signal,
103
+ },
104
+ (err, chunk) => {
105
+ if (!err) {
106
+ enqueueChunk(chunk);
107
+ }
108
+ },
109
+ );
110
+
111
+ const winner = await Promise.race([
112
+ runPromise.then(result => ({ kind: "result" as const, result })),
113
+ hardTimeoutDeferred.promise.then(() => ({ kind: "hard-timeout" as const })),
114
+ ]);
115
+
116
+ await pendingChunks;
117
+
118
+ if (winner.kind === "hard-timeout") {
119
+ resetSession = true;
120
+ return {
121
+ exitCode: undefined,
122
+ cancelled: true,
123
+ ...(await sink.dump(`Command exceeded hard timeout after ${Math.round(hardTimeoutMs / 1000)} seconds`)),
124
+ };
125
+ }
126
+
127
+ // Handle timeout
128
+ if (winner.result.timedOut) {
129
+ const annotation = options?.timeout
130
+ ? `Command timed out after ${Math.round(options.timeout / 1000)} seconds`
131
+ : "Command timed out";
132
+ resetSession = true;
133
+ return {
134
+ exitCode: undefined,
135
+ cancelled: true,
136
+ ...(await sink.dump(annotation)),
137
+ };
138
+ }
139
+
140
+ // Handle cancellation
141
+ if (winner.result.cancelled) {
142
+ resetSession = true;
143
+ return {
144
+ exitCode: undefined,
145
+ cancelled: true,
146
+ ...(await sink.dump("Command cancelled")),
147
+ };
148
+ }
149
+
150
+ // Normal completion
151
+ return {
152
+ exitCode: winner.result.exitCode,
153
+ cancelled: false,
154
+ ...(await sink.dump()),
155
+ };
156
+ } catch (err) {
157
+ resetSession = true;
158
+ throw err;
159
+ } finally {
160
+ if (hardTimeoutTimer) {
161
+ clearTimeout(hardTimeoutTimer);
162
+ }
163
+ if (signal) {
164
+ signal.removeEventListener("abort", abortHandler);
165
+ }
166
+ await pendingChunks;
167
+ if (resetSession) {
168
+ shellSessions.delete(sessionKey);
169
+ }
170
+ }
171
+ }
172
+
173
+ function buildSessionKey(
174
+ shell: string,
175
+ prefix: string | undefined,
176
+ snapshotPath: string | null,
177
+ env: Record<string, string>,
178
+ agentSessionKey?: string,
179
+ ): string {
180
+ const entries = Object.entries(env);
181
+ entries.sort(([a], [b]) => a.localeCompare(b));
182
+ const envSerialized = entries.map(([key, value]) => `${key}=${value}`).join("\n");
183
+ return [agentSessionKey ?? "", shell, prefix ?? "", snapshotPath ?? "", envSerialized].join("\n");
184
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Shared command execution utilities for hooks and custom tools.
3
+ */
4
+ import { ptree } from "@nghyane/arcane-utils";
5
+
6
+ /**
7
+ * Options for executing shell commands.
8
+ */
9
+ export interface ExecOptions {
10
+ /** AbortSignal to cancel the command */
11
+ signal?: AbortSignal;
12
+ /** Timeout in milliseconds */
13
+ timeout?: number;
14
+ /** Working directory */
15
+ cwd?: string;
16
+ }
17
+
18
+ /**
19
+ * Result of executing a shell command.
20
+ */
21
+ export interface ExecResult {
22
+ stdout: string;
23
+ stderr: string;
24
+ code: number;
25
+ killed: boolean;
26
+ }
27
+
28
+ /**
29
+ * Execute a shell command and return stdout/stderr/code.
30
+ * Supports timeout and abort signal.
31
+ */
32
+ export async function execCommand(
33
+ command: string,
34
+ args: string[],
35
+ cwd: string,
36
+ options?: ExecOptions,
37
+ ): Promise<ExecResult> {
38
+ const result = await ptree.exec([command, ...args], {
39
+ cwd,
40
+ signal: options?.signal,
41
+ timeout: options?.timeout,
42
+ allowNonZero: true,
43
+ allowAbort: true,
44
+ stderr: "full",
45
+ });
46
+
47
+ return {
48
+ stdout: result.stdout,
49
+ stderr: result.stderr,
50
+ code: result.exitCode ?? 0,
51
+ killed: Boolean(result.exitError?.aborted),
52
+ };
53
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Custom share script loader.
3
+ *
4
+ * Allows users to define a custom share handler at ~/.arcane/agent/share.ts
5
+ * that will be used instead of the default GitHub Gist sharing.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import { getAgentDir } from "@nghyane/arcane-utils/dirs";
10
+
11
+ export interface CustomShareResult {
12
+ /** URL to display/open (optional - script may handle everything itself) */
13
+ url?: string;
14
+ /** Additional message to show the user */
15
+ message?: string;
16
+ }
17
+
18
+ export type CustomShareFn = (htmlPath: string) => Promise<CustomShareResult | string | undefined>;
19
+
20
+ interface LoadedCustomShare {
21
+ path: string;
22
+ fn: CustomShareFn;
23
+ }
24
+
25
+ const SHARE_SCRIPT_CANDIDATES = ["share.ts", "share.js", "share.mjs"];
26
+
27
+ /**
28
+ * Get the path to the custom share script if it exists.
29
+ */
30
+ export function getCustomSharePath(): string | null {
31
+ const agentDir = getAgentDir();
32
+
33
+ for (const candidate of SHARE_SCRIPT_CANDIDATES) {
34
+ const scriptPath = path.join(agentDir, candidate);
35
+ if (fs.existsSync(scriptPath)) {
36
+ return scriptPath;
37
+ }
38
+ }
39
+
40
+ return null;
41
+ }
42
+
43
+ /**
44
+ * Load the custom share script if it exists.
45
+ */
46
+ export async function loadCustomShare(): Promise<LoadedCustomShare | null> {
47
+ const scriptPath = getCustomSharePath();
48
+ if (!scriptPath) {
49
+ return null;
50
+ }
51
+
52
+ try {
53
+ const module = await import(scriptPath);
54
+ const fn = module.default;
55
+
56
+ if (typeof fn !== "function") {
57
+ throw new Error("share script must export a default function");
58
+ }
59
+
60
+ return { path: scriptPath, fn };
61
+ } catch (err) {
62
+ const message = err instanceof Error ? err.message : String(err);
63
+ throw new Error(`Failed to load share script: ${message}`);
64
+ }
65
+ }
@@ -0,0 +1,162 @@
1
+ import * as path from "node:path";
2
+ import type { AgentState } from "@nghyane/arcane-agent";
3
+ import { isEnoent } from "@nghyane/arcane-utils";
4
+ import { APP_NAME } from "@nghyane/arcane-utils/dirs";
5
+ import { getResolvedThemeColors, getThemeExportColors } from "../../modes/theme/theme";
6
+ import { type SessionEntry, type SessionHeader, SessionManager } from "../../session/session-manager";
7
+ // Pre-generated template (created by scripts/generate-template.ts at publish time)
8
+ import { TEMPLATE } from "./template.generated";
9
+
10
+ export interface ExportOptions {
11
+ outputPath?: string;
12
+ themeName?: string;
13
+ }
14
+
15
+ /** Parse a color string to RGB values. */
16
+ function parseColor(color: string): { r: number; g: number; b: number } | undefined {
17
+ const hexMatch = color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);
18
+ if (hexMatch) {
19
+ return {
20
+ r: Number.parseInt(hexMatch[1], 16),
21
+ g: Number.parseInt(hexMatch[2], 16),
22
+ b: Number.parseInt(hexMatch[3], 16),
23
+ };
24
+ }
25
+ const rgbMatch = color.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);
26
+ if (rgbMatch) {
27
+ return {
28
+ r: Number.parseInt(rgbMatch[1], 10),
29
+ g: Number.parseInt(rgbMatch[2], 10),
30
+ b: Number.parseInt(rgbMatch[3], 10),
31
+ };
32
+ }
33
+ return undefined;
34
+ }
35
+
36
+ /** Calculate relative luminance of a color (0-1, higher = lighter). */
37
+ function getLuminance(r: number, g: number, b: number): number {
38
+ const toLinear = (c: number) => {
39
+ const s = c / 255;
40
+ return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
41
+ };
42
+ return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
43
+ }
44
+
45
+ /** Adjust color brightness. */
46
+ function adjustBrightness(color: string, factor: number): string {
47
+ const parsed = parseColor(color);
48
+ if (!parsed) return color;
49
+ const adjust = (c: number) => Math.min(255, Math.max(0, Math.round(c * factor)));
50
+ return `rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`;
51
+ }
52
+
53
+ /** Derive export background colors from a base color. */
54
+ function deriveExportColors(baseColor: string): { pageBg: string; cardBg: string; infoBg: string } {
55
+ const parsed = parseColor(baseColor);
56
+ if (!parsed) {
57
+ return { pageBg: "rgb(24, 24, 30)", cardBg: "rgb(30, 30, 36)", infoBg: "rgb(60, 55, 40)" };
58
+ }
59
+
60
+ const luminance = getLuminance(parsed.r, parsed.g, parsed.b);
61
+ if (luminance > 0.5) {
62
+ return {
63
+ pageBg: adjustBrightness(baseColor, 0.96),
64
+ cardBg: baseColor,
65
+ infoBg: `rgb(${Math.min(255, parsed.r + 10)}, ${Math.min(255, parsed.g + 5)}, ${Math.max(0, parsed.b - 20)})`,
66
+ };
67
+ }
68
+ return {
69
+ pageBg: adjustBrightness(baseColor, 0.7),
70
+ cardBg: adjustBrightness(baseColor, 0.85),
71
+ infoBg: `rgb(${Math.min(255, parsed.r + 20)}, ${Math.min(255, parsed.g + 15)}, ${parsed.b})`,
72
+ };
73
+ }
74
+
75
+ /** Generate CSS custom properties for theme. */
76
+ async function generateThemeVars(themeName?: string): Promise<string> {
77
+ const colors = await getResolvedThemeColors(themeName);
78
+ const lines: string[] = [];
79
+ for (const [key, value] of Object.entries(colors)) {
80
+ lines.push(`--${key}: ${value};`);
81
+ }
82
+
83
+ const themeExport = await getThemeExportColors(themeName);
84
+ const userMessageBg = colors.userMessageBg || "#343541";
85
+ const derived = deriveExportColors(userMessageBg);
86
+
87
+ lines.push(`--body-bg: ${themeExport.pageBg ?? derived.pageBg};`);
88
+ lines.push(`--container-bg: ${themeExport.cardBg ?? derived.cardBg};`);
89
+ lines.push(`--info-bg: ${themeExport.infoBg ?? derived.infoBg};`);
90
+
91
+ return lines.join(" ");
92
+ }
93
+
94
+ interface SessionData {
95
+ header: SessionHeader | null;
96
+ entries: SessionEntry[];
97
+ leafId: string | null;
98
+ systemPrompt?: string;
99
+ tools?: { name: string; description: string }[];
100
+ }
101
+
102
+ /** Generate HTML from bundled template with runtime substitutions. */
103
+ async function generateHtml(sessionData: SessionData, themeName?: string): Promise<string> {
104
+ const themeVars = await generateThemeVars(themeName);
105
+ const sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toBase64();
106
+
107
+ return TEMPLATE.replace("<theme-vars/>", `<style>:root { ${themeVars} }</style>`).replace(
108
+ "{{SESSION_DATA}}",
109
+ sessionDataBase64,
110
+ );
111
+ }
112
+
113
+ /** Export session to HTML using SessionManager and AgentState. */
114
+ export async function exportSessionToHtml(
115
+ sm: SessionManager,
116
+ state?: AgentState,
117
+ options?: ExportOptions | string,
118
+ ): Promise<string> {
119
+ const opts: ExportOptions = typeof options === "string" ? { outputPath: options } : options || {};
120
+
121
+ const sessionFile = sm.getSessionFile();
122
+ if (!sessionFile) throw new Error("Cannot export in-memory session to HTML");
123
+
124
+ const sessionData: SessionData = {
125
+ header: sm.getHeader(),
126
+ entries: sm.getEntries(),
127
+ leafId: sm.getLeafId(),
128
+ systemPrompt: state?.systemPrompt,
129
+ tools: state?.tools?.map(t => ({ name: t.name, description: t.description })),
130
+ };
131
+
132
+ const html = await generateHtml(sessionData, opts.themeName);
133
+ const outputPath = opts.outputPath || `${APP_NAME}-session-${path.basename(sessionFile, ".jsonl")}.html`;
134
+
135
+ await Bun.write(outputPath, html);
136
+ return outputPath;
137
+ }
138
+
139
+ /** Export session file to HTML (standalone). */
140
+ export async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {
141
+ const opts: ExportOptions = typeof options === "string" ? { outputPath: options } : options || {};
142
+
143
+ let sm: SessionManager;
144
+ try {
145
+ sm = await SessionManager.open(inputPath);
146
+ } catch (err) {
147
+ if (isEnoent(err)) throw new Error(`File not found: ${inputPath}`);
148
+ throw err;
149
+ }
150
+
151
+ const sessionData: SessionData = {
152
+ header: sm.getHeader(),
153
+ entries: sm.getEntries(),
154
+ leafId: sm.getLeafId(),
155
+ };
156
+
157
+ const html = await generateHtml(sessionData, opts.themeName);
158
+ const outputPath = opts.outputPath || `${APP_NAME}-session-${path.basename(inputPath, ".jsonl")}.html`;
159
+
160
+ await Bun.write(outputPath, html);
161
+ return outputPath;
162
+ }