@mastra/code-sdk 0.0.0-fix-workflow-step-timing-and-parallel-status-20260715180716
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 +285 -0
- package/LICENSE.md +30 -0
- package/README.md +50 -0
- package/dist/acp/agent.d.ts +35 -0
- package/dist/acp/agent.d.ts.map +1 -0
- package/dist/acp/agent.js +173 -0
- package/dist/acp/agent.js.map +1 -0
- package/dist/acp/event-mapper.d.ts +22 -0
- package/dist/acp/event-mapper.d.ts.map +1 -0
- package/dist/acp/event-mapper.js +166 -0
- package/dist/acp/event-mapper.js.map +1 -0
- package/dist/acp/index.d.ts +8 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +54 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/server.d.ts +7 -0
- package/dist/acp/server.d.ts.map +1 -0
- package/dist/acp/server.js +34 -0
- package/dist/acp/server.js.map +1 -0
- package/dist/acp.d.ts +2 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +5 -0
- package/dist/acp.js.map +1 -0
- package/dist/agents/instructions.d.ts +6 -0
- package/dist/agents/instructions.d.ts.map +1 -0
- package/dist/agents/instructions.js +41 -0
- package/dist/agents/instructions.js.map +1 -0
- package/dist/agents/mastracode-gateway.d.ts +67 -0
- package/dist/agents/mastracode-gateway.d.ts.map +1 -0
- package/dist/agents/mastracode-gateway.js +446 -0
- package/dist/agents/mastracode-gateway.js.map +1 -0
- package/dist/agents/memory.d.ts +13 -0
- package/dist/agents/memory.d.ts.map +1 -0
- package/dist/agents/memory.js +107 -0
- package/dist/agents/memory.js.map +1 -0
- package/dist/agents/model.d.ts +55 -0
- package/dist/agents/model.d.ts.map +1 -0
- package/dist/agents/model.js +115 -0
- package/dist/agents/model.js.map +1 -0
- package/dist/agents/modes/build.d.ts +10 -0
- package/dist/agents/modes/build.d.ts.map +1 -0
- package/dist/agents/modes/build.js +45 -0
- package/dist/agents/modes/build.js.map +1 -0
- package/dist/agents/modes/explore.d.ts +10 -0
- package/dist/agents/modes/explore.d.ts.map +1 -0
- package/dist/agents/modes/explore.js +38 -0
- package/dist/agents/modes/explore.js.map +1 -0
- package/dist/agents/modes/plan.d.ts +6 -0
- package/dist/agents/modes/plan.d.ts.map +1 -0
- package/dist/agents/modes/plan.js +38 -0
- package/dist/agents/modes/plan.js.map +1 -0
- package/dist/agents/prompts/agent-instructions.d.ts +20 -0
- package/dist/agents/prompts/agent-instructions.d.ts.map +1 -0
- package/dist/agents/prompts/agent-instructions.js +82 -0
- package/dist/agents/prompts/agent-instructions.js.map +1 -0
- package/dist/agents/prompts/build.d.ts +12 -0
- package/dist/agents/prompts/build.d.ts.map +1 -0
- package/dist/agents/prompts/build.js +73 -0
- package/dist/agents/prompts/build.js.map +1 -0
- package/dist/agents/prompts/fast.d.ts +5 -0
- package/dist/agents/prompts/fast.d.ts.map +1 -0
- package/dist/agents/prompts/fast.js +22 -0
- package/dist/agents/prompts/fast.js.map +1 -0
- package/dist/agents/prompts/index.d.ts +19 -0
- package/dist/agents/prompts/index.d.ts.map +1 -0
- package/dist/agents/prompts/index.js +57 -0
- package/dist/agents/prompts/index.js.map +1 -0
- package/dist/agents/prompts/model.d.ts +5 -0
- package/dist/agents/prompts/model.d.ts.map +1 -0
- package/dist/agents/prompts/model.js +22 -0
- package/dist/agents/prompts/model.js.map +1 -0
- package/dist/agents/prompts/plan.d.ts +6 -0
- package/dist/agents/prompts/plan.d.ts.map +1 -0
- package/dist/agents/prompts/plan.js +107 -0
- package/dist/agents/prompts/plan.js.map +1 -0
- package/dist/agents/prompts/tool-guidance.d.ts +13 -0
- package/dist/agents/prompts/tool-guidance.d.ts.map +1 -0
- package/dist/agents/prompts/tool-guidance.js +181 -0
- package/dist/agents/prompts/tool-guidance.js.map +1 -0
- package/dist/agents/sandbox-filesystem.d.ts +89 -0
- package/dist/agents/sandbox-filesystem.d.ts.map +1 -0
- package/dist/agents/sandbox-filesystem.js +268 -0
- package/dist/agents/sandbox-filesystem.js.map +1 -0
- package/dist/agents/sandbox-reattach.d.ts +19 -0
- package/dist/agents/sandbox-reattach.d.ts.map +1 -0
- package/dist/agents/sandbox-reattach.js +17 -0
- package/dist/agents/sandbox-reattach.js.map +1 -0
- package/dist/agents/thread-caveman-state.d.ts +17 -0
- package/dist/agents/thread-caveman-state.d.ts.map +1 -0
- package/dist/agents/thread-caveman-state.js +96 -0
- package/dist/agents/thread-caveman-state.js.map +1 -0
- package/dist/agents/tool-availability.d.ts +10 -0
- package/dist/agents/tool-availability.d.ts.map +1 -0
- package/dist/agents/tool-availability.js +105 -0
- package/dist/agents/tool-availability.js.map +1 -0
- package/dist/agents/tools.d.ts +19 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +145 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/agents/workspace.d.ts +22 -0
- package/dist/agents/workspace.d.ts.map +1 -0
- package/dist/agents/workspace.js +226 -0
- package/dist/agents/workspace.js.map +1 -0
- package/dist/analytics.d.ts +18 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +152 -0
- package/dist/analytics.js.map +1 -0
- package/dist/auth/index.d.ts +9 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/pkce.d.ts +13 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +21 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/providers/anthropic.d.ts +17 -0
- package/dist/auth/providers/anthropic.d.ts.map +1 -0
- package/dist/auth/providers/anthropic.js +94 -0
- package/dist/auth/providers/anthropic.js.map +1 -0
- package/dist/auth/providers/github-copilot.d.ts +100 -0
- package/dist/auth/providers/github-copilot.d.ts.map +1 -0
- package/dist/auth/providers/github-copilot.js +302 -0
- package/dist/auth/providers/github-copilot.js.map +1 -0
- package/dist/auth/providers/openai-codex.d.ts +95 -0
- package/dist/auth/providers/openai-codex.d.ts.map +1 -0
- package/dist/auth/providers/openai-codex.js +527 -0
- package/dist/auth/providers/openai-codex.js.map +1 -0
- package/dist/auth/storage.d.ts +91 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +187 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/auth/types.d.ts +68 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +1 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/clipboard/index.d.ts +26 -0
- package/dist/clipboard/index.d.ts.map +1 -0
- package/dist/clipboard/index.js +192 -0
- package/dist/clipboard/index.js.map +1 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +23 -0
- package/dist/constants.js.map +1 -0
- package/dist/error-classification.d.ts +10 -0
- package/dist/error-classification.d.ts.map +1 -0
- package/dist/error-classification.js +14 -0
- package/dist/error-classification.js.map +1 -0
- package/dist/evals/context-builder.d.ts +41 -0
- package/dist/evals/context-builder.d.ts.map +1 -0
- package/dist/evals/context-builder.js +120 -0
- package/dist/evals/context-builder.js.map +1 -0
- package/dist/evals/index.d.ts +4 -0
- package/dist/evals/index.d.ts.map +1 -0
- package/dist/evals/index.js +8 -0
- package/dist/evals/index.js.map +1 -0
- package/dist/evals/scorers/classify-command.d.ts +31 -0
- package/dist/evals/scorers/classify-command.d.ts.map +1 -0
- package/dist/evals/scorers/classify-command.js +52 -0
- package/dist/evals/scorers/classify-command.js.map +1 -0
- package/dist/evals/scorers/efficiency.d.ts +44 -0
- package/dist/evals/scorers/efficiency.d.ts.map +1 -0
- package/dist/evals/scorers/efficiency.js +201 -0
- package/dist/evals/scorers/efficiency.js.map +1 -0
- package/dist/evals/scorers/extract-tools.d.ts +25 -0
- package/dist/evals/scorers/extract-tools.d.ts.map +1 -0
- package/dist/evals/scorers/extract-tools.js +56 -0
- package/dist/evals/scorers/extract-tools.js.map +1 -0
- package/dist/evals/scorers/index.d.ts +3 -0
- package/dist/evals/scorers/index.d.ts.map +1 -0
- package/dist/evals/scorers/index.js +7 -0
- package/dist/evals/scorers/index.js.map +1 -0
- package/dist/evals/scorers/outcome.d.ts +49 -0
- package/dist/evals/scorers/outcome.d.ts.map +1 -0
- package/dist/evals/scorers/outcome.js +238 -0
- package/dist/evals/scorers/outcome.js.map +1 -0
- package/dist/headless/cli.d.ts +42 -0
- package/dist/headless/cli.d.ts.map +1 -0
- package/dist/headless/cli.js +196 -0
- package/dist/headless/cli.js.map +1 -0
- package/dist/headless/flags.d.ts +33 -0
- package/dist/headless/flags.d.ts.map +1 -0
- package/dist/headless/flags.js +188 -0
- package/dist/headless/flags.js.map +1 -0
- package/dist/headless/format.d.ts +38 -0
- package/dist/headless/format.d.ts.map +1 -0
- package/dist/headless/format.js +85 -0
- package/dist/headless/format.js.map +1 -0
- package/dist/headless/index.d.ts +25 -0
- package/dist/headless/index.d.ts.map +1 -0
- package/dist/headless/index.js +32 -0
- package/dist/headless/index.js.map +1 -0
- package/dist/headless/policy.d.ts +17 -0
- package/dist/headless/policy.d.ts.map +1 -0
- package/dist/headless/policy.js +38 -0
- package/dist/headless/policy.js.map +1 -0
- package/dist/headless/run-mc.d.ts +7 -0
- package/dist/headless/run-mc.d.ts.map +1 -0
- package/dist/headless/run-mc.js +296 -0
- package/dist/headless/run-mc.js.map +1 -0
- package/dist/headless/types.d.ts +134 -0
- package/dist/headless/types.d.ts.map +1 -0
- package/dist/headless/types.js +9 -0
- package/dist/headless/types.js.map +1 -0
- package/dist/hooks/config.d.ts +11 -0
- package/dist/hooks/config.d.ts.map +1 -0
- package/dist/hooks/config.js +78 -0
- package/dist/hooks/config.js.map +1 -0
- package/dist/hooks/executor.d.ts +13 -0
- package/dist/hooks/executor.d.ts.map +1 -0
- package/dist/hooks/executor.js +125 -0
- package/dist/hooks/executor.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +16 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/manager.d.ts +47 -0
- package/dist/hooks/manager.d.ts.map +1 -0
- package/dist/hooks/manager.js +284 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/types.d.ts +152 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +7 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +243 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +730 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/ipc-reporter.d.ts +14 -0
- package/dist/ipc/ipc-reporter.d.ts.map +1 -0
- package/dist/ipc/ipc-reporter.js +24 -0
- package/dist/ipc/ipc-reporter.js.map +1 -0
- package/dist/lsp/client.d.ts +56 -0
- package/dist/lsp/client.d.ts.map +1 -0
- package/dist/lsp/client.js +309 -0
- package/dist/lsp/client.js.map +1 -0
- package/dist/lsp/index.d.ts +4 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +9 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/language.d.ts +9 -0
- package/dist/lsp/language.d.ts.map +1 -0
- package/dist/lsp/language.js +48 -0
- package/dist/lsp/language.js.map +1 -0
- package/dist/lsp/manager.d.ts +34 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +97 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/server.d.ts +27 -0
- package/dist/lsp/server.d.ts.map +1 -0
- package/dist/lsp/server.js +128 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp/workspace.d.ts +9 -0
- package/dist/lsp/workspace.d.ts.map +1 -0
- package/dist/lsp/workspace.js +52 -0
- package/dist/lsp/workspace.js.map +1 -0
- package/dist/mcp/config.d.ts +34 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +205 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +10 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +49 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +374 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/types.d.ts +85 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +1 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/onboarding/custom-packs.d.ts +7 -0
- package/dist/onboarding/custom-packs.d.ts.map +1 -0
- package/dist/onboarding/custom-packs.js +20 -0
- package/dist/onboarding/custom-packs.js.map +1 -0
- package/dist/onboarding/custom-providers.d.ts +4 -0
- package/dist/onboarding/custom-providers.d.ts.map +1 -0
- package/dist/onboarding/custom-providers.js +28 -0
- package/dist/onboarding/custom-providers.js.map +1 -0
- package/dist/onboarding/index.d.ts +5 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +21 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/om-settings.d.ts +20 -0
- package/dist/onboarding/om-settings.d.ts.map +1 -0
- package/dist/onboarding/om-settings.js +26 -0
- package/dist/onboarding/om-settings.js.map +1 -0
- package/dist/onboarding/packs.d.ts +48 -0
- package/dist/onboarding/packs.d.ts.map +1 -0
- package/dist/onboarding/packs.js +111 -0
- package/dist/onboarding/packs.js.map +1 -0
- package/dist/onboarding/settings.d.ts +327 -0
- package/dist/onboarding/settings.d.ts.map +1 -0
- package/dist/onboarding/settings.js +598 -0
- package/dist/onboarding/settings.js.map +1 -0
- package/dist/permissions.d.ts +55 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +119 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plugin.d.ts +81 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +30 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugins/dependencies.d.ts +9 -0
- package/dist/plugins/dependencies.d.ts.map +1 -0
- package/dist/plugins/dependencies.js +111 -0
- package/dist/plugins/dependencies.js.map +1 -0
- package/dist/plugins/install.d.ts +21 -0
- package/dist/plugins/install.d.ts.map +1 -0
- package/dist/plugins/install.js +200 -0
- package/dist/plugins/install.js.map +1 -0
- package/dist/plugins/loader.d.ts +15 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +221 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manager.d.ts +60 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +378 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/manifest.d.ts +14 -0
- package/dist/plugins/manifest.d.ts.map +1 -0
- package/dist/plugins/manifest.js +75 -0
- package/dist/plugins/manifest.js.map +1 -0
- package/dist/plugins/package-link.d.ts +3 -0
- package/dist/plugins/package-link.d.ts.map +1 -0
- package/dist/plugins/package-link.js +77 -0
- package/dist/plugins/package-link.js.map +1 -0
- package/dist/plugins/paths.d.ts +10 -0
- package/dist/plugins/paths.d.ts.map +1 -0
- package/dist/plugins/paths.js +26 -0
- package/dist/plugins/paths.js.map +1 -0
- package/dist/plugins/registry.d.ts +8 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +96 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/scaffold.d.ts +10 -0
- package/dist/plugins/scaffold.d.ts.map +1 -0
- package/dist/plugins/scaffold.js +152 -0
- package/dist/plugins/scaffold.js.map +1 -0
- package/dist/plugins/types.d.ts +45 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +1 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/processors/plan-rejection-abort.d.ts +12 -0
- package/dist/processors/plan-rejection-abort.d.ts.map +1 -0
- package/dist/processors/plan-rejection-abort.js +53 -0
- package/dist/processors/plan-rejection-abort.js.map +1 -0
- package/dist/providers/amazon-bedrock-gateway.d.ts +40 -0
- package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -0
- package/dist/providers/amazon-bedrock-gateway.js +79 -0
- package/dist/providers/amazon-bedrock-gateway.js.map +1 -0
- package/dist/providers/amazon-bedrock.d.ts +28 -0
- package/dist/providers/amazon-bedrock.d.ts.map +1 -0
- package/dist/providers/amazon-bedrock.js +62 -0
- package/dist/providers/amazon-bedrock.js.map +1 -0
- package/dist/providers/claude-max.d.ts +50 -0
- package/dist/providers/claude-max.d.ts.map +1 -0
- package/dist/providers/claude-max.js +151 -0
- package/dist/providers/claude-max.js.map +1 -0
- package/dist/providers/github-copilot.d.ts +58 -0
- package/dist/providers/github-copilot.d.ts.map +1 -0
- package/dist/providers/github-copilot.js +263 -0
- package/dist/providers/github-copilot.js.map +1 -0
- package/dist/providers/openai-codex.d.ts +70 -0
- package/dist/providers/openai-codex.d.ts.map +1 -0
- package/dist/providers/openai-codex.js +291 -0
- package/dist/providers/openai-codex.js.map +1 -0
- package/dist/schema.d.ts +167 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +92 -0
- package/dist/schema.js.map +1 -0
- package/dist/theme-palette.d.ts +17 -0
- package/dist/theme-palette.d.ts.map +1 -0
- package/dist/theme-palette.js +17 -0
- package/dist/theme-palette.js.map +1 -0
- package/dist/tool-names.d.ts +73 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tool-names.js +43 -0
- package/dist/tool-names.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/request-sandbox-access.d.ts +6 -0
- package/dist/tools/request-sandbox-access.d.ts.map +1 -0
- package/dist/tools/request-sandbox-access.js +88 -0
- package/dist/tools/request-sandbox-access.js.map +1 -0
- package/dist/tools/utils.d.ts +20 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +22 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/web-search.d.ts +35 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +65 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/utils/binaries.d.ts +7 -0
- package/dist/utils/binaries.d.ts.map +1 -0
- package/dist/utils/binaries.js +74 -0
- package/dist/utils/binaries.js.map +1 -0
- package/dist/utils/debug-log.d.ts +12 -0
- package/dist/utils/debug-log.d.ts.map +1 -0
- package/dist/utils/debug-log.js +55 -0
- package/dist/utils/debug-log.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +207 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/gateway-sync.d.ts +26 -0
- package/dist/utils/gateway-sync.d.ts.map +1 -0
- package/dist/utils/gateway-sync.js +49 -0
- package/dist/utils/gateway-sync.js.map +1 -0
- package/dist/utils/path-security.d.ts +2 -0
- package/dist/utils/path-security.d.ts.map +1 -0
- package/dist/utils/path-security.js +9 -0
- package/dist/utils/path-security.js.map +1 -0
- package/dist/utils/plan-diff.d.ts +25 -0
- package/dist/utils/plan-diff.d.ts.map +1 -0
- package/dist/utils/plan-diff.js +43 -0
- package/dist/utils/plan-diff.js.map +1 -0
- package/dist/utils/plans.d.ts +56 -0
- package/dist/utils/plans.d.ts.map +1 -0
- package/dist/utils/plans.js +99 -0
- package/dist/utils/plans.js.map +1 -0
- package/dist/utils/project.d.ts +160 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +302 -0
- package/dist/utils/project.js.map +1 -0
- package/dist/utils/signals-pubsub.d.ts +41 -0
- package/dist/utils/signals-pubsub.d.ts.map +1 -0
- package/dist/utils/signals-pubsub.js +104 -0
- package/dist/utils/signals-pubsub.js.map +1 -0
- package/dist/utils/slash-command-loader.d.ts +52 -0
- package/dist/utils/slash-command-loader.d.ts.map +1 -0
- package/dist/utils/slash-command-loader.js +177 -0
- package/dist/utils/slash-command-loader.js.map +1 -0
- package/dist/utils/slash-command-processor.d.ts +14 -0
- package/dist/utils/slash-command-processor.d.ts.map +1 -0
- package/dist/utils/slash-command-processor.js +96 -0
- package/dist/utils/slash-command-processor.js.map +1 -0
- package/dist/utils/stdin-pipe.d.ts +33 -0
- package/dist/utils/stdin-pipe.d.ts.map +1 -0
- package/dist/utils/stdin-pipe.js +72 -0
- package/dist/utils/stdin-pipe.js.map +1 -0
- package/dist/utils/storage-factory.d.ts +50 -0
- package/dist/utils/storage-factory.d.ts.map +1 -0
- package/dist/utils/storage-factory.js +101 -0
- package/dist/utils/storage-factory.js.map +1 -0
- package/dist/utils/storage-maintenance.d.ts +103 -0
- package/dist/utils/storage-maintenance.d.ts.map +1 -0
- package/dist/utils/storage-maintenance.js +236 -0
- package/dist/utils/storage-maintenance.js.map +1 -0
- package/dist/utils/thread-lock.d.ts +26 -0
- package/dist/utils/thread-lock.d.ts.map +1 -0
- package/dist/utils/thread-lock.js +108 -0
- package/dist/utils/thread-lock.js.map +1 -0
- package/dist/utils/token-estimator.d.ts +3 -0
- package/dist/utils/token-estimator.d.ts.map +1 -0
- package/dist/utils/token-estimator.js +21 -0
- package/dist/utils/token-estimator.js.map +1 -0
- package/dist/utils/update-check.d.ts +52 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/dist/utils/update-check.js +177 -0
- package/dist/utils/update-check.js.map +1 -0
- package/dist/voice/stt-registry.d.ts +64 -0
- package/dist/voice/stt-registry.d.ts.map +1 -0
- package/dist/voice/stt-registry.js +126 -0
- package/dist/voice/stt-registry.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/analytics.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { PostHog } from 'posthog-node';\n\nconst POSTHOG_API_KEY = 'phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT';\nconst POSTHOG_HOST = 'https://us.posthog.com';\nconst MASTRA_SOURCE = 'mastracode';\nconst TRUTHY_DISABLED_VALUES = new Set(['1', 'true', 'yes', 'on']);\nconst ANALYTICS_CONFIG_PATH = path.join(os.homedir(), '.mastracode', 'analytics.json');\n\ninterface AnalyticsConfig {\n distinctId?: string;\n}\n\nfunction createMastraAnalyticsDistinctId(): string {\n return `mastra-${randomUUID()}`;\n}\n\nfunction isHostnameDerivedDistinctId(distinctId: string, hostname = os.hostname()): boolean {\n return distinctId === `mastra-${hostname}`;\n}\n\nfunction isValidMastraAnalyticsDistinctId(distinctId: string): boolean {\n return /^mastra-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(distinctId);\n}\n\nfunction writeAnalyticsConfig(distinctId: string, configPath = ANALYTICS_CONFIG_PATH): void {\n try {\n mkdirSync(path.dirname(configPath), { recursive: true });\n writeFileSync(configPath, JSON.stringify({ distinctId }));\n } catch {\n // swallow analytics persistence errors\n }\n}\n\nexport function getMastraAnalyticsDistinctId(configPath = ANALYTICS_CONFIG_PATH): string {\n try {\n if (existsSync(configPath)) {\n const config = JSON.parse(readFileSync(configPath, 'utf-8')) as AnalyticsConfig;\n if (\n config.distinctId &&\n isValidMastraAnalyticsDistinctId(config.distinctId) &&\n !isHostnameDerivedDistinctId(config.distinctId)\n ) {\n return config.distinctId;\n }\n }\n } catch {\n // regenerate below\n }\n\n const distinctId = createMastraAnalyticsDistinctId();\n writeAnalyticsConfig(distinctId, configPath);\n return distinctId;\n}\n\nfunction isAnalyticsDebugEnabled(): boolean {\n return TRUTHY_DISABLED_VALUES.has(process.env.MASTRACODE_ANALYTICS_DEBUG?.trim().toLowerCase() ?? '');\n}\n\nfunction debugAnalytics(message: string, properties?: Record<string, unknown>): void {\n if (!isAnalyticsDebugEnabled()) {\n return;\n }\n\n const suffix = properties ? ` ${JSON.stringify(properties)}` : '';\n process.stderr.write(`[mastracode analytics] ${message}${suffix}\\n`);\n}\n\nexport type MastraCodeAnalyticsEvent =\n | 'mastracode_session_started'\n | 'mastracode_prompt_submitted'\n | 'mastracode_thread_changed'\n | 'mastracode_model_changed'\n | 'mastracode_command_used'\n | 'mastracode_interactive_prompt_shown';\n\nexport interface MastraCodeAnalytics {\n capture(event: MastraCodeAnalyticsEvent, properties?: Record<string, unknown>): void;\n trackCommand(command: string, properties?: Record<string, unknown>): void;\n trackInteractivePrompt(promptType: string, properties?: Record<string, unknown>): void;\n shutdown(): Promise<void>;\n isEnabled(): boolean;\n}\n\ninterface MastraCodeAnalyticsOptions {\n version: string;\n host?: string;\n apiKey?: string;\n}\n\nclass NoopMastraCodeAnalytics implements MastraCodeAnalytics {\n capture(event: MastraCodeAnalyticsEvent): void {\n debugAnalytics('capture skipped: telemetry disabled', { event });\n }\n trackCommand(command: string): void {\n debugAnalytics('command skipped: telemetry disabled', { command });\n }\n trackInteractivePrompt(promptType: string): void {\n debugAnalytics('interactive prompt skipped: telemetry disabled', { promptType });\n }\n async shutdown(): Promise<void> {\n debugAnalytics('shutdown skipped: telemetry disabled');\n }\n isEnabled(): boolean {\n return false;\n }\n}\n\nclass PostHogMastraCodeAnalytics implements MastraCodeAnalytics {\n private readonly client: PostHog;\n private readonly distinctId: string;\n private readonly sessionId = randomUUID();\n private readonly version: string;\n\n constructor({ version, apiKey = POSTHOG_API_KEY, host = POSTHOG_HOST }: MastraCodeAnalyticsOptions) {\n this.version = version;\n this.distinctId = getMastraAnalyticsDistinctId();\n this.client = new PostHog(apiKey, {\n host,\n flushAt: 1,\n flushInterval: 0,\n disableGeoip: false,\n });\n this.client.register({ mastraSource: MASTRA_SOURCE });\n debugAnalytics('enabled', { host, distinctId: this.distinctId, version });\n }\n\n capture(event: MastraCodeAnalyticsEvent, properties?: Record<string, unknown>): void {\n try {\n const eventProperties = {\n ...this.getBaseProperties(),\n ...properties,\n };\n debugAnalytics('capture', { event, properties: eventProperties });\n this.client.capture({\n distinctId: this.distinctId,\n event,\n properties: eventProperties,\n });\n } catch (error) {\n debugAnalytics('capture failed', { event, error: error instanceof Error ? error.message : String(error) });\n // swallow analytics errors\n }\n }\n\n trackCommand(command: string, properties?: Record<string, unknown>): void {\n this.capture('mastracode_command_used', { command, ...properties });\n }\n\n trackInteractivePrompt(promptType: string, properties?: Record<string, unknown>): void {\n this.capture('mastracode_interactive_prompt_shown', { promptType, ...properties });\n }\n\n async shutdown(): Promise<void> {\n try {\n debugAnalytics('shutdown start');\n await this.client.shutdown();\n debugAnalytics('shutdown complete');\n } catch (error) {\n debugAnalytics('shutdown failed', { error: error instanceof Error ? error.message : String(error) });\n // swallow analytics errors\n }\n }\n\n isEnabled(): boolean {\n return true;\n }\n\n private getBaseProperties(): Record<string, unknown> {\n return {\n mastraSource: MASTRA_SOURCE,\n sessionId: this.sessionId,\n version: this.version,\n os: process.platform,\n osVersion: os.release(),\n nodeVersion: process.version,\n platform: process.arch,\n machineId: os.hostname(),\n };\n }\n}\n\nexport function isTelemetryDisabled(env: NodeJS.ProcessEnv = process.env): boolean {\n const value = env.MASTRA_TELEMETRY_DISABLED;\n if (!value) {\n return false;\n }\n\n return TRUTHY_DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nexport function createMastraCodeAnalytics(options: MastraCodeAnalyticsOptions): MastraCodeAnalytics {\n if (isTelemetryDisabled()) {\n debugAnalytics('disabled by MASTRA_TELEMETRY_DISABLED', { value: process.env.MASTRA_TELEMETRY_DISABLED });\n return new NoopMastraCodeAnalytics();\n }\n\n return new PostHogMastraCodeAnalytics(options);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth credential management for AI providers.
|
|
3
|
+
*/
|
|
4
|
+
export * from './types.js';
|
|
5
|
+
export * from './storage.js';
|
|
6
|
+
export { anthropicOAuthProvider } from './providers/anthropic.js';
|
|
7
|
+
export { githubCopilotOAuthProvider } from './providers/github-copilot.js';
|
|
8
|
+
export { openaiCodexOAuthProvider } from './providers/openai-codex.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./storage.js";
|
|
3
|
+
import { anthropicOAuthProvider } from "./providers/anthropic.js";
|
|
4
|
+
import { githubCopilotOAuthProvider } from "./providers/github-copilot.js";
|
|
5
|
+
import { openaiCodexOAuthProvider } from "./providers/openai-codex.js";
|
|
6
|
+
export {
|
|
7
|
+
anthropicOAuthProvider,
|
|
8
|
+
githubCopilotOAuthProvider,
|
|
9
|
+
openaiCodexOAuthProvider
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/auth/index.ts"],"sourcesContent":["/**\n * OAuth credential management for AI providers.\n */\n\nexport * from './types.js';\nexport * from './storage.js';\nexport { anthropicOAuthProvider } from './providers/anthropic.js';\nexport { githubCopilotOAuthProvider } from './providers/github-copilot.js';\nexport { openaiCodexOAuthProvider } from './providers/openai-codex.js';\n"],"mappings":"AAIA,cAAc;AACd,cAAc;AACd,SAAS,8BAA8B;AACvC,SAAS,kCAAkC;AAC3C,SAAS,gCAAgC;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PKCE utilities using Web Crypto API.
|
|
3
|
+
* Works in both Node.js 20+ and browsers.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generate PKCE code verifier and challenge.
|
|
7
|
+
* Uses Web Crypto API for cross-platform compatibility.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generatePKCE(): Promise<{
|
|
10
|
+
verifier: string;
|
|
11
|
+
challenge: string;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=pkce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/auth/pkce.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAaD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function base64urlEncode(bytes) {
|
|
2
|
+
let binary = "";
|
|
3
|
+
for (const byte of bytes) {
|
|
4
|
+
binary += String.fromCharCode(byte);
|
|
5
|
+
}
|
|
6
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
7
|
+
}
|
|
8
|
+
async function generatePKCE() {
|
|
9
|
+
const verifierBytes = new Uint8Array(32);
|
|
10
|
+
crypto.getRandomValues(verifierBytes);
|
|
11
|
+
const verifier = base64urlEncode(verifierBytes);
|
|
12
|
+
const encoder = new TextEncoder();
|
|
13
|
+
const data = encoder.encode(verifier);
|
|
14
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
15
|
+
const challenge = base64urlEncode(new Uint8Array(hashBuffer));
|
|
16
|
+
return { verifier, challenge };
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
generatePKCE
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=pkce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/auth/pkce.ts"],"sourcesContent":["/**\n * PKCE utilities using Web Crypto API.\n * Works in both Node.js 20+ and browsers.\n */\n\n/**\n * Encode bytes as base64url string.\n */\nfunction base64urlEncode(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Generate PKCE code verifier and challenge.\n * Uses Web Crypto API for cross-platform compatibility.\n */\nexport async function generatePKCE(): Promise<{\n verifier: string;\n challenge: string;\n}> {\n // Generate random verifier\n const verifierBytes = new Uint8Array(32);\n crypto.getRandomValues(verifierBytes);\n const verifier = base64urlEncode(verifierBytes);\n\n // Compute SHA-256 challenge\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const challenge = base64urlEncode(new Uint8Array(hashBuffer));\n\n return { verifier, challenge };\n}\n"],"mappings":"AAQA,SAAS,gBAAgB,OAA2B;AAClD,MAAI,SAAS;AACb,aAAW,QAAQ,OAAO;AACxB,cAAU,OAAO,aAAa,IAAI;AAAA,EACpC;AACA,SAAO,KAAK,MAAM,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE;AAC9E;AAMA,eAAsB,eAGnB;AAED,QAAM,gBAAgB,IAAI,WAAW,EAAE;AACvC,SAAO,gBAAgB,aAAa;AACpC,QAAM,WAAW,gBAAgB,aAAa;AAG9C,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,OAAO,QAAQ,OAAO,QAAQ;AACpC,QAAM,aAAa,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI;AAC7D,QAAM,YAAY,gBAAgB,IAAI,WAAW,UAAU,CAAC;AAE5D,SAAO,EAAE,UAAU,UAAU;AAC/B;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic OAuth flow (Claude Pro/Max)
|
|
3
|
+
*
|
|
4
|
+
* Inspired by pi-mono's OAuth implementation:
|
|
5
|
+
* https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/anthropic.ts
|
|
6
|
+
*/
|
|
7
|
+
import type { OAuthCredentials, OAuthProviderInterface } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Login with Anthropic OAuth (device code flow)
|
|
10
|
+
*/
|
|
11
|
+
export declare function loginAnthropic(onAuthUrl: (url: string) => void, onPromptCode: () => Promise<string>): Promise<OAuthCredentials>;
|
|
12
|
+
/**
|
|
13
|
+
* Refresh Anthropic OAuth token
|
|
14
|
+
*/
|
|
15
|
+
export declare function refreshAnthropicToken(refreshToken: string): Promise<OAuthCredentials>;
|
|
16
|
+
export declare const anthropicOAuthProvider: OAuthProviderInterface;
|
|
17
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAuB,sBAAsB,EAAE,MAAM,aAAa,CAAC;AASjG;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAChC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAClC,OAAO,CAAC,gBAAgB,CAAC,CA6D3B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2B3F;AAED,eAAO,MAAM,sBAAsB,EAAE,sBAkBpC,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { generatePKCE } from "../pkce.js";
|
|
2
|
+
const decode = (s) => atob(s);
|
|
3
|
+
const CLIENT_ID = decode("OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl");
|
|
4
|
+
const AUTHORIZE_URL = "https://claude.ai/oauth/authorize";
|
|
5
|
+
const TOKEN_URL = "https://console.anthropic.com/v1/oauth/token";
|
|
6
|
+
const REDIRECT_URI = "https://console.anthropic.com/oauth/code/callback";
|
|
7
|
+
const SCOPES = "org:create_api_key user:profile user:inference";
|
|
8
|
+
async function loginAnthropic(onAuthUrl, onPromptCode) {
|
|
9
|
+
const { verifier, challenge } = await generatePKCE();
|
|
10
|
+
const authParams = new URLSearchParams({
|
|
11
|
+
code: "true",
|
|
12
|
+
client_id: CLIENT_ID,
|
|
13
|
+
response_type: "code",
|
|
14
|
+
redirect_uri: REDIRECT_URI,
|
|
15
|
+
scope: SCOPES,
|
|
16
|
+
code_challenge: challenge,
|
|
17
|
+
code_challenge_method: "S256",
|
|
18
|
+
state: verifier
|
|
19
|
+
});
|
|
20
|
+
const authUrl = `${AUTHORIZE_URL}?${authParams.toString()}`;
|
|
21
|
+
onAuthUrl(authUrl);
|
|
22
|
+
const authCode = await onPromptCode();
|
|
23
|
+
const splits = authCode.split("#");
|
|
24
|
+
const code = splits[0];
|
|
25
|
+
const state = splits[1];
|
|
26
|
+
const tokenResponse = await fetch(TOKEN_URL, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: {
|
|
29
|
+
"Content-Type": "application/json"
|
|
30
|
+
},
|
|
31
|
+
body: JSON.stringify({
|
|
32
|
+
grant_type: "authorization_code",
|
|
33
|
+
client_id: CLIENT_ID,
|
|
34
|
+
code,
|
|
35
|
+
state,
|
|
36
|
+
redirect_uri: REDIRECT_URI,
|
|
37
|
+
code_verifier: verifier
|
|
38
|
+
})
|
|
39
|
+
});
|
|
40
|
+
if (!tokenResponse.ok) {
|
|
41
|
+
const error = await tokenResponse.text();
|
|
42
|
+
throw new Error(`Token exchange failed: ${error}`);
|
|
43
|
+
}
|
|
44
|
+
const tokenData = await tokenResponse.json();
|
|
45
|
+
const expiresAt = Date.now() + tokenData.expires_in * 1e3 - 5 * 60 * 1e3;
|
|
46
|
+
return {
|
|
47
|
+
refresh: tokenData.refresh_token,
|
|
48
|
+
access: tokenData.access_token,
|
|
49
|
+
expires: expiresAt
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async function refreshAnthropicToken(refreshToken) {
|
|
53
|
+
const response = await fetch(TOKEN_URL, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: { "Content-Type": "application/json" },
|
|
56
|
+
body: JSON.stringify({
|
|
57
|
+
grant_type: "refresh_token",
|
|
58
|
+
client_id: CLIENT_ID,
|
|
59
|
+
refresh_token: refreshToken
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
const error = await response.text();
|
|
64
|
+
throw new Error(`Anthropic token refresh failed: ${error}`);
|
|
65
|
+
}
|
|
66
|
+
const data = await response.json();
|
|
67
|
+
return {
|
|
68
|
+
refresh: data.refresh_token,
|
|
69
|
+
access: data.access_token,
|
|
70
|
+
expires: Date.now() + data.expires_in * 1e3 - 5 * 60 * 1e3
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const anthropicOAuthProvider = {
|
|
74
|
+
id: "anthropic",
|
|
75
|
+
name: "Anthropic (Claude Pro/Max)",
|
|
76
|
+
async login(callbacks) {
|
|
77
|
+
return loginAnthropic(
|
|
78
|
+
(url) => callbacks.onAuth({ url }),
|
|
79
|
+
() => callbacks.onPrompt({ message: "Paste the authorization code:" })
|
|
80
|
+
);
|
|
81
|
+
},
|
|
82
|
+
async refreshToken(credentials) {
|
|
83
|
+
return refreshAnthropicToken(credentials.refresh);
|
|
84
|
+
},
|
|
85
|
+
getApiKey(credentials) {
|
|
86
|
+
return credentials.access;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
export {
|
|
90
|
+
anthropicOAuthProvider,
|
|
91
|
+
loginAnthropic,
|
|
92
|
+
refreshAnthropicToken
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/providers/anthropic.ts"],"sourcesContent":["/**\n * Anthropic OAuth flow (Claude Pro/Max)\n *\n * Inspired by pi-mono's OAuth implementation:\n * https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/anthropic.ts\n */\n\nimport { generatePKCE } from '../pkce.js';\nimport type { OAuthCredentials, OAuthLoginCallbacks, OAuthProviderInterface } from '../types.js';\n\nconst decode = (s: string) => atob(s);\nconst CLIENT_ID = decode('OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl');\nconst AUTHORIZE_URL = 'https://claude.ai/oauth/authorize';\nconst TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token';\nconst REDIRECT_URI = 'https://console.anthropic.com/oauth/code/callback';\nconst SCOPES = 'org:create_api_key user:profile user:inference';\n\n/**\n * Login with Anthropic OAuth (device code flow)\n */\nexport async function loginAnthropic(\n onAuthUrl: (url: string) => void,\n onPromptCode: () => Promise<string>,\n): Promise<OAuthCredentials> {\n const { verifier, challenge } = await generatePKCE();\n\n // Build authorization URL\n const authParams = new URLSearchParams({\n code: 'true',\n client_id: CLIENT_ID,\n response_type: 'code',\n redirect_uri: REDIRECT_URI,\n scope: SCOPES,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n state: verifier,\n });\n\n const authUrl = `${AUTHORIZE_URL}?${authParams.toString()}`;\n\n // Notify caller with URL to open\n onAuthUrl(authUrl);\n\n // Wait for user to paste authorization code (format: code#state)\n const authCode = await onPromptCode();\n const splits = authCode.split('#');\n const code = splits[0];\n const state = splits[1];\n\n // Exchange code for tokens\n const tokenResponse = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n grant_type: 'authorization_code',\n client_id: CLIENT_ID,\n code: code,\n state: state,\n redirect_uri: REDIRECT_URI,\n code_verifier: verifier,\n }),\n });\n\n if (!tokenResponse.ok) {\n const error = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const tokenData = (await tokenResponse.json()) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n\n // Calculate expiry time (current time + expires_in seconds - 5 min buffer)\n const expiresAt = Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000;\n\n return {\n refresh: tokenData.refresh_token,\n access: tokenData.access_token,\n expires: expiresAt,\n };\n}\n\n/**\n * Refresh Anthropic OAuth token\n */\nexport async function refreshAnthropicToken(refreshToken: string): Promise<OAuthCredentials> {\n const response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic token refresh failed: ${error}`);\n }\n\n const data = (await response.json()) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n\n return {\n refresh: data.refresh_token,\n access: data.access_token,\n expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,\n };\n}\n\nexport const anthropicOAuthProvider: OAuthProviderInterface = {\n id: 'anthropic',\n name: 'Anthropic (Claude Pro/Max)',\n\n async login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n return loginAnthropic(\n url => callbacks.onAuth({ url }),\n () => callbacks.onPrompt({ message: 'Paste the authorization code:' }),\n );\n },\n\n async refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n return refreshAnthropicToken(credentials.refresh);\n },\n\n getApiKey(credentials: OAuthCredentials): string {\n return credentials.access;\n },\n};\n"],"mappings":"AAOA,SAAS,oBAAoB;AAG7B,MAAM,SAAS,CAAC,MAAc,KAAK,CAAC;AACpC,MAAM,YAAY,OAAO,kDAAkD;AAC3E,MAAM,gBAAgB;AACtB,MAAM,YAAY;AAClB,MAAM,eAAe;AACrB,MAAM,SAAS;AAKf,eAAsB,eACpB,WACA,cAC2B;AAC3B,QAAM,EAAE,UAAU,UAAU,IAAI,MAAM,aAAa;AAGnD,QAAM,aAAa,IAAI,gBAAgB;AAAA,IACrC,MAAM;AAAA,IACN,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,OAAO;AAAA,EACT,CAAC;AAED,QAAM,UAAU,GAAG,aAAa,IAAI,WAAW,SAAS,CAAC;AAGzD,YAAU,OAAO;AAGjB,QAAM,WAAW,MAAM,aAAa;AACpC,QAAM,SAAS,SAAS,MAAM,GAAG;AACjC,QAAM,OAAO,OAAO,CAAC;AACrB,QAAM,QAAQ,OAAO,CAAC;AAGtB,QAAM,gBAAgB,MAAM,MAAM,WAAW;AAAA,IAC3C,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,YAAY;AAAA,MACZ,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,IACjB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,cAAc,IAAI;AACrB,UAAM,QAAQ,MAAM,cAAc,KAAK;AACvC,UAAM,IAAI,MAAM,0BAA0B,KAAK,EAAE;AAAA,EACnD;AAEA,QAAM,YAAa,MAAM,cAAc,KAAK;AAO5C,QAAM,YAAY,KAAK,IAAI,IAAI,UAAU,aAAa,MAAO,IAAI,KAAK;AAEtE,SAAO;AAAA,IACL,SAAS,UAAU;AAAA,IACnB,QAAQ,UAAU;AAAA,IAClB,SAAS;AAAA,EACX;AACF;AAKA,eAAsB,sBAAsB,cAAiD;AAC3F,QAAM,WAAW,MAAM,MAAM,WAAW;AAAA,IACtC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,eAAe;AAAA,IACjB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,mCAAmC,KAAK,EAAE;AAAA,EAC5D;AAEA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAMlC,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK,IAAI,IAAI,KAAK,aAAa,MAAO,IAAI,KAAK;AAAA,EAC1D;AACF;AAEO,MAAM,yBAAiD;AAAA,EAC5D,IAAI;AAAA,EACJ,MAAM;AAAA,EAEN,MAAM,MAAM,WAA2D;AACrE,WAAO;AAAA,MACL,SAAO,UAAU,OAAO,EAAE,IAAI,CAAC;AAAA,MAC/B,MAAM,UAAU,SAAS,EAAE,SAAS,gCAAgC,CAAC;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,aAA0D;AAC3E,WAAO,sBAAsB,YAAY,OAAO;AAAA,EAClD;AAAA,EAEA,UAAU,aAAuC;AAC/C,WAAO,YAAY;AAAA,EACrB;AACF;","names":[]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Copilot OAuth flow
|
|
3
|
+
*
|
|
4
|
+
* Inspired by:
|
|
5
|
+
* - pi-mono: https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/github-copilot.ts
|
|
6
|
+
* - opencode: https://github.com/anomalyco/opencode/blob/dev/packages/opencode/src/plugin/github-copilot/copilot.ts
|
|
7
|
+
*
|
|
8
|
+
* Storage layout in AuthStorage:
|
|
9
|
+
* - `refresh` holds the long-lived GitHub OAuth access token (used to mint Copilot tokens).
|
|
10
|
+
* - `access` holds the short-lived Copilot bearer token (~30 minutes).
|
|
11
|
+
* - `expires` is the Copilot bearer expiry (ms epoch, with a 5-minute safety buffer).
|
|
12
|
+
* - `enterpriseUrl` is the GitHub Enterprise hostname, or undefined for github.com.
|
|
13
|
+
*/
|
|
14
|
+
import type { OAuthCredentials, OAuthProviderInterface } from '../types.js';
|
|
15
|
+
export type GitHubCopilotCredentials = OAuthCredentials & {
|
|
16
|
+
enterpriseUrl?: string;
|
|
17
|
+
};
|
|
18
|
+
export declare const COPILOT_USER_AGENT = "GitHubCopilotChat/0.35.0";
|
|
19
|
+
/** Headers that Copilot endpoints expect from a VS Code-like client. */
|
|
20
|
+
export declare const COPILOT_HEADERS: {
|
|
21
|
+
readonly 'User-Agent': "GitHubCopilotChat/0.35.0";
|
|
22
|
+
readonly 'Editor-Version': "vscode/1.107.0";
|
|
23
|
+
readonly 'Editor-Plugin-Version': "copilot-chat/0.35.0";
|
|
24
|
+
readonly 'Copilot-Integration-Id': "vscode-chat";
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Normalize a user-entered Enterprise URL/domain into a hostname (e.g. `company.ghe.com`).
|
|
28
|
+
* Returns null for an empty input or an unparseable URL.
|
|
29
|
+
*/
|
|
30
|
+
export declare function normalizeDomain(input: string): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the Copilot API base URL.
|
|
33
|
+
* Prefers the `proxy-ep` parsed from the bearer token, then falls back to enterprise/individual defaults.
|
|
34
|
+
*/
|
|
35
|
+
export declare function getGitHubCopilotBaseUrl(token?: string, enterpriseDomain?: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Refresh the short-lived Copilot bearer token using the long-lived GitHub OAuth token.
|
|
38
|
+
*
|
|
39
|
+
* `refreshToken` here is the GitHub OAuth access token; the Copilot endpoint returns a
|
|
40
|
+
* fresh bearer token (`token`) and absolute expiry (`expires_at`, seconds since epoch).
|
|
41
|
+
*/
|
|
42
|
+
export declare function refreshGitHubCopilotToken(refreshToken: string, enterpriseDomain?: string, signal?: AbortSignal): Promise<GitHubCopilotCredentials>;
|
|
43
|
+
/**
|
|
44
|
+
* Login with GitHub Copilot OAuth (device-code flow).
|
|
45
|
+
*
|
|
46
|
+
* Prompts for an optional GitHub Enterprise URL/domain, performs the device-code flow,
|
|
47
|
+
* then exchanges the GitHub OAuth token for a Copilot bearer token.
|
|
48
|
+
*/
|
|
49
|
+
export declare function loginGitHubCopilot(options: {
|
|
50
|
+
onAuth: (url: string, instructions?: string) => void;
|
|
51
|
+
onPrompt: (prompt: {
|
|
52
|
+
message: string;
|
|
53
|
+
placeholder?: string;
|
|
54
|
+
allowEmpty?: boolean;
|
|
55
|
+
}) => Promise<string>;
|
|
56
|
+
onProgress?: (message: string) => void;
|
|
57
|
+
signal?: AbortSignal;
|
|
58
|
+
}): Promise<GitHubCopilotCredentials>;
|
|
59
|
+
/**
|
|
60
|
+
* Filtered, normalized entry from the Copilot `/models` API.
|
|
61
|
+
*
|
|
62
|
+
* The full API payload includes a lot of capability metadata; we only keep the bits
|
|
63
|
+
* we need to expose models in `listAvailableModels()` and route requests sensibly.
|
|
64
|
+
*/
|
|
65
|
+
export type CopilotModelEntry = {
|
|
66
|
+
/** Stable model id (e.g. `claude-sonnet-4.5`, `gpt-4.1`). */
|
|
67
|
+
id: string;
|
|
68
|
+
/** Human-readable display name (e.g. `Claude Sonnet 4.5`). */
|
|
69
|
+
name: string;
|
|
70
|
+
/** Vendor field from the API (e.g. `Anthropic`, `OpenAI`). */
|
|
71
|
+
vendor: string;
|
|
72
|
+
/**
|
|
73
|
+
* Endpoints the model exposes (e.g. `/chat/completions`, `/responses`, `/v1/messages`).
|
|
74
|
+
* Empty when the API didn't return `supported_endpoints` for this entry.
|
|
75
|
+
*/
|
|
76
|
+
supportedEndpoints: string[];
|
|
77
|
+
/** True when `supported_endpoints` includes `/v1/messages` (Anthropic-shaped Copilot model). */
|
|
78
|
+
isAnthropicShaped: boolean;
|
|
79
|
+
/** True when `capabilities.supports.vision` is true. */
|
|
80
|
+
supportsVision: boolean;
|
|
81
|
+
/** True when the model supports tool calling. */
|
|
82
|
+
supportsToolCalls: boolean;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Fetch the Copilot model list available to the current subscription.
|
|
86
|
+
*
|
|
87
|
+
* Hits `${baseURL}/models` with the Copilot bearer token, filters to
|
|
88
|
+
* `model_picker_enabled === true && policy.state !== 'disabled'`, and returns
|
|
89
|
+
* a normalized list. Mirrors opencode's filtering rules.
|
|
90
|
+
*
|
|
91
|
+
* Inspired by:
|
|
92
|
+
* - opencode: https://github.com/anomalyco/opencode/blob/dev/packages/opencode/src/plugin/github-copilot/models.ts
|
|
93
|
+
*/
|
|
94
|
+
export declare function fetchCopilotModels(opts: {
|
|
95
|
+
baseUrl: string;
|
|
96
|
+
bearerToken: string;
|
|
97
|
+
signal?: AbortSignal;
|
|
98
|
+
}): Promise<CopilotModelEntry[]>;
|
|
99
|
+
export declare const githubCopilotOAuthProvider: OAuthProviderInterface;
|
|
100
|
+
//# sourceMappingURL=github-copilot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-copilot.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/github-copilot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAuB,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEjG,MAAM,MAAM,wBAAwB,GAAG,gBAAgB,GAAG;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAMF,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAE7D,wEAAwE;AACxE,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAyBX;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS5D;AA0BD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAOzF;AA0JD;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,MAAM,EACzB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAsCnC;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvG,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA+BpC;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,6DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gGAAgG;IAChG,iBAAiB,EAAE,OAAO,CAAC;IAC3B,wDAAwD;IACxD,cAAc,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA8D/B;AAED,eAAO,MAAM,0BAA0B,EAAE,sBAqBxC,CAAC"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
const decode = (s) => atob(s);
|
|
2
|
+
const CLIENT_ID = decode("SXYxLmI1MDdhMDhjODdlY2ZlOTg=");
|
|
3
|
+
const COPILOT_USER_AGENT = "GitHubCopilotChat/0.35.0";
|
|
4
|
+
const COPILOT_HEADERS = {
|
|
5
|
+
"User-Agent": COPILOT_USER_AGENT,
|
|
6
|
+
"Editor-Version": "vscode/1.107.0",
|
|
7
|
+
"Editor-Plugin-Version": "copilot-chat/0.35.0",
|
|
8
|
+
"Copilot-Integration-Id": "vscode-chat"
|
|
9
|
+
};
|
|
10
|
+
const INITIAL_POLL_INTERVAL_MULTIPLIER = 1.2;
|
|
11
|
+
const SLOW_DOWN_POLL_INTERVAL_MULTIPLIER = 1.4;
|
|
12
|
+
function normalizeDomain(input) {
|
|
13
|
+
const trimmed = input.trim();
|
|
14
|
+
if (!trimmed) return null;
|
|
15
|
+
try {
|
|
16
|
+
const url = trimmed.includes("://") ? new URL(trimmed) : new URL(`https://${trimmed}`);
|
|
17
|
+
return url.hostname || null;
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function getUrls(domain) {
|
|
23
|
+
return {
|
|
24
|
+
deviceCodeUrl: `https://${domain}/login/device/code`,
|
|
25
|
+
accessTokenUrl: `https://${domain}/login/oauth/access_token`,
|
|
26
|
+
copilotTokenUrl: `https://api.${domain}/copilot_internal/v2/token`
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function getBaseUrlFromToken(token) {
|
|
30
|
+
const match = token.match(/proxy-ep=([^;]+)/);
|
|
31
|
+
if (!match) return null;
|
|
32
|
+
const proxyHost = match[1];
|
|
33
|
+
const apiHost = proxyHost.replace(/^proxy\./, "api.");
|
|
34
|
+
return `https://${apiHost}`;
|
|
35
|
+
}
|
|
36
|
+
function getGitHubCopilotBaseUrl(token, enterpriseDomain) {
|
|
37
|
+
if (token) {
|
|
38
|
+
const fromToken = getBaseUrlFromToken(token);
|
|
39
|
+
if (fromToken) return fromToken;
|
|
40
|
+
}
|
|
41
|
+
if (enterpriseDomain) return `https://copilot-api.${enterpriseDomain}`;
|
|
42
|
+
return "https://api.individual.githubcopilot.com";
|
|
43
|
+
}
|
|
44
|
+
async function fetchJson(url, init, signal) {
|
|
45
|
+
const response = await fetch(url, signal ? { ...init, signal } : init);
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const text = await response.text().catch(() => "");
|
|
48
|
+
throw new Error(`${response.status} ${response.statusText}: ${text}`);
|
|
49
|
+
}
|
|
50
|
+
return response.json();
|
|
51
|
+
}
|
|
52
|
+
async function startDeviceFlow(domain, signal) {
|
|
53
|
+
const urls = getUrls(domain);
|
|
54
|
+
const data = await fetchJson(
|
|
55
|
+
urls.deviceCodeUrl,
|
|
56
|
+
{
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: {
|
|
59
|
+
Accept: "application/json",
|
|
60
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
61
|
+
"User-Agent": COPILOT_USER_AGENT
|
|
62
|
+
},
|
|
63
|
+
body: new URLSearchParams({
|
|
64
|
+
client_id: CLIENT_ID,
|
|
65
|
+
scope: "read:user"
|
|
66
|
+
})
|
|
67
|
+
},
|
|
68
|
+
signal
|
|
69
|
+
);
|
|
70
|
+
if (!data || typeof data !== "object") {
|
|
71
|
+
throw new Error("Invalid device code response");
|
|
72
|
+
}
|
|
73
|
+
const obj = data;
|
|
74
|
+
const deviceCode = obj.device_code;
|
|
75
|
+
const userCode = obj.user_code;
|
|
76
|
+
const verificationUri = obj.verification_uri;
|
|
77
|
+
const interval = obj.interval;
|
|
78
|
+
const expiresIn = obj.expires_in;
|
|
79
|
+
if (typeof deviceCode !== "string" || typeof userCode !== "string" || typeof verificationUri !== "string" || typeof interval !== "number" || typeof expiresIn !== "number") {
|
|
80
|
+
throw new Error("Invalid device code response fields");
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
device_code: deviceCode,
|
|
84
|
+
user_code: userCode,
|
|
85
|
+
verification_uri: verificationUri,
|
|
86
|
+
interval,
|
|
87
|
+
expires_in: expiresIn
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function abortableSleep(ms, signal) {
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
if (signal?.aborted) {
|
|
93
|
+
reject(new Error("Login cancelled"));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
let timeout;
|
|
97
|
+
const onAbort = () => {
|
|
98
|
+
clearTimeout(timeout);
|
|
99
|
+
reject(new Error("Login cancelled"));
|
|
100
|
+
};
|
|
101
|
+
timeout = setTimeout(() => {
|
|
102
|
+
signal?.removeEventListener("abort", onAbort);
|
|
103
|
+
resolve();
|
|
104
|
+
}, ms);
|
|
105
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async function pollForGitHubAccessToken(domain, deviceCode, intervalSeconds, expiresIn, signal) {
|
|
109
|
+
const urls = getUrls(domain);
|
|
110
|
+
const deadline = Date.now() + expiresIn * 1e3;
|
|
111
|
+
let intervalMs = Math.max(1e3, Math.floor(intervalSeconds * 1e3));
|
|
112
|
+
let intervalMultiplier = INITIAL_POLL_INTERVAL_MULTIPLIER;
|
|
113
|
+
let slowDownResponses = 0;
|
|
114
|
+
while (Date.now() < deadline) {
|
|
115
|
+
if (signal?.aborted) {
|
|
116
|
+
throw new Error("Login cancelled");
|
|
117
|
+
}
|
|
118
|
+
const remainingMs = deadline - Date.now();
|
|
119
|
+
const waitMs = Math.min(Math.ceil(intervalMs * intervalMultiplier), remainingMs);
|
|
120
|
+
await abortableSleep(waitMs, signal);
|
|
121
|
+
const raw = await fetchJson(
|
|
122
|
+
urls.accessTokenUrl,
|
|
123
|
+
{
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: {
|
|
126
|
+
Accept: "application/json",
|
|
127
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
128
|
+
"User-Agent": COPILOT_USER_AGENT
|
|
129
|
+
},
|
|
130
|
+
body: new URLSearchParams({
|
|
131
|
+
client_id: CLIENT_ID,
|
|
132
|
+
device_code: deviceCode,
|
|
133
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code"
|
|
134
|
+
})
|
|
135
|
+
},
|
|
136
|
+
signal
|
|
137
|
+
);
|
|
138
|
+
if (raw && typeof raw === "object" && typeof raw.access_token === "string") {
|
|
139
|
+
return raw.access_token;
|
|
140
|
+
}
|
|
141
|
+
if (raw && typeof raw === "object" && typeof raw.error === "string") {
|
|
142
|
+
const { error, error_description: description, interval } = raw;
|
|
143
|
+
if (error === "authorization_pending") {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (error === "slow_down") {
|
|
147
|
+
slowDownResponses += 1;
|
|
148
|
+
intervalMs = typeof interval === "number" && interval > 0 ? interval * 1e3 : Math.max(1e3, intervalMs + 5e3);
|
|
149
|
+
intervalMultiplier = SLOW_DOWN_POLL_INTERVAL_MULTIPLIER;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const descriptionSuffix = description ? `: ${description}` : "";
|
|
153
|
+
throw new Error(`Device flow failed: ${error}${descriptionSuffix}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (slowDownResponses > 0) {
|
|
157
|
+
throw new Error(
|
|
158
|
+
"Device flow timed out after one or more slow_down responses. This is often caused by clock drift in WSL or VM environments. Please sync or restart the VM clock and try again."
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
throw new Error("Device flow timed out");
|
|
162
|
+
}
|
|
163
|
+
async function refreshGitHubCopilotToken(refreshToken, enterpriseDomain, signal) {
|
|
164
|
+
const domain = enterpriseDomain || "github.com";
|
|
165
|
+
const urls = getUrls(domain);
|
|
166
|
+
const raw = await fetchJson(
|
|
167
|
+
urls.copilotTokenUrl,
|
|
168
|
+
{
|
|
169
|
+
headers: {
|
|
170
|
+
Accept: "application/json",
|
|
171
|
+
Authorization: `Bearer ${refreshToken}`,
|
|
172
|
+
...COPILOT_HEADERS
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
signal
|
|
176
|
+
);
|
|
177
|
+
if (!raw || typeof raw !== "object") {
|
|
178
|
+
throw new Error("Invalid Copilot token response");
|
|
179
|
+
}
|
|
180
|
+
const obj = raw;
|
|
181
|
+
const token = obj.token;
|
|
182
|
+
const expiresAt = obj.expires_at;
|
|
183
|
+
if (typeof token !== "string" || typeof expiresAt !== "number") {
|
|
184
|
+
throw new Error("Invalid Copilot token response fields");
|
|
185
|
+
}
|
|
186
|
+
const credentials = {
|
|
187
|
+
refresh: refreshToken,
|
|
188
|
+
access: token,
|
|
189
|
+
// expires_at is seconds; subtract 5 minutes so we refresh before actual expiry.
|
|
190
|
+
expires: expiresAt * 1e3 - 5 * 60 * 1e3
|
|
191
|
+
};
|
|
192
|
+
if (enterpriseDomain) {
|
|
193
|
+
credentials.enterpriseUrl = enterpriseDomain;
|
|
194
|
+
}
|
|
195
|
+
return credentials;
|
|
196
|
+
}
|
|
197
|
+
async function loginGitHubCopilot(options) {
|
|
198
|
+
const input = await options.onPrompt({
|
|
199
|
+
message: "GitHub Enterprise URL/domain (blank for github.com)",
|
|
200
|
+
placeholder: "company.ghe.com",
|
|
201
|
+
allowEmpty: true
|
|
202
|
+
});
|
|
203
|
+
if (options.signal?.aborted) {
|
|
204
|
+
throw new Error("Login cancelled");
|
|
205
|
+
}
|
|
206
|
+
const trimmed = input.trim();
|
|
207
|
+
const enterpriseDomain = normalizeDomain(input);
|
|
208
|
+
if (trimmed && !enterpriseDomain) {
|
|
209
|
+
throw new Error("Invalid GitHub Enterprise URL/domain");
|
|
210
|
+
}
|
|
211
|
+
const domain = enterpriseDomain || "github.com";
|
|
212
|
+
const device = await startDeviceFlow(domain, options.signal);
|
|
213
|
+
options.onAuth(device.verification_uri, `Enter code: ${device.user_code}`);
|
|
214
|
+
const githubAccessToken = await pollForGitHubAccessToken(
|
|
215
|
+
domain,
|
|
216
|
+
device.device_code,
|
|
217
|
+
device.interval,
|
|
218
|
+
device.expires_in,
|
|
219
|
+
options.signal
|
|
220
|
+
);
|
|
221
|
+
options.onProgress?.("Fetching Copilot token...");
|
|
222
|
+
return refreshGitHubCopilotToken(githubAccessToken, enterpriseDomain ?? void 0, options.signal);
|
|
223
|
+
}
|
|
224
|
+
async function fetchCopilotModels(opts) {
|
|
225
|
+
const url = `${opts.baseUrl.replace(/\/$/, "")}/models`;
|
|
226
|
+
const response = await fetch(url, {
|
|
227
|
+
headers: {
|
|
228
|
+
Accept: "application/json",
|
|
229
|
+
Authorization: `Bearer ${opts.bearerToken}`,
|
|
230
|
+
...COPILOT_HEADERS
|
|
231
|
+
},
|
|
232
|
+
signal: opts.signal
|
|
233
|
+
});
|
|
234
|
+
if (!response.ok) {
|
|
235
|
+
const text = await response.text().catch(() => "");
|
|
236
|
+
throw new Error(`Failed to fetch Copilot models: ${response.status} ${response.statusText}: ${text}`);
|
|
237
|
+
}
|
|
238
|
+
const json = await response.json().catch(() => null);
|
|
239
|
+
if (!json || typeof json !== "object" || !Array.isArray(json.data)) {
|
|
240
|
+
throw new Error("Invalid Copilot models response: missing `data` array");
|
|
241
|
+
}
|
|
242
|
+
const data = json.data;
|
|
243
|
+
const result = [];
|
|
244
|
+
for (const item of data) {
|
|
245
|
+
if (!item || typeof item !== "object") continue;
|
|
246
|
+
const obj = item;
|
|
247
|
+
if (obj.model_picker_enabled !== true) continue;
|
|
248
|
+
const policy = obj.policy;
|
|
249
|
+
if (policy && policy.state === "disabled") continue;
|
|
250
|
+
const id = obj.id;
|
|
251
|
+
if (typeof id !== "string" || !id) continue;
|
|
252
|
+
const name = typeof obj.name === "string" ? obj.name : id;
|
|
253
|
+
const vendor = typeof obj.vendor === "string" ? obj.vendor : "";
|
|
254
|
+
const capabilities = obj.capabilities;
|
|
255
|
+
const supports = capabilities?.supports;
|
|
256
|
+
const supportsVision = supports?.vision === true;
|
|
257
|
+
const supportsToolCalls = supports?.tool_calls === true;
|
|
258
|
+
const rawEndpoints = obj.supported_endpoints;
|
|
259
|
+
const supportedEndpoints = Array.isArray(rawEndpoints) ? rawEndpoints.filter((e) => typeof e === "string") : [];
|
|
260
|
+
const isAnthropicShaped = supportedEndpoints.includes("/v1/messages");
|
|
261
|
+
result.push({
|
|
262
|
+
id,
|
|
263
|
+
name,
|
|
264
|
+
vendor,
|
|
265
|
+
supportedEndpoints,
|
|
266
|
+
isAnthropicShaped,
|
|
267
|
+
supportsVision,
|
|
268
|
+
supportsToolCalls
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
const githubCopilotOAuthProvider = {
|
|
274
|
+
id: "github-copilot",
|
|
275
|
+
name: "GitHub Copilot",
|
|
276
|
+
async login(callbacks) {
|
|
277
|
+
return loginGitHubCopilot({
|
|
278
|
+
onAuth: (url, instructions) => callbacks.onAuth({ url, instructions }),
|
|
279
|
+
onPrompt: callbacks.onPrompt,
|
|
280
|
+
onProgress: callbacks.onProgress,
|
|
281
|
+
signal: callbacks.signal
|
|
282
|
+
});
|
|
283
|
+
},
|
|
284
|
+
async refreshToken(credentials) {
|
|
285
|
+
const creds = credentials;
|
|
286
|
+
return refreshGitHubCopilotToken(creds.refresh, creds.enterpriseUrl);
|
|
287
|
+
},
|
|
288
|
+
getApiKey(credentials) {
|
|
289
|
+
return credentials.access;
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
export {
|
|
293
|
+
COPILOT_HEADERS,
|
|
294
|
+
COPILOT_USER_AGENT,
|
|
295
|
+
fetchCopilotModels,
|
|
296
|
+
getGitHubCopilotBaseUrl,
|
|
297
|
+
githubCopilotOAuthProvider,
|
|
298
|
+
loginGitHubCopilot,
|
|
299
|
+
normalizeDomain,
|
|
300
|
+
refreshGitHubCopilotToken
|
|
301
|
+
};
|
|
302
|
+
//# sourceMappingURL=github-copilot.js.map
|