shortcutxl 0.2.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 (423) hide show
  1. package/README.md +59 -0
  2. package/agent-docs/README.md +397 -0
  3. package/agent-docs/docs/compaction.md +390 -0
  4. package/agent-docs/docs/custom-provider.md +580 -0
  5. package/agent-docs/docs/development.md +69 -0
  6. package/agent-docs/docs/extensions.md +1971 -0
  7. package/agent-docs/docs/json.md +79 -0
  8. package/agent-docs/docs/keybindings.md +174 -0
  9. package/agent-docs/docs/models.md +293 -0
  10. package/agent-docs/docs/packages.md +209 -0
  11. package/agent-docs/docs/prompt-templates.md +67 -0
  12. package/agent-docs/docs/providers.md +186 -0
  13. package/agent-docs/docs/rpc.md +1317 -0
  14. package/agent-docs/docs/sdk.md +962 -0
  15. package/agent-docs/docs/session.md +412 -0
  16. package/agent-docs/docs/settings.md +223 -0
  17. package/agent-docs/docs/shell-aliases.md +13 -0
  18. package/agent-docs/docs/skills.md +231 -0
  19. package/agent-docs/docs/terminal-setup.md +70 -0
  20. package/agent-docs/docs/termux.md +127 -0
  21. package/agent-docs/docs/themes.md +295 -0
  22. package/agent-docs/docs/tree.md +219 -0
  23. package/agent-docs/docs/tui.md +887 -0
  24. package/agent-docs/docs/windows.md +17 -0
  25. package/agent-docs/examples/README.md +25 -0
  26. package/agent-docs/examples/extensions/README.md +205 -0
  27. package/agent-docs/examples/extensions/antigravity-image-gen.ts +447 -0
  28. package/agent-docs/examples/extensions/auto-commit-on-exit.ts +49 -0
  29. package/agent-docs/examples/extensions/bash-spawn-hook.ts +30 -0
  30. package/agent-docs/examples/extensions/bookmark.ts +50 -0
  31. package/agent-docs/examples/extensions/built-in-tool-renderer.ts +256 -0
  32. package/agent-docs/examples/extensions/claude-rules.ts +86 -0
  33. package/agent-docs/examples/extensions/commands.ts +75 -0
  34. package/agent-docs/examples/extensions/confirm-destructive.ts +59 -0
  35. package/agent-docs/examples/extensions/custom-compaction.ts +126 -0
  36. package/agent-docs/examples/extensions/custom-footer.ts +63 -0
  37. package/agent-docs/examples/extensions/custom-header.ts +73 -0
  38. package/agent-docs/examples/extensions/custom-provider-anthropic/index.ts +660 -0
  39. package/agent-docs/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  40. package/agent-docs/examples/extensions/custom-provider-anthropic/package.json +19 -0
  41. package/agent-docs/examples/extensions/custom-provider-gitlab-duo/index.ts +362 -0
  42. package/agent-docs/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  43. package/agent-docs/examples/extensions/custom-provider-gitlab-duo/test.ts +88 -0
  44. package/agent-docs/examples/extensions/custom-provider-qwen-cli/index.ts +349 -0
  45. package/agent-docs/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  46. package/agent-docs/examples/extensions/dirty-repo-guard.ts +56 -0
  47. package/agent-docs/examples/extensions/doom-overlay/README.md +46 -0
  48. package/agent-docs/examples/extensions/doom-overlay/doom/build.sh +152 -0
  49. package/agent-docs/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  50. package/agent-docs/examples/extensions/doom-overlay/doom-component.ts +133 -0
  51. package/agent-docs/examples/extensions/doom-overlay/doom-engine.ts +186 -0
  52. package/agent-docs/examples/extensions/doom-overlay/doom-keys.ts +108 -0
  53. package/agent-docs/examples/extensions/doom-overlay/index.ts +74 -0
  54. package/agent-docs/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  55. package/agent-docs/examples/extensions/dynamic-resources/SKILL.md +8 -0
  56. package/agent-docs/examples/extensions/dynamic-resources/dynamic.json +79 -0
  57. package/agent-docs/examples/extensions/dynamic-resources/dynamic.md +5 -0
  58. package/agent-docs/examples/extensions/dynamic-resources/index.ts +15 -0
  59. package/agent-docs/examples/extensions/dynamic-tools.ts +77 -0
  60. package/agent-docs/examples/extensions/event-bus.ts +43 -0
  61. package/agent-docs/examples/extensions/file-trigger.ts +41 -0
  62. package/agent-docs/examples/extensions/git-checkpoint.ts +53 -0
  63. package/agent-docs/examples/extensions/handoff.ts +155 -0
  64. package/agent-docs/examples/extensions/hello.ts +25 -0
  65. package/agent-docs/examples/extensions/inline-bash.ts +94 -0
  66. package/agent-docs/examples/extensions/input-transform.ts +43 -0
  67. package/agent-docs/examples/extensions/interactive-shell.ts +209 -0
  68. package/agent-docs/examples/extensions/mac-system-theme.ts +47 -0
  69. package/agent-docs/examples/extensions/message-renderer.ts +59 -0
  70. package/agent-docs/examples/extensions/minimal-mode.ts +430 -0
  71. package/agent-docs/examples/extensions/modal-editor.ts +90 -0
  72. package/agent-docs/examples/extensions/model-status.ts +31 -0
  73. package/agent-docs/examples/extensions/notify.ts +55 -0
  74. package/agent-docs/examples/extensions/overlay-qa-tests.ts +936 -0
  75. package/agent-docs/examples/extensions/overlay-test.ts +159 -0
  76. package/agent-docs/examples/extensions/permission-gate.ts +37 -0
  77. package/agent-docs/examples/extensions/pirate.ts +47 -0
  78. package/agent-docs/examples/extensions/plan-mode/README.md +65 -0
  79. package/agent-docs/examples/extensions/plan-mode/index.ts +363 -0
  80. package/agent-docs/examples/extensions/plan-mode/utils.ts +173 -0
  81. package/agent-docs/examples/extensions/preset.ts +418 -0
  82. package/agent-docs/examples/extensions/protected-paths.ts +30 -0
  83. package/agent-docs/examples/extensions/qna.ts +122 -0
  84. package/agent-docs/examples/extensions/question.ts +278 -0
  85. package/agent-docs/examples/extensions/questionnaire.ts +440 -0
  86. package/agent-docs/examples/extensions/rainbow-editor.ts +90 -0
  87. package/agent-docs/examples/extensions/reload-runtime.ts +37 -0
  88. package/agent-docs/examples/extensions/rpc-demo.ts +124 -0
  89. package/agent-docs/examples/extensions/sandbox/index.ts +324 -0
  90. package/agent-docs/examples/extensions/sandbox/package-lock.json +92 -0
  91. package/agent-docs/examples/extensions/sandbox/package.json +19 -0
  92. package/agent-docs/examples/extensions/send-user-message.ts +97 -0
  93. package/agent-docs/examples/extensions/session-name.ts +27 -0
  94. package/agent-docs/examples/extensions/shutdown-command.ts +69 -0
  95. package/agent-docs/examples/extensions/snake.ts +343 -0
  96. package/agent-docs/examples/extensions/space-invaders.ts +566 -0
  97. package/agent-docs/examples/extensions/ssh.ts +233 -0
  98. package/agent-docs/examples/extensions/status-line.ts +40 -0
  99. package/agent-docs/examples/extensions/subagent/README.md +172 -0
  100. package/agent-docs/examples/extensions/subagent/agents/planner.md +37 -0
  101. package/agent-docs/examples/extensions/subagent/agents/reviewer.md +35 -0
  102. package/agent-docs/examples/extensions/subagent/agents/scout.md +50 -0
  103. package/agent-docs/examples/extensions/subagent/agents/worker.md +24 -0
  104. package/agent-docs/examples/extensions/subagent/agents.ts +130 -0
  105. package/agent-docs/examples/extensions/subagent/index.ts +1068 -0
  106. package/agent-docs/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  107. package/agent-docs/examples/extensions/subagent/prompts/implement.md +10 -0
  108. package/agent-docs/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  109. package/agent-docs/examples/extensions/summarize.ts +206 -0
  110. package/agent-docs/examples/extensions/system-prompt-header.ts +17 -0
  111. package/agent-docs/examples/extensions/timed-confirm.ts +72 -0
  112. package/agent-docs/examples/extensions/titlebar-spinner.ts +58 -0
  113. package/agent-docs/examples/extensions/todo.ts +314 -0
  114. package/agent-docs/examples/extensions/tool-override.ts +146 -0
  115. package/agent-docs/examples/extensions/tools.ts +145 -0
  116. package/agent-docs/examples/extensions/trigger-compact.ts +40 -0
  117. package/agent-docs/examples/extensions/truncated-tool.ts +194 -0
  118. package/agent-docs/examples/extensions/widget-placement.ts +17 -0
  119. package/agent-docs/examples/extensions/with-deps/index.ts +37 -0
  120. package/agent-docs/examples/extensions/with-deps/package-lock.json +31 -0
  121. package/agent-docs/examples/extensions/with-deps/package.json +22 -0
  122. package/agent-docs/examples/rpc-extension-ui.ts +654 -0
  123. package/agent-docs/examples/sdk/01-minimal.ts +22 -0
  124. package/agent-docs/examples/sdk/02-custom-model.ts +48 -0
  125. package/agent-docs/examples/sdk/03-custom-prompt.ts +55 -0
  126. package/agent-docs/examples/sdk/04-skills.ts +53 -0
  127. package/agent-docs/examples/sdk/05-tools.ts +56 -0
  128. package/agent-docs/examples/sdk/06-extensions.ts +88 -0
  129. package/agent-docs/examples/sdk/07-context-files.ts +40 -0
  130. package/agent-docs/examples/sdk/08-prompt-templates.ts +47 -0
  131. package/agent-docs/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  132. package/agent-docs/examples/sdk/10-settings.ts +54 -0
  133. package/agent-docs/examples/sdk/11-sessions.ts +48 -0
  134. package/agent-docs/examples/sdk/12-full-control.ts +82 -0
  135. package/agent-docs/examples/sdk/README.md +144 -0
  136. package/agent-docs/xll-skill.md +61 -0
  137. package/agent-docs/xll-spec.md +110 -0
  138. package/dist/cli/args.js +290 -0
  139. package/dist/cli/config-selector.js +31 -0
  140. package/dist/cli/file-processor.js +79 -0
  141. package/dist/cli/list-models.js +92 -0
  142. package/dist/cli/package-commands.js +210 -0
  143. package/dist/cli/report-settings-errors.js +11 -0
  144. package/dist/cli/session-picker.js +34 -0
  145. package/dist/cli.js +19 -0
  146. package/dist/config.js +288 -0
  147. package/dist/core/abort.js +15 -0
  148. package/dist/core/agent-loop.js +352 -0
  149. package/dist/core/agent-session.js +2019 -0
  150. package/dist/core/agent.js +410 -0
  151. package/dist/core/auth-storage.js +456 -0
  152. package/dist/core/bash-executor.js +222 -0
  153. package/dist/core/compaction/branch-summarization.js +242 -0
  154. package/dist/core/compaction/compaction.js +610 -0
  155. package/dist/core/compaction/index.js +7 -0
  156. package/dist/core/compaction/utils.js +139 -0
  157. package/dist/core/defaults.js +6 -0
  158. package/dist/core/diagnostics.js +2 -0
  159. package/dist/core/event-bus.js +25 -0
  160. package/dist/core/exec.js +71 -0
  161. package/dist/core/export-html/ansi-to-html.js +256 -0
  162. package/dist/core/export-html/index.js +238 -0
  163. package/dist/core/export-html/session-view-model.js +342 -0
  164. package/dist/core/export-html/template.css +1110 -0
  165. package/dist/core/export-html/template.html +76 -0
  166. package/dist/core/export-html/template.js +1990 -0
  167. package/dist/core/export-html/tool-renderer.js +63 -0
  168. package/dist/core/export-html/vendor/highlight.min.js +7725 -0
  169. package/dist/core/export-html/vendor/marked.min.js +1803 -0
  170. package/dist/core/extensions/index.js +9 -0
  171. package/dist/core/extensions/loader.js +422 -0
  172. package/dist/core/extensions/runner.js +651 -0
  173. package/dist/core/extensions/types.js +35 -0
  174. package/dist/core/extensions/wrapper.js +102 -0
  175. package/dist/core/footer-data-provider.js +162 -0
  176. package/dist/core/index.js +9 -0
  177. package/dist/core/keybindings.js +153 -0
  178. package/dist/core/messages.js +133 -0
  179. package/dist/core/model-registry.js +539 -0
  180. package/dist/core/model-resolver.js +370 -0
  181. package/dist/core/package-manager.js +1485 -0
  182. package/dist/core/prompt-templates.js +253 -0
  183. package/dist/core/resolve-config-value.js +59 -0
  184. package/dist/core/resource-loader.js +700 -0
  185. package/dist/core/sdk.js +197 -0
  186. package/dist/core/session-bash.js +99 -0
  187. package/dist/core/session-compaction.js +165 -0
  188. package/dist/core/session-manager.js +1153 -0
  189. package/dist/core/session-models.js +99 -0
  190. package/dist/core/session-retry.js +155 -0
  191. package/dist/core/settings-manager.js +572 -0
  192. package/dist/core/skills.js +382 -0
  193. package/dist/core/slash-commands.js +31 -0
  194. package/dist/core/system-prompt.js +161 -0
  195. package/dist/core/theme.js +770 -0
  196. package/dist/core/timings.js +26 -0
  197. package/dist/core/tools/bash.js +258 -0
  198. package/dist/core/tools/edit-diff.js +245 -0
  199. package/dist/core/tools/edit.js +148 -0
  200. package/dist/core/tools/find.js +208 -0
  201. package/dist/core/tools/grep.js +246 -0
  202. package/dist/core/tools/index.js +67 -0
  203. package/dist/core/tools/ls.js +123 -0
  204. package/dist/core/tools/path-utils.js +81 -0
  205. package/dist/core/tools/read.js +160 -0
  206. package/dist/core/tools/truncate.js +70 -0
  207. package/dist/core/tools/write.js +82 -0
  208. package/dist/custom/agents/action.js +13 -0
  209. package/dist/custom/agents/document-reader.js +70 -0
  210. package/dist/custom/agents/general.js +26 -0
  211. package/dist/custom/agents/index.js +49 -0
  212. package/dist/custom/agents/installation.js +13 -0
  213. package/dist/custom/agents/types.js +7 -0
  214. package/dist/custom/auth/refresh-timer.js +33 -0
  215. package/dist/custom/auth/shortcut-oauth.js +145 -0
  216. package/dist/custom/constants.js +21 -0
  217. package/dist/custom/context/workbook-summary.js +73 -0
  218. package/dist/custom/credits/shortcut-credits.js +29 -0
  219. package/dist/custom/cron/cron-daemon-entry.js +18 -0
  220. package/dist/custom/cron/daemon-ipc.js +131 -0
  221. package/dist/custom/cron/daemon.js +224 -0
  222. package/dist/custom/cron/jobs.js +226 -0
  223. package/dist/custom/cron/run-log.js +51 -0
  224. package/dist/custom/cron/schedule.js +72 -0
  225. package/dist/custom/cron/status-line.js +98 -0
  226. package/dist/custom/cron/store.js +87 -0
  227. package/dist/custom/cron/types.js +8 -0
  228. package/dist/custom/dev/index.js +59 -0
  229. package/dist/custom/dev/trace-export.js +58 -0
  230. package/dist/custom/ensure-excel.js +63 -0
  231. package/dist/custom/excel-config.js +36 -0
  232. package/dist/custom/preflight.js +422 -0
  233. package/dist/custom/prompts/action.js +100 -0
  234. package/dist/custom/prompts/api.js +66 -0
  235. package/dist/custom/prompts/installation.js +124 -0
  236. package/dist/custom/prompts/shared.js +138 -0
  237. package/dist/custom/providers/llm-usage.js +42 -0
  238. package/dist/custom/providers/message-converter.js +74 -0
  239. package/dist/custom/providers/provider-ids.js +9 -0
  240. package/dist/custom/providers/register-openai-codex-provider.js +27 -0
  241. package/dist/custom/providers/register-shortcut-provider.js +52 -0
  242. package/dist/custom/providers/shortcut-invoke.js +117 -0
  243. package/dist/custom/providers/shortcut-stream.js +252 -0
  244. package/dist/custom/providers/sse-protocol.js +38 -0
  245. package/dist/custom/sync-xll.js +130 -0
  246. package/dist/custom/tools/cron.js +413 -0
  247. package/dist/custom/tools/excel-exec.js +167 -0
  248. package/dist/custom/tools/excel-range.js +50 -0
  249. package/dist/custom/tools/llm-analysis.js +265 -0
  250. package/dist/custom/tools/render-helpers.js +38 -0
  251. package/dist/custom/tools/switch-mode.js +94 -0
  252. package/dist/custom/tools/task/agents.js +6 -0
  253. package/dist/custom/tools/task/index.js +8 -0
  254. package/dist/custom/tools/task/render.js +348 -0
  255. package/dist/custom/tools/task/subprocess.js +320 -0
  256. package/dist/custom/tools/task/task.js +205 -0
  257. package/dist/custom/tools/todo-list.js +195 -0
  258. package/dist/custom/tracing/session-upload.js +93 -0
  259. package/dist/index.js +45 -0
  260. package/dist/main.js +613 -0
  261. package/dist/migrations.js +265 -0
  262. package/dist/modes/index.js +8 -0
  263. package/dist/modes/interactive/components/armin.js +337 -0
  264. package/dist/modes/interactive/components/assistant-message.js +94 -0
  265. package/dist/modes/interactive/components/bash-execution.js +171 -0
  266. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  267. package/dist/modes/interactive/components/branch-summary-message.js +45 -0
  268. package/dist/modes/interactive/components/compaction-summary-message.js +46 -0
  269. package/dist/modes/interactive/components/config-selector.js +488 -0
  270. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  271. package/dist/modes/interactive/components/custom-editor.js +93 -0
  272. package/dist/modes/interactive/components/custom-message.js +81 -0
  273. package/dist/modes/interactive/components/daxnuts.js +140 -0
  274. package/dist/modes/interactive/components/diff.js +133 -0
  275. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  276. package/dist/modes/interactive/components/extension-editor.js +105 -0
  277. package/dist/modes/interactive/components/extension-input.js +61 -0
  278. package/dist/modes/interactive/components/extension-selector.js +78 -0
  279. package/dist/modes/interactive/components/footer.js +309 -0
  280. package/dist/modes/interactive/components/index.js +33 -0
  281. package/dist/modes/interactive/components/keybinding-hints.js +61 -0
  282. package/dist/modes/interactive/components/layout.js +64 -0
  283. package/dist/modes/interactive/components/login-dialog.js +148 -0
  284. package/dist/modes/interactive/components/model-selector.js +237 -0
  285. package/dist/modes/interactive/components/oauth-selector.js +111 -0
  286. package/dist/modes/interactive/components/session-selector-search.js +157 -0
  287. package/dist/modes/interactive/components/session-selector.js +860 -0
  288. package/dist/modes/interactive/components/settings-selector.js +123 -0
  289. package/dist/modes/interactive/components/show-images-selector.js +35 -0
  290. package/dist/modes/interactive/components/skill-invocation-message.js +48 -0
  291. package/dist/modes/interactive/components/theme-selector.js +47 -0
  292. package/dist/modes/interactive/components/thinking-selector.js +47 -0
  293. package/dist/modes/interactive/components/tool-execution.js +789 -0
  294. package/dist/modes/interactive/components/tool-group.js +106 -0
  295. package/dist/modes/interactive/components/tree-selector.js +962 -0
  296. package/dist/modes/interactive/components/user-message-selector.js +115 -0
  297. package/dist/modes/interactive/components/user-message.js +48 -0
  298. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  299. package/dist/modes/interactive/file-attachments.js +135 -0
  300. package/dist/modes/interactive/interactive-mode.js +3775 -0
  301. package/dist/modes/interactive/theme/dark.json +85 -0
  302. package/dist/modes/interactive/theme/light.json +85 -0
  303. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  304. package/dist/modes/interactive/theme/theme.js +177 -0
  305. package/dist/modes/print-mode.js +101 -0
  306. package/dist/modes/rpc/rpc-client.js +387 -0
  307. package/dist/modes/rpc/rpc-mode.js +509 -0
  308. package/dist/modes/rpc/rpc-types.js +8 -0
  309. package/dist/subagent-entry.js +145 -0
  310. package/dist/tool-names.js +34 -0
  311. package/dist/tui/autocomplete.js +596 -0
  312. package/dist/tui/components/box.js +104 -0
  313. package/dist/tui/components/cancellable-loader.js +35 -0
  314. package/dist/tui/components/editor.js +1679 -0
  315. package/dist/tui/components/image.js +69 -0
  316. package/dist/tui/components/input.js +433 -0
  317. package/dist/tui/components/loader.js +49 -0
  318. package/dist/tui/components/markdown.js +629 -0
  319. package/dist/tui/components/select-list.js +152 -0
  320. package/dist/tui/components/settings-list.js +185 -0
  321. package/dist/tui/components/spacer.js +23 -0
  322. package/dist/tui/components/text.js +89 -0
  323. package/dist/tui/components/truncated-text.js +51 -0
  324. package/dist/tui/editor-component.js +2 -0
  325. package/dist/tui/fuzzy.js +107 -0
  326. package/dist/tui/get-east-asian-width/index.js +32 -0
  327. package/dist/tui/get-east-asian-width/lookup.js +404 -0
  328. package/dist/tui/index.js +32 -0
  329. package/dist/tui/keybindings.js +114 -0
  330. package/dist/tui/keys.js +959 -0
  331. package/dist/tui/kill-ring.js +44 -0
  332. package/dist/tui/stdin-buffer.js +317 -0
  333. package/dist/tui/terminal-image.js +288 -0
  334. package/dist/tui/terminal.js +249 -0
  335. package/dist/tui/tui/autocomplete.js +596 -0
  336. package/dist/tui/tui/components/box.js +106 -0
  337. package/dist/tui/tui/components/cancellable-loader.js +35 -0
  338. package/dist/tui/tui/components/editor.js +1679 -0
  339. package/dist/tui/tui/components/image.js +69 -0
  340. package/dist/tui/tui/components/input.js +433 -0
  341. package/dist/tui/tui/components/loader.js +49 -0
  342. package/dist/tui/tui/components/markdown.js +629 -0
  343. package/dist/tui/tui/components/select-list.js +152 -0
  344. package/dist/tui/tui/components/settings-list.js +185 -0
  345. package/dist/tui/tui/components/spacer.js +23 -0
  346. package/dist/tui/tui/components/text.js +91 -0
  347. package/dist/tui/tui/components/truncated-text.js +51 -0
  348. package/dist/tui/tui/editor-component.js +2 -0
  349. package/dist/tui/tui/fuzzy.js +107 -0
  350. package/dist/tui/tui/get-east-asian-width/index.js +32 -0
  351. package/dist/tui/tui/get-east-asian-width/lookup.js +404 -0
  352. package/dist/tui/tui/index.js +32 -0
  353. package/dist/tui/tui/keybindings.js +114 -0
  354. package/dist/tui/tui/keys.js +959 -0
  355. package/dist/tui/tui/kill-ring.js +44 -0
  356. package/dist/tui/tui/stdin-buffer.js +317 -0
  357. package/dist/tui/tui/terminal-image.js +288 -0
  358. package/dist/tui/tui/terminal.js +249 -0
  359. package/dist/tui/tui/tui.js +955 -0
  360. package/dist/tui/tui/undo-stack.js +25 -0
  361. package/dist/tui/tui/utils.js +800 -0
  362. package/dist/tui/tui.js +955 -0
  363. package/dist/tui/undo-stack.js +25 -0
  364. package/dist/tui/utils.js +800 -0
  365. package/dist/utils/changelog.js +87 -0
  366. package/dist/utils/clipboard-image.js +164 -0
  367. package/dist/utils/clipboard-native.js +14 -0
  368. package/dist/utils/clipboard.js +67 -0
  369. package/dist/utils/frontmatter.js +26 -0
  370. package/dist/utils/git.js +166 -0
  371. package/dist/utils/image-convert.js +35 -0
  372. package/dist/utils/image-resize.js +183 -0
  373. package/dist/utils/mime.js +26 -0
  374. package/dist/utils/photon.js +121 -0
  375. package/dist/utils/shell.js +217 -0
  376. package/dist/utils/sleep.js +17 -0
  377. package/dist/utils/tools-manager.js +259 -0
  378. package/package.json +78 -0
  379. package/skills/excel-com-api/SKILL.md +74 -0
  380. package/skills/excel-com-api/excel-type-library.py +27767 -0
  381. package/skills/excel-com-api/office-type-library.py +10867 -0
  382. package/skills/integrations/SKILL.md +138 -0
  383. package/skills/integrations/alphasense.md +457 -0
  384. package/skills/integrations/bloomberg.md +803 -0
  385. package/skills/integrations/calcbench.md +315 -0
  386. package/skills/integrations/capiq.md +848 -0
  387. package/skills/integrations/dynamics-365-finance.md +354 -0
  388. package/skills/integrations/earnings_transcripts.md +387 -0
  389. package/skills/integrations/factset.md +758 -0
  390. package/skills/integrations/ice-fixed-income.md +344 -0
  391. package/skills/integrations/moodys-analytics.md +313 -0
  392. package/skills/integrations/morningstar.md +433 -0
  393. package/skills/integrations/nasdaq-data-link.md +249 -0
  394. package/skills/integrations/pitchbook.md +413 -0
  395. package/skills/integrations/preqin.md +422 -0
  396. package/skills/integrations/quickbooks.md +289 -0
  397. package/skills/integrations/quickfs.md +314 -0
  398. package/skills/integrations/refinitiv.md +473 -0
  399. package/skills/integrations/sage-intacct.md +401 -0
  400. package/skills/integrations/visible-alpha.md +320 -0
  401. package/skills/integrations/xero.md +393 -0
  402. package/skills/integrations/ycharts.md +306 -0
  403. package/skills/pdf-creation/SKILL.md +93 -0
  404. package/skills/pdf-extraction/SKILL.md +32 -0
  405. package/skills/powerpoint-creation/SKILL.md +110 -0
  406. package/skills/sec-edgar/SKILL.md +127 -0
  407. package/skills/sec-edgar/sec_to_pdf.py +109 -0
  408. package/xll/ShortcutXL.xll +0 -0
  409. package/xll/modules/debug_render.py +272 -0
  410. package/xll/modules/gameboy.py +241 -0
  411. package/xll/modules/pong.py +188 -0
  412. package/xll/modules/shortcut_xl/__init__.py +18 -0
  413. package/xll/modules/shortcut_xl/_categorize.py +200 -0
  414. package/xll/modules/shortcut_xl/_com.py +108 -0
  415. package/xll/modules/shortcut_xl/_format.py +252 -0
  416. package/xll/modules/shortcut_xl/_log.py +12 -0
  417. package/xll/modules/shortcut_xl/_managed.py +116 -0
  418. package/xll/modules/shortcut_xl/_registry.py +44 -0
  419. package/xll/modules/shortcut_xl/_threading.py +161 -0
  420. package/xll/modules/shortcut_xl/_tracking.py +283 -0
  421. package/xll/modules/stocks.py +100 -0
  422. package/xll/python3.dll +0 -0
  423. package/xll/python312.dll +0 -0
@@ -0,0 +1,651 @@
1
+ /**
2
+ * Extension runner - executes extensions and manages their lifecycle.
3
+ */
4
+ import { theme } from '../theme.js';
5
+ // Keybindings for these actions cannot be overridden by extensions
6
+ const RESERVED_ACTIONS_FOR_EXTENSION_CONFLICTS = [
7
+ 'interrupt',
8
+ 'clear',
9
+ 'exit',
10
+ 'suspend',
11
+ 'cycleThinkingLevel',
12
+ 'cycleModelForward',
13
+ 'cycleModelBackward',
14
+ 'selectModel',
15
+ 'expandTools',
16
+ 'toggleThinking',
17
+ 'externalEditor',
18
+ 'followUp',
19
+ 'submit',
20
+ 'selectConfirm',
21
+ 'selectCancel',
22
+ 'copy',
23
+ 'deleteToLineEnd'
24
+ ];
25
+ const buildBuiltinKeybindings = (effectiveKeybindings) => {
26
+ const builtinKeybindings = {};
27
+ for (const [action, keys] of Object.entries(effectiveKeybindings)) {
28
+ const keyAction = action;
29
+ const keyList = Array.isArray(keys) ? keys : [keys];
30
+ const restrictOverride = RESERVED_ACTIONS_FOR_EXTENSION_CONFLICTS.includes(keyAction);
31
+ for (const key of keyList) {
32
+ const normalizedKey = key.toLowerCase();
33
+ builtinKeybindings[normalizedKey] = {
34
+ action: keyAction,
35
+ restrictOverride: restrictOverride
36
+ };
37
+ }
38
+ }
39
+ return builtinKeybindings;
40
+ };
41
+ /**
42
+ * Helper function to emit session_shutdown event to extensions.
43
+ * Returns true if the event was emitted, false if there were no handlers.
44
+ */
45
+ export async function emitSessionShutdownEvent(extensionRunner) {
46
+ if (extensionRunner?.hasHandlers('session_shutdown')) {
47
+ await extensionRunner.emit({
48
+ type: 'session_shutdown'
49
+ });
50
+ return true;
51
+ }
52
+ return false;
53
+ }
54
+ const noOpUIContext = {
55
+ select: async () => undefined,
56
+ confirm: async () => false,
57
+ input: async () => undefined,
58
+ notify: () => { },
59
+ onTerminalInput: () => () => { },
60
+ setStatus: () => { },
61
+ setWorkingMessage: () => { },
62
+ setWidget: () => { },
63
+ setFooter: () => { },
64
+ setHeader: () => { },
65
+ setTitle: () => { },
66
+ custom: async () => undefined,
67
+ pasteToEditor: () => { },
68
+ setEditorText: () => { },
69
+ getEditorText: () => '',
70
+ editor: async () => undefined,
71
+ setEditorComponent: () => { },
72
+ get theme() {
73
+ return theme;
74
+ },
75
+ getAllThemes: () => [],
76
+ getTheme: () => undefined,
77
+ setTheme: (_theme) => ({ success: false, error: 'UI not available' }),
78
+ getToolsExpanded: () => false,
79
+ setToolsExpanded: () => { }
80
+ };
81
+ export class ExtensionRunner {
82
+ extensions;
83
+ runtime;
84
+ uiContext;
85
+ cwd;
86
+ sessionManager;
87
+ modelRegistry;
88
+ errorListeners = new Set();
89
+ getModel = () => undefined;
90
+ isIdleFn = () => true;
91
+ waitForIdleFn = async () => { };
92
+ abortFn = () => { };
93
+ hasPendingMessagesFn = () => false;
94
+ getContextUsageFn = () => undefined;
95
+ compactFn = () => { };
96
+ getSystemPromptFn = () => '';
97
+ newSessionHandler = async () => ({ cancelled: false });
98
+ forkHandler = async () => ({ cancelled: false });
99
+ navigateTreeHandler = async () => ({ cancelled: false });
100
+ switchSessionHandler = async () => ({ cancelled: false });
101
+ reloadHandler = async () => { };
102
+ shutdownHandler = () => { };
103
+ shortcutDiagnostics = [];
104
+ commandDiagnostics = [];
105
+ constructor(extensions, runtime, cwd, sessionManager, modelRegistry) {
106
+ this.extensions = extensions;
107
+ this.runtime = runtime;
108
+ this.uiContext = noOpUIContext;
109
+ this.cwd = cwd;
110
+ this.sessionManager = sessionManager;
111
+ this.modelRegistry = modelRegistry;
112
+ }
113
+ bindCore(actions, contextActions) {
114
+ // Copy actions into the shared runtime (all extension APIs reference this)
115
+ this.runtime.sendMessage = actions.sendMessage;
116
+ this.runtime.sendUserMessage = actions.sendUserMessage;
117
+ this.runtime.appendEntry = actions.appendEntry;
118
+ this.runtime.setSessionName = actions.setSessionName;
119
+ this.runtime.getSessionName = actions.getSessionName;
120
+ this.runtime.setLabel = actions.setLabel;
121
+ this.runtime.getActiveTools = actions.getActiveTools;
122
+ this.runtime.getAllTools = actions.getAllTools;
123
+ this.runtime.setActiveTools = actions.setActiveTools;
124
+ this.runtime.refreshTools = actions.refreshTools;
125
+ this.runtime.getCommands = actions.getCommands;
126
+ this.runtime.setModel = actions.setModel;
127
+ this.runtime.getThinkingLevel = actions.getThinkingLevel;
128
+ this.runtime.setThinkingLevel = actions.setThinkingLevel;
129
+ // Context actions (required)
130
+ this.getModel = contextActions.getModel;
131
+ this.isIdleFn = contextActions.isIdle;
132
+ this.abortFn = contextActions.abort;
133
+ this.hasPendingMessagesFn = contextActions.hasPendingMessages;
134
+ this.shutdownHandler = contextActions.shutdown;
135
+ this.getContextUsageFn = contextActions.getContextUsage;
136
+ this.compactFn = contextActions.compact;
137
+ this.getSystemPromptFn = contextActions.getSystemPrompt;
138
+ // Flush provider registrations queued during extension loading
139
+ for (const { name, config } of this.runtime.pendingProviderRegistrations) {
140
+ this.modelRegistry.registerProvider(name, config);
141
+ }
142
+ this.runtime.pendingProviderRegistrations = [];
143
+ // From this point on, provider registration/unregistration takes effect immediately
144
+ // without requiring a /reload.
145
+ this.runtime.registerProvider = (name, config) => this.modelRegistry.registerProvider(name, config);
146
+ this.runtime.unregisterProvider = (name) => this.modelRegistry.unregisterProvider(name);
147
+ }
148
+ bindCommandContext(actions) {
149
+ if (actions) {
150
+ this.waitForIdleFn = actions.waitForIdle;
151
+ this.newSessionHandler = actions.newSession;
152
+ this.forkHandler = actions.fork;
153
+ this.navigateTreeHandler = actions.navigateTree;
154
+ this.switchSessionHandler = actions.switchSession;
155
+ this.reloadHandler = actions.reload;
156
+ return;
157
+ }
158
+ this.waitForIdleFn = async () => { };
159
+ this.newSessionHandler = async () => ({ cancelled: false });
160
+ this.forkHandler = async () => ({ cancelled: false });
161
+ this.navigateTreeHandler = async () => ({ cancelled: false });
162
+ this.switchSessionHandler = async () => ({ cancelled: false });
163
+ this.reloadHandler = async () => { };
164
+ }
165
+ setUIContext(uiContext) {
166
+ this.uiContext = uiContext ?? noOpUIContext;
167
+ }
168
+ getUIContext() {
169
+ return this.uiContext;
170
+ }
171
+ hasUI() {
172
+ return this.uiContext !== noOpUIContext;
173
+ }
174
+ getExtensionPaths() {
175
+ return this.extensions.map((e) => e.path);
176
+ }
177
+ /** Get all registered tools from all extensions (first registration per name wins). */
178
+ getAllRegisteredTools() {
179
+ const toolsByName = new Map();
180
+ for (const ext of this.extensions) {
181
+ for (const tool of ext.tools.values()) {
182
+ if (!toolsByName.has(tool.definition.name)) {
183
+ toolsByName.set(tool.definition.name, tool);
184
+ }
185
+ }
186
+ }
187
+ return Array.from(toolsByName.values());
188
+ }
189
+ /** Get a tool definition by name. Returns undefined if not found. */
190
+ getToolDefinition(toolName) {
191
+ for (const ext of this.extensions) {
192
+ const tool = ext.tools.get(toolName);
193
+ if (tool) {
194
+ return tool.definition;
195
+ }
196
+ }
197
+ return undefined;
198
+ }
199
+ getFlags() {
200
+ const allFlags = new Map();
201
+ for (const ext of this.extensions) {
202
+ for (const [name, flag] of ext.flags) {
203
+ if (!allFlags.has(name)) {
204
+ allFlags.set(name, flag);
205
+ }
206
+ }
207
+ }
208
+ return allFlags;
209
+ }
210
+ setFlagValue(name, value) {
211
+ this.runtime.flagValues.set(name, value);
212
+ }
213
+ getFlagValues() {
214
+ return new Map(this.runtime.flagValues);
215
+ }
216
+ getShortcuts(effectiveKeybindings) {
217
+ this.shortcutDiagnostics = [];
218
+ const builtinKeybindings = buildBuiltinKeybindings(effectiveKeybindings);
219
+ const extensionShortcuts = new Map();
220
+ const addDiagnostic = (message, extensionPath) => {
221
+ this.shortcutDiagnostics.push({ type: 'warning', message, path: extensionPath });
222
+ if (!this.hasUI()) {
223
+ console.warn(message);
224
+ }
225
+ };
226
+ for (const ext of this.extensions) {
227
+ for (const [key, shortcut] of ext.shortcuts) {
228
+ const normalizedKey = key.toLowerCase();
229
+ const builtInKeybinding = builtinKeybindings[normalizedKey];
230
+ if (builtInKeybinding?.restrictOverride === true) {
231
+ addDiagnostic(`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`, shortcut.extensionPath);
232
+ continue;
233
+ }
234
+ if (builtInKeybinding?.restrictOverride === false) {
235
+ addDiagnostic(`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.action} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`, shortcut.extensionPath);
236
+ }
237
+ const existingExtensionShortcut = extensionShortcuts.get(normalizedKey);
238
+ if (existingExtensionShortcut) {
239
+ addDiagnostic(`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`, shortcut.extensionPath);
240
+ }
241
+ extensionShortcuts.set(normalizedKey, shortcut);
242
+ }
243
+ }
244
+ return extensionShortcuts;
245
+ }
246
+ getShortcutDiagnostics() {
247
+ return this.shortcutDiagnostics;
248
+ }
249
+ onError(listener) {
250
+ this.errorListeners.add(listener);
251
+ return () => this.errorListeners.delete(listener);
252
+ }
253
+ emitError(error) {
254
+ for (const listener of this.errorListeners) {
255
+ listener(error);
256
+ }
257
+ }
258
+ hasHandlers(eventType) {
259
+ for (const ext of this.extensions) {
260
+ const handlers = ext.handlers.get(eventType);
261
+ if (handlers && handlers.length > 0) {
262
+ return true;
263
+ }
264
+ }
265
+ return false;
266
+ }
267
+ getMessageRenderer(customType) {
268
+ for (const ext of this.extensions) {
269
+ const renderer = ext.messageRenderers.get(customType);
270
+ if (renderer) {
271
+ return renderer;
272
+ }
273
+ }
274
+ return undefined;
275
+ }
276
+ getRegisteredCommands(reserved) {
277
+ this.commandDiagnostics = [];
278
+ const commands = [];
279
+ const commandOwners = new Map();
280
+ for (const ext of this.extensions) {
281
+ for (const command of ext.commands.values()) {
282
+ if (reserved?.has(command.name)) {
283
+ const message = `Extension command '${command.name}' from ${ext.path} conflicts with built-in commands. Skipping.`;
284
+ this.commandDiagnostics.push({ type: 'warning', message, path: ext.path });
285
+ if (!this.hasUI()) {
286
+ console.warn(message);
287
+ }
288
+ continue;
289
+ }
290
+ const existingOwner = commandOwners.get(command.name);
291
+ if (existingOwner) {
292
+ const message = `Extension command '${command.name}' from ${ext.path} conflicts with ${existingOwner}. Skipping.`;
293
+ this.commandDiagnostics.push({ type: 'warning', message, path: ext.path });
294
+ if (!this.hasUI()) {
295
+ console.warn(message);
296
+ }
297
+ continue;
298
+ }
299
+ commandOwners.set(command.name, ext.path);
300
+ commands.push(command);
301
+ }
302
+ }
303
+ return commands;
304
+ }
305
+ getCommandDiagnostics() {
306
+ return this.commandDiagnostics;
307
+ }
308
+ getRegisteredCommandsWithPaths() {
309
+ const result = [];
310
+ for (const ext of this.extensions) {
311
+ for (const command of ext.commands.values()) {
312
+ result.push({ command, extensionPath: ext.path });
313
+ }
314
+ }
315
+ return result;
316
+ }
317
+ getCommand(name) {
318
+ for (const ext of this.extensions) {
319
+ const command = ext.commands.get(name);
320
+ if (command) {
321
+ return command;
322
+ }
323
+ }
324
+ return undefined;
325
+ }
326
+ /**
327
+ * Request a graceful shutdown. Called by extension tools and event handlers.
328
+ * The actual shutdown behavior is provided by the mode via bindExtensions().
329
+ */
330
+ shutdown() {
331
+ this.shutdownHandler();
332
+ }
333
+ /**
334
+ * Create an ExtensionContext for use in event handlers and tool execution.
335
+ * Context values are resolved at call time, so changes via bindCore/bindUI are reflected.
336
+ */
337
+ createContext() {
338
+ const getModel = this.getModel;
339
+ return {
340
+ ui: this.uiContext,
341
+ hasUI: this.hasUI(),
342
+ cwd: this.cwd,
343
+ sessionManager: this.sessionManager,
344
+ modelRegistry: this.modelRegistry,
345
+ get model() {
346
+ return getModel();
347
+ },
348
+ isIdle: () => this.isIdleFn(),
349
+ abort: () => this.abortFn(),
350
+ hasPendingMessages: () => this.hasPendingMessagesFn(),
351
+ shutdown: () => this.shutdownHandler(),
352
+ getContextUsage: () => this.getContextUsageFn(),
353
+ compact: (options) => this.compactFn(options),
354
+ getSystemPrompt: () => this.getSystemPromptFn()
355
+ };
356
+ }
357
+ createCommandContext() {
358
+ return {
359
+ ...this.createContext(),
360
+ waitForIdle: () => this.waitForIdleFn(),
361
+ newSession: (options) => this.newSessionHandler(options),
362
+ fork: (entryId) => this.forkHandler(entryId),
363
+ navigateTree: (targetId, options) => this.navigateTreeHandler(targetId, options),
364
+ switchSession: (sessionPath) => this.switchSessionHandler(sessionPath),
365
+ reload: () => this.reloadHandler()
366
+ };
367
+ }
368
+ isSessionBeforeEvent(event) {
369
+ return (event.type === 'session_before_switch' ||
370
+ event.type === 'session_before_fork' ||
371
+ event.type === 'session_before_compact' ||
372
+ event.type === 'session_before_tree');
373
+ }
374
+ async emit(event) {
375
+ const ctx = this.createContext();
376
+ let result;
377
+ for (const ext of this.extensions) {
378
+ const handlers = ext.handlers.get(event.type);
379
+ if (!handlers || handlers.length === 0)
380
+ continue;
381
+ for (const handler of handlers) {
382
+ try {
383
+ const handlerResult = await handler(event, ctx);
384
+ if (this.isSessionBeforeEvent(event) && handlerResult) {
385
+ result = handlerResult;
386
+ if (result.cancel) {
387
+ return result;
388
+ }
389
+ }
390
+ }
391
+ catch (err) {
392
+ const message = err instanceof Error ? err.message : String(err);
393
+ const stack = err instanceof Error ? err.stack : undefined;
394
+ this.emitError({
395
+ extensionPath: ext.path,
396
+ event: event.type,
397
+ error: message,
398
+ stack
399
+ });
400
+ }
401
+ }
402
+ }
403
+ return result;
404
+ }
405
+ async emitToolResult(event) {
406
+ const ctx = this.createContext();
407
+ const currentEvent = { ...event };
408
+ let modified = false;
409
+ for (const ext of this.extensions) {
410
+ const handlers = ext.handlers.get('tool_result');
411
+ if (!handlers || handlers.length === 0)
412
+ continue;
413
+ for (const handler of handlers) {
414
+ try {
415
+ const handlerResult = (await handler(currentEvent, ctx));
416
+ if (!handlerResult)
417
+ continue;
418
+ if (handlerResult.content !== undefined) {
419
+ currentEvent.content = handlerResult.content;
420
+ modified = true;
421
+ }
422
+ if (handlerResult.details !== undefined) {
423
+ currentEvent.details = handlerResult.details;
424
+ modified = true;
425
+ }
426
+ if (handlerResult.isError !== undefined) {
427
+ currentEvent.isError = handlerResult.isError;
428
+ modified = true;
429
+ }
430
+ }
431
+ catch (err) {
432
+ const message = err instanceof Error ? err.message : String(err);
433
+ const stack = err instanceof Error ? err.stack : undefined;
434
+ this.emitError({
435
+ extensionPath: ext.path,
436
+ event: 'tool_result',
437
+ error: message,
438
+ stack
439
+ });
440
+ }
441
+ }
442
+ }
443
+ if (!modified) {
444
+ return undefined;
445
+ }
446
+ return {
447
+ content: currentEvent.content,
448
+ details: currentEvent.details,
449
+ isError: currentEvent.isError
450
+ };
451
+ }
452
+ async emitToolCall(event) {
453
+ const ctx = this.createContext();
454
+ let result;
455
+ for (const ext of this.extensions) {
456
+ const handlers = ext.handlers.get('tool_call');
457
+ if (!handlers || handlers.length === 0)
458
+ continue;
459
+ for (const handler of handlers) {
460
+ const handlerResult = await handler(event, ctx);
461
+ if (handlerResult) {
462
+ result = handlerResult;
463
+ if (result.block) {
464
+ return result;
465
+ }
466
+ }
467
+ }
468
+ }
469
+ return result;
470
+ }
471
+ async emitUserBash(event) {
472
+ const ctx = this.createContext();
473
+ for (const ext of this.extensions) {
474
+ const handlers = ext.handlers.get('user_bash');
475
+ if (!handlers || handlers.length === 0)
476
+ continue;
477
+ for (const handler of handlers) {
478
+ try {
479
+ const handlerResult = await handler(event, ctx);
480
+ if (handlerResult) {
481
+ return handlerResult;
482
+ }
483
+ }
484
+ catch (err) {
485
+ const message = err instanceof Error ? err.message : String(err);
486
+ const stack = err instanceof Error ? err.stack : undefined;
487
+ this.emitError({
488
+ extensionPath: ext.path,
489
+ event: 'user_bash',
490
+ error: message,
491
+ stack
492
+ });
493
+ }
494
+ }
495
+ }
496
+ return undefined;
497
+ }
498
+ async emitContext(messages) {
499
+ const ctx = this.createContext();
500
+ let currentMessages = structuredClone(messages);
501
+ for (const ext of this.extensions) {
502
+ const handlers = ext.handlers.get('context');
503
+ if (!handlers || handlers.length === 0)
504
+ continue;
505
+ for (const handler of handlers) {
506
+ try {
507
+ const event = { type: 'context', messages: currentMessages };
508
+ const handlerResult = await handler(event, ctx);
509
+ if (handlerResult && handlerResult.messages) {
510
+ currentMessages = handlerResult.messages;
511
+ }
512
+ }
513
+ catch (err) {
514
+ const message = err instanceof Error ? err.message : String(err);
515
+ const stack = err instanceof Error ? err.stack : undefined;
516
+ this.emitError({
517
+ extensionPath: ext.path,
518
+ event: 'context',
519
+ error: message,
520
+ stack
521
+ });
522
+ }
523
+ }
524
+ }
525
+ return currentMessages;
526
+ }
527
+ async emitBeforeAgentStart(prompt, images, systemPrompt) {
528
+ const ctx = this.createContext();
529
+ const messages = [];
530
+ let currentSystemPrompt = systemPrompt;
531
+ let systemPromptModified = false;
532
+ for (const ext of this.extensions) {
533
+ const handlers = ext.handlers.get('before_agent_start');
534
+ if (!handlers || handlers.length === 0)
535
+ continue;
536
+ for (const handler of handlers) {
537
+ try {
538
+ const event = {
539
+ type: 'before_agent_start',
540
+ prompt,
541
+ images,
542
+ systemPrompt: currentSystemPrompt
543
+ };
544
+ const handlerResult = await handler(event, ctx);
545
+ if (handlerResult) {
546
+ const result = handlerResult;
547
+ if (result.message) {
548
+ messages.push(result.message);
549
+ }
550
+ if (result.systemPrompt !== undefined) {
551
+ currentSystemPrompt = result.systemPrompt;
552
+ systemPromptModified = true;
553
+ }
554
+ }
555
+ }
556
+ catch (err) {
557
+ const message = err instanceof Error ? err.message : String(err);
558
+ const stack = err instanceof Error ? err.stack : undefined;
559
+ this.emitError({
560
+ extensionPath: ext.path,
561
+ event: 'before_agent_start',
562
+ error: message,
563
+ stack
564
+ });
565
+ }
566
+ }
567
+ }
568
+ if (messages.length > 0 || systemPromptModified) {
569
+ return {
570
+ messages: messages.length > 0 ? messages : undefined,
571
+ systemPrompt: systemPromptModified ? currentSystemPrompt : undefined
572
+ };
573
+ }
574
+ return undefined;
575
+ }
576
+ async emitResourcesDiscover(cwd, reason) {
577
+ const ctx = this.createContext();
578
+ const skillPaths = [];
579
+ const promptPaths = [];
580
+ const themePaths = [];
581
+ for (const ext of this.extensions) {
582
+ const handlers = ext.handlers.get('resources_discover');
583
+ if (!handlers || handlers.length === 0)
584
+ continue;
585
+ for (const handler of handlers) {
586
+ try {
587
+ const event = { type: 'resources_discover', cwd, reason };
588
+ const handlerResult = await handler(event, ctx);
589
+ const result = handlerResult;
590
+ if (result?.skillPaths?.length) {
591
+ skillPaths.push(...result.skillPaths.map((path) => ({ path, extensionPath: ext.path })));
592
+ }
593
+ if (result?.promptPaths?.length) {
594
+ promptPaths.push(...result.promptPaths.map((path) => ({ path, extensionPath: ext.path })));
595
+ }
596
+ if (result?.themePaths?.length) {
597
+ themePaths.push(...result.themePaths.map((path) => ({ path, extensionPath: ext.path })));
598
+ }
599
+ }
600
+ catch (err) {
601
+ const message = err instanceof Error ? err.message : String(err);
602
+ const stack = err instanceof Error ? err.stack : undefined;
603
+ this.emitError({
604
+ extensionPath: ext.path,
605
+ event: 'resources_discover',
606
+ error: message,
607
+ stack
608
+ });
609
+ }
610
+ }
611
+ }
612
+ return { skillPaths, promptPaths, themePaths };
613
+ }
614
+ /** Emit input event. Transforms chain, "handled" short-circuits. */
615
+ async emitInput(text, images, source) {
616
+ const ctx = this.createContext();
617
+ let currentText = text;
618
+ let currentImages = images;
619
+ for (const ext of this.extensions) {
620
+ for (const handler of ext.handlers.get('input') ?? []) {
621
+ try {
622
+ const event = {
623
+ type: 'input',
624
+ text: currentText,
625
+ images: currentImages,
626
+ source
627
+ };
628
+ const result = (await handler(event, ctx));
629
+ if (result?.action === 'handled')
630
+ return result;
631
+ if (result?.action === 'transform') {
632
+ currentText = result.text;
633
+ currentImages = result.images ?? currentImages;
634
+ }
635
+ }
636
+ catch (err) {
637
+ this.emitError({
638
+ extensionPath: ext.path,
639
+ event: 'input',
640
+ error: err instanceof Error ? err.message : String(err),
641
+ stack: err instanceof Error ? err.stack : undefined
642
+ });
643
+ }
644
+ }
645
+ }
646
+ return currentText !== text || currentImages !== images
647
+ ? { action: 'transform', text: currentText, images: currentImages }
648
+ : { action: 'continue' };
649
+ }
650
+ }
651
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1,35 @@
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
+ // Type guards for ToolResultEvent
11
+ export function isBashToolResult(e) {
12
+ return e.toolName === 'bash';
13
+ }
14
+ export function isReadToolResult(e) {
15
+ return e.toolName === 'read';
16
+ }
17
+ export function isEditToolResult(e) {
18
+ return e.toolName === 'edit';
19
+ }
20
+ export function isWriteToolResult(e) {
21
+ return e.toolName === 'write';
22
+ }
23
+ export function isGrepToolResult(e) {
24
+ return e.toolName === 'grep';
25
+ }
26
+ export function isFindToolResult(e) {
27
+ return e.toolName === 'find';
28
+ }
29
+ export function isLsToolResult(e) {
30
+ return e.toolName === 'ls';
31
+ }
32
+ export function isToolCallEventType(toolName, event) {
33
+ return event.toolName === toolName;
34
+ }
35
+ //# sourceMappingURL=types.js.map