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,283 @@
1
+ """Dirty cell tracking — lazy sheet snapshots.
2
+
3
+ Instead of snapshotting the entire workbook, we proxy Worksheet access
4
+ so that a sheet's UsedRange.Value2 is captured on first touch. After
5
+ execution we re-read only the touched sheets and diff. Cost is O(touched
6
+ sheets) not O(workbook), and the agent gets raw COM objects for everything
7
+ below the Worksheet level — zero overhead on Range reads/writes.
8
+ """
9
+
10
+ from ._log import xl_log
11
+
12
+
13
+ def _col_to_letter(col):
14
+ """Convert 1-based column number to Excel column letters. 1→A, 27→AA."""
15
+ if col <= 0:
16
+ raise ValueError(f"_col_to_letter expects a positive integer, got {col}")
17
+ s = ""
18
+ while col > 0:
19
+ col, rem = divmod(col - 1, 26)
20
+ s = chr(65 + rem) + s
21
+ return s
22
+
23
+
24
+ def _normalize_2d(data, rows, cols):
25
+ """Normalize COM range data to tuple-of-tuples regardless of shape.
26
+
27
+ COM returns: scalar for 1×1, flat tuple for single-row OR
28
+ single-column, nested tuples for multi-row multi-column.
29
+ """
30
+ if not isinstance(data, tuple):
31
+ return ((data,),)
32
+ if data and not isinstance(data[0], tuple):
33
+ if rows == 1:
34
+ return (data,)
35
+ return tuple((v,) for v in data)
36
+ return data
37
+
38
+
39
+ class _SheetSnapshot:
40
+ """Immutable snapshot of a worksheet's UsedRange values and formulas."""
41
+ __slots__ = ('top_row', 'left_col', 'rows', 'cols', 'data', 'formulas')
42
+
43
+ def __init__(self, ws):
44
+ ur = ws.UsedRange
45
+ self.top_row = ur.Row
46
+ self.left_col = ur.Column
47
+ self.rows = ur.Rows.Count
48
+ self.cols = ur.Columns.Count
49
+ self.data = _normalize_2d(ur.Value, self.rows, self.cols)
50
+ try:
51
+ self.formulas = _normalize_2d(ur.Formula, self.rows, self.cols)
52
+ except Exception:
53
+ self.formulas = None
54
+
55
+
56
+ def _get_formula(snap, ri, ci):
57
+ """Get formula string from snapshot, or None if no formula data."""
58
+ if snap.formulas is None:
59
+ return None
60
+ try:
61
+ f = snap.formulas[ri][ci]
62
+ except (IndexError, TypeError):
63
+ return None
64
+ # COM returns the raw value for non-formula cells; only keep actual formulas
65
+ if isinstance(f, str) and f.startswith('='):
66
+ return f
67
+ return None
68
+
69
+
70
+ def _diff_snapshots(sheet_name, before, after):
71
+ """Compare two _SheetSnapshots, return list of change dicts.
72
+
73
+ Compares row-by-row first (tuple equality short-circuits) so
74
+ unchanged rows cost almost nothing.
75
+ """
76
+ changes = []
77
+ # Same geometry — fast path
78
+ if (before.top_row == after.top_row and before.left_col == after.left_col
79
+ and before.rows == after.rows and before.cols == after.cols):
80
+ for ri in range(before.rows):
81
+ if before.data[ri] == after.data[ri]:
82
+ continue
83
+ row_num = before.top_row + ri
84
+ for ci in range(before.cols):
85
+ old = before.data[ri][ci]
86
+ new = after.data[ri][ci]
87
+ if old != new:
88
+ addr = f"{_col_to_letter(before.left_col + ci)}{row_num}"
89
+ entry = {
90
+ 'sheet': sheet_name, 'address': addr,
91
+ 'oldValue': old, 'value': new,
92
+ }
93
+ formula = _get_formula(after, ri, ci)
94
+ if formula:
95
+ entry['formula'] = formula
96
+ changes.append(entry)
97
+ return changes
98
+
99
+ # Different geometry — union bounding box
100
+ min_r = min(before.top_row, after.top_row)
101
+ min_c = min(before.left_col, after.left_col)
102
+ max_r = max(before.top_row + before.rows - 1, after.top_row + after.rows - 1)
103
+ max_c = max(before.left_col + before.cols - 1, after.left_col + after.cols - 1)
104
+
105
+ def _get(snap, row, col):
106
+ r = row - snap.top_row
107
+ c = col - snap.left_col
108
+ if 0 <= r < snap.rows and 0 <= c < snap.cols:
109
+ return snap.data[r][c]
110
+ return None
111
+
112
+ def _get_formula_abs(snap, row, col):
113
+ r = row - snap.top_row
114
+ c = col - snap.left_col
115
+ if 0 <= r < snap.rows and 0 <= c < snap.cols:
116
+ return _get_formula(snap, r, c)
117
+ return None
118
+
119
+ for row in range(min_r, max_r + 1):
120
+ for col in range(min_c, max_c + 1):
121
+ old = _get(before, row, col)
122
+ new = _get(after, row, col)
123
+ if old != new:
124
+ addr = f"{_col_to_letter(col)}{row}"
125
+ entry = {
126
+ 'sheet': sheet_name, 'address': addr,
127
+ 'oldValue': old, 'value': new,
128
+ }
129
+ formula = _get_formula_abs(after, row, col)
130
+ if formula:
131
+ entry['formula'] = formula
132
+ changes.append(entry)
133
+ return changes
134
+
135
+
136
+ class DirtyTracker:
137
+ """Snapshots sheets on first access, diffs after execution."""
138
+ __slots__ = ('_app', '_snapshots')
139
+
140
+ def __init__(self, app):
141
+ self._app = app
142
+ self._snapshots = {} # name -> (ws, _SheetSnapshot)
143
+
144
+ def snapshot_sheet(self, ws):
145
+ """Capture a sheet's data on first access. No-op on subsequent calls."""
146
+ try:
147
+ name = ws.Name
148
+ except Exception:
149
+ return
150
+ if name not in self._snapshots:
151
+ try:
152
+ self._snapshots[name] = (ws, _SheetSnapshot(ws))
153
+ except Exception as e:
154
+ xl_log(f"DirtyTracker.snapshot_sheet({name}): {e}")
155
+
156
+ def collect_changes(self):
157
+ """Re-read snapshotted sheets and return list of cell changes."""
158
+ all_changes = []
159
+ for name, (ws, before) in self._snapshots.items():
160
+ try:
161
+ after = _SheetSnapshot(ws)
162
+ changes = _diff_snapshots(name, before, after)
163
+ # Enrich with numberFormat (can't bulk-read mixed ranges)
164
+ for entry in changes:
165
+ try:
166
+ fmt = ws.Range(entry['address']).NumberFormat
167
+ if fmt and fmt != 'General':
168
+ entry['numberFormat'] = str(fmt)
169
+ except Exception:
170
+ pass
171
+ all_changes.extend(changes)
172
+ except Exception as e:
173
+ xl_log(f"DirtyTracker.collect_changes({name}): {e}")
174
+ return all_changes
175
+
176
+
177
+ # ---------------------------------------------------------------------------
178
+ # Thin proxy classes (Application → Workbook → Worksheet access only)
179
+ # ---------------------------------------------------------------------------
180
+
181
+ class TrackedApp:
182
+ """Proxy around Application. Wraps workbook/sheet access to trigger
183
+ snapshots; everything else passes straight through to COM."""
184
+ _WB_ATTRS = frozenset(('ActiveWorkbook', 'ThisWorkbook'))
185
+ _SHEET_ACCESSORS = frozenset(('Worksheets', 'Sheets'))
186
+ _SHEET_DIRECT = frozenset(('ActiveSheet',))
187
+ __slots__ = ('_app', '_tracker')
188
+
189
+ def __init__(self, app, tracker):
190
+ object.__setattr__(self, '_app', app)
191
+ object.__setattr__(self, '_tracker', tracker)
192
+
193
+ def __getattr__(self, name):
194
+ val = getattr(object.__getattribute__(self, '_app'), name)
195
+ tracker = object.__getattribute__(self, '_tracker')
196
+ if name in TrackedApp._WB_ATTRS:
197
+ return _TrackedWorkbook(val, tracker)
198
+ if name == 'Workbooks':
199
+ return _TrackedWorkbooks(val, tracker)
200
+ if name in TrackedApp._SHEET_ACCESSORS:
201
+ return _TrackedSheetAccessor(val, tracker)
202
+ if name in TrackedApp._SHEET_DIRECT:
203
+ tracker.snapshot_sheet(val)
204
+ return val
205
+ return val
206
+
207
+ def __setattr__(self, name, value):
208
+ setattr(object.__getattribute__(self, '_app'), name, value)
209
+
210
+ def __repr__(self):
211
+ return repr(object.__getattribute__(self, '_app'))
212
+
213
+
214
+ class _TrackedWorkbooks:
215
+ """Proxy for Workbooks collection."""
216
+ __slots__ = ('_obj', '_tracker')
217
+
218
+ def __init__(self, obj, tracker):
219
+ object.__setattr__(self, '_obj', obj)
220
+ object.__setattr__(self, '_tracker', tracker)
221
+
222
+ def __call__(self, *args, **kwargs):
223
+ wb = object.__getattribute__(self, '_obj')(*args, **kwargs)
224
+ return _TrackedWorkbook(wb, object.__getattribute__(self, '_tracker'))
225
+
226
+ def __getattr__(self, name):
227
+ return getattr(object.__getattribute__(self, '_obj'), name)
228
+
229
+ def __iter__(self):
230
+ tracker = object.__getattribute__(self, '_tracker')
231
+ for wb in object.__getattribute__(self, '_obj'):
232
+ yield _TrackedWorkbook(wb, tracker)
233
+
234
+
235
+ class _TrackedWorkbook:
236
+ """Proxy for a Workbook — wraps Worksheet/Sheet access."""
237
+ _SHEET_ACCESSORS = frozenset(('Worksheets', 'Sheets'))
238
+ _SHEET_DIRECT = frozenset(('ActiveSheet',))
239
+ __slots__ = ('_wb', '_tracker')
240
+
241
+ def __init__(self, wb, tracker):
242
+ object.__setattr__(self, '_wb', wb)
243
+ object.__setattr__(self, '_tracker', tracker)
244
+
245
+ def __getattr__(self, name):
246
+ val = getattr(object.__getattribute__(self, '_wb'), name)
247
+ tracker = object.__getattribute__(self, '_tracker')
248
+ if name in _TrackedWorkbook._SHEET_ACCESSORS:
249
+ return _TrackedSheetAccessor(val, tracker)
250
+ if name in _TrackedWorkbook._SHEET_DIRECT:
251
+ tracker.snapshot_sheet(val)
252
+ return val
253
+ return val
254
+
255
+ def __setattr__(self, name, value):
256
+ setattr(object.__getattribute__(self, '_wb'), name, value)
257
+
258
+ def __repr__(self):
259
+ return repr(object.__getattribute__(self, '_wb'))
260
+
261
+
262
+ class _TrackedSheetAccessor:
263
+ """Proxy for Worksheets/Sheets collection — snapshots each sheet
264
+ the first time it is accessed, then returns the real COM Worksheet."""
265
+ __slots__ = ('_obj', '_tracker')
266
+
267
+ def __init__(self, obj, tracker):
268
+ object.__setattr__(self, '_obj', obj)
269
+ object.__setattr__(self, '_tracker', tracker)
270
+
271
+ def __call__(self, *args, **kwargs):
272
+ ws = object.__getattribute__(self, '_obj')(*args, **kwargs)
273
+ object.__getattribute__(self, '_tracker').snapshot_sheet(ws)
274
+ return ws # real COM object — no more proxying
275
+
276
+ def __getattr__(self, name):
277
+ return getattr(object.__getattribute__(self, '_obj'), name)
278
+
279
+ def __iter__(self):
280
+ tracker = object.__getattribute__(self, '_tracker')
281
+ for ws in object.__getattribute__(self, '_obj'):
282
+ tracker.snapshot_sheet(ws)
283
+ yield ws
@@ -0,0 +1,100 @@
1
+ """
2
+ Live stock quotes in Excel — powered by Yahoo Finance.
3
+
4
+ Functions:
5
+ =stock(ticker) current price
6
+ =stock_change(ticker) $ change from prev close
7
+ =stock_pct(ticker) % change from prev close
8
+ =stock_vol(ticker) volume
9
+ =stock_high(ticker) day high
10
+ =stock_low(ticker) day low
11
+ =stock_open(ticker) opening price
12
+ =stock_name(ticker) company name
13
+
14
+ All results are cached for 15 seconds to avoid hammering the API.
15
+ """
16
+
17
+ from shortcut_xl import xl_func
18
+ import urllib.request
19
+ import json
20
+ import time
21
+ import threading
22
+
23
+ _cache = {}
24
+ _CACHE_TTL = 15
25
+ _lock = threading.Lock()
26
+
27
+
28
+ def _fetch(ticker):
29
+ ticker = str(ticker).upper().strip()
30
+ now = time.time()
31
+ with _lock:
32
+ if ticker in _cache and now - _cache[ticker]['t'] < _CACHE_TTL:
33
+ return _cache[ticker]['d']
34
+
35
+ url = (
36
+ f"https://query1.finance.yahoo.com/v8/finance/chart/{ticker}"
37
+ f"?interval=1d&range=1d"
38
+ )
39
+ req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
40
+ with urllib.request.urlopen(req, timeout=5) as resp:
41
+ raw = json.loads(resp.read())
42
+
43
+ meta = raw["chart"]["result"][0]["meta"]
44
+ d = {
45
+ "price": meta.get("regularMarketPrice", 0),
46
+ "prev": meta.get("chartPreviousClose", 0) or meta.get("previousClose", 0),
47
+ "open": meta.get("regularMarketOpen", 0),
48
+ "high": meta.get("regularMarketDayHigh", 0),
49
+ "low": meta.get("regularMarketDayLow", 0),
50
+ "vol": meta.get("regularMarketVolume", 0),
51
+ "name": meta.get("shortName", ticker),
52
+ }
53
+ with _lock:
54
+ _cache[ticker] = {"d": d, "t": time.time()}
55
+ return d
56
+
57
+
58
+ def _safe(fn):
59
+ try:
60
+ return fn()
61
+ except Exception as e:
62
+ return f"#ERR {e}"
63
+
64
+
65
+ @xl_func
66
+ def stock(ticker):
67
+ return _safe(lambda: _fetch(ticker)["price"])
68
+
69
+ @xl_func
70
+ def stock_change(ticker):
71
+ return _safe(lambda: round(_fetch(ticker)["price"] - _fetch(ticker)["prev"], 2))
72
+
73
+ @xl_func
74
+ def stock_pct(ticker):
75
+ def _calc():
76
+ d = _fetch(ticker)
77
+ if d["prev"] == 0:
78
+ return 0
79
+ return round((d["price"] - d["prev"]) / d["prev"] * 100, 2)
80
+ return _safe(_calc)
81
+
82
+ @xl_func
83
+ def stock_vol(ticker):
84
+ return _safe(lambda: _fetch(ticker)["vol"])
85
+
86
+ @xl_func
87
+ def stock_high(ticker):
88
+ return _safe(lambda: _fetch(ticker)["high"])
89
+
90
+ @xl_func
91
+ def stock_low(ticker):
92
+ return _safe(lambda: _fetch(ticker)["low"])
93
+
94
+ @xl_func
95
+ def stock_open(ticker):
96
+ return _safe(lambda: _fetch(ticker)["open"])
97
+
98
+ @xl_func
99
+ def stock_name(ticker):
100
+ return _safe(lambda: _fetch(ticker)["name"])
Binary file
Binary file