@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,1293 @@
1
+ /**
2
+ * Extension system types.
3
+ *
4
+ * Extensions are TypeScript modules that can:
5
+ * - Subscribe to agent lifecycle events
6
+ * - Register LLM-callable tools
7
+ * - Register commands, keyboard shortcuts, and CLI flags
8
+ * - Interact with the user via UI primitives
9
+ */
10
+
11
+ import type * as piCodingAgent from "@nghyane/arcane";
12
+ import type { AgentMessage, AgentToolResult, AgentToolUpdateCallback, ThinkingLevel } from "@nghyane/arcane-agent";
13
+ import type {
14
+ Api,
15
+ AssistantMessageEvent,
16
+ AssistantMessageEventStream,
17
+ Context,
18
+ ImageContent,
19
+ Model,
20
+ OAuthCredentials,
21
+ OAuthLoginCallbacks,
22
+ SimpleStreamOptions,
23
+ TextContent,
24
+ ToolResultMessage,
25
+ } from "@nghyane/arcane-ai";
26
+ import type { AutocompleteItem, Component, EditorComponent, EditorTheme, KeyId, TUI } from "@nghyane/arcane-tui";
27
+ import type { Static, TSchema } from "@sinclair/typebox";
28
+ import type { Rule } from "../../capability/rule";
29
+ import type { KeybindingsManager } from "../../config/keybindings";
30
+ import type { ModelRegistry } from "../../config/model-registry";
31
+ import type { BashResult } from "../../exec/bash-executor";
32
+ import type { ExecOptions, ExecResult } from "../../exec/exec";
33
+ import type { PythonResult } from "../../ipy/executor";
34
+ import type { Theme } from "../../modes/theme/theme";
35
+ import type { EditToolDetails } from "../../patch";
36
+ import type { CompactionPreparation, CompactionResult } from "../../session/compaction";
37
+ import type { CustomMessage } from "../../session/messages";
38
+ import type {
39
+ BranchSummaryEntry,
40
+ CompactionEntry,
41
+ ReadonlySessionManager,
42
+ SessionEntry,
43
+ SessionManager,
44
+ } from "../../session/session-manager";
45
+ import type {
46
+ BashToolDetails,
47
+ BashToolInput,
48
+ FindToolDetails,
49
+ FindToolInput,
50
+ GrepToolDetails,
51
+ GrepToolInput,
52
+ ReadToolDetails,
53
+ ReadToolInput,
54
+ WriteToolInput,
55
+ } from "../../tools";
56
+ import type { TodoItem } from "../../tools/todo-write";
57
+ import type { EventBus } from "../../utils/event-bus";
58
+ import type { SlashCommandInfo } from "../slash-commands";
59
+
60
+ export type { AppAction, KeybindingsManager } from "../../config/keybindings";
61
+ export type { ExecOptions, ExecResult } from "../../exec/exec";
62
+ export type { AgentToolResult, AgentToolUpdateCallback };
63
+
64
+ // ============================================================================
65
+ // UI Context
66
+ // ============================================================================
67
+
68
+ /**
69
+ * UI dialog options for extensions.
70
+ */
71
+ export interface ExtensionUIDialogOptions {
72
+ signal?: AbortSignal;
73
+ timeout?: number;
74
+ /** Initial cursor position for select dialogs (0-indexed) */
75
+ initialIndex?: number;
76
+ /** Render an outlined list for select dialogs */
77
+ outline?: boolean;
78
+ }
79
+
80
+ /** Raw terminal input listener for extensions. */
81
+ export type TerminalInputHandler = (data: string) => { consume?: boolean; data?: string } | undefined;
82
+
83
+ /**
84
+ * UI context for extensions to request interactive UI.
85
+ * Each mode (interactive, RPC, print) provides its own implementation.
86
+ */
87
+ export interface ExtensionUIContext {
88
+ /** Show a selector and return the user's choice. */
89
+ select(title: string, options: string[], dialogOptions?: ExtensionUIDialogOptions): Promise<string | undefined>;
90
+
91
+ /** Show a confirmation dialog. */
92
+ confirm(title: string, message: string, dialogOptions?: ExtensionUIDialogOptions): Promise<boolean>;
93
+
94
+ /** Show a text input dialog. */
95
+ input(title: string, placeholder?: string, dialogOptions?: ExtensionUIDialogOptions): Promise<string | undefined>;
96
+
97
+ /** Show a notification to the user. */
98
+ notify(message: string, type?: "info" | "warning" | "error"): void;
99
+
100
+ /** Listen to raw terminal input (interactive mode only). Returns an unsubscribe function. */
101
+ onTerminalInput(handler: TerminalInputHandler): () => void;
102
+
103
+ /** Set status text in the footer/status bar. Pass undefined to clear. */
104
+ setStatus(key: string, text: string | undefined): void;
105
+
106
+ /** Set the working/loading message shown during streaming. Call with no argument to restore default. */
107
+ setWorkingMessage(message?: string): void;
108
+
109
+ /** Set a widget to display above the editor. Accepts string array or component factory. */
110
+ setWidget(key: string, content: string[] | undefined): void;
111
+ setWidget(key: string, content: ((tui: TUI, theme: Theme) => Component & { dispose?(): void }) | undefined): void;
112
+
113
+ /** Set a custom footer component, or undefined to restore the built-in footer. */
114
+ setFooter(factory: ((tui: TUI, theme: Theme) => Component & { dispose?(): void }) | undefined): void;
115
+
116
+ /** Set a custom header component, or undefined to restore the built-in header. */
117
+ setHeader(factory: ((tui: TUI, theme: Theme) => Component & { dispose?(): void }) | undefined): void;
118
+
119
+ /** Set the terminal window/tab title. */
120
+ setTitle(title: string): void;
121
+
122
+ /** Show a custom component with keyboard focus. */
123
+ custom<T>(
124
+ factory: (
125
+ tui: TUI,
126
+ theme: Theme,
127
+ keybindings: KeybindingsManager,
128
+ done: (result: T) => void,
129
+ ) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>,
130
+ options?: { overlay?: boolean },
131
+ ): Promise<T>;
132
+
133
+ /** Set the text in the core input editor. */
134
+ setEditorText(text: string): void;
135
+
136
+ /**
137
+ * Paste text into the core input editor.
138
+ *
139
+ * Interactive mode should route through the editor's paste handling (e.g. large paste markers).
140
+ * Non-interactive modes may fall back to replacing the editor text.
141
+ */
142
+ pasteToEditor(text: string): void;
143
+
144
+ /** Get the current text from the core input editor. */
145
+ getEditorText(): string;
146
+
147
+ /** Show a multi-line editor for text editing. */
148
+ editor(title: string, prefill?: string): Promise<string | undefined>;
149
+
150
+ /** Set a custom editor component via factory function, or undefined to restore the default editor. */
151
+ setEditorComponent(
152
+ factory: ((tui: TUI, theme: EditorTheme, keybindings: KeybindingsManager) => EditorComponent) | undefined,
153
+ ): void;
154
+
155
+ /** Get the current theme for styling. */
156
+ readonly theme: Theme;
157
+
158
+ /** Get all available themes with names and paths. */
159
+ getAllThemes(): Promise<{ name: string; path: string | undefined }[]>;
160
+
161
+ /** Load a theme by name without switching to it. */
162
+ getTheme(name: string): Promise<Theme | undefined>;
163
+
164
+ /** Set the current theme by name or Theme object. */
165
+ setTheme(theme: string | Theme): Promise<{ success: boolean; error?: string }>;
166
+
167
+ /** Get current tool output expansion state. */
168
+ getToolsExpanded(): boolean;
169
+
170
+ /** Set tool output expansion state. */
171
+ setToolsExpanded(expanded: boolean): void;
172
+ }
173
+
174
+ // ============================================================================
175
+ // Extension Context
176
+ // ============================================================================
177
+
178
+ export interface ContextUsage {
179
+ /** Estimated context tokens, or null if unknown (e.g. right after compaction, before next LLM response). */
180
+ tokens: number | null;
181
+ contextWindow: number;
182
+ /** Context usage as percentage of context window, or null if tokens is unknown. */
183
+ percent: number | null;
184
+ }
185
+
186
+ export interface CompactOptions {
187
+ onComplete?: (result: CompactionResult) => void;
188
+ onError?: (error: Error) => void;
189
+ }
190
+
191
+ /**
192
+ * Context passed to extension event handlers.
193
+ */
194
+ export interface ExtensionContext {
195
+ /** UI methods for user interaction */
196
+ ui: ExtensionUIContext;
197
+ /** Get current context usage for the active model. */
198
+ getContextUsage(): ContextUsage | undefined;
199
+ /** Compact the session context (interactive mode shows UI). */
200
+ compact(instructionsOrOptions?: string | CompactOptions): Promise<void>;
201
+ /** Whether UI is available (false in print/RPC mode) */
202
+ hasUI: boolean;
203
+ /** Current working directory */
204
+ cwd: string;
205
+ /** Session manager (read-only) */
206
+ sessionManager: ReadonlySessionManager;
207
+ /** Model registry for API key resolution */
208
+ modelRegistry: ModelRegistry;
209
+ /** Current model (may be undefined) */
210
+ model: Model | undefined;
211
+ /** Whether the agent is idle (not streaming) */
212
+ isIdle(): boolean;
213
+ /** Abort the current agent operation */
214
+ abort(): void;
215
+ /** Whether there are queued messages waiting */
216
+ hasPendingMessages(): boolean;
217
+ /** Gracefully shutdown and exit. */
218
+ shutdown(): void;
219
+ /** Get the current effective system prompt. */
220
+ getSystemPrompt(): string;
221
+ /** @deprecated Use hasPendingMessages() instead */
222
+ hasQueuedMessages(): boolean;
223
+ }
224
+
225
+ /**
226
+ * Extended context for command handlers.
227
+ * Includes session control methods only safe in user-initiated commands.
228
+ */
229
+ export interface ExtensionCommandContext extends ExtensionContext {
230
+ /** Get current context usage for the active model. */
231
+ getContextUsage(): ContextUsage | undefined;
232
+
233
+ /** Wait for the agent to finish streaming */
234
+ waitForIdle(): Promise<void>;
235
+
236
+ /** Start a new session, optionally with initialization. */
237
+ newSession(options?: {
238
+ parentSession?: string;
239
+ setup?: (sessionManager: SessionManager) => Promise<void>;
240
+ }): Promise<{ cancelled: boolean }>;
241
+
242
+ /** Branch from a specific entry, creating a new session file. */
243
+ branch(entryId: string): Promise<{ cancelled: boolean }>;
244
+
245
+ /** Navigate to a different point in the session tree. */
246
+ navigateTree(targetId: string, options?: { summarize?: boolean }): Promise<{ cancelled: boolean }>;
247
+
248
+ /** Switch to a different session file. */
249
+ switchSession(sessionPath: string): Promise<{ cancelled: boolean }>;
250
+
251
+ /** Reload the current session/runtime state. */
252
+ reload(): Promise<void>;
253
+
254
+ /** Compact the session context (interactive mode shows UI). */
255
+ compact(instructionsOrOptions?: string | CompactOptions): Promise<void>;
256
+ }
257
+
258
+ // ============================================================================
259
+ // Tool Types
260
+ // ============================================================================
261
+
262
+ /** Rendering options for tool results */
263
+ export interface ToolRenderResultOptions {
264
+ /** Whether the result view is expanded */
265
+ expanded: boolean;
266
+ /** Whether this is a partial/streaming result */
267
+ isPartial: boolean;
268
+ /** Current spinner frame index for animated elements (optional) */
269
+ spinnerFrame?: number;
270
+ }
271
+
272
+ /** Session event for tool onSession lifecycle */
273
+ export interface ToolSessionEvent {
274
+ /** Reason for the session event */
275
+ reason: "start" | "switch" | "branch" | "tree" | "shutdown";
276
+ /** Previous session file path, or undefined for "start" and "shutdown" */
277
+ previousSessionFile: string | undefined;
278
+ }
279
+
280
+ /**
281
+ * Tool definition for registerTool().
282
+ */
283
+ export interface ToolDefinition<TParams extends TSchema = TSchema, TDetails = unknown> {
284
+ /** Tool name (used in LLM tool calls) */
285
+ name: string;
286
+ /** Human-readable label for UI */
287
+ label: string;
288
+ /** Description for LLM */
289
+ description: string;
290
+ /** Parameter schema (TypeBox) */
291
+ parameters: TParams;
292
+ /** If true, tool is excluded unless explicitly listed in --tools or agent's tools field */
293
+ hidden?: boolean;
294
+
295
+ /** Execute the tool. */
296
+ execute(
297
+ toolCallId: string,
298
+ params: Static<TParams>,
299
+ signal: AbortSignal | undefined,
300
+ onUpdate: AgentToolUpdateCallback<TDetails> | undefined,
301
+ ctx: ExtensionContext,
302
+ ): Promise<AgentToolResult<TDetails>>;
303
+
304
+ /** Called on session lifecycle events - use to reconstruct state or cleanup resources */
305
+ onSession?: (event: ToolSessionEvent, ctx: ExtensionContext) => void | Promise<void>;
306
+
307
+ /** Custom rendering for tool call display */
308
+ renderCall?: (args: Static<TParams>, options: ToolRenderResultOptions, theme: Theme) => Component;
309
+
310
+ /** Custom rendering for tool result display */
311
+ renderResult?: (
312
+ result: AgentToolResult<TDetails>,
313
+ options: ToolRenderResultOptions,
314
+ theme: Theme,
315
+ args?: Static<TParams>,
316
+ ) => Component;
317
+ }
318
+
319
+ // ============================================================================
320
+ // Resource Events
321
+ // ============================================================================
322
+
323
+ /** Fired after session_start to allow extensions to provide additional resource paths. */
324
+ export interface ResourcesDiscoverEvent {
325
+ type: "resources_discover";
326
+ cwd: string;
327
+ reason: "startup" | "reload";
328
+ }
329
+
330
+ /** Result from resources_discover event handler */
331
+ export interface ResourcesDiscoverResult {
332
+ skillPaths?: string[];
333
+ promptPaths?: string[];
334
+ themePaths?: string[];
335
+ }
336
+
337
+ // ============================================================================
338
+ // Session Events
339
+ // ============================================================================
340
+
341
+ /** Fired on initial session load */
342
+ export interface SessionStartEvent {
343
+ type: "session_start";
344
+ }
345
+
346
+ /** Fired before switching to another session (can be cancelled) */
347
+ export interface SessionBeforeSwitchEvent {
348
+ type: "session_before_switch";
349
+ reason: "new" | "resume" | "fork";
350
+ targetSessionFile?: string;
351
+ }
352
+
353
+ /** Fired after switching to another session */
354
+ export interface SessionSwitchEvent {
355
+ type: "session_switch";
356
+ reason: "new" | "resume" | "fork";
357
+ previousSessionFile: string | undefined;
358
+ }
359
+
360
+ /** Fired before branching a session (can be cancelled) */
361
+ export interface SessionBeforeBranchEvent {
362
+ type: "session_before_branch";
363
+ entryId: string;
364
+ }
365
+
366
+ /** Fired after branching a session */
367
+ export interface SessionBranchEvent {
368
+ type: "session_branch";
369
+ previousSessionFile: string | undefined;
370
+ }
371
+
372
+ /** Fired before context compaction (can be cancelled or customized) */
373
+ export interface SessionBeforeCompactEvent {
374
+ type: "session_before_compact";
375
+ preparation: CompactionPreparation;
376
+ branchEntries: SessionEntry[];
377
+ customInstructions?: string;
378
+ signal: AbortSignal;
379
+ }
380
+
381
+ /** Fired before compaction summarization to customize prompts/context */
382
+ export interface SessionCompactingEvent {
383
+ type: "session.compacting";
384
+ sessionId: string;
385
+ messages: AgentMessage[];
386
+ }
387
+
388
+ /** Fired after context compaction */
389
+ export interface SessionCompactEvent {
390
+ type: "session_compact";
391
+ compactionEntry: CompactionEntry;
392
+ fromExtension: boolean;
393
+ }
394
+
395
+ /** Fired on process exit */
396
+ export interface SessionShutdownEvent {
397
+ type: "session_shutdown";
398
+ }
399
+
400
+ /** Preparation data for tree navigation */
401
+ export interface TreePreparation {
402
+ targetId: string;
403
+ oldLeafId: string | null;
404
+ commonAncestorId: string | null;
405
+ entriesToSummarize: SessionEntry[];
406
+ userWantsSummary: boolean;
407
+ }
408
+
409
+ /** Fired before navigating in the session tree (can be cancelled) */
410
+ export interface SessionBeforeTreeEvent {
411
+ type: "session_before_tree";
412
+ preparation: TreePreparation;
413
+ signal: AbortSignal;
414
+ }
415
+
416
+ /** Fired after navigating in the session tree */
417
+ export interface SessionTreeEvent {
418
+ type: "session_tree";
419
+ newLeafId: string | null;
420
+ oldLeafId: string | null;
421
+ summaryEntry?: BranchSummaryEntry;
422
+ fromExtension?: boolean;
423
+ }
424
+
425
+ export type SessionEvent =
426
+ | SessionStartEvent
427
+ | SessionBeforeSwitchEvent
428
+ | SessionSwitchEvent
429
+ | SessionBeforeBranchEvent
430
+ | SessionBranchEvent
431
+ | SessionBeforeCompactEvent
432
+ | SessionCompactingEvent
433
+ | SessionCompactEvent
434
+ | SessionShutdownEvent
435
+ | SessionBeforeTreeEvent
436
+ | SessionTreeEvent;
437
+
438
+ // ============================================================================
439
+ // Agent Events
440
+ // ============================================================================
441
+
442
+ /** Fired before each LLM call. Can modify messages. */
443
+ export interface ContextEvent {
444
+ type: "context";
445
+ messages: AgentMessage[];
446
+ }
447
+
448
+ /** Fired after user submits prompt but before agent loop. */
449
+ export interface BeforeAgentStartEvent {
450
+ type: "before_agent_start";
451
+ prompt: string;
452
+ images?: ImageContent[];
453
+ systemPrompt: string;
454
+ }
455
+
456
+ /** Fired when an agent loop starts */
457
+ export interface AgentStartEvent {
458
+ type: "agent_start";
459
+ }
460
+
461
+ /** Fired when an agent loop ends */
462
+ export interface AgentEndEvent {
463
+ type: "agent_end";
464
+ messages: AgentMessage[];
465
+ }
466
+
467
+ /** Fired at the start of each turn */
468
+ export interface TurnStartEvent {
469
+ type: "turn_start";
470
+ turnIndex: number;
471
+ timestamp: number;
472
+ }
473
+
474
+ /** Fired at the end of each turn */
475
+ export interface TurnEndEvent {
476
+ type: "turn_end";
477
+ turnIndex: number;
478
+ message: AgentMessage;
479
+ toolResults: ToolResultMessage[];
480
+ }
481
+
482
+ /** Fired when a message starts (user, assistant, or toolResult) */
483
+ export interface MessageStartEvent {
484
+ type: "message_start";
485
+ message: AgentMessage;
486
+ }
487
+
488
+ /** Fired during assistant message streaming with token-by-token updates */
489
+ export interface MessageUpdateEvent {
490
+ type: "message_update";
491
+ message: AgentMessage;
492
+ assistantMessageEvent: AssistantMessageEvent;
493
+ }
494
+
495
+ /** Fired when a message ends */
496
+ export interface MessageEndEvent {
497
+ type: "message_end";
498
+ message: AgentMessage;
499
+ }
500
+
501
+ /** Fired when a tool starts executing */
502
+ export interface ToolExecutionStartEvent {
503
+ type: "tool_execution_start";
504
+ toolCallId: string;
505
+ toolName: string;
506
+ args: unknown;
507
+ intent?: string;
508
+ }
509
+
510
+ /** Fired during tool execution with partial/streaming output */
511
+ export interface ToolExecutionUpdateEvent {
512
+ type: "tool_execution_update";
513
+ toolCallId: string;
514
+ toolName: string;
515
+ args: unknown;
516
+ partialResult: unknown;
517
+ }
518
+
519
+ /** Fired when a tool finishes executing */
520
+ export interface ToolExecutionEndEvent {
521
+ type: "tool_execution_end";
522
+ toolCallId: string;
523
+ toolName: string;
524
+ result: unknown;
525
+ isError: boolean;
526
+ }
527
+
528
+ /** Fired when auto-compaction starts */
529
+ export interface AutoCompactionStartEvent {
530
+ type: "auto_compaction_start";
531
+ reason: "threshold" | "overflow";
532
+ }
533
+
534
+ /** Fired when auto-compaction ends */
535
+ export interface AutoCompactionEndEvent {
536
+ type: "auto_compaction_end";
537
+ result: CompactionResult | undefined;
538
+ aborted: boolean;
539
+ willRetry: boolean;
540
+ errorMessage?: string;
541
+ }
542
+
543
+ /** Fired when auto-retry starts */
544
+ export interface AutoRetryStartEvent {
545
+ type: "auto_retry_start";
546
+ attempt: number;
547
+ maxAttempts: number;
548
+ delayMs: number;
549
+ errorMessage: string;
550
+ }
551
+
552
+ /** Fired when auto-retry ends */
553
+ export interface AutoRetryEndEvent {
554
+ type: "auto_retry_end";
555
+ success: boolean;
556
+ attempt: number;
557
+ finalError?: string;
558
+ }
559
+
560
+ /** Fired when TTSR rule matching interrupts generation */
561
+ export interface TtsrTriggeredEvent {
562
+ type: "ttsr_triggered";
563
+ rules: Rule[];
564
+ }
565
+
566
+ /** Fired when todo reminder logic detects unfinished todos */
567
+ export interface TodoReminderEvent {
568
+ type: "todo_reminder";
569
+ todos: TodoItem[];
570
+ attempt: number;
571
+ maxAttempts: number;
572
+ }
573
+
574
+ // ============================================================================
575
+ // User Bash Events
576
+ // ============================================================================
577
+
578
+ /** Fired when user executes a bash command via ! or !! prefix */
579
+ export interface UserBashEvent {
580
+ type: "user_bash";
581
+ /** The command to execute */
582
+ command: string;
583
+ /** True if !! prefix was used (excluded from LLM context) */
584
+ excludeFromContext: boolean;
585
+ /** Current working directory */
586
+ cwd: string;
587
+ }
588
+
589
+ // ============================================================================
590
+ // User Python Events
591
+ // ============================================================================
592
+
593
+ /** Fired when user executes Python code via $ or $$ prefix */
594
+ export interface UserPythonEvent {
595
+ type: "user_python";
596
+ /** The Python code to execute */
597
+ code: string;
598
+ /** True if $$ prefix was used (excluded from LLM context) */
599
+ excludeFromContext: boolean;
600
+ /** Current working directory */
601
+ cwd: string;
602
+ }
603
+
604
+ // ============================================================================
605
+ // Input Events
606
+ // ============================================================================
607
+
608
+ /** Fired when the user submits input (interactive mode only). */
609
+ export interface InputEvent {
610
+ type: "input";
611
+ text: string;
612
+ images?: ImageContent[];
613
+ source: "interactive" | "rpc" | "extension";
614
+ }
615
+
616
+ // ============================================================================
617
+ // Tool Events
618
+ // ============================================================================
619
+
620
+ interface ToolCallEventBase {
621
+ type: "tool_call";
622
+ toolCallId: string;
623
+ }
624
+
625
+ export interface BashToolCallEvent extends ToolCallEventBase {
626
+ toolName: "bash";
627
+ input: BashToolInput;
628
+ }
629
+
630
+ export interface ReadToolCallEvent extends ToolCallEventBase {
631
+ toolName: "read";
632
+ input: ReadToolInput;
633
+ }
634
+
635
+ export interface EditToolCallEvent extends ToolCallEventBase {
636
+ toolName: "edit";
637
+ input: Record<string, unknown>;
638
+ }
639
+
640
+ export interface WriteToolCallEvent extends ToolCallEventBase {
641
+ toolName: "write";
642
+ input: WriteToolInput;
643
+ }
644
+
645
+ export interface GrepToolCallEvent extends ToolCallEventBase {
646
+ toolName: "grep";
647
+ input: GrepToolInput;
648
+ }
649
+
650
+ export interface FindToolCallEvent extends ToolCallEventBase {
651
+ toolName: "find";
652
+ input: FindToolInput;
653
+ }
654
+
655
+ export interface CustomToolCallEvent extends ToolCallEventBase {
656
+ toolName: string;
657
+ input: Record<string, unknown>;
658
+ }
659
+
660
+ /** Fired before a tool executes. Can block. */
661
+ export type ToolCallEvent =
662
+ | BashToolCallEvent
663
+ | ReadToolCallEvent
664
+ | EditToolCallEvent
665
+ | WriteToolCallEvent
666
+ | GrepToolCallEvent
667
+ | FindToolCallEvent
668
+ | CustomToolCallEvent;
669
+
670
+ interface ToolResultEventBase {
671
+ type: "tool_result";
672
+ toolCallId: string;
673
+ input: Record<string, unknown>;
674
+ content: (TextContent | ImageContent)[];
675
+ isError: boolean;
676
+ }
677
+
678
+ export interface BashToolResultEvent extends ToolResultEventBase {
679
+ toolName: "bash";
680
+ details: BashToolDetails | undefined;
681
+ }
682
+
683
+ export interface ReadToolResultEvent extends ToolResultEventBase {
684
+ toolName: "read";
685
+ details: ReadToolDetails | undefined;
686
+ }
687
+
688
+ export interface EditToolResultEvent extends ToolResultEventBase {
689
+ toolName: "edit";
690
+ details: EditToolDetails | undefined;
691
+ }
692
+
693
+ export interface WriteToolResultEvent extends ToolResultEventBase {
694
+ toolName: "write";
695
+ details: undefined;
696
+ }
697
+
698
+ export interface GrepToolResultEvent extends ToolResultEventBase {
699
+ toolName: "grep";
700
+ details: GrepToolDetails | undefined;
701
+ }
702
+
703
+ export interface FindToolResultEvent extends ToolResultEventBase {
704
+ toolName: "find";
705
+ details: FindToolDetails | undefined;
706
+ }
707
+
708
+ export interface CustomToolResultEvent extends ToolResultEventBase {
709
+ toolName: string;
710
+ details: unknown;
711
+ }
712
+
713
+ /** Fired after a tool executes. Can modify result. */
714
+ export type ToolResultEvent =
715
+ | BashToolResultEvent
716
+ | ReadToolResultEvent
717
+ | EditToolResultEvent
718
+ | WriteToolResultEvent
719
+ | GrepToolResultEvent
720
+ | FindToolResultEvent
721
+ | CustomToolResultEvent;
722
+
723
+ /**
724
+ * Type guard for narrowing ToolCallEvent by tool name.
725
+ *
726
+ * Built-in tools narrow automatically (no type params needed):
727
+ * ```ts
728
+ * if (isToolCallEventType("bash", event)) {
729
+ * event.input.command; // string
730
+ * }
731
+ * ```
732
+ *
733
+ * Custom tools require explicit type parameters:
734
+ * ```ts
735
+ * if (isToolCallEventType<"my_tool", MyToolInput>("my_tool", event)) {
736
+ * event.input.action; // typed
737
+ * }
738
+ * ```
739
+ *
740
+ * Note: Direct narrowing via `event.toolName === "bash"` doesn't work because
741
+ * CustomToolCallEvent.toolName is `string` which overlaps with all literals.
742
+ */
743
+ export function isToolCallEventType(toolName: "bash", event: ToolCallEvent): event is BashToolCallEvent;
744
+ export function isToolCallEventType(toolName: "read", event: ToolCallEvent): event is ReadToolCallEvent;
745
+ export function isToolCallEventType(toolName: "edit", event: ToolCallEvent): event is EditToolCallEvent;
746
+ export function isToolCallEventType(toolName: "write", event: ToolCallEvent): event is WriteToolCallEvent;
747
+ export function isToolCallEventType(toolName: "grep", event: ToolCallEvent): event is GrepToolCallEvent;
748
+ export function isToolCallEventType(toolName: "find", event: ToolCallEvent): event is FindToolCallEvent;
749
+ export function isToolCallEventType<TName extends string, TInput extends Record<string, unknown>>(
750
+ toolName: TName,
751
+ event: ToolCallEvent,
752
+ ): event is ToolCallEvent & { toolName: TName; input: TInput };
753
+ export function isToolCallEventType(toolName: string, event: ToolCallEvent): boolean {
754
+ return event.toolName === toolName;
755
+ }
756
+
757
+ /** Union of all event types */
758
+ export type ExtensionEvent =
759
+ | ResourcesDiscoverEvent
760
+ | SessionEvent
761
+ | ContextEvent
762
+ | BeforeAgentStartEvent
763
+ | AgentStartEvent
764
+ | AgentEndEvent
765
+ | TurnStartEvent
766
+ | TurnEndEvent
767
+ | MessageStartEvent
768
+ | MessageUpdateEvent
769
+ | MessageEndEvent
770
+ | ToolExecutionStartEvent
771
+ | ToolExecutionUpdateEvent
772
+ | ToolExecutionEndEvent
773
+ | AutoCompactionStartEvent
774
+ | AutoCompactionEndEvent
775
+ | AutoRetryStartEvent
776
+ | AutoRetryEndEvent
777
+ | TtsrTriggeredEvent
778
+ | TodoReminderEvent
779
+ | UserBashEvent
780
+ | UserPythonEvent
781
+ | InputEvent
782
+ | ToolCallEvent
783
+ | ToolResultEvent;
784
+
785
+ // ============================================================================
786
+ // Event Results
787
+ // ============================================================================
788
+
789
+ export interface ContextEventResult {
790
+ messages?: AgentMessage[];
791
+ }
792
+
793
+ export interface ToolCallEventResult {
794
+ block?: boolean;
795
+ reason?: string;
796
+ }
797
+
798
+ /** Result from input event handler */
799
+ export interface InputEventResult {
800
+ /** If true, the input was handled and should not continue through normal flow */
801
+ handled?: boolean;
802
+ /** Replace the input text */
803
+ text?: string;
804
+ /** Replace any pending images */
805
+ images?: ImageContent[];
806
+ }
807
+
808
+ /** Result from user_bash event handler */
809
+ export interface UserBashEventResult {
810
+ /** Full replacement: extension handled execution, use this result */
811
+ result?: BashResult;
812
+ }
813
+
814
+ /** Result from user_python event handler */
815
+ export interface UserPythonEventResult {
816
+ /** Full replacement: extension handled execution, use this result */
817
+ result?: PythonResult;
818
+ }
819
+
820
+ export interface ToolResultEventResult {
821
+ content?: (TextContent | ImageContent)[];
822
+ details?: unknown;
823
+ isError?: boolean;
824
+ }
825
+
826
+ export interface BeforeAgentStartEventResult {
827
+ message?: Pick<CustomMessage, "customType" | "content" | "display" | "details">;
828
+ /** Replace the system prompt for this turn. If multiple extensions return this, they are chained. */
829
+ systemPrompt?: string;
830
+ }
831
+
832
+ export interface SessionBeforeSwitchResult {
833
+ cancel?: boolean;
834
+ }
835
+
836
+ export interface SessionBeforeBranchResult {
837
+ cancel?: boolean;
838
+ skipConversationRestore?: boolean;
839
+ }
840
+
841
+ export interface SessionBeforeCompactResult {
842
+ cancel?: boolean;
843
+ compaction?: CompactionResult;
844
+ }
845
+
846
+ export interface SessionCompactingResult {
847
+ context?: string[];
848
+ prompt?: string;
849
+ preserveData?: Record<string, unknown>;
850
+ }
851
+
852
+ export interface SessionBeforeTreeResult {
853
+ cancel?: boolean;
854
+ summary?: {
855
+ summary: string;
856
+ details?: unknown;
857
+ };
858
+ }
859
+
860
+ // ============================================================================
861
+ // Message Rendering
862
+ // ============================================================================
863
+
864
+ export interface MessageRenderOptions {
865
+ expanded: boolean;
866
+ }
867
+
868
+ export type MessageRenderer<T = unknown> = (
869
+ message: CustomMessage<T>,
870
+ options: MessageRenderOptions,
871
+ theme: Theme,
872
+ ) => Component | undefined;
873
+
874
+ // ============================================================================
875
+ // Command Registration
876
+ // ============================================================================
877
+
878
+ export interface RegisteredCommand {
879
+ name: string;
880
+ description?: string;
881
+ getArgumentCompletions?: (argumentPrefix: string) => AutocompleteItem[] | null;
882
+ handler: (args: string, ctx: ExtensionCommandContext) => Promise<void>;
883
+ }
884
+
885
+ // ============================================================================
886
+ // Extension API
887
+ // ============================================================================
888
+
889
+ /** Handler function type for events */
890
+ // biome-ignore lint/suspicious/noConfusingVoidType: void allows bare return statements
891
+ export type ExtensionHandler<E, R = undefined> = (event: E, ctx: ExtensionContext) => Promise<R | void> | R | void;
892
+
893
+ /**
894
+ * ExtensionAPI passed to extension factory functions.
895
+ */
896
+ export interface ExtensionAPI {
897
+ // =========================================================================
898
+ // Module Access
899
+ // =========================================================================
900
+
901
+ /** File logger for error/warning/debug messages */
902
+ logger: typeof import("@nghyane/arcane-utils").logger;
903
+
904
+ /** Injected @sinclair/typebox module for defining tool parameters */
905
+ typebox: typeof import("@sinclair/typebox");
906
+
907
+ /** Injected pi-coding-agent exports for accessing SDK utilities */
908
+ pi: typeof piCodingAgent;
909
+
910
+ // =========================================================================
911
+ // Event Subscription
912
+ // =========================================================================
913
+
914
+ on(event: "resources_discover", handler: ExtensionHandler<ResourcesDiscoverEvent, ResourcesDiscoverResult>): void;
915
+ on(event: "session_start", handler: ExtensionHandler<SessionStartEvent>): void;
916
+ on(
917
+ event: "session_before_switch",
918
+ handler: ExtensionHandler<SessionBeforeSwitchEvent, SessionBeforeSwitchResult>,
919
+ ): void;
920
+ on(event: "session_switch", handler: ExtensionHandler<SessionSwitchEvent>): void;
921
+ on(
922
+ event: "session_before_branch",
923
+ handler: ExtensionHandler<SessionBeforeBranchEvent, SessionBeforeBranchResult>,
924
+ ): void;
925
+ on(event: "session_branch", handler: ExtensionHandler<SessionBranchEvent>): void;
926
+ on(
927
+ event: "session_before_compact",
928
+ handler: ExtensionHandler<SessionBeforeCompactEvent, SessionBeforeCompactResult>,
929
+ ): void;
930
+ on(event: "session.compacting", handler: ExtensionHandler<SessionCompactingEvent, SessionCompactingResult>): void;
931
+ on(event: "session_compact", handler: ExtensionHandler<SessionCompactEvent>): void;
932
+ on(event: "session_shutdown", handler: ExtensionHandler<SessionShutdownEvent>): void;
933
+ on(event: "session_before_tree", handler: ExtensionHandler<SessionBeforeTreeEvent, SessionBeforeTreeResult>): void;
934
+ on(event: "session_tree", handler: ExtensionHandler<SessionTreeEvent>): void;
935
+ on(event: "context", handler: ExtensionHandler<ContextEvent, ContextEventResult>): void;
936
+ on(event: "before_agent_start", handler: ExtensionHandler<BeforeAgentStartEvent, BeforeAgentStartEventResult>): void;
937
+ on(event: "agent_start", handler: ExtensionHandler<AgentStartEvent>): void;
938
+ on(event: "agent_end", handler: ExtensionHandler<AgentEndEvent>): void;
939
+ on(event: "turn_start", handler: ExtensionHandler<TurnStartEvent>): void;
940
+ on(event: "turn_end", handler: ExtensionHandler<TurnEndEvent>): void;
941
+ on(event: "message_start", handler: ExtensionHandler<MessageStartEvent>): void;
942
+ on(event: "message_update", handler: ExtensionHandler<MessageUpdateEvent>): void;
943
+ on(event: "message_end", handler: ExtensionHandler<MessageEndEvent>): void;
944
+ on(event: "tool_execution_start", handler: ExtensionHandler<ToolExecutionStartEvent>): void;
945
+ on(event: "tool_execution_update", handler: ExtensionHandler<ToolExecutionUpdateEvent>): void;
946
+ on(event: "tool_execution_end", handler: ExtensionHandler<ToolExecutionEndEvent>): void;
947
+ on(event: "auto_compaction_start", handler: ExtensionHandler<AutoCompactionStartEvent>): void;
948
+ on(event: "auto_compaction_end", handler: ExtensionHandler<AutoCompactionEndEvent>): void;
949
+ on(event: "auto_retry_start", handler: ExtensionHandler<AutoRetryStartEvent>): void;
950
+ on(event: "auto_retry_end", handler: ExtensionHandler<AutoRetryEndEvent>): void;
951
+ on(event: "ttsr_triggered", handler: ExtensionHandler<TtsrTriggeredEvent>): void;
952
+ on(event: "todo_reminder", handler: ExtensionHandler<TodoReminderEvent>): void;
953
+ on(event: "input", handler: ExtensionHandler<InputEvent, InputEventResult>): void;
954
+ on(event: "tool_call", handler: ExtensionHandler<ToolCallEvent, ToolCallEventResult>): void;
955
+ on(event: "tool_result", handler: ExtensionHandler<ToolResultEvent, ToolResultEventResult>): void;
956
+ on(event: "user_bash", handler: ExtensionHandler<UserBashEvent, UserBashEventResult>): void;
957
+ on(event: "user_python", handler: ExtensionHandler<UserPythonEvent, UserPythonEventResult>): void;
958
+
959
+ // =========================================================================
960
+ // Tool Registration
961
+ // =========================================================================
962
+
963
+ /** Register a tool that the LLM can call. */
964
+ registerTool<TParams extends TSchema = TSchema, TDetails = unknown>(tool: ToolDefinition<TParams, TDetails>): void;
965
+
966
+ // =========================================================================
967
+ // Command, Shortcut, Flag Registration
968
+ // =========================================================================
969
+
970
+ /** Register a custom command. */
971
+ registerCommand(
972
+ name: string,
973
+ options: {
974
+ description?: string;
975
+ getArgumentCompletions?: RegisteredCommand["getArgumentCompletions"];
976
+ handler: RegisteredCommand["handler"];
977
+ },
978
+ ): void;
979
+
980
+ /** Register a keyboard shortcut. */
981
+ registerShortcut(
982
+ shortcut: KeyId,
983
+ options: {
984
+ description?: string;
985
+ handler: (ctx: ExtensionContext) => Promise<void> | void;
986
+ },
987
+ ): void;
988
+
989
+ /** Register a CLI flag. */
990
+ registerFlag(
991
+ name: string,
992
+ options: {
993
+ description?: string;
994
+ type: "boolean" | "string";
995
+ default?: boolean | string;
996
+ },
997
+ ): void;
998
+
999
+ /** Set the display label for this extension, or set a label on a specific entry. */
1000
+ setLabel(entryIdOrLabel: string, label?: string | undefined): void;
1001
+
1002
+ /** Get the value of a registered CLI flag. */
1003
+ getFlag(name: string): boolean | string | undefined;
1004
+
1005
+ // =========================================================================
1006
+ // Message Rendering
1007
+ // =========================================================================
1008
+
1009
+ /** Register a custom renderer for CustomMessageEntry. */
1010
+ registerMessageRenderer<T = unknown>(customType: string, renderer: MessageRenderer<T>): void;
1011
+
1012
+ // =========================================================================
1013
+ // Actions
1014
+ // =========================================================================
1015
+
1016
+ /** Send a custom message to the session. */
1017
+ sendMessage<T = unknown>(
1018
+ message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details">,
1019
+ options?: { triggerTurn?: boolean; deliverAs?: "steer" | "followUp" | "nextTurn" },
1020
+ ): void;
1021
+
1022
+ /** Send a user message to the agent. Always triggers a turn. */
1023
+ sendUserMessage(
1024
+ content: string | (TextContent | ImageContent)[],
1025
+ options?: { deliverAs?: "steer" | "followUp" },
1026
+ ): void;
1027
+
1028
+ /** Append a custom entry to the session for state persistence (not sent to LLM). */
1029
+ appendEntry<T = unknown>(customType: string, data?: T): void;
1030
+
1031
+ /** Execute a shell command. */
1032
+ exec(command: string, args: string[], options?: ExecOptions): Promise<ExecResult>;
1033
+
1034
+ /** Get the list of currently active tool names. */
1035
+ getActiveTools(): string[];
1036
+
1037
+ /** Get all configured tools (built-in + extension tools). */
1038
+ getAllTools(): string[];
1039
+
1040
+ /** Set the active tools by name. */
1041
+ setActiveTools(toolNames: string[]): Promise<void>;
1042
+
1043
+ /** Get available slash commands in the current session. */
1044
+ getCommands(): SlashCommandInfo[];
1045
+
1046
+ /** Set the current model. Returns false if no API key available. */
1047
+ setModel(model: Model): Promise<boolean>;
1048
+
1049
+ /** Get current thinking level. */
1050
+ getThinkingLevel(): ThinkingLevel;
1051
+
1052
+ /** Set thinking level (clamped to model capabilities). */
1053
+ setThinkingLevel(level: ThinkingLevel): void;
1054
+
1055
+ // =========================================================================
1056
+ // Provider Registration
1057
+ // =========================================================================
1058
+
1059
+ /**
1060
+ * Register or override a model provider.
1061
+ *
1062
+ * If `models` is provided: replaces all existing models for this provider.
1063
+ * If only `baseUrl` is provided: overrides the URL for existing models.
1064
+ * If `streamSimple` is provided: registers a custom API stream handler.
1065
+ *
1066
+ * @example
1067
+ * // Register a new provider with custom models and streaming
1068
+ * pi.registerProvider("google-vertex-claude", {
1069
+ * baseUrl: "https://us-east5-aiplatform.googleapis.com",
1070
+ * apiKey: "GOOGLE_CLOUD_PROJECT",
1071
+ * api: "vertex-claude-api",
1072
+ * streamSimple: myStreamFunction,
1073
+ * models: [
1074
+ * {
1075
+ * id: "claude-sonnet-4@20250514",
1076
+ * name: "Claude Sonnet 4 (Vertex)",
1077
+ * reasoning: true,
1078
+ * input: ["text", "image"],
1079
+ * cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
1080
+ * contextWindow: 200000,
1081
+ * maxTokens: 64000,
1082
+ * }
1083
+ * ]
1084
+ * });
1085
+ *
1086
+ * @example
1087
+ * // Override baseUrl for an existing provider
1088
+ * pi.registerProvider("anthropic", {
1089
+ * baseUrl: "https://proxy.example.com"
1090
+ * });
1091
+ */
1092
+ registerProvider(name: string, config: ProviderConfig): void;
1093
+
1094
+ /** Shared event bus for extension communication. */
1095
+ events: EventBus;
1096
+ }
1097
+
1098
+ // ============================================================================
1099
+ // Provider Registration Types
1100
+ // ============================================================================
1101
+
1102
+ /** Configuration for registering a provider via pi.registerProvider(). */
1103
+ export interface ProviderConfig {
1104
+ /** Base URL for the API endpoint. Required when defining models. */
1105
+ baseUrl?: string;
1106
+ /** API key or environment variable name. Required when defining models unless oauth is provided. */
1107
+ apiKey?: string;
1108
+ /** API type identifier. Required when registering streamSimple or when models don't specify one. */
1109
+ api?: Api;
1110
+ /** Custom streaming function for non-built-in APIs. */
1111
+ streamSimple?: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;
1112
+ /** Custom headers to include in requests. */
1113
+ headers?: Record<string, string>;
1114
+ /** If true, adds Authorization: Bearer header with the resolved API key. */
1115
+ authHeader?: boolean;
1116
+ /** Models to register. If provided, replaces all existing models for this provider. */
1117
+ models?: ProviderModelConfig[];
1118
+ /** OAuth provider for /login support. */
1119
+ oauth?: {
1120
+ /** Display name in login UI. */
1121
+ name: string;
1122
+ /** Run the provider login flow and return credentials (or a plain API key) to persist. */
1123
+ login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials | string>;
1124
+ /** Refresh expired credentials. */
1125
+ refreshToken?(credentials: OAuthCredentials): Promise<OAuthCredentials>;
1126
+ /** Convert credentials to an API key string for requests. */
1127
+ getApiKey?(credentials: OAuthCredentials): string;
1128
+ /** Optional model rewrite hook for credential-aware routing (e.g., enterprise URLs). */
1129
+ modifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];
1130
+ };
1131
+ }
1132
+
1133
+ /** Configuration for a model within a provider. */
1134
+ export interface ProviderModelConfig {
1135
+ /** Model ID (e.g., "claude-sonnet-4@20250514"). */
1136
+ id: string;
1137
+ /** Display name (e.g., "Claude Sonnet 4 (Vertex)"). */
1138
+ name: string;
1139
+ /** API type override for this model. */
1140
+ api?: Api;
1141
+ /** Whether the model supports extended thinking. */
1142
+ reasoning: boolean;
1143
+ /** Supported input types. */
1144
+ input: ("text" | "image")[];
1145
+ /** Cost per million tokens. */
1146
+ cost: { input: number; output: number; cacheRead: number; cacheWrite: number };
1147
+ /** Maximum context window size in tokens. */
1148
+ contextWindow: number;
1149
+ /** Maximum output tokens. */
1150
+ maxTokens: number;
1151
+ /** Custom headers for this model. */
1152
+ headers?: Record<string, string>;
1153
+ /** OpenAI compatibility settings. */
1154
+ compat?: Model<Api>["compat"];
1155
+ }
1156
+
1157
+ /** Extension factory function type. Supports both sync and async initialization. */
1158
+ export type ExtensionFactory = (pi: ExtensionAPI) => void | Promise<void>;
1159
+
1160
+ // ============================================================================
1161
+ // Loaded Extension Types
1162
+ // ============================================================================
1163
+
1164
+ export interface RegisteredTool<TParams extends TSchema = TSchema, TDetails = unknown> {
1165
+ definition: ToolDefinition<TParams, TDetails>;
1166
+ extensionPath: string;
1167
+ }
1168
+
1169
+ export interface ExtensionFlag {
1170
+ name: string;
1171
+ description?: string;
1172
+ type: "boolean" | "string";
1173
+ default?: boolean | string;
1174
+ extensionPath: string;
1175
+ }
1176
+
1177
+ export interface ExtensionShortcut {
1178
+ shortcut: KeyId;
1179
+ description?: string;
1180
+ handler: (ctx: ExtensionContext) => Promise<void> | void;
1181
+ extensionPath: string;
1182
+ }
1183
+
1184
+ type HandlerFn = (...args: unknown[]) => Promise<unknown>;
1185
+
1186
+ export type SendMessageHandler = <T = unknown>(
1187
+ message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details">,
1188
+ options?: { triggerTurn?: boolean; deliverAs?: "steer" | "followUp" | "nextTurn" },
1189
+ ) => void;
1190
+
1191
+ export type SendUserMessageHandler = (
1192
+ content: string | (TextContent | ImageContent)[],
1193
+ options?: { deliverAs?: "steer" | "followUp" },
1194
+ ) => void;
1195
+
1196
+ export type AppendEntryHandler = <T = unknown>(customType: string, data?: T) => void;
1197
+
1198
+ export type GetActiveToolsHandler = () => string[];
1199
+
1200
+ export type GetAllToolsHandler = () => string[];
1201
+
1202
+ export type GetCommandsHandler = () => SlashCommandInfo[];
1203
+
1204
+ export type SetActiveToolsHandler = (toolNames: string[]) => Promise<void>;
1205
+
1206
+ export type SetModelHandler = (model: Model) => Promise<boolean>;
1207
+
1208
+ export type GetThinkingLevelHandler = () => ThinkingLevel;
1209
+
1210
+ export type SetThinkingLevelHandler = (level: ThinkingLevel, persist?: boolean) => void;
1211
+
1212
+ /** Shared state created by loader, used during registration and runtime. */
1213
+ export interface ExtensionRuntimeState {
1214
+ flagValues: Map<string, boolean | string>;
1215
+ /** Provider registrations queued during extension loading, processed during session initialization */
1216
+ pendingProviderRegistrations: Array<{ name: string; config: ProviderConfig; sourceId: string }>;
1217
+ }
1218
+
1219
+ /** Action implementations for ExtensionAPI methods. */
1220
+ export interface ExtensionActions {
1221
+ sendMessage: SendMessageHandler;
1222
+ sendUserMessage: SendUserMessageHandler;
1223
+ appendEntry: AppendEntryHandler;
1224
+ setLabel: (targetId: string, label: string | undefined) => void;
1225
+ getActiveTools: GetActiveToolsHandler;
1226
+ getAllTools: GetAllToolsHandler;
1227
+ setActiveTools: SetActiveToolsHandler;
1228
+ getCommands: GetCommandsHandler;
1229
+ setModel: SetModelHandler;
1230
+ getThinkingLevel: GetThinkingLevelHandler;
1231
+ setThinkingLevel: SetThinkingLevelHandler;
1232
+ }
1233
+
1234
+ /** Actions for ExtensionContext (ctx.* in event handlers). */
1235
+ export interface ExtensionContextActions {
1236
+ getModel: () => Model | undefined;
1237
+ isIdle: () => boolean;
1238
+ abort: () => void;
1239
+ hasPendingMessages: () => boolean;
1240
+ shutdown: () => void;
1241
+ getContextUsage: () => ContextUsage | undefined;
1242
+ compact: (instructionsOrOptions?: string | CompactOptions) => Promise<void>;
1243
+ getSystemPrompt: () => string;
1244
+ }
1245
+
1246
+ /** Actions for ExtensionCommandContext (ctx.* in command handlers). */
1247
+ export interface ExtensionCommandContextActions {
1248
+ getContextUsage: () => ContextUsage | undefined;
1249
+ waitForIdle: () => Promise<void>;
1250
+ newSession: (options?: {
1251
+ parentSession?: string;
1252
+ setup?: (sessionManager: SessionManager) => Promise<void>;
1253
+ }) => Promise<{ cancelled: boolean }>;
1254
+ branch: (entryId: string) => Promise<{ cancelled: boolean }>;
1255
+ navigateTree: (targetId: string, options?: { summarize?: boolean }) => Promise<{ cancelled: boolean }>;
1256
+ compact: (instructionsOrOptions?: string | CompactOptions) => Promise<void>;
1257
+ switchSession: (sessionPath: string) => Promise<{ cancelled: boolean }>;
1258
+ reload: () => Promise<void>;
1259
+ }
1260
+
1261
+ /** Full runtime = state + actions. */
1262
+ export interface ExtensionRuntime extends ExtensionRuntimeState, ExtensionActions {}
1263
+
1264
+ /** Loaded extension with all registered items. */
1265
+ export interface Extension {
1266
+ path: string;
1267
+ resolvedPath: string;
1268
+ label?: string;
1269
+ handlers: Map<string, HandlerFn[]>;
1270
+ tools: Map<string, RegisteredTool<any, any>>;
1271
+ messageRenderers: Map<string, MessageRenderer>;
1272
+ commands: Map<string, RegisteredCommand>;
1273
+ flags: Map<string, ExtensionFlag>;
1274
+ shortcuts: Map<KeyId, ExtensionShortcut>;
1275
+ }
1276
+
1277
+ /** Result of loading extensions. */
1278
+ export interface LoadExtensionsResult {
1279
+ extensions: Extension[];
1280
+ errors: Array<{ path: string; error: string }>;
1281
+ runtime: ExtensionRuntime;
1282
+ }
1283
+
1284
+ // ============================================================================
1285
+ // Extension Error
1286
+ // ============================================================================
1287
+
1288
+ export interface ExtensionError {
1289
+ extensionPath: string;
1290
+ event: string;
1291
+ error: string;
1292
+ stack?: string;
1293
+ }