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,700 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve, sep } from 'node:path';
5
+ import { CONFIG_DIR_NAME, getAgentDir } from '../config.js';
6
+ import { loadThemeFromPath } from './theme.js';
7
+ import { createEventBus } from './event-bus.js';
8
+ import { createExtensionRuntime, loadExtensionFromFactory, loadExtensions } from './extensions/loader.js';
9
+ import { DefaultPackageManager } from './package-manager.js';
10
+ import { loadPromptTemplates } from './prompt-templates.js';
11
+ import { SettingsManager } from './settings-manager.js';
12
+ import { loadSkills } from './skills.js';
13
+ function resolvePromptInput(input, description) {
14
+ if (!input) {
15
+ return undefined;
16
+ }
17
+ if (existsSync(input)) {
18
+ try {
19
+ return readFileSync(input, 'utf-8');
20
+ }
21
+ catch (error) {
22
+ console.error(chalk.yellow(`Warning: Could not read ${description} file ${input}: ${error}`));
23
+ return input;
24
+ }
25
+ }
26
+ return input;
27
+ }
28
+ function loadContextFileFromDir(dir) {
29
+ const candidates = ['AGENTS.md', 'CLAUDE.md'];
30
+ for (const filename of candidates) {
31
+ const filePath = join(dir, filename);
32
+ if (existsSync(filePath)) {
33
+ try {
34
+ return {
35
+ path: filePath,
36
+ content: readFileSync(filePath, 'utf-8')
37
+ };
38
+ }
39
+ catch (error) {
40
+ console.error(chalk.yellow(`Warning: Could not read ${filePath}: ${error}`));
41
+ }
42
+ }
43
+ }
44
+ return null;
45
+ }
46
+ function loadProjectContextFiles(options = {}) {
47
+ const resolvedCwd = options.cwd ?? process.cwd();
48
+ const resolvedAgentDir = options.agentDir ?? getAgentDir();
49
+ const contextFiles = [];
50
+ const seenPaths = new Set();
51
+ const globalContext = loadContextFileFromDir(resolvedAgentDir);
52
+ if (globalContext) {
53
+ contextFiles.push(globalContext);
54
+ seenPaths.add(globalContext.path);
55
+ }
56
+ const ancestorContextFiles = [];
57
+ let currentDir = resolvedCwd;
58
+ const root = resolve('/');
59
+ while (true) {
60
+ const contextFile = loadContextFileFromDir(currentDir);
61
+ if (contextFile && !seenPaths.has(contextFile.path)) {
62
+ ancestorContextFiles.unshift(contextFile);
63
+ seenPaths.add(contextFile.path);
64
+ }
65
+ if (currentDir === root)
66
+ break;
67
+ const parentDir = resolve(currentDir, '..');
68
+ if (parentDir === currentDir)
69
+ break;
70
+ currentDir = parentDir;
71
+ }
72
+ contextFiles.push(...ancestorContextFiles);
73
+ return contextFiles;
74
+ }
75
+ export class DefaultResourceLoader {
76
+ cwd;
77
+ agentDir;
78
+ settingsManager;
79
+ eventBus;
80
+ packageManager;
81
+ additionalExtensionPaths;
82
+ additionalSkillPaths;
83
+ additionalPromptTemplatePaths;
84
+ additionalThemePaths;
85
+ extensionFactories;
86
+ noExtensions;
87
+ noSkills;
88
+ noPromptTemplates;
89
+ noThemes;
90
+ systemPromptSource;
91
+ appendSystemPromptSource;
92
+ extensionsOverride;
93
+ skillsOverride;
94
+ promptsOverride;
95
+ themesOverride;
96
+ agentsFilesOverride;
97
+ systemPromptOverride;
98
+ appendSystemPromptOverride;
99
+ extensionsResult;
100
+ skills;
101
+ skillDiagnostics;
102
+ prompts;
103
+ promptDiagnostics;
104
+ themes;
105
+ themeDiagnostics;
106
+ agentsFiles;
107
+ systemPrompt;
108
+ appendSystemPrompt;
109
+ pathMetadata;
110
+ lastSkillPaths;
111
+ lastPromptPaths;
112
+ lastThemePaths;
113
+ constructor(options) {
114
+ this.cwd = options.cwd ?? process.cwd();
115
+ this.agentDir = options.agentDir ?? getAgentDir();
116
+ this.settingsManager =
117
+ options.settingsManager ?? SettingsManager.create(this.cwd, this.agentDir);
118
+ this.eventBus = options.eventBus ?? createEventBus();
119
+ this.packageManager = new DefaultPackageManager({
120
+ cwd: this.cwd,
121
+ agentDir: this.agentDir,
122
+ settingsManager: this.settingsManager
123
+ });
124
+ this.additionalExtensionPaths = options.additionalExtensionPaths ?? [];
125
+ this.additionalSkillPaths = options.additionalSkillPaths ?? [];
126
+ this.additionalPromptTemplatePaths = options.additionalPromptTemplatePaths ?? [];
127
+ this.additionalThemePaths = options.additionalThemePaths ?? [];
128
+ this.extensionFactories = options.extensionFactories ?? [];
129
+ this.noExtensions = options.noExtensions ?? false;
130
+ this.noSkills = options.noSkills ?? false;
131
+ this.noPromptTemplates = options.noPromptTemplates ?? false;
132
+ this.noThemes = options.noThemes ?? false;
133
+ this.systemPromptSource = options.systemPrompt;
134
+ this.appendSystemPromptSource = options.appendSystemPrompt;
135
+ this.extensionsOverride = options.extensionsOverride;
136
+ this.skillsOverride = options.skillsOverride;
137
+ this.promptsOverride = options.promptsOverride;
138
+ this.themesOverride = options.themesOverride;
139
+ this.agentsFilesOverride = options.agentsFilesOverride;
140
+ this.systemPromptOverride = options.systemPromptOverride;
141
+ this.appendSystemPromptOverride = options.appendSystemPromptOverride;
142
+ this.extensionsResult = { extensions: [], errors: [], runtime: createExtensionRuntime() };
143
+ this.skills = [];
144
+ this.skillDiagnostics = [];
145
+ this.prompts = [];
146
+ this.promptDiagnostics = [];
147
+ this.themes = [];
148
+ this.themeDiagnostics = [];
149
+ this.agentsFiles = [];
150
+ this.appendSystemPrompt = [];
151
+ this.pathMetadata = new Map();
152
+ this.lastSkillPaths = [];
153
+ this.lastPromptPaths = [];
154
+ this.lastThemePaths = [];
155
+ }
156
+ getExtensions() {
157
+ return this.extensionsResult;
158
+ }
159
+ getSkills() {
160
+ return { skills: this.skills, diagnostics: this.skillDiagnostics };
161
+ }
162
+ getPrompts() {
163
+ return { prompts: this.prompts, diagnostics: this.promptDiagnostics };
164
+ }
165
+ getThemes() {
166
+ return { themes: this.themes, diagnostics: this.themeDiagnostics };
167
+ }
168
+ getAgentsFiles() {
169
+ return { agentsFiles: this.agentsFiles };
170
+ }
171
+ getSystemPrompt() {
172
+ return this.systemPrompt;
173
+ }
174
+ getAppendSystemPrompt() {
175
+ return this.appendSystemPrompt;
176
+ }
177
+ getPathMetadata() {
178
+ return this.pathMetadata;
179
+ }
180
+ extendResources(paths) {
181
+ const skillPaths = this.normalizeExtensionPaths(paths.skillPaths ?? []);
182
+ const promptPaths = this.normalizeExtensionPaths(paths.promptPaths ?? []);
183
+ const themePaths = this.normalizeExtensionPaths(paths.themePaths ?? []);
184
+ if (skillPaths.length > 0) {
185
+ this.lastSkillPaths = this.mergePaths(this.lastSkillPaths, skillPaths.map((entry) => entry.path));
186
+ this.updateSkillsFromPaths(this.lastSkillPaths, skillPaths);
187
+ }
188
+ if (promptPaths.length > 0) {
189
+ this.lastPromptPaths = this.mergePaths(this.lastPromptPaths, promptPaths.map((entry) => entry.path));
190
+ this.updatePromptsFromPaths(this.lastPromptPaths, promptPaths);
191
+ }
192
+ if (themePaths.length > 0) {
193
+ this.lastThemePaths = this.mergePaths(this.lastThemePaths, themePaths.map((entry) => entry.path));
194
+ this.updateThemesFromPaths(this.lastThemePaths, themePaths);
195
+ }
196
+ }
197
+ async reload() {
198
+ const resolvedPaths = await this.packageManager.resolve();
199
+ const cliExtensionPaths = await this.packageManager.resolveExtensionSources(this.additionalExtensionPaths, {
200
+ temporary: true
201
+ });
202
+ // Helper to extract enabled paths and store metadata
203
+ const getEnabledResources = (resources) => {
204
+ for (const r of resources) {
205
+ if (!this.pathMetadata.has(r.path)) {
206
+ this.pathMetadata.set(r.path, r.metadata);
207
+ }
208
+ }
209
+ return resources.filter((r) => r.enabled);
210
+ };
211
+ const getEnabledPaths = (resources) => getEnabledResources(resources).map((r) => r.path);
212
+ // Store metadata and get enabled paths
213
+ this.pathMetadata = new Map();
214
+ const enabledExtensions = getEnabledPaths(resolvedPaths.extensions);
215
+ const enabledSkillResources = getEnabledResources(resolvedPaths.skills);
216
+ const enabledPrompts = getEnabledPaths(resolvedPaths.prompts);
217
+ const enabledThemes = getEnabledPaths(resolvedPaths.themes);
218
+ const mapSkillPath = (resource) => {
219
+ if (resource.metadata.source !== 'auto' && resource.metadata.origin !== 'package') {
220
+ return resource.path;
221
+ }
222
+ try {
223
+ const stats = statSync(resource.path);
224
+ if (!stats.isDirectory()) {
225
+ return resource.path;
226
+ }
227
+ }
228
+ catch {
229
+ return resource.path;
230
+ }
231
+ const skillFile = join(resource.path, 'SKILL.md');
232
+ if (existsSync(skillFile)) {
233
+ if (!this.pathMetadata.has(skillFile)) {
234
+ this.pathMetadata.set(skillFile, resource.metadata);
235
+ }
236
+ return skillFile;
237
+ }
238
+ return resource.path;
239
+ };
240
+ const enabledSkills = enabledSkillResources.map(mapSkillPath);
241
+ // Add CLI paths metadata
242
+ for (const r of cliExtensionPaths.extensions) {
243
+ if (!this.pathMetadata.has(r.path)) {
244
+ this.pathMetadata.set(r.path, { source: 'cli', scope: 'temporary', origin: 'top-level' });
245
+ }
246
+ }
247
+ for (const r of cliExtensionPaths.skills) {
248
+ if (!this.pathMetadata.has(r.path)) {
249
+ this.pathMetadata.set(r.path, { source: 'cli', scope: 'temporary', origin: 'top-level' });
250
+ }
251
+ }
252
+ const cliEnabledExtensions = getEnabledPaths(cliExtensionPaths.extensions);
253
+ const cliEnabledSkills = getEnabledPaths(cliExtensionPaths.skills);
254
+ const cliEnabledPrompts = getEnabledPaths(cliExtensionPaths.prompts);
255
+ const cliEnabledThemes = getEnabledPaths(cliExtensionPaths.themes);
256
+ const extensionPaths = this.noExtensions
257
+ ? cliEnabledExtensions
258
+ : this.mergePaths(enabledExtensions, cliEnabledExtensions);
259
+ const extensionsResult = await loadExtensions(extensionPaths, this.cwd, this.eventBus);
260
+ const inlineExtensions = await this.loadExtensionFactories(extensionsResult.runtime);
261
+ extensionsResult.extensions.push(...inlineExtensions.extensions);
262
+ extensionsResult.errors.push(...inlineExtensions.errors);
263
+ // Detect extension conflicts (tools, commands, flags with same names from different extensions)
264
+ // Keep all extensions loaded. Conflicts are reported as diagnostics, and precedence is handled by load order.
265
+ const conflicts = this.detectExtensionConflicts(extensionsResult.extensions);
266
+ for (const conflict of conflicts) {
267
+ extensionsResult.errors.push({ path: conflict.path, error: conflict.message });
268
+ }
269
+ this.extensionsResult = this.extensionsOverride
270
+ ? this.extensionsOverride(extensionsResult)
271
+ : extensionsResult;
272
+ const skillPaths = this.noSkills
273
+ ? this.mergePaths(cliEnabledSkills, this.additionalSkillPaths)
274
+ : this.mergePaths([...enabledSkills, ...cliEnabledSkills], this.additionalSkillPaths);
275
+ this.lastSkillPaths = skillPaths;
276
+ this.updateSkillsFromPaths(skillPaths);
277
+ const promptPaths = this.noPromptTemplates
278
+ ? this.mergePaths(cliEnabledPrompts, this.additionalPromptTemplatePaths)
279
+ : this.mergePaths([...enabledPrompts, ...cliEnabledPrompts], this.additionalPromptTemplatePaths);
280
+ this.lastPromptPaths = promptPaths;
281
+ this.updatePromptsFromPaths(promptPaths);
282
+ const themePaths = this.noThemes
283
+ ? this.mergePaths(cliEnabledThemes, this.additionalThemePaths)
284
+ : this.mergePaths([...enabledThemes, ...cliEnabledThemes], this.additionalThemePaths);
285
+ this.lastThemePaths = themePaths;
286
+ this.updateThemesFromPaths(themePaths);
287
+ for (const extension of this.extensionsResult.extensions) {
288
+ this.addDefaultMetadataForPath(extension.path);
289
+ }
290
+ const agentsFiles = {
291
+ agentsFiles: loadProjectContextFiles({ cwd: this.cwd, agentDir: this.agentDir })
292
+ };
293
+ const resolvedAgentsFiles = this.agentsFilesOverride
294
+ ? this.agentsFilesOverride(agentsFiles)
295
+ : agentsFiles;
296
+ this.agentsFiles = resolvedAgentsFiles.agentsFiles;
297
+ const baseSystemPrompt = resolvePromptInput(this.systemPromptSource ?? this.discoverSystemPromptFile(), 'system prompt');
298
+ this.systemPrompt = this.systemPromptOverride
299
+ ? this.systemPromptOverride(baseSystemPrompt)
300
+ : baseSystemPrompt;
301
+ const appendSource = this.appendSystemPromptSource ?? this.discoverAppendSystemPromptFile();
302
+ const resolvedAppend = resolvePromptInput(appendSource, 'append system prompt');
303
+ const baseAppend = resolvedAppend ? [resolvedAppend] : [];
304
+ this.appendSystemPrompt = this.appendSystemPromptOverride
305
+ ? this.appendSystemPromptOverride(baseAppend)
306
+ : baseAppend;
307
+ }
308
+ normalizeExtensionPaths(entries) {
309
+ return entries.map((entry) => ({
310
+ path: this.resolveResourcePath(entry.path),
311
+ metadata: entry.metadata
312
+ }));
313
+ }
314
+ updateSkillsFromPaths(skillPaths, extensionPaths = []) {
315
+ let skillsResult;
316
+ if (this.noSkills && skillPaths.length === 0) {
317
+ skillsResult = { skills: [], diagnostics: [] };
318
+ }
319
+ else {
320
+ skillsResult = loadSkills({
321
+ cwd: this.cwd,
322
+ agentDir: this.agentDir,
323
+ skillPaths,
324
+ includeDefaults: false
325
+ });
326
+ }
327
+ const resolvedSkills = this.skillsOverride ? this.skillsOverride(skillsResult) : skillsResult;
328
+ this.skills = resolvedSkills.skills;
329
+ this.skillDiagnostics = resolvedSkills.diagnostics;
330
+ this.applyExtensionMetadata(extensionPaths, this.skills.map((skill) => skill.filePath));
331
+ for (const skill of this.skills) {
332
+ this.addDefaultMetadataForPath(skill.filePath);
333
+ }
334
+ }
335
+ updatePromptsFromPaths(promptPaths, extensionPaths = []) {
336
+ let promptsResult;
337
+ if (this.noPromptTemplates && promptPaths.length === 0) {
338
+ promptsResult = { prompts: [], diagnostics: [] };
339
+ }
340
+ else {
341
+ const allPrompts = loadPromptTemplates({
342
+ cwd: this.cwd,
343
+ agentDir: this.agentDir,
344
+ promptPaths,
345
+ includeDefaults: false
346
+ });
347
+ promptsResult = this.dedupePrompts(allPrompts);
348
+ }
349
+ const resolvedPrompts = this.promptsOverride
350
+ ? this.promptsOverride(promptsResult)
351
+ : promptsResult;
352
+ this.prompts = resolvedPrompts.prompts;
353
+ this.promptDiagnostics = resolvedPrompts.diagnostics;
354
+ this.applyExtensionMetadata(extensionPaths, this.prompts.map((prompt) => prompt.filePath));
355
+ for (const prompt of this.prompts) {
356
+ this.addDefaultMetadataForPath(prompt.filePath);
357
+ }
358
+ }
359
+ updateThemesFromPaths(themePaths, extensionPaths = []) {
360
+ let themesResult;
361
+ if (this.noThemes && themePaths.length === 0) {
362
+ themesResult = { themes: [], diagnostics: [] };
363
+ }
364
+ else {
365
+ const loaded = this.loadThemes(themePaths, false);
366
+ const deduped = this.dedupeThemes(loaded.themes);
367
+ themesResult = {
368
+ themes: deduped.themes,
369
+ diagnostics: [...loaded.diagnostics, ...deduped.diagnostics]
370
+ };
371
+ }
372
+ const resolvedThemes = this.themesOverride ? this.themesOverride(themesResult) : themesResult;
373
+ this.themes = resolvedThemes.themes;
374
+ this.themeDiagnostics = resolvedThemes.diagnostics;
375
+ const themePathsWithSource = this.themes.flatMap((theme) => theme.sourcePath ? [theme.sourcePath] : []);
376
+ this.applyExtensionMetadata(extensionPaths, themePathsWithSource);
377
+ for (const theme of this.themes) {
378
+ if (theme.sourcePath) {
379
+ this.addDefaultMetadataForPath(theme.sourcePath);
380
+ }
381
+ }
382
+ }
383
+ applyExtensionMetadata(extensionPaths, resourcePaths) {
384
+ if (extensionPaths.length === 0) {
385
+ return;
386
+ }
387
+ const normalized = extensionPaths.map((entry) => ({
388
+ path: resolve(entry.path),
389
+ metadata: entry.metadata
390
+ }));
391
+ for (const entry of normalized) {
392
+ if (!this.pathMetadata.has(entry.path)) {
393
+ this.pathMetadata.set(entry.path, entry.metadata);
394
+ }
395
+ }
396
+ for (const resourcePath of resourcePaths) {
397
+ const normalizedResourcePath = resolve(resourcePath);
398
+ if (this.pathMetadata.has(normalizedResourcePath) || this.pathMetadata.has(resourcePath)) {
399
+ continue;
400
+ }
401
+ const match = normalized.find((entry) => normalizedResourcePath === entry.path ||
402
+ normalizedResourcePath.startsWith(`${entry.path}${sep}`));
403
+ if (match) {
404
+ this.pathMetadata.set(normalizedResourcePath, match.metadata);
405
+ }
406
+ }
407
+ }
408
+ mergePaths(primary, additional) {
409
+ const merged = [];
410
+ const seen = new Set();
411
+ for (const p of [...primary, ...additional]) {
412
+ const resolved = this.resolveResourcePath(p);
413
+ if (seen.has(resolved))
414
+ continue;
415
+ seen.add(resolved);
416
+ merged.push(resolved);
417
+ }
418
+ return merged;
419
+ }
420
+ resolveResourcePath(p) {
421
+ const trimmed = p.trim();
422
+ let expanded = trimmed;
423
+ if (trimmed === '~') {
424
+ expanded = homedir();
425
+ }
426
+ else if (trimmed.startsWith('~/')) {
427
+ expanded = join(homedir(), trimmed.slice(2));
428
+ }
429
+ else if (trimmed.startsWith('~')) {
430
+ expanded = join(homedir(), trimmed.slice(1));
431
+ }
432
+ return resolve(this.cwd, expanded);
433
+ }
434
+ loadThemes(paths, includeDefaults = true) {
435
+ const themes = [];
436
+ const diagnostics = [];
437
+ if (includeDefaults) {
438
+ const defaultDirs = [
439
+ join(this.agentDir, 'themes'),
440
+ join(this.cwd, CONFIG_DIR_NAME, 'themes')
441
+ ];
442
+ for (const dir of defaultDirs) {
443
+ this.loadThemesFromDir(dir, themes, diagnostics);
444
+ }
445
+ }
446
+ for (const p of paths) {
447
+ const resolved = resolve(this.cwd, p);
448
+ if (!existsSync(resolved)) {
449
+ diagnostics.push({ type: 'warning', message: 'theme path does not exist', path: resolved });
450
+ continue;
451
+ }
452
+ try {
453
+ const stats = statSync(resolved);
454
+ if (stats.isDirectory()) {
455
+ this.loadThemesFromDir(resolved, themes, diagnostics);
456
+ }
457
+ else if (stats.isFile() && resolved.endsWith('.json')) {
458
+ this.loadThemeFromFile(resolved, themes, diagnostics);
459
+ }
460
+ else {
461
+ diagnostics.push({
462
+ type: 'warning',
463
+ message: 'theme path is not a json file',
464
+ path: resolved
465
+ });
466
+ }
467
+ }
468
+ catch (error) {
469
+ const message = error instanceof Error ? error.message : 'failed to read theme path';
470
+ diagnostics.push({ type: 'warning', message, path: resolved });
471
+ }
472
+ }
473
+ return { themes, diagnostics };
474
+ }
475
+ loadThemesFromDir(dir, themes, diagnostics) {
476
+ if (!existsSync(dir)) {
477
+ return;
478
+ }
479
+ try {
480
+ const entries = readdirSync(dir, { withFileTypes: true });
481
+ for (const entry of entries) {
482
+ let isFile = entry.isFile();
483
+ if (entry.isSymbolicLink()) {
484
+ try {
485
+ isFile = statSync(join(dir, entry.name)).isFile();
486
+ }
487
+ catch {
488
+ continue;
489
+ }
490
+ }
491
+ if (!isFile) {
492
+ continue;
493
+ }
494
+ if (!entry.name.endsWith('.json')) {
495
+ continue;
496
+ }
497
+ this.loadThemeFromFile(join(dir, entry.name), themes, diagnostics);
498
+ }
499
+ }
500
+ catch (error) {
501
+ const message = error instanceof Error ? error.message : 'failed to read theme directory';
502
+ diagnostics.push({ type: 'warning', message, path: dir });
503
+ }
504
+ }
505
+ loadThemeFromFile(filePath, themes, diagnostics) {
506
+ try {
507
+ themes.push(loadThemeFromPath(filePath));
508
+ }
509
+ catch (error) {
510
+ const message = error instanceof Error ? error.message : 'failed to load theme';
511
+ diagnostics.push({ type: 'warning', message, path: filePath });
512
+ }
513
+ }
514
+ async loadExtensionFactories(runtime) {
515
+ const extensions = [];
516
+ const errors = [];
517
+ for (const [index, factory] of this.extensionFactories.entries()) {
518
+ const extensionPath = `<inline:${index + 1}>`;
519
+ try {
520
+ const extension = await loadExtensionFromFactory(factory, this.cwd, this.eventBus, runtime, extensionPath);
521
+ extensions.push(extension);
522
+ }
523
+ catch (error) {
524
+ const message = error instanceof Error ? error.message : 'failed to load extension';
525
+ errors.push({ path: extensionPath, error: message });
526
+ }
527
+ }
528
+ return { extensions, errors };
529
+ }
530
+ dedupePrompts(prompts) {
531
+ const seen = new Map();
532
+ const diagnostics = [];
533
+ for (const prompt of prompts) {
534
+ const existing = seen.get(prompt.name);
535
+ if (existing) {
536
+ diagnostics.push({
537
+ type: 'collision',
538
+ message: `name "/${prompt.name}" collision`,
539
+ path: prompt.filePath,
540
+ collision: {
541
+ resourceType: 'prompt',
542
+ name: prompt.name,
543
+ winnerPath: existing.filePath,
544
+ loserPath: prompt.filePath
545
+ }
546
+ });
547
+ }
548
+ else {
549
+ seen.set(prompt.name, prompt);
550
+ }
551
+ }
552
+ return { prompts: Array.from(seen.values()), diagnostics };
553
+ }
554
+ dedupeThemes(themes) {
555
+ const seen = new Map();
556
+ const diagnostics = [];
557
+ for (const t of themes) {
558
+ const name = t.name ?? 'unnamed';
559
+ const existing = seen.get(name);
560
+ if (existing) {
561
+ diagnostics.push({
562
+ type: 'collision',
563
+ message: `name "${name}" collision`,
564
+ path: t.sourcePath,
565
+ collision: {
566
+ resourceType: 'theme',
567
+ name,
568
+ winnerPath: existing.sourcePath ?? '<builtin>',
569
+ loserPath: t.sourcePath ?? '<builtin>'
570
+ }
571
+ });
572
+ }
573
+ else {
574
+ seen.set(name, t);
575
+ }
576
+ }
577
+ return { themes: Array.from(seen.values()), diagnostics };
578
+ }
579
+ discoverSystemPromptFile() {
580
+ const projectPath = join(this.cwd, CONFIG_DIR_NAME, 'SYSTEM.md');
581
+ if (existsSync(projectPath)) {
582
+ return projectPath;
583
+ }
584
+ const globalPath = join(this.agentDir, 'SYSTEM.md');
585
+ if (existsSync(globalPath)) {
586
+ return globalPath;
587
+ }
588
+ return undefined;
589
+ }
590
+ discoverAppendSystemPromptFile() {
591
+ const projectPath = join(this.cwd, CONFIG_DIR_NAME, 'APPEND_SYSTEM.md');
592
+ if (existsSync(projectPath)) {
593
+ return projectPath;
594
+ }
595
+ const globalPath = join(this.agentDir, 'APPEND_SYSTEM.md');
596
+ if (existsSync(globalPath)) {
597
+ return globalPath;
598
+ }
599
+ return undefined;
600
+ }
601
+ addDefaultMetadataForPath(filePath) {
602
+ if (!filePath || filePath.startsWith('<')) {
603
+ return;
604
+ }
605
+ const normalizedPath = resolve(filePath);
606
+ if (this.pathMetadata.has(normalizedPath) || this.pathMetadata.has(filePath)) {
607
+ return;
608
+ }
609
+ const agentRoots = [
610
+ join(this.agentDir, 'skills'),
611
+ join(this.agentDir, 'prompts'),
612
+ join(this.agentDir, 'themes'),
613
+ join(this.agentDir, 'extensions')
614
+ ];
615
+ const projectRoots = [
616
+ join(this.cwd, CONFIG_DIR_NAME, 'skills'),
617
+ join(this.cwd, CONFIG_DIR_NAME, 'prompts'),
618
+ join(this.cwd, CONFIG_DIR_NAME, 'themes'),
619
+ join(this.cwd, CONFIG_DIR_NAME, 'extensions')
620
+ ];
621
+ for (const root of agentRoots) {
622
+ if (this.isUnderPath(normalizedPath, root)) {
623
+ this.pathMetadata.set(normalizedPath, {
624
+ source: 'local',
625
+ scope: 'user',
626
+ origin: 'top-level'
627
+ });
628
+ return;
629
+ }
630
+ }
631
+ for (const root of projectRoots) {
632
+ if (this.isUnderPath(normalizedPath, root)) {
633
+ this.pathMetadata.set(normalizedPath, {
634
+ source: 'local',
635
+ scope: 'project',
636
+ origin: 'top-level'
637
+ });
638
+ return;
639
+ }
640
+ }
641
+ }
642
+ isUnderPath(target, root) {
643
+ const normalizedRoot = resolve(root);
644
+ if (target === normalizedRoot) {
645
+ return true;
646
+ }
647
+ const prefix = normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`;
648
+ return target.startsWith(prefix);
649
+ }
650
+ detectExtensionConflicts(extensions) {
651
+ const conflicts = [];
652
+ // Track which extension registered each tool, command, and flag
653
+ const toolOwners = new Map();
654
+ const commandOwners = new Map();
655
+ const flagOwners = new Map();
656
+ for (const ext of extensions) {
657
+ // Check tools
658
+ for (const toolName of ext.tools.keys()) {
659
+ const existingOwner = toolOwners.get(toolName);
660
+ if (existingOwner && existingOwner !== ext.path) {
661
+ conflicts.push({
662
+ path: ext.path,
663
+ message: `Tool "${toolName}" conflicts with ${existingOwner}`
664
+ });
665
+ }
666
+ else {
667
+ toolOwners.set(toolName, ext.path);
668
+ }
669
+ }
670
+ // Check commands
671
+ for (const commandName of ext.commands.keys()) {
672
+ const existingOwner = commandOwners.get(commandName);
673
+ if (existingOwner && existingOwner !== ext.path) {
674
+ conflicts.push({
675
+ path: ext.path,
676
+ message: `Command "/${commandName}" conflicts with ${existingOwner}`
677
+ });
678
+ }
679
+ else {
680
+ commandOwners.set(commandName, ext.path);
681
+ }
682
+ }
683
+ // Check flags
684
+ for (const flagName of ext.flags.keys()) {
685
+ const existingOwner = flagOwners.get(flagName);
686
+ if (existingOwner && existingOwner !== ext.path) {
687
+ conflicts.push({
688
+ path: ext.path,
689
+ message: `Flag "--${flagName}" conflicts with ${existingOwner}`
690
+ });
691
+ }
692
+ else {
693
+ flagOwners.set(flagName, ext.path);
694
+ }
695
+ }
696
+ }
697
+ return conflicts;
698
+ }
699
+ }
700
+ //# sourceMappingURL=resource-loader.js.map