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,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom streamSimple for Shortcut provider.
|
|
3
|
+
*
|
|
4
|
+
* Thin composition: converts context → request body, fetches SSE stream,
|
|
5
|
+
* maps SSE events → pi-ai AssistantMessageEvents.
|
|
6
|
+
*
|
|
7
|
+
* Message conversion lives in message-converter.ts.
|
|
8
|
+
* SSE protocol types live in sse-protocol.ts.
|
|
9
|
+
*/
|
|
10
|
+
import { createAssistantMessageEventStream } from '@mariozechner/pi-ai';
|
|
11
|
+
import { APP_NAME } from '../../config.js';
|
|
12
|
+
import { buildUsage, mapStopReason } from './llm-usage.js';
|
|
13
|
+
import { convertMessages, convertTools } from './message-converter.js';
|
|
14
|
+
import { SHORTCUT_PROVIDER_ID } from './provider-ids.js';
|
|
15
|
+
import { THINKING_TO_EFFORT, parseSSE } from './sse-protocol.js';
|
|
16
|
+
export function createShortcutStream(baseUrl) {
|
|
17
|
+
return function shortcutStream(model, context, options) {
|
|
18
|
+
const stream = createAssistantMessageEventStream();
|
|
19
|
+
const partial = {
|
|
20
|
+
role: 'assistant',
|
|
21
|
+
content: [],
|
|
22
|
+
api: 'shortcut-llm',
|
|
23
|
+
provider: SHORTCUT_PROVIDER_ID,
|
|
24
|
+
model: model.id,
|
|
25
|
+
usage: {
|
|
26
|
+
input: 0,
|
|
27
|
+
output: 0,
|
|
28
|
+
cacheRead: 0,
|
|
29
|
+
cacheWrite: 0,
|
|
30
|
+
totalTokens: 0,
|
|
31
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }
|
|
32
|
+
},
|
|
33
|
+
stopReason: 'stop',
|
|
34
|
+
timestamp: Date.now()
|
|
35
|
+
};
|
|
36
|
+
const body = {
|
|
37
|
+
model: model.id,
|
|
38
|
+
messages: convertMessages(context),
|
|
39
|
+
tools: convertTools(context.tools),
|
|
40
|
+
effort_level: options?.reasoning ? THINKING_TO_EFFORT[options.reasoning] || 'low' : undefined,
|
|
41
|
+
thinking_type: 'adaptive'
|
|
42
|
+
};
|
|
43
|
+
const thinkingText = {};
|
|
44
|
+
const toolCallArgs = {};
|
|
45
|
+
(async () => {
|
|
46
|
+
try {
|
|
47
|
+
const apiKey = options?.apiKey ?? '';
|
|
48
|
+
const response = await fetch(`${baseUrl}/api/llm/stream`, {
|
|
49
|
+
method: 'POST',
|
|
50
|
+
headers: {
|
|
51
|
+
'Content-Type': 'application/json',
|
|
52
|
+
Authorization: `Bearer ${apiKey}`,
|
|
53
|
+
'User-Agent': `Mozilla/5.0 (compatible; ${APP_NAME}-coding-agent/1.0)`
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify(body),
|
|
56
|
+
signal: options?.signal
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const raw = await response.text();
|
|
60
|
+
const text = raw.split('\n').slice(0, 20).join('\n');
|
|
61
|
+
throw new Error(`LLM proxy error ${response.status}: ${text}`);
|
|
62
|
+
}
|
|
63
|
+
stream.push({ type: 'start', partial });
|
|
64
|
+
const reader = response.body.getReader();
|
|
65
|
+
const decoder = new TextDecoder();
|
|
66
|
+
let buffer = '';
|
|
67
|
+
while (true) {
|
|
68
|
+
const { done, value } = await reader.read();
|
|
69
|
+
if (done)
|
|
70
|
+
break;
|
|
71
|
+
buffer += decoder.decode(value, { stream: true });
|
|
72
|
+
const events = buffer.split('\n\n');
|
|
73
|
+
buffer = events.pop() || '';
|
|
74
|
+
for (const eventBlock of events) {
|
|
75
|
+
if (!eventBlock.trim())
|
|
76
|
+
continue;
|
|
77
|
+
const parsed = parseSSE(eventBlock.split('\n'));
|
|
78
|
+
if (!parsed)
|
|
79
|
+
continue;
|
|
80
|
+
const { event, data } = parsed;
|
|
81
|
+
let payload;
|
|
82
|
+
try {
|
|
83
|
+
payload = JSON.parse(data);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
handleSSEEvent(event, payload, partial, stream, thinkingText, toolCallArgs, model);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const isAbort = options?.signal?.aborted ||
|
|
94
|
+
(err instanceof Error && err.name === 'AbortError');
|
|
95
|
+
const errMsg = err instanceof Error ? err.message : 'Request failed';
|
|
96
|
+
partial.stopReason = isAbort ? 'aborted' : 'error';
|
|
97
|
+
partial.errorMessage = isAbort ? 'Request was aborted' : errMsg;
|
|
98
|
+
stream.push({ type: 'error', reason: isAbort ? 'aborted' : 'error', error: partial });
|
|
99
|
+
}
|
|
100
|
+
})();
|
|
101
|
+
return stream;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/** Pad partial.content with empty text placeholders up to the given index. */
|
|
105
|
+
function padContent(partial, ci) {
|
|
106
|
+
while (partial.content.length <= ci) {
|
|
107
|
+
partial.content.push({ type: 'text', text: '' });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Map a single SSE event to pi-ai stream events and update partial state. */
|
|
111
|
+
function handleSSEEvent(event, payload, partial, stream, thinkingText, toolCallArgs, model) {
|
|
112
|
+
switch (event) {
|
|
113
|
+
case 'thinking_start': {
|
|
114
|
+
const p = payload;
|
|
115
|
+
const ci = p.content_index;
|
|
116
|
+
thinkingText[ci] = '';
|
|
117
|
+
padContent(partial, ci);
|
|
118
|
+
partial.content[ci] = {
|
|
119
|
+
type: 'thinking',
|
|
120
|
+
thinking: '',
|
|
121
|
+
redacted: false,
|
|
122
|
+
thinkingSignature: ''
|
|
123
|
+
};
|
|
124
|
+
stream.push({ type: 'thinking_start', contentIndex: ci, partial });
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
case 'thinking_delta': {
|
|
128
|
+
const p = payload;
|
|
129
|
+
const ci = p.content_index;
|
|
130
|
+
thinkingText[ci] = (thinkingText[ci] || '') + p.delta;
|
|
131
|
+
const tc = partial.content[ci];
|
|
132
|
+
if (tc)
|
|
133
|
+
tc.thinking = thinkingText[ci];
|
|
134
|
+
stream.push({ type: 'thinking_delta', contentIndex: ci, delta: p.delta, partial });
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
case 'thinking_end': {
|
|
138
|
+
const p = payload;
|
|
139
|
+
const ci = p.content_index;
|
|
140
|
+
const tc = partial.content[ci];
|
|
141
|
+
if (tc)
|
|
142
|
+
tc.thinkingSignature = p.signature;
|
|
143
|
+
stream.push({
|
|
144
|
+
type: 'thinking_end',
|
|
145
|
+
contentIndex: ci,
|
|
146
|
+
content: thinkingText[ci] || '',
|
|
147
|
+
partial
|
|
148
|
+
});
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case 'thinking_redacted': {
|
|
152
|
+
const p = payload;
|
|
153
|
+
const ci = p.content_index;
|
|
154
|
+
padContent(partial, ci);
|
|
155
|
+
partial.content[ci] = {
|
|
156
|
+
type: 'thinking',
|
|
157
|
+
thinking: '',
|
|
158
|
+
redacted: true,
|
|
159
|
+
thinkingSignature: p.signature
|
|
160
|
+
};
|
|
161
|
+
stream.push({ type: 'thinking_start', contentIndex: ci, partial });
|
|
162
|
+
stream.push({ type: 'thinking_end', contentIndex: ci, content: '', partial });
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
case 'text_start': {
|
|
166
|
+
const p = payload;
|
|
167
|
+
const ci = p.content_index;
|
|
168
|
+
padContent(partial, ci);
|
|
169
|
+
partial.content[ci] = { type: 'text', text: '' };
|
|
170
|
+
stream.push({ type: 'text_start', contentIndex: ci, partial });
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
case 'text_delta': {
|
|
174
|
+
const p = payload;
|
|
175
|
+
const ci = p.content_index;
|
|
176
|
+
const tc = partial.content[ci];
|
|
177
|
+
if (tc)
|
|
178
|
+
tc.text += p.delta;
|
|
179
|
+
stream.push({ type: 'text_delta', contentIndex: ci, delta: p.delta, partial });
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
case 'text_end': {
|
|
183
|
+
const ci = payload.content_index;
|
|
184
|
+
const tc = partial.content[ci];
|
|
185
|
+
stream.push({
|
|
186
|
+
type: 'text_end',
|
|
187
|
+
contentIndex: ci,
|
|
188
|
+
content: tc?.text || '',
|
|
189
|
+
partial
|
|
190
|
+
});
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
case 'toolcall_start': {
|
|
194
|
+
const p = payload;
|
|
195
|
+
const ci = p.content_index;
|
|
196
|
+
toolCallArgs[ci] = '';
|
|
197
|
+
padContent(partial, ci);
|
|
198
|
+
partial.content[ci] = {
|
|
199
|
+
type: 'toolCall',
|
|
200
|
+
id: p.id,
|
|
201
|
+
name: p.name,
|
|
202
|
+
arguments: {}
|
|
203
|
+
};
|
|
204
|
+
stream.push({ type: 'toolcall_start', contentIndex: ci, partial });
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
case 'toolcall_delta': {
|
|
208
|
+
const p = payload;
|
|
209
|
+
const ci = p.content_index;
|
|
210
|
+
toolCallArgs[ci] = (toolCallArgs[ci] || '') + p.delta;
|
|
211
|
+
stream.push({ type: 'toolcall_delta', contentIndex: ci, delta: p.delta, partial });
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
case 'toolcall_end': {
|
|
215
|
+
const p = payload;
|
|
216
|
+
const ci = p.content_index;
|
|
217
|
+
let args = {};
|
|
218
|
+
try {
|
|
219
|
+
args = JSON.parse(p.arguments);
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// keep empty
|
|
223
|
+
}
|
|
224
|
+
const toolCall = {
|
|
225
|
+
type: 'toolCall',
|
|
226
|
+
id: p.id,
|
|
227
|
+
name: p.name,
|
|
228
|
+
arguments: args
|
|
229
|
+
};
|
|
230
|
+
partial.content[ci] = toolCall;
|
|
231
|
+
stream.push({ type: 'toolcall_end', contentIndex: ci, toolCall, partial });
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
case 'done': {
|
|
235
|
+
const p = payload;
|
|
236
|
+
partial.usage = buildUsage(p.usage, model);
|
|
237
|
+
const reason = mapStopReason(p.stop_reason);
|
|
238
|
+
partial.stopReason = reason;
|
|
239
|
+
stream.push({
|
|
240
|
+
type: 'done',
|
|
241
|
+
reason: reason,
|
|
242
|
+
message: partial
|
|
243
|
+
});
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
case 'error': {
|
|
247
|
+
const p = payload;
|
|
248
|
+
throw new Error(p.message);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=shortcut-stream.js.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE protocol contract between the Python backend and the TS client.
|
|
3
|
+
*
|
|
4
|
+
* This file defines every SSE event type that /api/llm/stream can emit.
|
|
5
|
+
* It is the single source of truth. If the Python backend changes an event
|
|
6
|
+
* shape, this file must change first, and both sides' tests must be updated.
|
|
7
|
+
*
|
|
8
|
+
* Counterpart: backend/server/routes/llm_stream.py (_sse_event, _stream_llm)
|
|
9
|
+
*/
|
|
10
|
+
// --- SSE line parser ---
|
|
11
|
+
/**
|
|
12
|
+
* Parse a single SSE event block (lines between double-newlines) into
|
|
13
|
+
* its event name and JSON data string. Returns null if the block is
|
|
14
|
+
* incomplete or malformed.
|
|
15
|
+
*/
|
|
16
|
+
export function parseSSE(lines) {
|
|
17
|
+
let event = '';
|
|
18
|
+
let data = '';
|
|
19
|
+
for (const line of lines) {
|
|
20
|
+
if (line.startsWith('event: '))
|
|
21
|
+
event = line.slice(7);
|
|
22
|
+
else if (line.startsWith('data: '))
|
|
23
|
+
data = line.slice(6);
|
|
24
|
+
}
|
|
25
|
+
if (!event || !data)
|
|
26
|
+
return null;
|
|
27
|
+
return { event, data };
|
|
28
|
+
}
|
|
29
|
+
// --- Thinking level mapping ---
|
|
30
|
+
/** Map pi-ai thinking levels to backend effort levels. */
|
|
31
|
+
export const THINKING_TO_EFFORT = {
|
|
32
|
+
minimal: 'low',
|
|
33
|
+
low: 'low',
|
|
34
|
+
medium: 'medium',
|
|
35
|
+
high: 'high',
|
|
36
|
+
xhigh: 'max'
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=sse-protocol.js.map
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync the shipped XLL directory to a stable user-local path.
|
|
3
|
+
*
|
|
4
|
+
* The npm package ships xll/ containing everything the XLL needs:
|
|
5
|
+
* xll/ShortcutXL.xll — the add-in DLL
|
|
6
|
+
* xll/python3.dll etc. — Python runtime DLLs
|
|
7
|
+
* xll/modules/ — shortcut_xl.py and user UDF modules
|
|
8
|
+
*
|
|
9
|
+
* On every startup we sync xll/ to ~/.shortcut/agent/xll/ so the
|
|
10
|
+
* Windows registry key always points to a stable path that survives
|
|
11
|
+
* npm re-installs.
|
|
12
|
+
*
|
|
13
|
+
* Note: files removed from the shipped directory are NOT deleted from the
|
|
14
|
+
* stable directory. This is intentional — Excel may still have the old DLL
|
|
15
|
+
* loaded, and stale files are harmless.
|
|
16
|
+
*/
|
|
17
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, utimesSync } from 'fs';
|
|
18
|
+
import { createHash } from 'crypto';
|
|
19
|
+
import { join } from 'path';
|
|
20
|
+
import { getAgentDir, getPackageDir } from '../config.js';
|
|
21
|
+
/** Stable XLL directory that the registry should point to. */
|
|
22
|
+
export function getStableXllDir() {
|
|
23
|
+
return join(getAgentDir(), 'xll');
|
|
24
|
+
}
|
|
25
|
+
/** Strip the NTFS Zone.Identifier alternate data stream (Mark of the Web). */
|
|
26
|
+
function stripMotw(filePath) {
|
|
27
|
+
try {
|
|
28
|
+
unlinkSync(`${filePath}:Zone.Identifier`);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// No MOTW or not on NTFS — nothing to do
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Returns true if `src` and `dest` have identical size and mtime.
|
|
36
|
+
* Avoids reading file contents — stat-only comparison is ~100x faster
|
|
37
|
+
* than MD5 hashing multi-MB DLLs on every startup.
|
|
38
|
+
*/
|
|
39
|
+
function filesMatch(src, dest) {
|
|
40
|
+
if (!existsSync(dest))
|
|
41
|
+
return false;
|
|
42
|
+
const srcStat = statSync(src);
|
|
43
|
+
const destStat = statSync(dest);
|
|
44
|
+
return srcStat.size === destStat.size && srcStat.mtimeMs === destStat.mtimeMs;
|
|
45
|
+
}
|
|
46
|
+
/** Returns true if two files have identical content (SHA-256). */
|
|
47
|
+
function filesContentMatch(src, dest) {
|
|
48
|
+
const hash = (p) => createHash('sha256').update(readFileSync(p)).digest('hex');
|
|
49
|
+
return hash(src) === hash(dest);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Recursively copy `src` directory to `dest`, only overwriting files
|
|
53
|
+
* whose content has changed. Creates directories as needed.
|
|
54
|
+
*/
|
|
55
|
+
function syncDir(src, dest) {
|
|
56
|
+
if (!existsSync(src))
|
|
57
|
+
return { updated: 0, staleLocked: false };
|
|
58
|
+
mkdirSync(dest, { recursive: true });
|
|
59
|
+
let updated = 0;
|
|
60
|
+
let staleLocked = false;
|
|
61
|
+
for (const entry of readdirSync(src)) {
|
|
62
|
+
const srcPath = join(src, entry);
|
|
63
|
+
const destPath = join(dest, entry);
|
|
64
|
+
const stat = statSync(srcPath);
|
|
65
|
+
if (stat.isDirectory()) {
|
|
66
|
+
const sub = syncDir(srcPath, destPath);
|
|
67
|
+
updated += sub.updated;
|
|
68
|
+
staleLocked = staleLocked || sub.staleLocked;
|
|
69
|
+
}
|
|
70
|
+
else if (stat.isFile()) {
|
|
71
|
+
if (!filesMatch(srcPath, destPath)) {
|
|
72
|
+
try {
|
|
73
|
+
copyFileSync(srcPath, destPath);
|
|
74
|
+
// Preserve mtime so the stat-based filesMatch() short-circuits next startup.
|
|
75
|
+
const srcMtime = statSync(srcPath).mtime;
|
|
76
|
+
utimesSync(destPath, srcMtime, srcMtime);
|
|
77
|
+
// Strip Mark of the Web so Excel doesn't show "file format mismatch" dialogs.
|
|
78
|
+
// npm downloads carry a Zone.Identifier ADS that Windows propagates through copies.
|
|
79
|
+
stripMotw(destPath);
|
|
80
|
+
updated++;
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
// On Windows, Excel may have the XLL/DLL locked (EBUSY/EPERM).
|
|
84
|
+
const code = err.code;
|
|
85
|
+
if (code === 'EBUSY' || code === 'EPERM') {
|
|
86
|
+
// The stat-based check flagged a difference (usually just mtime after
|
|
87
|
+
// npm reinstall). Check actual content before alarming the user.
|
|
88
|
+
if (!filesContentMatch(srcPath, destPath)) {
|
|
89
|
+
staleLocked = true;
|
|
90
|
+
}
|
|
91
|
+
// If content matches, silently skip — no update needed.
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { updated, staleLocked };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Sync shipped XLL files to the stable user-local directory.
|
|
104
|
+
*
|
|
105
|
+
* Safe to call on every startup — only copies files that actually changed.
|
|
106
|
+
* Callers should check `xllReady` — if false on first install, the agent
|
|
107
|
+
* cannot proceed with registration.
|
|
108
|
+
*/
|
|
109
|
+
export function syncXll() {
|
|
110
|
+
const shippedDir = join(getPackageDir(), 'xll');
|
|
111
|
+
const stableDir = getStableXllDir();
|
|
112
|
+
if (existsSync(shippedDir)) {
|
|
113
|
+
try {
|
|
114
|
+
const { updated, staleLocked } = syncDir(shippedDir, stableDir);
|
|
115
|
+
if (staleLocked) {
|
|
116
|
+
console.warn('Warning: A ShortcutXL update is available but Excel has files locked. ' +
|
|
117
|
+
'Please close Excel and restart the Shortcut agent to apply it.');
|
|
118
|
+
}
|
|
119
|
+
const xllReady = existsSync(join(stableDir, 'ShortcutXL.xll'));
|
|
120
|
+
return { updated, stableDir, xllReady };
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
console.warn(`Warning: XLL sync failed: ${err}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Sync failed or shipped dir missing — check if stable dir has a prior copy
|
|
127
|
+
const xllReady = existsSync(join(stableDir, 'ShortcutXL.xll'));
|
|
128
|
+
return { updated: 0, stableDir, xllReady };
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=sync-xll.js.map
|