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.
- package/README.md +59 -0
- package/agent-docs/README.md +397 -0
- package/agent-docs/docs/compaction.md +390 -0
- package/agent-docs/docs/custom-provider.md +580 -0
- package/agent-docs/docs/development.md +69 -0
- package/agent-docs/docs/extensions.md +1971 -0
- package/agent-docs/docs/json.md +79 -0
- package/agent-docs/docs/keybindings.md +174 -0
- package/agent-docs/docs/models.md +293 -0
- package/agent-docs/docs/packages.md +209 -0
- package/agent-docs/docs/prompt-templates.md +67 -0
- package/agent-docs/docs/providers.md +186 -0
- package/agent-docs/docs/rpc.md +1317 -0
- package/agent-docs/docs/sdk.md +962 -0
- package/agent-docs/docs/session.md +412 -0
- package/agent-docs/docs/settings.md +223 -0
- package/agent-docs/docs/shell-aliases.md +13 -0
- package/agent-docs/docs/skills.md +231 -0
- package/agent-docs/docs/terminal-setup.md +70 -0
- package/agent-docs/docs/termux.md +127 -0
- package/agent-docs/docs/themes.md +295 -0
- package/agent-docs/docs/tree.md +219 -0
- package/agent-docs/docs/tui.md +887 -0
- package/agent-docs/docs/windows.md +17 -0
- package/agent-docs/examples/README.md +25 -0
- package/agent-docs/examples/extensions/README.md +205 -0
- package/agent-docs/examples/extensions/antigravity-image-gen.ts +447 -0
- package/agent-docs/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/agent-docs/examples/extensions/bash-spawn-hook.ts +30 -0
- package/agent-docs/examples/extensions/bookmark.ts +50 -0
- package/agent-docs/examples/extensions/built-in-tool-renderer.ts +256 -0
- package/agent-docs/examples/extensions/claude-rules.ts +86 -0
- package/agent-docs/examples/extensions/commands.ts +75 -0
- package/agent-docs/examples/extensions/confirm-destructive.ts +59 -0
- package/agent-docs/examples/extensions/custom-compaction.ts +126 -0
- package/agent-docs/examples/extensions/custom-footer.ts +63 -0
- package/agent-docs/examples/extensions/custom-header.ts +73 -0
- package/agent-docs/examples/extensions/custom-provider-anthropic/index.ts +660 -0
- package/agent-docs/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/agent-docs/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/agent-docs/examples/extensions/custom-provider-gitlab-duo/index.ts +362 -0
- package/agent-docs/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/agent-docs/examples/extensions/custom-provider-gitlab-duo/test.ts +88 -0
- package/agent-docs/examples/extensions/custom-provider-qwen-cli/index.ts +349 -0
- package/agent-docs/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
- package/agent-docs/examples/extensions/dirty-repo-guard.ts +56 -0
- package/agent-docs/examples/extensions/doom-overlay/README.md +46 -0
- package/agent-docs/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/agent-docs/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/agent-docs/examples/extensions/doom-overlay/doom-component.ts +133 -0
- package/agent-docs/examples/extensions/doom-overlay/doom-engine.ts +186 -0
- package/agent-docs/examples/extensions/doom-overlay/doom-keys.ts +108 -0
- package/agent-docs/examples/extensions/doom-overlay/index.ts +74 -0
- package/agent-docs/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/agent-docs/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/agent-docs/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/agent-docs/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/agent-docs/examples/extensions/dynamic-resources/index.ts +15 -0
- package/agent-docs/examples/extensions/dynamic-tools.ts +77 -0
- package/agent-docs/examples/extensions/event-bus.ts +43 -0
- package/agent-docs/examples/extensions/file-trigger.ts +41 -0
- package/agent-docs/examples/extensions/git-checkpoint.ts +53 -0
- package/agent-docs/examples/extensions/handoff.ts +155 -0
- package/agent-docs/examples/extensions/hello.ts +25 -0
- package/agent-docs/examples/extensions/inline-bash.ts +94 -0
- package/agent-docs/examples/extensions/input-transform.ts +43 -0
- package/agent-docs/examples/extensions/interactive-shell.ts +209 -0
- package/agent-docs/examples/extensions/mac-system-theme.ts +47 -0
- package/agent-docs/examples/extensions/message-renderer.ts +59 -0
- package/agent-docs/examples/extensions/minimal-mode.ts +430 -0
- package/agent-docs/examples/extensions/modal-editor.ts +90 -0
- package/agent-docs/examples/extensions/model-status.ts +31 -0
- package/agent-docs/examples/extensions/notify.ts +55 -0
- package/agent-docs/examples/extensions/overlay-qa-tests.ts +936 -0
- package/agent-docs/examples/extensions/overlay-test.ts +159 -0
- package/agent-docs/examples/extensions/permission-gate.ts +37 -0
- package/agent-docs/examples/extensions/pirate.ts +47 -0
- package/agent-docs/examples/extensions/plan-mode/README.md +65 -0
- package/agent-docs/examples/extensions/plan-mode/index.ts +363 -0
- package/agent-docs/examples/extensions/plan-mode/utils.ts +173 -0
- package/agent-docs/examples/extensions/preset.ts +418 -0
- package/agent-docs/examples/extensions/protected-paths.ts +30 -0
- package/agent-docs/examples/extensions/qna.ts +122 -0
- package/agent-docs/examples/extensions/question.ts +278 -0
- package/agent-docs/examples/extensions/questionnaire.ts +440 -0
- package/agent-docs/examples/extensions/rainbow-editor.ts +90 -0
- package/agent-docs/examples/extensions/reload-runtime.ts +37 -0
- package/agent-docs/examples/extensions/rpc-demo.ts +124 -0
- package/agent-docs/examples/extensions/sandbox/index.ts +324 -0
- package/agent-docs/examples/extensions/sandbox/package-lock.json +92 -0
- package/agent-docs/examples/extensions/sandbox/package.json +19 -0
- package/agent-docs/examples/extensions/send-user-message.ts +97 -0
- package/agent-docs/examples/extensions/session-name.ts +27 -0
- package/agent-docs/examples/extensions/shutdown-command.ts +69 -0
- package/agent-docs/examples/extensions/snake.ts +343 -0
- package/agent-docs/examples/extensions/space-invaders.ts +566 -0
- package/agent-docs/examples/extensions/ssh.ts +233 -0
- package/agent-docs/examples/extensions/status-line.ts +40 -0
- package/agent-docs/examples/extensions/subagent/README.md +172 -0
- package/agent-docs/examples/extensions/subagent/agents/planner.md +37 -0
- package/agent-docs/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/agent-docs/examples/extensions/subagent/agents/scout.md +50 -0
- package/agent-docs/examples/extensions/subagent/agents/worker.md +24 -0
- package/agent-docs/examples/extensions/subagent/agents.ts +130 -0
- package/agent-docs/examples/extensions/subagent/index.ts +1068 -0
- package/agent-docs/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/agent-docs/examples/extensions/subagent/prompts/implement.md +10 -0
- package/agent-docs/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/agent-docs/examples/extensions/summarize.ts +206 -0
- package/agent-docs/examples/extensions/system-prompt-header.ts +17 -0
- package/agent-docs/examples/extensions/timed-confirm.ts +72 -0
- package/agent-docs/examples/extensions/titlebar-spinner.ts +58 -0
- package/agent-docs/examples/extensions/todo.ts +314 -0
- package/agent-docs/examples/extensions/tool-override.ts +146 -0
- package/agent-docs/examples/extensions/tools.ts +145 -0
- package/agent-docs/examples/extensions/trigger-compact.ts +40 -0
- package/agent-docs/examples/extensions/truncated-tool.ts +194 -0
- package/agent-docs/examples/extensions/widget-placement.ts +17 -0
- package/agent-docs/examples/extensions/with-deps/index.ts +37 -0
- package/agent-docs/examples/extensions/with-deps/package-lock.json +31 -0
- package/agent-docs/examples/extensions/with-deps/package.json +22 -0
- package/agent-docs/examples/rpc-extension-ui.ts +654 -0
- package/agent-docs/examples/sdk/01-minimal.ts +22 -0
- package/agent-docs/examples/sdk/02-custom-model.ts +48 -0
- package/agent-docs/examples/sdk/03-custom-prompt.ts +55 -0
- package/agent-docs/examples/sdk/04-skills.ts +53 -0
- package/agent-docs/examples/sdk/05-tools.ts +56 -0
- package/agent-docs/examples/sdk/06-extensions.ts +88 -0
- package/agent-docs/examples/sdk/07-context-files.ts +40 -0
- package/agent-docs/examples/sdk/08-prompt-templates.ts +47 -0
- package/agent-docs/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/agent-docs/examples/sdk/10-settings.ts +54 -0
- package/agent-docs/examples/sdk/11-sessions.ts +48 -0
- package/agent-docs/examples/sdk/12-full-control.ts +82 -0
- package/agent-docs/examples/sdk/README.md +144 -0
- package/agent-docs/xll-skill.md +61 -0
- package/agent-docs/xll-spec.md +110 -0
- package/dist/cli/args.js +290 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/file-processor.js +79 -0
- package/dist/cli/list-models.js +92 -0
- package/dist/cli/package-commands.js +210 -0
- package/dist/cli/report-settings-errors.js +11 -0
- package/dist/cli/session-picker.js +34 -0
- package/dist/cli.js +19 -0
- package/dist/config.js +288 -0
- package/dist/core/abort.js +15 -0
- package/dist/core/agent-loop.js +352 -0
- package/dist/core/agent-session.js +2019 -0
- package/dist/core/agent.js +410 -0
- package/dist/core/auth-storage.js +456 -0
- package/dist/core/bash-executor.js +222 -0
- package/dist/core/compaction/branch-summarization.js +242 -0
- package/dist/core/compaction/compaction.js +610 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/utils.js +139 -0
- package/dist/core/defaults.js +6 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/exec.js +71 -0
- package/dist/core/export-html/ansi-to-html.js +256 -0
- package/dist/core/export-html/index.js +238 -0
- package/dist/core/export-html/session-view-model.js +342 -0
- package/dist/core/export-html/template.css +1110 -0
- package/dist/core/export-html/template.html +76 -0
- package/dist/core/export-html/template.js +1990 -0
- package/dist/core/export-html/tool-renderer.js +63 -0
- package/dist/core/export-html/vendor/highlight.min.js +7725 -0
- package/dist/core/export-html/vendor/marked.min.js +1803 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/loader.js +422 -0
- package/dist/core/extensions/runner.js +651 -0
- package/dist/core/extensions/types.js +35 -0
- package/dist/core/extensions/wrapper.js +102 -0
- package/dist/core/footer-data-provider.js +162 -0
- package/dist/core/index.js +9 -0
- package/dist/core/keybindings.js +153 -0
- package/dist/core/messages.js +133 -0
- package/dist/core/model-registry.js +539 -0
- package/dist/core/model-resolver.js +370 -0
- package/dist/core/package-manager.js +1485 -0
- package/dist/core/prompt-templates.js +253 -0
- package/dist/core/resolve-config-value.js +59 -0
- package/dist/core/resource-loader.js +700 -0
- package/dist/core/sdk.js +197 -0
- package/dist/core/session-bash.js +99 -0
- package/dist/core/session-compaction.js +165 -0
- package/dist/core/session-manager.js +1153 -0
- package/dist/core/session-models.js +99 -0
- package/dist/core/session-retry.js +155 -0
- package/dist/core/settings-manager.js +572 -0
- package/dist/core/skills.js +382 -0
- package/dist/core/slash-commands.js +31 -0
- package/dist/core/system-prompt.js +161 -0
- package/dist/core/theme.js +770 -0
- package/dist/core/timings.js +26 -0
- package/dist/core/tools/bash.js +258 -0
- package/dist/core/tools/edit-diff.js +245 -0
- package/dist/core/tools/edit.js +148 -0
- package/dist/core/tools/find.js +208 -0
- package/dist/core/tools/grep.js +246 -0
- package/dist/core/tools/index.js +67 -0
- package/dist/core/tools/ls.js +123 -0
- package/dist/core/tools/path-utils.js +81 -0
- package/dist/core/tools/read.js +160 -0
- package/dist/core/tools/truncate.js +70 -0
- package/dist/core/tools/write.js +82 -0
- package/dist/custom/agents/action.js +13 -0
- package/dist/custom/agents/document-reader.js +70 -0
- package/dist/custom/agents/general.js +26 -0
- package/dist/custom/agents/index.js +49 -0
- package/dist/custom/agents/installation.js +13 -0
- package/dist/custom/agents/types.js +7 -0
- package/dist/custom/auth/refresh-timer.js +33 -0
- package/dist/custom/auth/shortcut-oauth.js +145 -0
- package/dist/custom/constants.js +21 -0
- package/dist/custom/context/workbook-summary.js +73 -0
- package/dist/custom/credits/shortcut-credits.js +29 -0
- package/dist/custom/cron/cron-daemon-entry.js +18 -0
- package/dist/custom/cron/daemon-ipc.js +131 -0
- package/dist/custom/cron/daemon.js +224 -0
- package/dist/custom/cron/jobs.js +226 -0
- package/dist/custom/cron/run-log.js +51 -0
- package/dist/custom/cron/schedule.js +72 -0
- package/dist/custom/cron/status-line.js +98 -0
- package/dist/custom/cron/store.js +87 -0
- package/dist/custom/cron/types.js +8 -0
- package/dist/custom/dev/index.js +59 -0
- package/dist/custom/dev/trace-export.js +58 -0
- package/dist/custom/ensure-excel.js +63 -0
- package/dist/custom/excel-config.js +36 -0
- package/dist/custom/preflight.js +422 -0
- package/dist/custom/prompts/action.js +100 -0
- package/dist/custom/prompts/api.js +66 -0
- package/dist/custom/prompts/installation.js +124 -0
- package/dist/custom/prompts/shared.js +138 -0
- package/dist/custom/providers/llm-usage.js +42 -0
- package/dist/custom/providers/message-converter.js +74 -0
- package/dist/custom/providers/provider-ids.js +9 -0
- package/dist/custom/providers/register-openai-codex-provider.js +27 -0
- package/dist/custom/providers/register-shortcut-provider.js +52 -0
- package/dist/custom/providers/shortcut-invoke.js +117 -0
- package/dist/custom/providers/shortcut-stream.js +252 -0
- package/dist/custom/providers/sse-protocol.js +38 -0
- package/dist/custom/sync-xll.js +130 -0
- package/dist/custom/tools/cron.js +413 -0
- package/dist/custom/tools/excel-exec.js +167 -0
- package/dist/custom/tools/excel-range.js +50 -0
- package/dist/custom/tools/llm-analysis.js +265 -0
- package/dist/custom/tools/render-helpers.js +38 -0
- package/dist/custom/tools/switch-mode.js +94 -0
- package/dist/custom/tools/task/agents.js +6 -0
- package/dist/custom/tools/task/index.js +8 -0
- package/dist/custom/tools/task/render.js +348 -0
- package/dist/custom/tools/task/subprocess.js +320 -0
- package/dist/custom/tools/task/task.js +205 -0
- package/dist/custom/tools/todo-list.js +195 -0
- package/dist/custom/tracing/session-upload.js +93 -0
- package/dist/index.js +45 -0
- package/dist/main.js +613 -0
- package/dist/migrations.js +265 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/interactive/components/armin.js +337 -0
- package/dist/modes/interactive/components/assistant-message.js +94 -0
- package/dist/modes/interactive/components/bash-execution.js +171 -0
- package/dist/modes/interactive/components/bordered-loader.js +51 -0
- package/dist/modes/interactive/components/branch-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +46 -0
- package/dist/modes/interactive/components/config-selector.js +488 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/custom-editor.js +93 -0
- package/dist/modes/interactive/components/custom-message.js +81 -0
- package/dist/modes/interactive/components/daxnuts.js +140 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/extension-editor.js +105 -0
- package/dist/modes/interactive/components/extension-input.js +61 -0
- package/dist/modes/interactive/components/extension-selector.js +78 -0
- package/dist/modes/interactive/components/footer.js +309 -0
- package/dist/modes/interactive/components/index.js +33 -0
- package/dist/modes/interactive/components/keybinding-hints.js +61 -0
- package/dist/modes/interactive/components/layout.js +64 -0
- package/dist/modes/interactive/components/login-dialog.js +148 -0
- package/dist/modes/interactive/components/model-selector.js +237 -0
- package/dist/modes/interactive/components/oauth-selector.js +111 -0
- package/dist/modes/interactive/components/session-selector-search.js +157 -0
- package/dist/modes/interactive/components/session-selector.js +860 -0
- package/dist/modes/interactive/components/settings-selector.js +123 -0
- package/dist/modes/interactive/components/show-images-selector.js +35 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +48 -0
- package/dist/modes/interactive/components/theme-selector.js +47 -0
- package/dist/modes/interactive/components/thinking-selector.js +47 -0
- package/dist/modes/interactive/components/tool-execution.js +789 -0
- package/dist/modes/interactive/components/tool-group.js +106 -0
- package/dist/modes/interactive/components/tree-selector.js +962 -0
- package/dist/modes/interactive/components/user-message-selector.js +115 -0
- package/dist/modes/interactive/components/user-message.js +48 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/file-attachments.js +135 -0
- package/dist/modes/interactive/interactive-mode.js +3775 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +85 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.js +177 -0
- package/dist/modes/print-mode.js +101 -0
- package/dist/modes/rpc/rpc-client.js +387 -0
- package/dist/modes/rpc/rpc-mode.js +509 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/subagent-entry.js +145 -0
- package/dist/tool-names.js +34 -0
- package/dist/tui/autocomplete.js +596 -0
- package/dist/tui/components/box.js +104 -0
- package/dist/tui/components/cancellable-loader.js +35 -0
- package/dist/tui/components/editor.js +1679 -0
- package/dist/tui/components/image.js +69 -0
- package/dist/tui/components/input.js +433 -0
- package/dist/tui/components/loader.js +49 -0
- package/dist/tui/components/markdown.js +629 -0
- package/dist/tui/components/select-list.js +152 -0
- package/dist/tui/components/settings-list.js +185 -0
- package/dist/tui/components/spacer.js +23 -0
- package/dist/tui/components/text.js +89 -0
- package/dist/tui/components/truncated-text.js +51 -0
- package/dist/tui/editor-component.js +2 -0
- package/dist/tui/fuzzy.js +107 -0
- package/dist/tui/get-east-asian-width/index.js +32 -0
- package/dist/tui/get-east-asian-width/lookup.js +404 -0
- package/dist/tui/index.js +32 -0
- package/dist/tui/keybindings.js +114 -0
- package/dist/tui/keys.js +959 -0
- package/dist/tui/kill-ring.js +44 -0
- package/dist/tui/stdin-buffer.js +317 -0
- package/dist/tui/terminal-image.js +288 -0
- package/dist/tui/terminal.js +249 -0
- package/dist/tui/tui/autocomplete.js +596 -0
- package/dist/tui/tui/components/box.js +106 -0
- package/dist/tui/tui/components/cancellable-loader.js +35 -0
- package/dist/tui/tui/components/editor.js +1679 -0
- package/dist/tui/tui/components/image.js +69 -0
- package/dist/tui/tui/components/input.js +433 -0
- package/dist/tui/tui/components/loader.js +49 -0
- package/dist/tui/tui/components/markdown.js +629 -0
- package/dist/tui/tui/components/select-list.js +152 -0
- package/dist/tui/tui/components/settings-list.js +185 -0
- package/dist/tui/tui/components/spacer.js +23 -0
- package/dist/tui/tui/components/text.js +91 -0
- package/dist/tui/tui/components/truncated-text.js +51 -0
- package/dist/tui/tui/editor-component.js +2 -0
- package/dist/tui/tui/fuzzy.js +107 -0
- package/dist/tui/tui/get-east-asian-width/index.js +32 -0
- package/dist/tui/tui/get-east-asian-width/lookup.js +404 -0
- package/dist/tui/tui/index.js +32 -0
- package/dist/tui/tui/keybindings.js +114 -0
- package/dist/tui/tui/keys.js +959 -0
- package/dist/tui/tui/kill-ring.js +44 -0
- package/dist/tui/tui/stdin-buffer.js +317 -0
- package/dist/tui/tui/terminal-image.js +288 -0
- package/dist/tui/tui/terminal.js +249 -0
- package/dist/tui/tui/tui.js +955 -0
- package/dist/tui/tui/undo-stack.js +25 -0
- package/dist/tui/tui/utils.js +800 -0
- package/dist/tui/tui.js +955 -0
- package/dist/tui/undo-stack.js +25 -0
- package/dist/tui/utils.js +800 -0
- package/dist/utils/changelog.js +87 -0
- package/dist/utils/clipboard-image.js +164 -0
- package/dist/utils/clipboard-native.js +14 -0
- package/dist/utils/clipboard.js +67 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/git.js +166 -0
- package/dist/utils/image-convert.js +35 -0
- package/dist/utils/image-resize.js +183 -0
- package/dist/utils/mime.js +26 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/shell.js +217 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/tools-manager.js +259 -0
- package/package.json +78 -0
- package/skills/excel-com-api/SKILL.md +74 -0
- package/skills/excel-com-api/excel-type-library.py +27767 -0
- package/skills/excel-com-api/office-type-library.py +10867 -0
- package/skills/integrations/SKILL.md +138 -0
- package/skills/integrations/alphasense.md +457 -0
- package/skills/integrations/bloomberg.md +803 -0
- package/skills/integrations/calcbench.md +315 -0
- package/skills/integrations/capiq.md +848 -0
- package/skills/integrations/dynamics-365-finance.md +354 -0
- package/skills/integrations/earnings_transcripts.md +387 -0
- package/skills/integrations/factset.md +758 -0
- package/skills/integrations/ice-fixed-income.md +344 -0
- package/skills/integrations/moodys-analytics.md +313 -0
- package/skills/integrations/morningstar.md +433 -0
- package/skills/integrations/nasdaq-data-link.md +249 -0
- package/skills/integrations/pitchbook.md +413 -0
- package/skills/integrations/preqin.md +422 -0
- package/skills/integrations/quickbooks.md +289 -0
- package/skills/integrations/quickfs.md +314 -0
- package/skills/integrations/refinitiv.md +473 -0
- package/skills/integrations/sage-intacct.md +401 -0
- package/skills/integrations/visible-alpha.md +320 -0
- package/skills/integrations/xero.md +393 -0
- package/skills/integrations/ycharts.md +306 -0
- package/skills/pdf-creation/SKILL.md +93 -0
- package/skills/pdf-extraction/SKILL.md +32 -0
- package/skills/powerpoint-creation/SKILL.md +110 -0
- package/skills/sec-edgar/SKILL.md +127 -0
- package/skills/sec-edgar/sec_to_pdf.py +109 -0
- package/xll/ShortcutXL.xll +0 -0
- package/xll/modules/debug_render.py +272 -0
- package/xll/modules/gameboy.py +241 -0
- package/xll/modules/pong.py +188 -0
- package/xll/modules/shortcut_xl/__init__.py +18 -0
- package/xll/modules/shortcut_xl/_categorize.py +200 -0
- package/xll/modules/shortcut_xl/_com.py +108 -0
- package/xll/modules/shortcut_xl/_format.py +252 -0
- package/xll/modules/shortcut_xl/_log.py +12 -0
- package/xll/modules/shortcut_xl/_managed.py +116 -0
- package/xll/modules/shortcut_xl/_registry.py +44 -0
- package/xll/modules/shortcut_xl/_threading.py +161 -0
- package/xll/modules/shortcut_xl/_tracking.py +283 -0
- package/xll/modules/stocks.py +100 -0
- package/xll/python3.dll +0 -0
- 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"])
|
package/xll/python3.dll
ADDED
|
Binary file
|
|
Binary file
|