@mars_ai/marscli 2.0.12 → 2.0.14
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/CHANGELOG.md +6515 -0
- package/README.md +71 -22
- package/dist/bun/cli.d.ts +5 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +5 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +17 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +36 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/bun/runtime-setup.d.ts +2 -0
- package/dist/bun/runtime-setup.d.ts.map +1 -0
- package/dist/bun/runtime-setup.js +12 -0
- package/dist/bun/runtime-setup.js.map +1 -0
- package/dist/bun/sandbox-env-setup.d.ts +2 -0
- package/dist/bun/sandbox-env-setup.d.ts.map +1 -0
- package/dist/bun/sandbox-env-setup.js +4 -0
- package/dist/bun/sandbox-env-setup.js.map +1 -0
- package/dist/bundle/chunks/anthropic-messages-QCK7M7VG.js +6 -0
- package/dist/bundle/chunks/anthropic.js +75 -0
- package/dist/bundle/chunks/azure-openai-responses-LMBPTTDE.js +2 -0
- package/dist/bundle/chunks/bedrock-converse-stream.js +89 -0
- package/dist/bundle/chunks/chunk-45GGYWI5.js +2 -0
- package/dist/bundle/chunks/chunk-5AGIVGSV.js +6 -0
- package/dist/bundle/chunks/chunk-5ZIVIB55.js +8 -0
- package/dist/bundle/chunks/chunk-6QGV3IWD.js +6 -0
- package/dist/bundle/chunks/chunk-7CBJINYJ.js +20 -0
- package/dist/bundle/chunks/chunk-7DDKXS2Q.js +2 -0
- package/dist/bundle/chunks/chunk-7ZC4UXSL.js +2 -0
- package/dist/bundle/chunks/chunk-AZEKCFSR.js +82 -0
- package/dist/bundle/chunks/chunk-BUEFMMN7.js +1261 -0
- package/dist/bundle/chunks/chunk-CF5GWZHW.js +31 -0
- package/dist/bundle/chunks/chunk-FFMDRXC4.js +10 -0
- package/dist/bundle/chunks/chunk-FR2OJIAF.js +2 -0
- package/dist/bundle/chunks/chunk-G4QXDUQL.js +30 -0
- package/dist/bundle/chunks/chunk-GFUN2N5K.js +2 -0
- package/dist/bundle/chunks/chunk-GXW3X65X.js +4 -0
- package/dist/bundle/chunks/chunk-ICLDQMTM.js +129 -0
- package/dist/bundle/chunks/chunk-IEBK4HQA.js +2 -0
- package/dist/bundle/chunks/chunk-JEIXS66U.js +2 -0
- package/dist/bundle/chunks/chunk-JK44MIUX.js +44 -0
- package/dist/bundle/chunks/chunk-JXUDILQJ.js +16 -0
- package/dist/bundle/chunks/chunk-JXWJOIH4.js +2 -0
- package/dist/bundle/chunks/chunk-K5TQM7UY.js +2 -0
- package/dist/bundle/chunks/chunk-L2ZPNLYD.js +2 -0
- package/dist/bundle/chunks/chunk-LPXNMA2W.js +2 -0
- package/dist/bundle/chunks/chunk-LVVZS2NO.js +12 -0
- package/dist/bundle/chunks/chunk-MTY47RPT.js +19 -0
- package/dist/bundle/chunks/chunk-OLNSR6Z3.js +13 -0
- package/dist/bundle/chunks/chunk-P7FPUEYA.js +2 -0
- package/dist/bundle/chunks/chunk-PGXDEOVV.js +2 -0
- package/dist/bundle/chunks/chunk-PJACZCIR.js +2 -0
- package/dist/bundle/chunks/chunk-PMRZO46Y.js +2 -0
- package/dist/bundle/chunks/chunk-PRRNXB7S.js +2 -0
- package/dist/bundle/chunks/chunk-RDZVAGPR.js +2 -0
- package/dist/bundle/chunks/chunk-TVDA4NZP.js +55 -0
- package/dist/bundle/chunks/chunk-UNAPBUIX.js +2 -0
- package/dist/bundle/chunks/chunk-UTB4DTYQ.js +2 -0
- package/dist/bundle/chunks/chunk-V6KH5QG4.js +9 -0
- package/dist/bundle/chunks/chunk-ZG74NES2.js +2 -0
- package/dist/bundle/chunks/cli-CI7EFTTK.js +53 -0
- package/dist/bundle/chunks/codemode-worker.js +478 -0
- package/dist/bundle/chunks/easter-egg-3d-P2D4BQR7.js +2 -0
- package/dist/bundle/chunks/execute-PRYDOFWM.js +505 -0
- package/dist/bundle/chunks/github-copilot.js +2 -0
- package/dist/bundle/chunks/google-generative-ai-WFLFMJYT.js +2 -0
- package/dist/bundle/chunks/google-vertex-3VJ5WJYY.js +2 -0
- package/dist/bundle/chunks/https-proxy-agent-LVOO5TPL.js +13 -0
- package/dist/bundle/chunks/image-resize-worker.js +2 -0
- package/dist/bundle/chunks/jiti-loader-GL4HJFAD.js +21 -0
- package/dist/bundle/chunks/jiti-static-loader-2RCDI6B4.js +2 -0
- package/dist/bundle/chunks/kimi-coding.js +2 -0
- package/dist/bundle/chunks/lib-4AVRLBHM.js +9 -0
- package/dist/bundle/chunks/meta.js +2 -0
- package/dist/bundle/chunks/mistral-conversations-G22LGLWM.js +5 -0
- package/dist/bundle/chunks/multipart-parser-FMGQ7342.js +3 -0
- package/dist/bundle/chunks/node-AUOGOBCN.js +2 -0
- package/dist/bundle/chunks/node-KCMANYC2.js +16 -0
- package/dist/bundle/chunks/openai-chatgpt.js +75 -0
- package/dist/bundle/chunks/openai-codex-responses-CDQVKDUO.js +10 -0
- package/dist/bundle/chunks/openai-codex.js +75 -0
- package/dist/bundle/chunks/openai-completions-RAU4DJDG.js +7 -0
- package/dist/bundle/chunks/openai-responses-4IZEGS2C.js +4 -0
- package/dist/bundle/chunks/openrouter-images-EXXX2XDD.js +2 -0
- package/dist/bundle/chunks/openrouter.js +75 -0
- package/dist/bundle/chunks/pi-messages-YPAWD2FK.js +8 -0
- package/dist/bundle/chunks/radius.js +75 -0
- package/dist/bundle/chunks/runtime-4K2RC6HQ.js +2 -0
- package/dist/bundle/chunks/src-QKGKDFSU.js +4 -0
- package/dist/bundle/chunks/typesafe-system-one-2F7KHMWD.js +2 -0
- package/dist/bundle/chunks/virtual-modules-XDTMJGCH.js +2 -0
- package/dist/bundle/chunks/xai.js +2 -0
- package/dist/bundle/cli-runtime.js +3 -0
- package/dist/bundle/cli.js +5 -0
- package/dist/bundle/index.js +2 -0
- package/dist/bundle/rpc-entry.js +3 -0
- package/dist/cli/args.d.ts +62 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +474 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/auth-check.d.ts +19 -0
- package/dist/cli/auth-check.d.ts.map +1 -0
- package/dist/cli/auth-check.js +50 -0
- package/dist/cli/auth-check.js.map +1 -0
- package/dist/cli/auth-command.d.ts +24 -0
- package/dist/cli/auth-command.d.ts.map +1 -0
- package/dist/cli/auth-command.js +103 -0
- package/dist/cli/auth-command.js.map +1 -0
- package/dist/cli/config-selector.d.ts +16 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +34 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/credential-print.d.ts +13 -0
- package/dist/cli/credential-print.d.ts.map +1 -0
- package/dist/cli/credential-print.js +76 -0
- package/dist/cli/credential-print.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +71 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +98 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/project-trust.d.ts +10 -0
- package/dist/cli/project-trust.d.ts.map +1 -0
- package/dist/cli/project-trust.js +48 -0
- package/dist/cli/project-trust.js.map +1 -0
- package/dist/cli/session-picker.d.ts +10 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +36 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/setup.d.ts +2 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +12 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/startup-ui.d.ts +20 -0
- package/dist/cli/startup-ui.d.ts.map +1 -0
- package/dist/cli/startup-ui.js +175 -0
- package/dist/cli/startup-ui.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +136 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +554 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +124 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +324 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +86 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +147 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session.d.ts +950 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +3710 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +72 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +434 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +32 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +103 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/bug-report-upload.d.ts +12 -0
- package/dist/core/bug-report-upload.d.ts.map +1 -0
- package/dist/core/bug-report-upload.js +22 -0
- package/dist/core/bug-report-upload.js.map +1 -0
- package/dist/core/bug-report.d.ts +184 -0
- package/dist/core/bug-report.d.ts.map +1 -0
- package/dist/core/bug-report.js +292 -0
- package/dist/core/bug-report.js.map +1 -0
- package/dist/core/cache-stats.d.ts +49 -0
- package/dist/core/cache-stats.d.ts.map +1 -0
- package/dist/core/cache-stats.js +112 -0
- package/dist/core/cache-stats.js.map +1 -0
- package/dist/core/cache-warmer.d.ts +103 -0
- package/dist/core/cache-warmer.d.ts.map +1 -0
- package/dist/core/cache-warmer.js +358 -0
- package/dist/core/cache-warmer.js.map +1 -0
- package/dist/core/client-identity.d.ts +8 -0
- package/dist/core/client-identity.d.ts.map +1 -0
- package/dist/core/client-identity.js +15 -0
- package/dist/core/client-identity.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +100 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +262 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +145 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +749 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +45 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +149 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/crash-log.d.ts +27 -0
- package/dist/core/crash-log.d.ts.map +1 -0
- package/dist/core/crash-log.js +140 -0
- package/dist/core/crash-log.js.map +1 -0
- package/dist/core/defaults.d.ts +4 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +11 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +37 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +119 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/experimental.d.ts +2 -0
- package/dist/core/experimental.d.ts.map +1 -0
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +37 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +228 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +1085 -0
- package/dist/core/export-html/template.html +56 -0
- package/dist/core/export-html/template.js +2044 -0
- package/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +113 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked-cjk-friendly.min.js +6 -0
- package/dist/core/export-html/vendor/marked.min.js +79 -0
- package/dist/core/extensions/index.d.ts +12 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/jiti-loader.d.ts +2 -0
- package/dist/core/extensions/jiti-loader.d.ts.map +1 -0
- package/dist/core/extensions/jiti-loader.js +4 -0
- package/dist/core/extensions/jiti-loader.js.map +1 -0
- package/dist/core/extensions/jiti-static-loader.d.ts +2 -0
- package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -0
- package/dist/core/extensions/jiti-static-loader.js +4 -0
- package/dist/core/extensions/jiti-static-loader.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +23 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +710 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/pi-ai-extension-view.d.ts +19 -0
- package/dist/core/extensions/pi-ai-extension-view.d.ts.map +1 -0
- package/dist/core/extensions/pi-ai-extension-view.js +22 -0
- package/dist/core/extensions/pi-ai-extension-view.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +216 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +1246 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1801 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +48 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/virtual-modules.d.ts +3 -0
- package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/virtual-modules.js +42 -0
- package/dist/core/extensions/virtual-modules.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +20 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +22 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +64 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +338 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts +22 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +98 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/key-id-schema.d.ts +6 -0
- package/dist/core/key-id-schema.d.ts.map +1 -0
- package/dist/core/key-id-schema.js +16 -0
- package/dist/core/key-id-schema.js.map +1 -0
- package/dist/core/keybindings-schema.d.ts +4 -0
- package/dist/core/keybindings-schema.d.ts.map +1 -0
- package/dist/core/keybindings-schema.js +16 -0
- package/dist/core/keybindings-schema.js.map +1 -0
- package/dist/core/keybindings.d.ts +560 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +324 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/mcp-servers.d.ts +121 -0
- package/dist/core/mcp-servers.d.ts.map +1 -0
- package/dist/core/mcp-servers.js +163 -0
- package/dist/core/mcp-servers.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +124 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-config.d.ts +2000 -0
- package/dist/core/model-config.d.ts.map +1 -0
- package/dist/core/model-config.js +167 -0
- package/dist/core/model-config.js.map +1 -0
- package/dist/core/model-registry.d.ts +63 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +144 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +139 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +495 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/model-runtime.d.ts +150 -0
- package/dist/core/model-runtime.d.ts.map +1 -0
- package/dist/core/model-runtime.js +774 -0
- package/dist/core/model-runtime.js.map +1 -0
- package/dist/core/models-store.d.ts +22 -0
- package/dist/core/models-store.d.ts.map +1 -0
- package/dist/core/models-store.js +115 -0
- package/dist/core/models-store.js.map +1 -0
- package/dist/core/nested-tool-calls.d.ts +103 -0
- package/dist/core/nested-tool-calls.d.ts.map +1 -0
- package/dist/core/nested-tool-calls.js +179 -0
- package/dist/core/nested-tool-calls.js.map +1 -0
- package/dist/core/output-guard.d.ts +7 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +89 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +240 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +2383 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/pi-ai-schemas.d.ts +166 -0
- package/dist/core/pi-ai-schemas.d.ts.map +1 -0
- package/dist/core/pi-ai-schemas.js +21 -0
- package/dist/core/pi-ai-schemas.js.map +1 -0
- package/dist/core/pi-manifest.d.ts +9 -0
- package/dist/core/pi-manifest.d.ts.map +1 -0
- package/dist/core/pi-manifest.js +30 -0
- package/dist/core/pi-manifest.js.map +1 -0
- package/dist/core/project-trust.d.ts +15 -0
- package/dist/core/project-trust.d.ts.map +1 -0
- package/dist/core/project-trust.js +60 -0
- package/dist/core/project-trust.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +59 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +267 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/provider-composer.d.ts +81 -0
- package/dist/core/provider-composer.d.ts.map +1 -0
- package/dist/core/provider-composer.js +492 -0
- package/dist/core/provider-composer.js.map +1 -0
- package/dist/core/radius.d.ts +7 -0
- package/dist/core/radius.d.ts.map +1 -0
- package/dist/core/radius.js +10 -0
- package/dist/core/radius.js.map +1 -0
- package/dist/core/remote-catalog-provider.d.ts +23 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -0
- package/dist/core/remote-catalog-provider.js +190 -0
- package/dist/core/remote-catalog-provider.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +30 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +247 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +233 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +1025 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/runtime-credentials.d.ts +23 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -0
- package/dist/core/runtime-credentials.js +53 -0
- package/dist/core/runtime-credentials.js.map +1 -0
- package/dist/core/sdk.d.ts +117 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +329 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-export.d.ts +8 -0
- package/dist/core/session-export.d.ts.map +1 -0
- package/dist/core/session-export.js +33 -0
- package/dist/core/session-export.js.map +1 -0
- package/dist/core/session-manager.d.ts +423 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1542 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-defaults.d.ts +66 -0
- package/dist/core/settings-defaults.d.ts.map +1 -0
- package/dist/core/settings-defaults.js +69 -0
- package/dist/core/settings-defaults.js.map +1 -0
- package/dist/core/settings-diagnostics.d.ts +9 -0
- package/dist/core/settings-diagnostics.d.ts.map +1 -0
- package/dist/core/settings-diagnostics.js +21 -0
- package/dist/core/settings-diagnostics.js.map +1 -0
- package/dist/core/settings-manager.d.ts +253 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +1154 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/settings-schema.d.ts +232 -0
- package/dist/core/settings-schema.d.ts.map +1 -0
- package/dist/core/settings-schema.js +301 -0
- package/dist/core/settings-schema.js.map +1 -0
- package/dist/core/skills.d.ts +63 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +404 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +15 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +32 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +35 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +48 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +77 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +150 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/telemetry.d.ts +3 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +9 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/timings.d.ts +10 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +41 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +100 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +363 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +101 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +421 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +44 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +145 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +52 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +42 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +267 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +39 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +257 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +43 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +129 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +41 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +127 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +63 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +214 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +10 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +99 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/powershell.d.ts +16 -0
- package/dist/core/tools/powershell.d.ts.map +1 -0
- package/dist/core/tools/powershell.js +39 -0
- package/dist/core/tools/powershell.js.map +1 -0
- package/dist/core/tools/read.d.ts +63 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +302 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +50 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +153 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/renderers/bash.d.ts +12 -0
- package/dist/core/tools/renderers/bash.d.ts.map +1 -0
- package/dist/core/tools/renderers/bash.js +89 -0
- package/dist/core/tools/renderers/bash.js.map +1 -0
- package/dist/core/tools/renderers/edit.d.ts +23 -0
- package/dist/core/tools/renderers/edit.d.ts.map +1 -0
- package/dist/core/tools/renderers/edit.js +168 -0
- package/dist/core/tools/renderers/edit.js.map +1 -0
- package/dist/core/tools/renderers/find.d.ts +10 -0
- package/dist/core/tools/renderers/find.d.ts.map +1 -0
- package/dist/core/tools/renderers/find.js +64 -0
- package/dist/core/tools/renderers/find.js.map +1 -0
- package/dist/core/tools/renderers/grep.d.ts +10 -0
- package/dist/core/tools/renderers/grep.d.ts.map +1 -0
- package/dist/core/tools/renderers/grep.js +69 -0
- package/dist/core/tools/renderers/grep.js.map +1 -0
- package/dist/core/tools/renderers/index.d.ts +28 -0
- package/dist/core/tools/renderers/index.d.ts.map +1 -0
- package/dist/core/tools/renderers/index.js +47 -0
- package/dist/core/tools/renderers/index.js.map +1 -0
- package/dist/core/tools/renderers/ls.d.ts +10 -0
- package/dist/core/tools/renderers/ls.d.ts.map +1 -0
- package/dist/core/tools/renderers/ls.js +58 -0
- package/dist/core/tools/renderers/ls.js.map +1 -0
- package/dist/core/tools/renderers/read.d.ts +11 -0
- package/dist/core/tools/renderers/read.d.ts.map +1 -0
- package/dist/core/tools/renderers/read.js +126 -0
- package/dist/core/tools/renderers/read.js.map +1 -0
- package/dist/core/tools/renderers/write.d.ts +10 -0
- package/dist/core/tools/renderers/write.d.ts.map +1 -0
- package/dist/core/tools/renderers/write.js +153 -0
- package/dist/core/tools/renderers/write.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +26 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +38 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +74 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +238 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +30 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +61 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/core/trust-manager.d.ts +36 -0
- package/dist/core/trust-manager.d.ts.map +1 -0
- package/dist/core/trust-manager.js +210 -0
- package/dist/core/trust-manager.js.map +1 -0
- package/dist/core/usage-totals.d.ts +21 -0
- package/dist/core/usage-totals.d.ts.map +1 -0
- package/dist/core/usage-totals.js +81 -0
- package/dist/core/usage-totals.js.map +1 -0
- package/dist/core/virtual-models.d.ts +117 -0
- package/dist/core/virtual-models.d.ts.map +1 -0
- package/dist/core/virtual-models.js +124 -0
- package/dist/core/virtual-models.js.map +1 -0
- package/dist/extensions/codemode/execute.d.ts +16 -0
- package/dist/extensions/codemode/execute.d.ts.map +1 -0
- package/dist/extensions/codemode/execute.js +740 -0
- package/dist/extensions/codemode/execute.js.map +1 -0
- package/dist/extensions/codemode/execute.lazy.d.ts +3 -0
- package/dist/extensions/codemode/execute.lazy.d.ts.map +1 -0
- package/dist/extensions/codemode/execute.lazy.js +3 -0
- package/dist/extensions/codemode/execute.lazy.js.map +1 -0
- package/dist/extensions/codemode/index.d.ts +21 -0
- package/dist/extensions/codemode/index.d.ts.map +1 -0
- package/dist/extensions/codemode/index.js +33 -0
- package/dist/extensions/codemode/index.js.map +1 -0
- package/dist/extensions/codemode/renderer.d.ts +12 -0
- package/dist/extensions/codemode/renderer.d.ts.map +1 -0
- package/dist/extensions/codemode/renderer.js +147 -0
- package/dist/extensions/codemode/renderer.js.map +1 -0
- package/dist/extensions/codemode/tool.d.ts +125 -0
- package/dist/extensions/codemode/tool.d.ts.map +1 -0
- package/dist/extensions/codemode/tool.js +313 -0
- package/dist/extensions/codemode/tool.js.map +1 -0
- package/dist/extensions/codemode/worker.d.ts +7 -0
- package/dist/extensions/codemode/worker.d.ts.map +1 -0
- package/dist/extensions/codemode/worker.js +7 -0
- package/dist/extensions/codemode/worker.js.map +1 -0
- package/dist/extensions/index.d.ts +3 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +19 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/llama/client.d.ts +71 -0
- package/dist/extensions/llama/client.d.ts.map +1 -0
- package/dist/extensions/llama/client.js +334 -0
- package/dist/extensions/llama/client.js.map +1 -0
- package/dist/extensions/llama/huggingface.d.ts +23 -0
- package/dist/extensions/llama/huggingface.d.ts.map +1 -0
- package/dist/extensions/llama/huggingface.js +141 -0
- package/dist/extensions/llama/huggingface.js.map +1 -0
- package/dist/extensions/llama/index.d.ts +3 -0
- package/dist/extensions/llama/index.d.ts.map +1 -0
- package/dist/extensions/llama/index.js +219 -0
- package/dist/extensions/llama/index.js.map +1 -0
- package/dist/extensions/llama/provider.d.ts +12 -0
- package/dist/extensions/llama/provider.d.ts.map +1 -0
- package/dist/extensions/llama/provider.js +236 -0
- package/dist/extensions/llama/provider.js.map +1 -0
- package/dist/extensions/llama/ui.d.ts +42 -0
- package/dist/extensions/llama/ui.d.ts.map +1 -0
- package/dist/extensions/llama/ui.js +440 -0
- package/dist/extensions/llama/ui.js.map +1 -0
- package/dist/extensions/marsai/index.d.ts +18 -0
- package/dist/extensions/marsai/index.d.ts.map +1 -0
- package/dist/extensions/marsai/index.js +179 -0
- package/dist/extensions/marsai/index.js.map +1 -0
- package/dist/extensions/marsai/oauth.d.ts +49 -0
- package/dist/extensions/marsai/oauth.d.ts.map +1 -0
- package/dist/extensions/marsai/oauth.js +291 -0
- package/dist/extensions/marsai/oauth.js.map +1 -0
- package/dist/extensions/marsai/web-tools.d.ts +31 -0
- package/dist/extensions/marsai/web-tools.d.ts.map +1 -0
- package/dist/extensions/marsai/web-tools.js +298 -0
- package/dist/extensions/marsai/web-tools.js.map +1 -0
- package/dist/extensions/mcp/cli.d.ts +23 -0
- package/dist/extensions/mcp/cli.d.ts.map +1 -0
- package/dist/extensions/mcp/cli.js +558 -0
- package/dist/extensions/mcp/cli.js.map +1 -0
- package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
- package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
- package/dist/extensions/mcp/cli.lazy.js +3 -0
- package/dist/extensions/mcp/cli.lazy.js.map +1 -0
- package/dist/extensions/mcp/config.d.ts +84 -0
- package/dist/extensions/mcp/config.d.ts.map +1 -0
- package/dist/extensions/mcp/config.js +192 -0
- package/dist/extensions/mcp/config.js.map +1 -0
- package/dist/extensions/mcp/index.d.ts +79 -0
- package/dist/extensions/mcp/index.d.ts.map +1 -0
- package/dist/extensions/mcp/index.js +1206 -0
- package/dist/extensions/mcp/index.js.map +1 -0
- package/dist/extensions/mcp/log.d.ts +16 -0
- package/dist/extensions/mcp/log.d.ts.map +1 -0
- package/dist/extensions/mcp/log.js +66 -0
- package/dist/extensions/mcp/log.js.map +1 -0
- package/dist/extensions/mcp/oauth.d.ts +64 -0
- package/dist/extensions/mcp/oauth.d.ts.map +1 -0
- package/dist/extensions/mcp/oauth.js +188 -0
- package/dist/extensions/mcp/oauth.js.map +1 -0
- package/dist/extensions/mcp/resources.d.ts +36 -0
- package/dist/extensions/mcp/resources.d.ts.map +1 -0
- package/dist/extensions/mcp/resources.js +262 -0
- package/dist/extensions/mcp/resources.js.map +1 -0
- package/dist/extensions/mcp/runtime.d.ts +99 -0
- package/dist/extensions/mcp/runtime.d.ts.map +1 -0
- package/dist/extensions/mcp/runtime.js +380 -0
- package/dist/extensions/mcp/runtime.js.map +1 -0
- package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
- package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
- package/dist/extensions/mcp/runtime.lazy.js +3 -0
- package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
- package/dist/extensions/mcp/tools.d.ts +65 -0
- package/dist/extensions/mcp/tools.d.ts.map +1 -0
- package/dist/extensions/mcp/tools.js +257 -0
- package/dist/extensions/mcp/tools.js.map +1 -0
- package/dist/extensions/mcp/ui.d.ts +61 -0
- package/dist/extensions/mcp/ui.d.ts.map +1 -0
- package/dist/extensions/mcp/ui.js +195 -0
- package/dist/extensions/mcp/ui.js.map +1 -0
- package/dist/extensions/subagent/agents.d.ts +23 -0
- package/dist/extensions/subagent/agents.d.ts.map +1 -0
- package/dist/extensions/subagent/agents.js +121 -0
- package/dist/extensions/subagent/agents.js.map +1 -0
- package/dist/extensions/subagent/index.d.ts +16 -0
- package/dist/extensions/subagent/index.d.ts.map +1 -0
- package/dist/extensions/subagent/index.js +1080 -0
- package/dist/extensions/subagent/index.js.map +1 -0
- package/dist/extensions/subagent/recon-child.d.ts +9 -0
- package/dist/extensions/subagent/recon-child.d.ts.map +1 -0
- package/dist/extensions/subagent/recon-child.js +80 -0
- package/dist/extensions/subagent/recon-child.js.map +1 -0
- package/dist/extensions/subagent/recon.d.ts +17 -0
- package/dist/extensions/subagent/recon.d.ts.map +1 -0
- package/dist/extensions/subagent/recon.js +56 -0
- package/dist/extensions/subagent/recon.js.map +1 -0
- package/dist/extensions/tool-search/index.d.ts +12 -0
- package/dist/extensions/tool-search/index.d.ts.map +1 -0
- package/dist/extensions/tool-search/index.js +15 -0
- package/dist/extensions/tool-search/index.js.map +1 -0
- package/dist/extensions/tool-search/tool.d.ts +86 -0
- package/dist/extensions/tool-search/tool.d.ts.map +1 -0
- package/dist/extensions/tool-search/tool.js +255 -0
- package/dist/extensions/tool-search/tool.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +16 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +835 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +282 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +10 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/bug-report.d.ts +16 -0
- package/dist/modes/interactive/bug-report.d.ts.map +1 -0
- package/dist/modes/interactive/bug-report.js +210 -0
- package/dist/modes/interactive/bug-report.js.map +1 -0
- package/dist/modes/interactive/chat-viewport.d.ts +20 -0
- package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
- package/dist/modes/interactive/chat-viewport.js +28 -0
- package/dist/modes/interactive/chat-viewport.js.map +1 -0
- package/dist/modes/interactive/components/armin.d.ts +37 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +335 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +29 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +182 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/auth-url.d.ts +14 -0
- package/dist/modes/interactive/components/auth-url.d.ts.map +1 -0
- package/dist/modes/interactive/components/auth-url.js +37 -0
- package/dist/modes/interactive/components/auth-url.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +38 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +178 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +54 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +21 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +62 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +21 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +63 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +102 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +758 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +30 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +122 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-entry.d.ts +21 -0
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-entry.js +59 -0
- package/dist/modes/interactive/components/custom-entry.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +25 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +96 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +139 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.js +40 -0
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
- package/dist/modes/interactive/components/easter-egg-3d.d.ts +104 -0
- package/dist/modes/interactive/components/easter-egg-3d.d.ts.map +1 -0
- package/dist/modes/interactive/components/easter-egg-3d.js +1139 -0
- package/dist/modes/interactive/components/easter-egg-3d.js.map +1 -0
- package/dist/modes/interactive/components/easter-egg-3d.lazy.d.ts +6 -0
- package/dist/modes/interactive/components/easter-egg-3d.lazy.d.ts.map +1 -0
- package/dist/modes/interactive/components/easter-egg-3d.lazy.js +23 -0
- package/dist/modes/interactive/components/easter-egg-3d.lazy.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +26 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +107 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +25 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +67 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +27 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +95 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts +26 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.js +118 -0
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +39 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +265 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +33 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +34 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +36 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +59 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +289 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts +4 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.js +20 -0
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
- package/dist/modes/interactive/components/mermaid.d.ts +12 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +80 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +61 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +380 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +40 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +175 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/pi-logo.d.ts +20 -0
- package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -0
- package/dist/modes/interactive/components/pi-logo.js +41 -0
- package/dist/modes/interactive/components/pi-logo.js.map +1 -0
- package/dist/modes/interactive/components/radius-login-selector.d.ts +15 -0
- package/dist/modes/interactive/components/radius-login-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/radius-login-selector.js +85 -0
- package/dist/modes/interactive/components/radius-login-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +47 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +337 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +27 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +219 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +96 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +885 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +98 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +753 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-submenu.js +167 -0
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +39 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +22 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +65 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/status-indicator.d.ts +32 -0
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
- package/dist/modes/interactive/components/status-indicator.js +88 -0
- package/dist/modes/interactive/components/status-indicator.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +50 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/themed-text.d.ts +17 -0
- package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
- package/dist/modes/interactive/components/themed-text.js +29 -0
- package/dist/modes/interactive/components/themed-text.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +23 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +109 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +79 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +336 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +96 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +1255 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/trust-selector.js +91 -0
- package/dist/modes/interactive/components/trust-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +31 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +122 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +18 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +54 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +48 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +66 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/external-editor.d.ts +13 -0
- package/dist/modes/interactive/external-editor.d.ts.map +1 -0
- package/dist/modes/interactive/external-editor.js +50 -0
- package/dist/modes/interactive/external-editor.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +528 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +6347 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +34 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/model-search.d.ts +22 -0
- package/dist/modes/interactive/model-search.d.ts.map +1 -0
- package/dist/modes/interactive/model-search.js +36 -0
- package/dist/modes/interactive/model-search.js.map +1 -0
- package/dist/modes/interactive/program-status-reporter.d.ts +34 -0
- package/dist/modes/interactive/program-status-reporter.d.ts.map +1 -0
- package/dist/modes/interactive/program-status-reporter.js +110 -0
- package/dist/modes/interactive/program-status-reporter.js.map +1 -0
- package/dist/modes/interactive/session-share.d.ts +18 -0
- package/dist/modes/interactive/session-share.d.ts.map +1 -0
- package/dist/modes/interactive/session-share.js +195 -0
- package/dist/modes/interactive/session-share.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +78 -0
- package/dist/modes/interactive/theme/light.json +78 -0
- package/dist/modes/interactive/theme/system-theme.d.ts +55 -0
- package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/system-theme.js +546 -0
- package/dist/modes/interactive/theme/system-theme.js.map +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +81 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-controller.js +210 -0
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts +28 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.js +105 -0
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/dist/modes/interactive/theme/theme-tokens.d.ts +257 -0
- package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-tokens.js +94 -0
- package/dist/modes/interactive/theme/theme-tokens.js.map +1 -0
- package/dist/modes/interactive/theme/theme.d.ts +165 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +917 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/interactive/tui-renderer.d.ts +22 -0
- package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
- package/dist/modes/interactive/tui-renderer.js +67 -0
- package/dist/modes/interactive/tui-renderer.js.map +1 -0
- package/dist/modes/json-event.d.ts +34 -0
- package/dist/modes/json-event.d.ts.map +1 -0
- package/dist/modes/json-event.js +29 -0
- package/dist/modes/json-event.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +155 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +254 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +499 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +685 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +478 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/package-manager-cli.d.ts +9 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +1076 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/rpc-entry.d.ts +3 -0
- package/dist/rpc-entry.d.ts.map +1 -0
- package/dist/rpc-entry.js +11 -0
- package/dist/rpc-entry.js.map +1 -0
- package/dist/utils/abort.d.ts +5 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +48 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/ansi.d.ts +10 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +74 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +22 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +171 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/child-process.d.ts +18 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +106 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/cli-invocation.d.ts +11 -0
- package/dist/utils/cli-invocation.d.ts.map +1 -0
- package/dist/utils/cli-invocation.js +23 -0
- package/dist/utils/cli-invocation.js.map +1 -0
- package/dist/utils/clipboard-command.d.ts +7 -0
- package/dist/utils/clipboard-command.d.ts.map +1 -0
- package/dist/utils/clipboard-command.js +52 -0
- package/dist/utils/clipboard-command.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +214 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard.d.ts +6 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +162 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/deprecation.d.ts +4 -0
- package/dist/utils/deprecation.d.ts.map +1 -0
- package/dist/utils/deprecation.js +13 -0
- package/dist/utils/deprecation.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +157 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +27 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +5 -0
- package/dist/utils/fs-watch.d.ts.map +1 -0
- package/dist/utils/fs-watch.js +25 -0
- package/dist/utils/fs-watch.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +195 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +40 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/image-convert.d.ts +22 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +84 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-process.d.ts +18 -0
- package/dist/utils/image-process.d.ts.map +1 -0
- package/dist/utils/image-process.js +83 -0
- package/dist/utils/image-process.js.map +1 -0
- package/dist/utils/image-resize-core.d.ts +42 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -0
- package/dist/utils/image-resize-core.js +131 -0
- package/dist/utils/image-resize-core.js.map +1 -0
- package/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/utils/image-resize-worker.d.ts.map +1 -0
- package/dist/utils/image-resize-worker.js +32 -0
- package/dist/utils/image-resize-worker.js.map +1 -0
- package/dist/utils/image-resize.d.ts +16 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +96 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +7 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/management-http.d.ts +25 -0
- package/dist/utils/management-http.d.ts.map +1 -0
- package/dist/utils/management-http.js +54 -0
- package/dist/utils/management-http.js.map +1 -0
- package/dist/utils/mime.d.ts +3 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +110 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/open-browser.d.ts +9 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +25 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/dist/utils/output-files.d.ts +15 -0
- package/dist/utils/output-files.d.ts.map +1 -0
- package/dist/utils/output-files.js +30 -0
- package/dist/utils/output-files.js.map +1 -0
- package/dist/utils/paths.d.ts +51 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +156 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/pi-user-agent.d.ts +3 -0
- package/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/dist/utils/pi-user-agent.js +6 -0
- package/dist/utils/pi-user-agent.js.map +1 -0
- package/dist/utils/shell.d.ts +32 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +235 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts +18 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +191 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/text.d.ts +8 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +9 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/utils/tool-result-images.d.ts +21 -0
- package/dist/utils/tool-result-images.d.ts.map +1 -0
- package/dist/utils/tool-result-images.js +48 -0
- package/dist/utils/tool-result-images.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +13 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +339 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +19 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +81 -0
- package/dist/utils/version-check.js.map +1 -0
- package/dist/utils/windows-self-update.d.ts +3 -0
- package/dist/utils/windows-self-update.d.ts.map +1 -0
- package/dist/utils/windows-self-update.js +77 -0
- package/dist/utils/windows-self-update.js.map +1 -0
- package/dist/utils/wsl.d.ts +3 -0
- package/dist/utils/wsl.d.ts.map +1 -0
- package/dist/utils/wsl.js +15 -0
- package/dist/utils/wsl.js.map +1 -0
- package/dist/utils/zip.d.ts +7 -0
- package/dist/utils/zip.d.ts.map +1 -0
- package/dist/utils/zip.js +60 -0
- package/dist/utils/zip.js.map +1 -0
- package/docs/cli-integration.md +106 -0
- package/docs/cli.md +343 -0
- package/docs/codemode.md +230 -0
- package/docs/compaction.md +463 -0
- package/docs/configuration.md +47 -0
- package/docs/containerization.md +183 -0
- package/docs/custom-provider.md +227 -0
- package/docs/docs.json +220 -0
- package/docs/environment-variables.md +103 -0
- package/docs/extensions.md +3366 -0
- package/docs/how-pi-works.md +49 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +39 -0
- package/docs/json.md +226 -0
- package/docs/keybindings.md +195 -0
- package/docs/llama-cpp.md +129 -0
- package/docs/mcp.md +274 -0
- package/docs/message-types.md +279 -0
- package/docs/models-configuration.md +200 -0
- package/docs/models.md +226 -0
- package/docs/nvidia-rtx-llama-cpp.md +96 -0
- package/docs/packages.md +153 -0
- package/docs/prompt-templates.md +59 -0
- package/docs/providers.md +247 -0
- package/docs/quickstart.md +140 -0
- package/docs/rpc-commands.md +860 -0
- package/docs/rpc-extension-ui.md +200 -0
- package/docs/rpc.md +195 -0
- package/docs/sdk.md +147 -0
- package/docs/security.md +99 -0
- package/docs/session-format.md +293 -0
- package/docs/sessions.md +74 -0
- package/docs/settings.md +173 -0
- package/docs/shell-aliases.md +93 -0
- package/docs/skills.md +93 -0
- package/docs/slash-commands.md +61 -0
- package/docs/terminal-setup.md +235 -0
- package/docs/termux.md +117 -0
- package/docs/themes.md +138 -0
- package/docs/tmux.md +61 -0
- package/docs/tui.md +197 -0
- package/docs/usage.md +94 -0
- package/docs/virtual-models.md +114 -0
- package/docs/windows.md +108 -0
- package/package.json +37 -37
- package/schemas/keybindings.schema.json +393 -0
- package/schemas/models.schema.json +1236 -0
- package/schemas/settings.schema.json +800 -0
- package/schemas/theme.schema.json +365 -0
- package/LICENSE +0 -21
- package/bin/mars.cjs +0 -133
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MarsAI provider as an extension: the only provider MARS CLI registers.
|
|
3
|
+
*
|
|
4
|
+
* Device-flow OAuth (machine-bound), env/stored API key, a live model catalog
|
|
5
|
+
* from `GET /v1/models`, and the `/mars` account command.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync } from "node:fs";
|
|
8
|
+
import { getAuthPath } from "../../config.js";
|
|
9
|
+
import { resolveConfigValue } from "../../core/resolve-config-value.js";
|
|
10
|
+
import { marsAccountInfo, marsApiKey, marsDeviceLogin, marsFetchModels, marsRefreshToken, marsServer, } from "./oauth.js";
|
|
11
|
+
import { createWebFetchToolDefinition, createWebSearchToolDefinition } from "./web-tools.js";
|
|
12
|
+
const PROVIDER_ID = "marsai";
|
|
13
|
+
/** Static list shown before the first successful catalog fetch. The id must be a real
|
|
14
|
+
* gateway id — the wire sends it verbatim and `marsai-auto` does not exist upstream. */
|
|
15
|
+
const FALLBACK_MODEL_ID = "marsai/auto-free";
|
|
16
|
+
const ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
17
|
+
const DEFAULT_CONTEXT_WINDOW = 128_000;
|
|
18
|
+
const MAX_OUTPUT_TOKENS = 8192;
|
|
19
|
+
/** Map one gateway catalog row; the server bills, so all cost rates are zero. */
|
|
20
|
+
function marsModel(row) {
|
|
21
|
+
// Prefer the gateway label; fall back to the id without the `marsai/` prefix.
|
|
22
|
+
// "(free)" marks access unless the name already carries it.
|
|
23
|
+
const name = row.label ?? row.id.replace(/^marsai\//, "");
|
|
24
|
+
const markedFree = row.access === "free" && !/free$/i.test(name);
|
|
25
|
+
return {
|
|
26
|
+
id: row.id,
|
|
27
|
+
name: markedFree ? `${name} (free)` : name,
|
|
28
|
+
input: ["text", "image"],
|
|
29
|
+
cost: ZERO_COST,
|
|
30
|
+
// ponytail: reasoning stays false until the gateway reports capabilities;
|
|
31
|
+
// upgrade path: map a capability field from `GET /v1/models` when it exists.
|
|
32
|
+
reasoning: false,
|
|
33
|
+
contextWindow: row.context_tokens ?? DEFAULT_CONTEXT_WINDOW,
|
|
34
|
+
maxTokens: MAX_OUTPUT_TOKENS,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const FALLBACK_MODEL = marsModel({ id: FALLBACK_MODEL_ID, label: "MarsAI Auto" });
|
|
38
|
+
/**
|
|
39
|
+
* Fetch the live gateway catalog. Every empty result keeps the fallback: whatever is
|
|
40
|
+
* returned is published as the provider's whole model list, so an empty list would
|
|
41
|
+
* leave MARS with no model at all.
|
|
42
|
+
*/
|
|
43
|
+
async function refreshMarsModels(context) {
|
|
44
|
+
if (!context.allowNetwork || !context.credential)
|
|
45
|
+
return [FALLBACK_MODEL];
|
|
46
|
+
const token = context.credential.type === "oauth" ? marsApiKey(context.credential) : context.credential.key;
|
|
47
|
+
if (!token)
|
|
48
|
+
return [FALLBACK_MODEL];
|
|
49
|
+
const rows = await marsFetchModels(`${marsServer()}/v1`, token, context.signal);
|
|
50
|
+
return rows.length === 0 ? [FALLBACK_MODEL] : rows.map(marsModel);
|
|
51
|
+
}
|
|
52
|
+
/** Read the local `auth.json` entry for MarsAI; the file is a trusted-but-mutable local store. */
|
|
53
|
+
function readStoredCredential() {
|
|
54
|
+
try {
|
|
55
|
+
const parsed = JSON.parse(readFileSync(getAuthPath(), "utf8"));
|
|
56
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
57
|
+
return undefined;
|
|
58
|
+
const credential = parsed[PROVIDER_ID];
|
|
59
|
+
return typeof credential === "object" && credential !== null
|
|
60
|
+
? credential
|
|
61
|
+
: undefined;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const FREE_MODEL_CACHE_MS = 5 * 60 * 1000;
|
|
68
|
+
let freeModelCache;
|
|
69
|
+
/** The stored credential entry must carry a usable key or OAuth grant; anything else is treated as absent. */
|
|
70
|
+
function storedToken(stored) {
|
|
71
|
+
if (!stored || (stored.type !== "oauth" && stored.type !== "api_key" && stored.type !== "api-key"))
|
|
72
|
+
return undefined;
|
|
73
|
+
if (stored.type === "oauth") {
|
|
74
|
+
const token = marsApiKey(stored);
|
|
75
|
+
return token || undefined;
|
|
76
|
+
}
|
|
77
|
+
if (typeof stored.apiKey !== "string" || stored.apiKey === "")
|
|
78
|
+
return undefined;
|
|
79
|
+
return resolveConfigValue(stored.apiKey);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Best free-tier catalog id for cheap delegated work (subagents). `auto-free` is the
|
|
83
|
+
* gateway's own router and wins when present; otherwise the least-loaded free row, then
|
|
84
|
+
* the plain fallback. `MARSAI_SUBAGENT_MODEL` pins an explicit id. Cached briefly per
|
|
85
|
+
* credential: this runs on every subagent dispatch and the catalog barely moves.
|
|
86
|
+
*/
|
|
87
|
+
export async function marsFreeModel(signal) {
|
|
88
|
+
const override = process.env.MARSAI_SUBAGENT_MODEL;
|
|
89
|
+
if (override)
|
|
90
|
+
return override.includes("/") ? override : `marsai/${override}`;
|
|
91
|
+
let token = "";
|
|
92
|
+
try {
|
|
93
|
+
const stored = readStoredCredential();
|
|
94
|
+
token = storedToken(stored) ?? process.env.MARSAI_API_KEY ?? "";
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
token = process.env.MARSAI_API_KEY ?? "";
|
|
98
|
+
}
|
|
99
|
+
if (freeModelCache && freeModelCache.token === token && Date.now() < freeModelCache.expires) {
|
|
100
|
+
return freeModelCache.id;
|
|
101
|
+
}
|
|
102
|
+
let id = FALLBACK_MODEL_ID;
|
|
103
|
+
try {
|
|
104
|
+
if (token) {
|
|
105
|
+
const rows = await marsFetchModels(`${marsServer()}/v1`, token, signal);
|
|
106
|
+
const free = rows.filter((row) => row.access === "free");
|
|
107
|
+
if (free.length > 0) {
|
|
108
|
+
const auto = free.find((row) => row.id === FALLBACK_MODEL_ID);
|
|
109
|
+
const leastLoaded = [...free].sort((a, b) => (a.usage_ratio ?? Number.MAX_SAFE_INTEGER) - (b.usage_ratio ?? Number.MAX_SAFE_INTEGER))[0];
|
|
110
|
+
id = auto?.id ?? leastLoaded?.id ?? FALLBACK_MODEL_ID;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Any failure keeps the fallback; a subagent model must never block the dispatch.
|
|
116
|
+
}
|
|
117
|
+
freeModelCache = { id, token, expires: Date.now() + FREE_MODEL_CACHE_MS };
|
|
118
|
+
return id;
|
|
119
|
+
}
|
|
120
|
+
function accountLines(stored, account) {
|
|
121
|
+
const lines = [];
|
|
122
|
+
if (account)
|
|
123
|
+
lines.push(`email: ${account.email}`);
|
|
124
|
+
else if (typeof stored.email === "string")
|
|
125
|
+
lines.push(`email: ${stored.email} (cached)`);
|
|
126
|
+
else
|
|
127
|
+
lines.push("email: unknown");
|
|
128
|
+
lines.push(`method: ${stored.type === "oauth" ? "OAuth device" : "API key"}`);
|
|
129
|
+
lines.push(`server: ${marsServer()}`);
|
|
130
|
+
if (account) {
|
|
131
|
+
lines.push(`balance: ${account.balance}`);
|
|
132
|
+
lines.push(`free credits: ${account.free_credits}`);
|
|
133
|
+
lines.push(`tokens used: ${account.tokens_used}`);
|
|
134
|
+
lines.push(`rpm: ${account.rpm}`);
|
|
135
|
+
if (account.expires_at > 0)
|
|
136
|
+
lines.push(`grant expires: ${new Date(account.expires_at * 1000).toISOString()}`);
|
|
137
|
+
}
|
|
138
|
+
else if (stored.type === "oauth") {
|
|
139
|
+
lines.push("account unreachable: expired token refreshes on the next request");
|
|
140
|
+
}
|
|
141
|
+
return lines;
|
|
142
|
+
}
|
|
143
|
+
export function createMarsaiExtension() {
|
|
144
|
+
return (pi) => {
|
|
145
|
+
pi.registerProvider(PROVIDER_ID, {
|
|
146
|
+
name: "MarsAI",
|
|
147
|
+
baseUrl: `${marsServer()}/v1`,
|
|
148
|
+
apiKey: "$MARSAI_API_KEY",
|
|
149
|
+
api: "openai-completions",
|
|
150
|
+
models: [FALLBACK_MODEL],
|
|
151
|
+
refreshModels: refreshMarsModels,
|
|
152
|
+
oauth: {
|
|
153
|
+
name: "MarsAI",
|
|
154
|
+
login: marsDeviceLogin,
|
|
155
|
+
refreshToken: marsRefreshToken,
|
|
156
|
+
getApiKey: marsApiKey,
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
pi.registerTool(createWebFetchToolDefinition());
|
|
160
|
+
pi.registerTool(createWebSearchToolDefinition());
|
|
161
|
+
pi.registerCommand("mars", {
|
|
162
|
+
description: "Show MarsAI account and auth status",
|
|
163
|
+
handler: async (_args, ctx) => {
|
|
164
|
+
const stored = readStoredCredential();
|
|
165
|
+
if (!stored) {
|
|
166
|
+
const env = process.env.MARSAI_API_KEY;
|
|
167
|
+
ctx.ui.notify(env
|
|
168
|
+
? `Using MARSAI_API_KEY from environment (${env.slice(0, 10)}...)`
|
|
169
|
+
: "Not signed in to MarsAI. Run /login marsai.", "info");
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const account = stored.type === "oauth" ? await marsAccountInfo(stored) : undefined;
|
|
173
|
+
await ctx.ui.select("MarsAI account", accountLines(stored, account));
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export default createMarsaiExtension();
|
|
179
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/marsai/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The MarsAI provider as an extension: the only provider MARS CLI registers.\n *\n * Device-flow OAuth (machine-bound), env/stored API key, a live model catalog\n * from `GET /v1/models`, and the `/mars` account command.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport type { OAuthCredentials, RefreshModelsContext } from \"@earendil-works/pi-ai\";\nimport { getAuthPath } from \"../../config.ts\";\nimport type {\n\tExtensionAPI,\n\tExtensionFactory,\n\tProviderChatModelConfig,\n\tProviderModelConfig,\n} from \"../../core/extensions/types.ts\";\nimport { resolveConfigValue } from \"../../core/resolve-config-value.ts\";\nimport {\n\ttype MarsAccountInfo,\n\tmarsAccountInfo,\n\tmarsApiKey,\n\tmarsDeviceLogin,\n\tmarsFetchModels,\n\tmarsRefreshToken,\n\tmarsServer,\n} from \"./oauth.ts\";\nimport { createWebFetchToolDefinition, createWebSearchToolDefinition } from \"./web-tools.ts\";\n\nconst PROVIDER_ID = \"marsai\";\n/** Static list shown before the first successful catalog fetch. The id must be a real\n * gateway id — the wire sends it verbatim and `marsai-auto` does not exist upstream. */\nconst FALLBACK_MODEL_ID = \"marsai/auto-free\";\nconst ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst DEFAULT_CONTEXT_WINDOW = 128_000;\nconst MAX_OUTPUT_TOKENS = 8192;\n\n/** Map one gateway catalog row; the server bills, so all cost rates are zero. */\nfunction marsModel(row: {\n\tid: string;\n\tlabel?: string;\n\taccess?: string;\n\tcontext_tokens?: number;\n}): ProviderChatModelConfig {\n\t// Prefer the gateway label; fall back to the id without the `marsai/` prefix.\n\t// \"(free)\" marks access unless the name already carries it.\n\tconst name = row.label ?? row.id.replace(/^marsai\\//, \"\");\n\tconst markedFree = row.access === \"free\" && !/free$/i.test(name);\n\treturn {\n\t\tid: row.id,\n\t\tname: markedFree ? `${name} (free)` : name,\n\t\tinput: [\"text\", \"image\"],\n\t\tcost: ZERO_COST,\n\t\t// ponytail: reasoning stays false until the gateway reports capabilities;\n\t\t// upgrade path: map a capability field from `GET /v1/models` when it exists.\n\t\treasoning: false,\n\t\tcontextWindow: row.context_tokens ?? DEFAULT_CONTEXT_WINDOW,\n\t\tmaxTokens: MAX_OUTPUT_TOKENS,\n\t};\n}\n\nconst FALLBACK_MODEL: ProviderChatModelConfig = marsModel({ id: FALLBACK_MODEL_ID, label: \"MarsAI Auto\" });\n\n/**\n * Fetch the live gateway catalog. Every empty result keeps the fallback: whatever is\n * returned is published as the provider's whole model list, so an empty list would\n * leave MARS with no model at all.\n */\nasync function refreshMarsModels(context: RefreshModelsContext): Promise<ProviderModelConfig[]> {\n\tif (!context.allowNetwork || !context.credential) return [FALLBACK_MODEL];\n\tconst token = context.credential.type === \"oauth\" ? marsApiKey(context.credential) : context.credential.key;\n\tif (!token) return [FALLBACK_MODEL];\n\tconst rows = await marsFetchModels(`${marsServer()}/v1`, token, context.signal);\n\treturn rows.length === 0 ? [FALLBACK_MODEL] : rows.map(marsModel);\n}\n\n/** Read the local `auth.json` entry for MarsAI; the file is a trusted-but-mutable local store. */\nfunction readStoredCredential(): Record<string, unknown> | undefined {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(readFileSync(getAuthPath(), \"utf8\"));\n\t\tif (typeof parsed !== \"object\" || parsed === null) return undefined;\n\t\tconst credential = (parsed as Record<string, unknown>)[PROVIDER_ID];\n\t\treturn typeof credential === \"object\" && credential !== null\n\t\t\t? (credential as Record<string, unknown>)\n\t\t\t: undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nconst FREE_MODEL_CACHE_MS = 5 * 60 * 1000;\nlet freeModelCache: { id: string; token: string; expires: number } | undefined;\n\n/** The stored credential entry must carry a usable key or OAuth grant; anything else is treated as absent. */\nfunction storedToken(stored: Record<string, unknown> | undefined): string | undefined {\n\tif (!stored || (stored.type !== \"oauth\" && stored.type !== \"api_key\" && stored.type !== \"api-key\")) return undefined;\n\tif (stored.type === \"oauth\") {\n\t\tconst token = marsApiKey(stored as OAuthCredentials);\n\t\treturn token || undefined;\n\t}\n\tif (typeof stored.apiKey !== \"string\" || stored.apiKey === \"\") return undefined;\n\treturn resolveConfigValue(stored.apiKey);\n}\n\n/**\n * Best free-tier catalog id for cheap delegated work (subagents). `auto-free` is the\n * gateway's own router and wins when present; otherwise the least-loaded free row, then\n * the plain fallback. `MARSAI_SUBAGENT_MODEL` pins an explicit id. Cached briefly per\n * credential: this runs on every subagent dispatch and the catalog barely moves.\n */\nexport async function marsFreeModel(signal?: AbortSignal): Promise<string> {\n\tconst override = process.env.MARSAI_SUBAGENT_MODEL;\n\tif (override) return override.includes(\"/\") ? override : `marsai/${override}`;\n\tlet token = \"\";\n\ttry {\n\t\tconst stored = readStoredCredential();\n\t\ttoken = storedToken(stored) ?? process.env.MARSAI_API_KEY ?? \"\";\n\t} catch {\n\t\ttoken = process.env.MARSAI_API_KEY ?? \"\";\n\t}\n\tif (freeModelCache && freeModelCache.token === token && Date.now() < freeModelCache.expires) {\n\t\treturn freeModelCache.id;\n\t}\n\tlet id = FALLBACK_MODEL_ID;\n\ttry {\n\t\tif (token) {\n\t\t\tconst rows = await marsFetchModels(`${marsServer()}/v1`, token, signal);\n\t\t\tconst free = rows.filter((row) => row.access === \"free\");\n\t\t\tif (free.length > 0) {\n\t\t\t\tconst auto = free.find((row) => row.id === FALLBACK_MODEL_ID);\n\t\t\t\tconst leastLoaded = [...free].sort(\n\t\t\t\t\t(a, b) => (a.usage_ratio ?? Number.MAX_SAFE_INTEGER) - (b.usage_ratio ?? Number.MAX_SAFE_INTEGER),\n\t\t\t\t)[0];\n\t\t\t\tid = auto?.id ?? leastLoaded?.id ?? FALLBACK_MODEL_ID;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Any failure keeps the fallback; a subagent model must never block the dispatch.\n\t}\n\tfreeModelCache = { id, token, expires: Date.now() + FREE_MODEL_CACHE_MS };\n\treturn id;\n}\n\nfunction accountLines(stored: Record<string, unknown>, account: MarsAccountInfo | undefined): string[] {\n\tconst lines: string[] = [];\n\tif (account) lines.push(`email: ${account.email}`);\n\telse if (typeof stored.email === \"string\") lines.push(`email: ${stored.email} (cached)`);\n\telse lines.push(\"email: unknown\");\n\tlines.push(`method: ${stored.type === \"oauth\" ? \"OAuth device\" : \"API key\"}`);\n\tlines.push(`server: ${marsServer()}`);\n\tif (account) {\n\t\tlines.push(`balance: ${account.balance}`);\n\t\tlines.push(`free credits: ${account.free_credits}`);\n\t\tlines.push(`tokens used: ${account.tokens_used}`);\n\t\tlines.push(`rpm: ${account.rpm}`);\n\t\tif (account.expires_at > 0) lines.push(`grant expires: ${new Date(account.expires_at * 1000).toISOString()}`);\n\t} else if (stored.type === \"oauth\") {\n\t\tlines.push(\"account unreachable: expired token refreshes on the next request\");\n\t}\n\treturn lines;\n}\n\nexport function createMarsaiExtension(): ExtensionFactory {\n\treturn (pi: ExtensionAPI) => {\n\t\tpi.registerProvider(PROVIDER_ID, {\n\t\t\tname: \"MarsAI\",\n\t\t\tbaseUrl: `${marsServer()}/v1`,\n\t\t\tapiKey: \"$MARSAI_API_KEY\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tmodels: [FALLBACK_MODEL],\n\t\t\trefreshModels: refreshMarsModels,\n\t\t\toauth: {\n\t\t\t\tname: \"MarsAI\",\n\t\t\t\tlogin: marsDeviceLogin,\n\t\t\t\trefreshToken: marsRefreshToken,\n\t\t\t\tgetApiKey: marsApiKey,\n\t\t\t},\n\t\t});\n\n\t\tpi.registerTool(createWebFetchToolDefinition());\n\t\tpi.registerTool(createWebSearchToolDefinition());\n\n\t\tpi.registerCommand(\"mars\", {\n\t\t\tdescription: \"Show MarsAI account and auth status\",\n\t\t\thandler: async (_args, ctx) => {\n\t\t\t\tconst stored = readStoredCredential();\n\t\t\t\tif (!stored) {\n\t\t\t\t\tconst env = process.env.MARSAI_API_KEY;\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\tenv\n\t\t\t\t\t\t\t? `Using MARSAI_API_KEY from environment (${env.slice(0, 10)}...)`\n\t\t\t\t\t\t\t: \"Not signed in to MarsAI. Run /login marsai.\",\n\t\t\t\t\t\t\"info\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst account = stored.type === \"oauth\" ? await marsAccountInfo(stored as OAuthCredentials) : undefined;\n\t\t\t\tawait ctx.ui.select(\"MarsAI account\", accountLines(stored, account));\n\t\t\t},\n\t\t});\n\t};\n}\n\nexport default createMarsaiExtension();\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** MarsAI OAuth: machine-bound device-code login, rotating refresh, and account/model queries. */
|
|
2
|
+
import type { OAuthCredentials, OAuthLoginCallbacks } from "@earendil-works/pi-ai";
|
|
3
|
+
/** MarsAI API origin: `MARSAI_URL` or the public site; a trailing `/v1` belongs to the API path. */
|
|
4
|
+
export declare function marsServer(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Stable per-install fingerprint sent with every OAuth request. The server stores only its
|
|
7
|
+
* hash and uses it to keep one machine on one account, so a stolen refresh token dies on
|
|
8
|
+
* another machine instead of taking the account with it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function marsMachineId(): string;
|
|
11
|
+
/** Account summary behind the `mars:account` scope, used by `/mars`. */
|
|
12
|
+
export interface MarsAccountInfo {
|
|
13
|
+
email: string;
|
|
14
|
+
name: string;
|
|
15
|
+
balance: number;
|
|
16
|
+
token_balance: number;
|
|
17
|
+
free_credits: number;
|
|
18
|
+
tokens_used: number;
|
|
19
|
+
rpm: number;
|
|
20
|
+
grant_id: string;
|
|
21
|
+
expires_at: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Account summary behind the `mars:account` scope, used by `/mars`. Takes the stored access
|
|
25
|
+
* token as-is: refresh must be persisted by the auth runtime, because refresh tokens rotate
|
|
26
|
+
* and an unpersisted rotation would look like a replay and revoke the grant.
|
|
27
|
+
*/
|
|
28
|
+
export declare function marsAccountInfo(credentials: OAuthCredentials, signal?: AbortSignal): Promise<MarsAccountInfo | undefined>;
|
|
29
|
+
/**
|
|
30
|
+
* Device-code login: show the code, poll until approved, then store tokens plus the minted key.
|
|
31
|
+
* The verification URI carries the user code, so the browser opens on its own as soon as the
|
|
32
|
+
* code arrives; the dialog's confirm action is a no-op fallback for when the launch fails.
|
|
33
|
+
*/
|
|
34
|
+
export declare function marsDeviceLogin(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;
|
|
35
|
+
/** Exchange the rotating refresh token; a replay or a foreign machine fails here and forces a new login. */
|
|
36
|
+
export declare function marsRefreshToken(credentials: OAuthCredentials, signal: AbortSignal): Promise<OAuthCredentials>;
|
|
37
|
+
/** Request credential: the minted gateway key when present, else the short-lived access token. */
|
|
38
|
+
export declare function marsApiKey(credentials: OAuthCredentials): string;
|
|
39
|
+
/** One row of `GET /v1/models`: the gateway's published combos, not a vendor catalog. */
|
|
40
|
+
export interface MarsModelRow {
|
|
41
|
+
id: string;
|
|
42
|
+
label?: string;
|
|
43
|
+
access?: string;
|
|
44
|
+
usage_ratio?: number;
|
|
45
|
+
context_tokens?: number;
|
|
46
|
+
}
|
|
47
|
+
/** Fetch the published model list with the gateway credential; empty means "keep what you have". */
|
|
48
|
+
export declare function marsFetchModels(baseUrl: string, token: string, signal?: AbortSignal): Promise<MarsModelRow[]>;
|
|
49
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/extensions/marsai/oauth.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAKlG,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAcnF,oGAAoG;AACpG,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAqBD;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAYtC;AAqGD,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACnB;AA4BD;;;;GAIG;AACH,wBAAsB,eAAe,CACpC,WAAW,EAAE,gBAAgB,EAC7B,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAGtC;AAkDD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuB/F;AAED,4GAA4G;AAC5G,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0BpH;AAED,kGAAkG;AAClG,wBAAgB,UAAU,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM,CAEhE;AAED,yFAAyF;AACzF,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,oGAAoG;AACpG,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAoBnH"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/** MarsAI OAuth: machine-bound device-code login, rotating refresh, and account/model queries. */
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { getAgentDir } from "../../config.js";
|
|
6
|
+
import { openBrowser } from "../../utils/open-browser.js";
|
|
7
|
+
const CLIENT_ID = "marscli";
|
|
8
|
+
const SCOPE = "mars:inference mars:models mars:account";
|
|
9
|
+
const MACHINE_ID_FILE = "machine-id";
|
|
10
|
+
const MACHINE_ID_PATTERN = /^m1_[a-f0-9]{32}$/;
|
|
11
|
+
const MIN_POLL_INTERVAL_MS = 1000;
|
|
12
|
+
const SLOW_DOWN_INCREMENT_MS = 5000;
|
|
13
|
+
/** Refresh just before the 15-minute access token expires, not when it is already dead. */
|
|
14
|
+
const ACCESS_MARGIN_MS = 60_000;
|
|
15
|
+
const CANCELLED = "Login cancelled";
|
|
16
|
+
/** MarsAI API origin: `MARSAI_URL` or the public site; a trailing `/v1` belongs to the API path. */
|
|
17
|
+
export function marsServer() {
|
|
18
|
+
return (process.env.MARSAI_URL ?? "https://marsai.click").replace(/\/+$/, "").replace(/\/v1$/i, "");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Stable per-install fingerprint sent with every OAuth request. The server stores only its
|
|
22
|
+
* hash and uses it to keep one machine on one account, so a stolen refresh token dies on
|
|
23
|
+
* another machine instead of taking the account with it.
|
|
24
|
+
*/
|
|
25
|
+
export function marsMachineId() {
|
|
26
|
+
const file = join(getAgentDir(), MACHINE_ID_FILE);
|
|
27
|
+
try {
|
|
28
|
+
const stored = readFileSync(file, "utf8").trim();
|
|
29
|
+
if (MACHINE_ID_PATTERN.test(stored))
|
|
30
|
+
return stored;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error.code !== "ENOENT")
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
const id = `m1_${randomBytes(16).toString("hex")}`;
|
|
37
|
+
mkdirSync(getAgentDir(), { recursive: true });
|
|
38
|
+
writeFileSync(file, `${id}\n`, { encoding: "utf8", mode: 0o600 });
|
|
39
|
+
return id;
|
|
40
|
+
}
|
|
41
|
+
function sleep(ms, signal) {
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
if (signal?.aborted) {
|
|
44
|
+
reject(new Error(CANCELLED));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const onAbort = () => {
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
reject(new Error(CANCELLED));
|
|
50
|
+
};
|
|
51
|
+
const timer = setTimeout(() => {
|
|
52
|
+
signal?.removeEventListener("abort", onAbort);
|
|
53
|
+
resolve();
|
|
54
|
+
}, ms);
|
|
55
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** POST form-encoded to a MarsAI OAuth endpoint; the caller interprets non-2xx bodies (device polling). */
|
|
59
|
+
async function postForm(url, body, signal) {
|
|
60
|
+
const response = await fetch(url, {
|
|
61
|
+
method: "POST",
|
|
62
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
63
|
+
body: new URLSearchParams(body),
|
|
64
|
+
signal,
|
|
65
|
+
});
|
|
66
|
+
const text = await response.text();
|
|
67
|
+
let parsed;
|
|
68
|
+
try {
|
|
69
|
+
parsed = text === "" ? {} : JSON.parse(text);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw new Error(`MarsAI returned a non-JSON response (HTTP ${response.status})`);
|
|
73
|
+
}
|
|
74
|
+
return { status: response.status, body: parsed };
|
|
75
|
+
}
|
|
76
|
+
/** Wire response shape check: the OAuth server is an untrusted input source. */
|
|
77
|
+
function readToken(body) {
|
|
78
|
+
if (typeof body !== "object" || body === null)
|
|
79
|
+
return undefined;
|
|
80
|
+
const value = body;
|
|
81
|
+
if (typeof value.access_token !== "string" || typeof value.refresh_token !== "string")
|
|
82
|
+
return undefined;
|
|
83
|
+
if (typeof value.expires_in !== "number" || !Number.isFinite(value.expires_in))
|
|
84
|
+
return undefined;
|
|
85
|
+
return {
|
|
86
|
+
access_token: value.access_token,
|
|
87
|
+
refresh_token: value.refresh_token,
|
|
88
|
+
expires_in: value.expires_in,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function readError(body) {
|
|
92
|
+
if (typeof body !== "object" || body === null)
|
|
93
|
+
return "unexpected response";
|
|
94
|
+
const value = body;
|
|
95
|
+
return value.error_description ?? value.error ?? "unexpected response";
|
|
96
|
+
}
|
|
97
|
+
async function postFormOrThrow(url, body, signal) {
|
|
98
|
+
const result = await postForm(url, body, signal);
|
|
99
|
+
if (result.status < 200 || result.status >= 300) {
|
|
100
|
+
throw new Error(`MarsAI request failed: ${readError(result.body)}`);
|
|
101
|
+
}
|
|
102
|
+
return result.body;
|
|
103
|
+
}
|
|
104
|
+
async function getJson(url, token, signal) {
|
|
105
|
+
const response = await fetch(url, { headers: { Authorization: `Bearer ${token}` }, signal });
|
|
106
|
+
const text = await response.text();
|
|
107
|
+
let parsed;
|
|
108
|
+
try {
|
|
109
|
+
parsed = text === "" ? {} : JSON.parse(text);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
throw new Error(`MarsAI returned a non-JSON response (HTTP ${response.status})`);
|
|
113
|
+
}
|
|
114
|
+
return { status: response.status, body: parsed };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Mint the long-lived per-grant gateway key. The access token expires every 15 minutes, so
|
|
118
|
+
* inference uses this key; it dies with the grant, which is what disconnecting a device means.
|
|
119
|
+
* Best effort: a failed mint leaves `access` as the request credential.
|
|
120
|
+
*/
|
|
121
|
+
async function mintApiKey(server, accessToken, signal) {
|
|
122
|
+
try {
|
|
123
|
+
const response = await fetch(`${server}/oauth/apikey`, {
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
126
|
+
signal,
|
|
127
|
+
});
|
|
128
|
+
if (!response.ok)
|
|
129
|
+
return undefined;
|
|
130
|
+
const body = (await response.json());
|
|
131
|
+
return typeof body.api_key === "string" && body.api_key !== "" ? body.api_key : undefined;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function fetchAccount(server, accessToken, signal) {
|
|
138
|
+
try {
|
|
139
|
+
const result = await getJson(`${server}/oauth/userinfo`, accessToken, signal);
|
|
140
|
+
if (result.status < 200 || result.status >= 300)
|
|
141
|
+
return undefined;
|
|
142
|
+
const body = result.body;
|
|
143
|
+
if (typeof body.email !== "string")
|
|
144
|
+
return undefined;
|
|
145
|
+
return {
|
|
146
|
+
email: body.email,
|
|
147
|
+
name: typeof body.name === "string" ? body.name : "",
|
|
148
|
+
balance: typeof body.balance === "number" ? body.balance : 0,
|
|
149
|
+
token_balance: typeof body.token_balance === "number" ? body.token_balance : 0,
|
|
150
|
+
free_credits: typeof body.free_credits === "number" ? body.free_credits : 0,
|
|
151
|
+
tokens_used: typeof body.tokens_used === "number" ? body.tokens_used : 0,
|
|
152
|
+
rpm: typeof body.rpm === "number" ? body.rpm : 0,
|
|
153
|
+
grant_id: typeof body.grant_id === "string" ? body.grant_id : "",
|
|
154
|
+
expires_at: typeof body.expires_at === "number" ? body.expires_at : 0,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Account summary behind the `mars:account` scope, used by `/mars`. Takes the stored access
|
|
163
|
+
* token as-is: refresh must be persisted by the auth runtime, because refresh tokens rotate
|
|
164
|
+
* and an unpersisted rotation would look like a replay and revoke the grant.
|
|
165
|
+
*/
|
|
166
|
+
export async function marsAccountInfo(credentials, signal) {
|
|
167
|
+
const server = typeof credentials.server === "string" ? credentials.server : marsServer();
|
|
168
|
+
return fetchAccount(server, credentials.access, signal);
|
|
169
|
+
}
|
|
170
|
+
async function marsCredentials(server, token) {
|
|
171
|
+
const [apiKey, account] = await Promise.all([
|
|
172
|
+
mintApiKey(server, token.access_token),
|
|
173
|
+
fetchAccount(server, token.access_token),
|
|
174
|
+
]);
|
|
175
|
+
return {
|
|
176
|
+
access: token.access_token,
|
|
177
|
+
refresh: token.refresh_token,
|
|
178
|
+
expires: Date.now() + token.expires_in * 1000 - ACCESS_MARGIN_MS,
|
|
179
|
+
apiKey,
|
|
180
|
+
server,
|
|
181
|
+
email: account?.email,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
async function pollForToken(server, device, signal) {
|
|
185
|
+
const deadline = Date.now() + device.expires_in * 1000;
|
|
186
|
+
let intervalMs = Math.max(MIN_POLL_INTERVAL_MS, Math.floor(device.interval * 1000));
|
|
187
|
+
while (Date.now() < deadline) {
|
|
188
|
+
await sleep(intervalMs, signal);
|
|
189
|
+
const result = await postForm(`${server}/oauth/token`, {
|
|
190
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
191
|
+
device_code: device.device_code,
|
|
192
|
+
client_id: CLIENT_ID,
|
|
193
|
+
machine: marsMachineId(),
|
|
194
|
+
}, signal);
|
|
195
|
+
const token = readToken(result.body);
|
|
196
|
+
if (token)
|
|
197
|
+
return token;
|
|
198
|
+
const code = result.body?.error;
|
|
199
|
+
if (code === "authorization_pending")
|
|
200
|
+
continue;
|
|
201
|
+
// RFC 8628: slow_down raises the wait by five seconds; the server enforces its own count too.
|
|
202
|
+
if (code === "slow_down") {
|
|
203
|
+
intervalMs += SLOW_DOWN_INCREMENT_MS;
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
throw new Error(`MarsAI device sign-in failed: ${readError(result.body)}`);
|
|
207
|
+
}
|
|
208
|
+
throw new Error("MarsAI device sign-in timed out");
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Device-code login: show the code, poll until approved, then store tokens plus the minted key.
|
|
212
|
+
* The verification URI carries the user code, so the browser opens on its own as soon as the
|
|
213
|
+
* code arrives; the dialog's confirm action is a no-op fallback for when the launch fails.
|
|
214
|
+
*/
|
|
215
|
+
export async function marsDeviceLogin(callbacks) {
|
|
216
|
+
const server = marsServer();
|
|
217
|
+
const created = (await postFormOrThrow(`${server}/oauth/device/code`, { client_id: CLIENT_ID, scope: SCOPE, machine: marsMachineId() }, callbacks.signal));
|
|
218
|
+
try {
|
|
219
|
+
openBrowser(created.verification_uri_complete);
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// Launcher failures must not interrupt login; the dialog still shows the URL.
|
|
223
|
+
}
|
|
224
|
+
callbacks.onDeviceCode({
|
|
225
|
+
userCode: created.user_code,
|
|
226
|
+
verificationUri: created.verification_uri_complete,
|
|
227
|
+
intervalSeconds: created.interval,
|
|
228
|
+
expiresInSeconds: created.expires_in,
|
|
229
|
+
// The browser already opened; a confirm-to-open hint would be noise.
|
|
230
|
+
openBrowserOnConfirm: false,
|
|
231
|
+
copyCodeOnConfirm: false,
|
|
232
|
+
});
|
|
233
|
+
const token = await pollForToken(server, created, callbacks.signal);
|
|
234
|
+
return marsCredentials(server, token);
|
|
235
|
+
}
|
|
236
|
+
/** Exchange the rotating refresh token; a replay or a foreign machine fails here and forces a new login. */
|
|
237
|
+
export async function marsRefreshToken(credentials, signal) {
|
|
238
|
+
const server = typeof credentials.server === "string" ? credentials.server : marsServer();
|
|
239
|
+
const body = await postFormOrThrow(`${server}/oauth/token`, {
|
|
240
|
+
grant_type: "refresh_token",
|
|
241
|
+
refresh_token: String(credentials.refresh),
|
|
242
|
+
client_id: CLIENT_ID,
|
|
243
|
+
machine: marsMachineId(),
|
|
244
|
+
}, signal);
|
|
245
|
+
const token = readToken(body);
|
|
246
|
+
if (!token)
|
|
247
|
+
throw new Error("MarsAI token refresh returned an unexpected response");
|
|
248
|
+
const minted = typeof credentials.apiKey === "string" && credentials.apiKey !== ""
|
|
249
|
+
? credentials.apiKey
|
|
250
|
+
: await mintApiKey(server, token.access_token, signal);
|
|
251
|
+
return {
|
|
252
|
+
...credentials,
|
|
253
|
+
access: token.access_token,
|
|
254
|
+
refresh: token.refresh_token,
|
|
255
|
+
expires: Date.now() + token.expires_in * 1000 - ACCESS_MARGIN_MS,
|
|
256
|
+
apiKey: minted,
|
|
257
|
+
server,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/** Request credential: the minted gateway key when present, else the short-lived access token. */
|
|
261
|
+
export function marsApiKey(credentials) {
|
|
262
|
+
return typeof credentials.apiKey === "string" && credentials.apiKey !== "" ? credentials.apiKey : credentials.access;
|
|
263
|
+
}
|
|
264
|
+
/** Fetch the published model list with the gateway credential; empty means "keep what you have". */
|
|
265
|
+
export async function marsFetchModels(baseUrl, token, signal) {
|
|
266
|
+
const result = await getJson(`${baseUrl.replace(/\/+$/, "")}/models`, token, signal);
|
|
267
|
+
if (result.status < 200 || result.status >= 300)
|
|
268
|
+
return [];
|
|
269
|
+
if (typeof result.body !== "object" || result.body === null)
|
|
270
|
+
return [];
|
|
271
|
+
const data = result.body.data;
|
|
272
|
+
if (!Array.isArray(data))
|
|
273
|
+
return [];
|
|
274
|
+
return data.flatMap((row) => {
|
|
275
|
+
if (typeof row !== "object" || row === null)
|
|
276
|
+
return [];
|
|
277
|
+
const value = row;
|
|
278
|
+
if (typeof value.id !== "string" || value.id === "")
|
|
279
|
+
return [];
|
|
280
|
+
return [
|
|
281
|
+
{
|
|
282
|
+
id: value.id,
|
|
283
|
+
label: typeof value.label === "string" ? value.label : undefined,
|
|
284
|
+
access: typeof value.access === "string" ? value.access : undefined,
|
|
285
|
+
usage_ratio: typeof value.usage_ratio === "number" ? value.usage_ratio : undefined,
|
|
286
|
+
context_tokens: typeof value.context_tokens === "number" ? value.context_tokens : undefined,
|
|
287
|
+
},
|
|
288
|
+
];
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/extensions/marsai/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["/** MarsAI OAuth: machine-bound device-code login, rotating refresh, and account/model queries. */\n\nimport { randomBytes } from \"node:crypto\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { OAuthCredentials, OAuthLoginCallbacks } from \"@earendil-works/pi-ai\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { openBrowser } from \"../../utils/open-browser.ts\";\n\nconst CLIENT_ID = \"marscli\";\nconst SCOPE = \"mars:inference mars:models mars:account\";\nconst MACHINE_ID_FILE = \"machine-id\";\nconst MACHINE_ID_PATTERN = /^m1_[a-f0-9]{32}$/;\nconst MIN_POLL_INTERVAL_MS = 1000;\nconst SLOW_DOWN_INCREMENT_MS = 5000;\n/** Refresh just before the 15-minute access token expires, not when it is already dead. */\nconst ACCESS_MARGIN_MS = 60_000;\nconst CANCELLED = \"Login cancelled\";\n\n/** MarsAI API origin: `MARSAI_URL` or the public site; a trailing `/v1` belongs to the API path. */\nexport function marsServer(): string {\n\treturn (process.env.MARSAI_URL ?? \"https://marsai.click\").replace(/\\/+$/, \"\").replace(/\\/v1$/i, \"\");\n}\n\ninterface MarsTokenResponse {\n\taccess_token: string;\n\trefresh_token: string;\n\texpires_in: number;\n}\n\ninterface MarsDeviceResponse {\n\tdevice_code: string;\n\tuser_code: string;\n\tverification_uri_complete: string;\n\texpires_in: number;\n\tinterval: number;\n}\n\ninterface MarsFormError {\n\terror?: string;\n\terror_description?: string;\n}\n\n/**\n * Stable per-install fingerprint sent with every OAuth request. The server stores only its\n * hash and uses it to keep one machine on one account, so a stolen refresh token dies on\n * another machine instead of taking the account with it.\n */\nexport function marsMachineId(): string {\n\tconst file = join(getAgentDir(), MACHINE_ID_FILE);\n\ttry {\n\t\tconst stored = readFileSync(file, \"utf8\").trim();\n\t\tif (MACHINE_ID_PATTERN.test(stored)) return stored;\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t}\n\tconst id = `m1_${randomBytes(16).toString(\"hex\")}`;\n\tmkdirSync(getAgentDir(), { recursive: true });\n\twriteFileSync(file, `${id}\\n`, { encoding: \"utf8\", mode: 0o600 });\n\treturn id;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error(CANCELLED));\n\t\t\treturn;\n\t\t}\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(new Error(CANCELLED));\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\n/** POST form-encoded to a MarsAI OAuth endpoint; the caller interprets non-2xx bodies (device polling). */\nasync function postForm(\n\turl: string,\n\tbody: Record<string, string>,\n\tsignal?: AbortSignal,\n): Promise<{ status: number; body: unknown }> {\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\tbody: new URLSearchParams(body),\n\t\tsignal,\n\t});\n\tconst text = await response.text();\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = text === \"\" ? {} : JSON.parse(text);\n\t} catch {\n\t\tthrow new Error(`MarsAI returned a non-JSON response (HTTP ${response.status})`);\n\t}\n\treturn { status: response.status, body: parsed };\n}\n\n/** Wire response shape check: the OAuth server is an untrusted input source. */\nfunction readToken(body: unknown): MarsTokenResponse | undefined {\n\tif (typeof body !== \"object\" || body === null) return undefined;\n\tconst value = body as Record<string, unknown>;\n\tif (typeof value.access_token !== \"string\" || typeof value.refresh_token !== \"string\") return undefined;\n\tif (typeof value.expires_in !== \"number\" || !Number.isFinite(value.expires_in)) return undefined;\n\treturn {\n\t\taccess_token: value.access_token,\n\t\trefresh_token: value.refresh_token,\n\t\texpires_in: value.expires_in,\n\t};\n}\n\nfunction readError(body: unknown): string {\n\tif (typeof body !== \"object\" || body === null) return \"unexpected response\";\n\tconst value = body as MarsFormError;\n\treturn value.error_description ?? value.error ?? \"unexpected response\";\n}\n\nasync function postFormOrThrow(url: string, body: Record<string, string>, signal?: AbortSignal): Promise<unknown> {\n\tconst result = await postForm(url, body, signal);\n\tif (result.status < 200 || result.status >= 300) {\n\t\tthrow new Error(`MarsAI request failed: ${readError(result.body)}`);\n\t}\n\treturn result.body;\n}\n\nasync function getJson(url: string, token: string, signal?: AbortSignal): Promise<{ status: number; body: unknown }> {\n\tconst response = await fetch(url, { headers: { Authorization: `Bearer ${token}` }, signal });\n\tconst text = await response.text();\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = text === \"\" ? {} : JSON.parse(text);\n\t} catch {\n\t\tthrow new Error(`MarsAI returned a non-JSON response (HTTP ${response.status})`);\n\t}\n\treturn { status: response.status, body: parsed };\n}\n\n/**\n * Mint the long-lived per-grant gateway key. The access token expires every 15 minutes, so\n * inference uses this key; it dies with the grant, which is what disconnecting a device means.\n * Best effort: a failed mint leaves `access` as the request credential.\n */\nasync function mintApiKey(server: string, accessToken: string, signal?: AbortSignal): Promise<string | undefined> {\n\ttry {\n\t\tconst response = await fetch(`${server}/oauth/apikey`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { Authorization: `Bearer ${accessToken}` },\n\t\t\tsignal,\n\t\t});\n\t\tif (!response.ok) return undefined;\n\t\tconst body = (await response.json()) as { api_key?: unknown };\n\t\treturn typeof body.api_key === \"string\" && body.api_key !== \"\" ? body.api_key : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Account summary behind the `mars:account` scope, used by `/mars`. */\nexport interface MarsAccountInfo {\n\temail: string;\n\tname: string;\n\tbalance: number;\n\ttoken_balance: number;\n\tfree_credits: number;\n\ttokens_used: number;\n\trpm: number;\n\tgrant_id: string;\n\texpires_at: number;\n}\n\nasync function fetchAccount(\n\tserver: string,\n\taccessToken: string,\n\tsignal?: AbortSignal,\n): Promise<MarsAccountInfo | undefined> {\n\ttry {\n\t\tconst result = await getJson(`${server}/oauth/userinfo`, accessToken, signal);\n\t\tif (result.status < 200 || result.status >= 300) return undefined;\n\t\tconst body = result.body as Partial<MarsAccountInfo>;\n\t\tif (typeof body.email !== \"string\") return undefined;\n\t\treturn {\n\t\t\temail: body.email,\n\t\t\tname: typeof body.name === \"string\" ? body.name : \"\",\n\t\t\tbalance: typeof body.balance === \"number\" ? body.balance : 0,\n\t\t\ttoken_balance: typeof body.token_balance === \"number\" ? body.token_balance : 0,\n\t\t\tfree_credits: typeof body.free_credits === \"number\" ? body.free_credits : 0,\n\t\t\ttokens_used: typeof body.tokens_used === \"number\" ? body.tokens_used : 0,\n\t\t\trpm: typeof body.rpm === \"number\" ? body.rpm : 0,\n\t\t\tgrant_id: typeof body.grant_id === \"string\" ? body.grant_id : \"\",\n\t\t\texpires_at: typeof body.expires_at === \"number\" ? body.expires_at : 0,\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Account summary behind the `mars:account` scope, used by `/mars`. Takes the stored access\n * token as-is: refresh must be persisted by the auth runtime, because refresh tokens rotate\n * and an unpersisted rotation would look like a replay and revoke the grant.\n */\nexport async function marsAccountInfo(\n\tcredentials: OAuthCredentials,\n\tsignal?: AbortSignal,\n): Promise<MarsAccountInfo | undefined> {\n\tconst server = typeof credentials.server === \"string\" ? credentials.server : marsServer();\n\treturn fetchAccount(server, credentials.access, signal);\n}\n\nasync function marsCredentials(server: string, token: MarsTokenResponse): Promise<OAuthCredentials> {\n\tconst [apiKey, account] = await Promise.all([\n\t\tmintApiKey(server, token.access_token),\n\t\tfetchAccount(server, token.access_token),\n\t]);\n\treturn {\n\t\taccess: token.access_token,\n\t\trefresh: token.refresh_token,\n\t\texpires: Date.now() + token.expires_in * 1000 - ACCESS_MARGIN_MS,\n\t\tapiKey,\n\t\tserver,\n\t\temail: account?.email,\n\t};\n}\n\nasync function pollForToken(\n\tserver: string,\n\tdevice: MarsDeviceResponse,\n\tsignal?: AbortSignal,\n): Promise<MarsTokenResponse> {\n\tconst deadline = Date.now() + device.expires_in * 1000;\n\tlet intervalMs = Math.max(MIN_POLL_INTERVAL_MS, Math.floor(device.interval * 1000));\n\twhile (Date.now() < deadline) {\n\t\tawait sleep(intervalMs, signal);\n\t\tconst result = await postForm(\n\t\t\t`${server}/oauth/token`,\n\t\t\t{\n\t\t\t\tgrant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n\t\t\t\tdevice_code: device.device_code,\n\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t\tmachine: marsMachineId(),\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\tconst token = readToken(result.body);\n\t\tif (token) return token;\n\t\tconst code = (result.body as MarsFormError | undefined)?.error;\n\t\tif (code === \"authorization_pending\") continue;\n\t\t// RFC 8628: slow_down raises the wait by five seconds; the server enforces its own count too.\n\t\tif (code === \"slow_down\") {\n\t\t\tintervalMs += SLOW_DOWN_INCREMENT_MS;\n\t\t\tcontinue;\n\t\t}\n\t\tthrow new Error(`MarsAI device sign-in failed: ${readError(result.body)}`);\n\t}\n\tthrow new Error(\"MarsAI device sign-in timed out\");\n}\n\n/**\n * Device-code login: show the code, poll until approved, then store tokens plus the minted key.\n * The verification URI carries the user code, so the browser opens on its own as soon as the\n * code arrives; the dialog's confirm action is a no-op fallback for when the launch fails.\n */\nexport async function marsDeviceLogin(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\tconst server = marsServer();\n\tconst created = (await postFormOrThrow(\n\t\t`${server}/oauth/device/code`,\n\t\t{ client_id: CLIENT_ID, scope: SCOPE, machine: marsMachineId() },\n\t\tcallbacks.signal,\n\t)) as MarsDeviceResponse;\n\ttry {\n\t\topenBrowser(created.verification_uri_complete);\n\t} catch {\n\t\t// Launcher failures must not interrupt login; the dialog still shows the URL.\n\t}\n\tcallbacks.onDeviceCode({\n\t\tuserCode: created.user_code,\n\t\tverificationUri: created.verification_uri_complete,\n\t\tintervalSeconds: created.interval,\n\t\texpiresInSeconds: created.expires_in,\n\t\t// The browser already opened; a confirm-to-open hint would be noise.\n\t\topenBrowserOnConfirm: false,\n\t\tcopyCodeOnConfirm: false,\n\t});\n\tconst token = await pollForToken(server, created, callbacks.signal);\n\treturn marsCredentials(server, token);\n}\n\n/** Exchange the rotating refresh token; a replay or a foreign machine fails here and forces a new login. */\nexport async function marsRefreshToken(credentials: OAuthCredentials, signal: AbortSignal): Promise<OAuthCredentials> {\n\tconst server = typeof credentials.server === \"string\" ? credentials.server : marsServer();\n\tconst body = await postFormOrThrow(\n\t\t`${server}/oauth/token`,\n\t\t{\n\t\t\tgrant_type: \"refresh_token\",\n\t\t\trefresh_token: String(credentials.refresh),\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tmachine: marsMachineId(),\n\t\t},\n\t\tsignal,\n\t);\n\tconst token = readToken(body);\n\tif (!token) throw new Error(\"MarsAI token refresh returned an unexpected response\");\n\tconst minted =\n\t\ttypeof credentials.apiKey === \"string\" && credentials.apiKey !== \"\"\n\t\t\t? credentials.apiKey\n\t\t\t: await mintApiKey(server, token.access_token, signal);\n\treturn {\n\t\t...credentials,\n\t\taccess: token.access_token,\n\t\trefresh: token.refresh_token,\n\t\texpires: Date.now() + token.expires_in * 1000 - ACCESS_MARGIN_MS,\n\t\tapiKey: minted,\n\t\tserver,\n\t};\n}\n\n/** Request credential: the minted gateway key when present, else the short-lived access token. */\nexport function marsApiKey(credentials: OAuthCredentials): string {\n\treturn typeof credentials.apiKey === \"string\" && credentials.apiKey !== \"\" ? credentials.apiKey : credentials.access;\n}\n\n/** One row of `GET /v1/models`: the gateway's published combos, not a vendor catalog. */\nexport interface MarsModelRow {\n\tid: string;\n\tlabel?: string;\n\taccess?: string;\n\tusage_ratio?: number;\n\tcontext_tokens?: number;\n}\n\n/** Fetch the published model list with the gateway credential; empty means \"keep what you have\". */\nexport async function marsFetchModels(baseUrl: string, token: string, signal?: AbortSignal): Promise<MarsModelRow[]> {\n\tconst result = await getJson(`${baseUrl.replace(/\\/+$/, \"\")}/models`, token, signal);\n\tif (result.status < 200 || result.status >= 300) return [];\n\tif (typeof result.body !== \"object\" || result.body === null) return [];\n\tconst data = (result.body as { data?: unknown }).data;\n\tif (!Array.isArray(data)) return [];\n\treturn data.flatMap((row) => {\n\t\tif (typeof row !== \"object\" || row === null) return [];\n\t\tconst value = row as Record<string, unknown>;\n\t\tif (typeof value.id !== \"string\" || value.id === \"\") return [];\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: value.id,\n\t\t\t\tlabel: typeof value.label === \"string\" ? value.label : undefined,\n\t\t\t\taccess: typeof value.access === \"string\" ? value.access : undefined,\n\t\t\t\tusage_ratio: typeof value.usage_ratio === \"number\" ? value.usage_ratio : undefined,\n\t\t\t\tcontext_tokens: typeof value.context_tokens === \"number\" ? value.context_tokens : undefined,\n\t\t\t},\n\t\t];\n\t});\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Absolute web access for the agent: `web_fetch` reads a page as text,
|
|
3
|
+
* `web_search` runs a query through DuckDuckGo's lite HTML endpoint (no API key).
|
|
4
|
+
*
|
|
5
|
+
* ponytail: DDG lite markup is screen-scraped — brittle by design.
|
|
6
|
+
* Upgrade path: point `web_search` at a MarsAI gateway search endpoint (or a
|
|
7
|
+
* keyed API like Brave) when one exists, and swap the regex HTML stripper in
|
|
8
|
+
* `web_fetch` for a real readability parse if pages get messier.
|
|
9
|
+
*/
|
|
10
|
+
import { Type } from "typebox";
|
|
11
|
+
import type { ToolDefinition } from "../../core/extensions/types.ts";
|
|
12
|
+
/**
|
|
13
|
+
* Loopback, private-range and link-local targets are refused: the agent must not
|
|
14
|
+
* reach intranet services or the cloud metadata endpoint through web_fetch.
|
|
15
|
+
* ponytail: checked per redirect hop, but DNS rebinding (public name resolving
|
|
16
|
+
* to a private address) is not — that needs a custom resolver.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isBlockedFetchUrl(url: URL): string | undefined;
|
|
19
|
+
declare const webFetchParams: Type.TObject<{
|
|
20
|
+
url: Type.TString;
|
|
21
|
+
}>;
|
|
22
|
+
declare const webSearchParams: Type.TObject<{
|
|
23
|
+
query: Type.TString;
|
|
24
|
+
limit: Type.TOptional<Type.TNumber>;
|
|
25
|
+
}>;
|
|
26
|
+
/** Drop scripts/styles and decode the entities a text-only model ever sees. */
|
|
27
|
+
export declare function htmlToText(html: string): string;
|
|
28
|
+
export declare function createWebFetchToolDefinition(): ToolDefinition<typeof webFetchParams, unknown, unknown>;
|
|
29
|
+
export declare function createWebSearchToolDefinition(): ToolDefinition<typeof webSearchParams, unknown, unknown>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=web-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-tools.d.ts","sourceRoot":"","sources":["../../../src/extensions/marsai/web-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAWrE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS,CA6B9D;AAED,QAAA,MAAM,cAAc;;EAElB,CAAC;AAEH,QAAA,MAAM,eAAe;;;EAGnB,CAAC;AAKH,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiB/C;AA8DD,wBAAgB,4BAA4B,IAAI,cAAc,CAAC,OAAO,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAiGtG;AAED,wBAAgB,6BAA6B,IAAI,cAAc,CAAC,OAAO,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAoDxG"}
|