@mastra/code-sdk 0.0.0-client-tool-results-20260912062135
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/LICENSE.md +32 -0
- package/README.md +37 -0
- package/dist/acp/agent.d.ts +35 -0
- package/dist/acp/agent.d.ts.map +1 -0
- package/dist/acp/agent.js +161 -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 +214 -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 +65 -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 +35 -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 +2 -0
- package/dist/agents/context-audit.d.ts +84 -0
- package/dist/agents/context-audit.d.ts.map +1 -0
- package/dist/agents/context-audit.js +118 -0
- package/dist/agents/context-audit.js.map +1 -0
- package/dist/agents/credential-resolver.d.ts +63 -0
- package/dist/agents/credential-resolver.d.ts.map +1 -0
- package/dist/agents/credential-resolver.js +97 -0
- package/dist/agents/credential-resolver.js.map +1 -0
- package/dist/agents/custom-provider-source.d.ts +35 -0
- package/dist/agents/custom-provider-source.d.ts.map +1 -0
- package/dist/agents/custom-provider-source.js +25 -0
- package/dist/agents/custom-provider-source.js.map +1 -0
- package/dist/agents/instructions.d.ts +29 -0
- package/dist/agents/instructions.d.ts.map +1 -0
- package/dist/agents/instructions.js +58 -0
- package/dist/agents/instructions.js.map +1 -0
- package/dist/agents/mastracode-gateway.d.ts +74 -0
- package/dist/agents/mastracode-gateway.d.ts.map +1 -0
- package/dist/agents/mastracode-gateway.js +431 -0
- package/dist/agents/mastracode-gateway.js.map +1 -0
- package/dist/agents/memory.d.ts +30 -0
- package/dist/agents/memory.d.ts.map +1 -0
- package/dist/agents/memory.js +171 -0
- package/dist/agents/memory.js.map +1 -0
- package/dist/agents/model.d.ts +81 -0
- package/dist/agents/model.d.ts.map +1 -0
- package/dist/agents/model.js +155 -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 +49 -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 +42 -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 +42 -0
- package/dist/agents/modes/plan.js.map +1 -0
- package/dist/agents/prompts/agent-instructions.d.ts +70 -0
- package/dist/agents/prompts/agent-instructions.d.ts.map +1 -0
- package/dist/agents/prompts/agent-instructions.js +211 -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 +76 -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 +26 -0
- package/dist/agents/prompts/fast.js.map +1 -0
- package/dist/agents/prompts/index.d.ts +50 -0
- package/dist/agents/prompts/index.d.ts.map +1 -0
- package/dist/agents/prompts/index.js +119 -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 +23 -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 +111 -0
- package/dist/agents/prompts/plan.js.map +1 -0
- package/dist/agents/prompts/tool-guidance.d.ts +18 -0
- package/dist/agents/prompts/tool-guidance.d.ts.map +1 -0
- package/dist/agents/prompts/tool-guidance.js +180 -0
- package/dist/agents/prompts/tool-guidance.js.map +1 -0
- package/dist/agents/sandbox-filesystem.d.ts +117 -0
- package/dist/agents/sandbox-filesystem.d.ts.map +1 -0
- package/dist/agents/sandbox-filesystem.js +356 -0
- package/dist/agents/sandbox-filesystem.js.map +1 -0
- package/dist/agents/subagents/execute.d.ts +3 -0
- package/dist/agents/subagents/execute.d.ts.map +1 -0
- package/dist/agents/subagents/execute.js +27 -0
- package/dist/agents/subagents/execute.js.map +1 -0
- package/dist/agents/subagents/explore.d.ts +3 -0
- package/dist/agents/subagents/explore.d.ts.map +1 -0
- package/dist/agents/subagents/explore.js +18 -0
- package/dist/agents/subagents/explore.js.map +1 -0
- package/dist/agents/subagents/plan.d.ts +3 -0
- package/dist/agents/subagents/plan.d.ts.map +1 -0
- package/dist/agents/subagents/plan.js +18 -0
- package/dist/agents/subagents/plan.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 +107 -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 +96 -0
- package/dist/agents/tool-availability.js.map +1 -0
- package/dist/agents/tools.d.ts +36 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +117 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/agents/workflow-builder-agent.d.ts +2 -0
- package/dist/agents/workflow-builder-agent.d.ts.map +1 -0
- package/dist/agents/workflow-builder-agent.js +80 -0
- package/dist/agents/workflow-builder-agent.js.map +1 -0
- package/dist/agents/workspace.d.ts +32 -0
- package/dist/agents/workspace.d.ts.map +1 -0
- package/dist/agents/workspace.js +208 -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 +163 -0
- package/dist/analytics.js.map +1 -0
- package/dist/auth/authorization-input.d.ts +16 -0
- package/dist/auth/authorization-input.d.ts.map +1 -0
- package/dist/auth/authorization-input.js +42 -0
- package/dist/auth/authorization-input.js.map +1 -0
- package/dist/auth/device-code.d.ts +93 -0
- package/dist/auth/device-code.d.ts.map +1 -0
- package/dist/auth/device-code.js +129 -0
- package/dist/auth/device-code.js.map +1 -0
- package/dist/auth/index.d.ts +12 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/pkce.d.ts +13 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +32 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/provider-auth-error.d.ts +12 -0
- package/dist/auth/provider-auth-error.d.ts.map +1 -0
- package/dist/auth/provider-auth-error.js +16 -0
- package/dist/auth/provider-auth-error.js.map +1 -0
- package/dist/auth/providers/anthropic.d.ts +40 -0
- package/dist/auth/providers/anthropic.d.ts.map +1 -0
- package/dist/auth/providers/anthropic.js +126 -0
- package/dist/auth/providers/anthropic.js.map +1 -0
- package/dist/auth/providers/github-copilot.d.ts +154 -0
- package/dist/auth/providers/github-copilot.d.ts.map +1 -0
- package/dist/auth/providers/github-copilot.js +340 -0
- package/dist/auth/providers/github-copilot.js.map +1 -0
- package/dist/auth/providers/kimi-coding.d.ts +38 -0
- package/dist/auth/providers/kimi-coding.d.ts.map +1 -0
- package/dist/auth/providers/kimi-coding.js +232 -0
- package/dist/auth/providers/kimi-coding.js.map +1 -0
- package/dist/auth/providers/openai-codex.d.ts +139 -0
- package/dist/auth/providers/openai-codex.d.ts.map +1 -0
- package/dist/auth/providers/openai-codex.js +519 -0
- package/dist/auth/providers/openai-codex.js.map +1 -0
- package/dist/auth/providers/xai.d.ts +64 -0
- package/dist/auth/providers/xai.d.ts.map +1 -0
- package/dist/auth/providers/xai.js +205 -0
- package/dist/auth/providers/xai.js.map +1 -0
- package/dist/auth/storage.d.ts +92 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +211 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/auth/types.d.ts +89 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +1 -0
- package/dist/clipboard/index.d.ts +26 -0
- package/dist/clipboard/index.d.ts.map +1 -0
- package/dist/clipboard/index.js +226 -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 +18 -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 +22 -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 +161 -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 +5 -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 +73 -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 +259 -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 +60 -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 +3 -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 +347 -0
- package/dist/evals/scorers/outcome.js.map +1 -0
- package/dist/goal-manager.d.ts +78 -0
- package/dist/goal-manager.d.ts.map +1 -0
- package/dist/goal-manager.js +273 -0
- package/dist/goal-manager.js.map +1 -0
- package/dist/goal-signal.d.ts +14 -0
- package/dist/goal-signal.d.ts.map +1 -0
- package/dist/goal-signal.js +17 -0
- package/dist/goal-signal.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 +209 -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 +190 -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 +89 -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 +6 -0
- package/dist/headless/policy.d.ts +17 -0
- package/dist/headless/policy.d.ts.map +1 -0
- package/dist/headless/policy.js +42 -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 +346 -0
- package/dist/headless/run-mc.js.map +1 -0
- package/dist/headless/types.d.ts +158 -0
- package/dist/headless/types.d.ts.map +1 -0
- package/dist/headless/types.js +19 -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 +73 -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 +129 -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 +5 -0
- package/dist/hooks/manager.d.ts +54 -0
- package/dist/hooks/manager.d.ts.map +1 -0
- package/dist/hooks/manager.js +241 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/types.d.ts +172 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +8 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +341 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +919 -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 +21 -0
- package/dist/ipc/ipc-reporter.js.map +1 -0
- package/dist/knowledge-inspector.d.ts +119 -0
- package/dist/knowledge-inspector.d.ts.map +1 -0
- package/dist/knowledge-inspector.js +508 -0
- package/dist/knowledge-inspector.js.map +1 -0
- package/dist/knowledge-scope.d.ts +35 -0
- package/dist/knowledge-scope.d.ts.map +1 -0
- package/dist/knowledge-scope.js +47 -0
- package/dist/knowledge-scope.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 +251 -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 +4 -0
- package/dist/lsp/language.d.ts +9 -0
- package/dist/lsp/language.d.ts.map +1 -0
- package/dist/lsp/language.js +44 -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 +82 -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 +159 -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 +55 -0
- package/dist/lsp/workspace.js.map +1 -0
- package/dist/mcp/config.d.ts +62 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +301 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/manager.d.ts +101 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +644 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/state.d.ts +35 -0
- package/dist/mcp/state.d.ts.map +1 -0
- package/dist/mcp/state.js +97 -0
- package/dist/mcp/state.js.map +1 -0
- package/dist/mcp/types.d.ts +125 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +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 +17 -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 +30 -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 +3 -0
- package/dist/onboarding/om-settings.d.ts +25 -0
- package/dist/onboarding/om-settings.d.ts.map +1 -0
- package/dist/onboarding/om-settings.js +47 -0
- package/dist/onboarding/om-settings.js.map +1 -0
- package/dist/onboarding/packs.d.ts +49 -0
- package/dist/onboarding/packs.d.ts.map +1 -0
- package/dist/onboarding/packs.js +182 -0
- package/dist/onboarding/packs.js.map +1 -0
- package/dist/onboarding/settings.d.ts +438 -0
- package/dist/onboarding/settings.d.ts.map +1 -0
- package/dist/onboarding/settings.js +847 -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 +137 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plugin.d.ts +144 -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 +88 -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 +190 -0
- package/dist/plugins/install.js.map +1 -0
- package/dist/plugins/loader.d.ts +19 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +258 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manager.d.ts +98 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +456 -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 +50 -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 +61 -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 +25 -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 +112 -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 +116 -0
- package/dist/plugins/scaffold.js.map +1 -0
- package/dist/plugins/signal-lane.d.ts +58 -0
- package/dist/plugins/signal-lane.d.ts.map +1 -0
- package/dist/plugins/signal-lane.js +166 -0
- package/dist/plugins/signal-lane.js.map +1 -0
- package/dist/plugins/types.d.ts +81 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +1 -0
- package/dist/process-memory-diagnostics.d.ts +135 -0
- package/dist/process-memory-diagnostics.d.ts.map +1 -0
- package/dist/process-memory-diagnostics.js +500 -0
- package/dist/process-memory-diagnostics.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 +54 -0
- package/dist/processors/plan-rejection-abort.js.map +1 -0
- package/dist/providers/amazon-bedrock-gateway.d.ts +47 -0
- package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -0
- package/dist/providers/amazon-bedrock-gateway.js +153 -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 +102 -0
- package/dist/providers/amazon-bedrock.js.map +1 -0
- package/dist/providers/claude-max.d.ts +65 -0
- package/dist/providers/claude-max.d.ts.map +1 -0
- package/dist/providers/claude-max.js +252 -0
- package/dist/providers/claude-max.js.map +1 -0
- package/dist/providers/github-copilot.d.ts +60 -0
- package/dist/providers/github-copilot.d.ts.map +1 -0
- package/dist/providers/github-copilot.js +266 -0
- package/dist/providers/github-copilot.js.map +1 -0
- package/dist/providers/kimi-coding.d.ts +15 -0
- package/dist/providers/kimi-coding.d.ts.map +1 -0
- package/dist/providers/kimi-coding.js +69 -0
- package/dist/providers/kimi-coding.js.map +1 -0
- package/dist/providers/openai-codex.d.ts +73 -0
- package/dist/providers/openai-codex.d.ts.map +1 -0
- package/dist/providers/openai-codex.js +306 -0
- package/dist/providers/openai-codex.js.map +1 -0
- package/dist/providers/xai.d.ts +33 -0
- package/dist/providers/xai.d.ts.map +1 -0
- package/dist/providers/xai.js +71 -0
- package/dist/providers/xai.js.map +1 -0
- package/dist/schema.d.ts +200 -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 +21 -0
- package/dist/theme-palette.js.map +1 -0
- package/dist/thinking.d.ts +33 -0
- package/dist/thinking.d.ts.map +1 -0
- package/dist/thinking.js +58 -0
- package/dist/thinking.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 +52 -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 +3 -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 +79 -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 +32 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/web-search.d.ts +114 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +155 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/workflows/create-workflow.d.ts +7 -0
- package/dist/tools/workflows/create-workflow.d.ts.map +1 -0
- package/dist/tools/workflows/create-workflow.js +81 -0
- package/dist/tools/workflows/create-workflow.js.map +1 -0
- package/dist/tools/workflows/delete-workflow.d.ts +7 -0
- package/dist/tools/workflows/delete-workflow.d.ts.map +1 -0
- package/dist/tools/workflows/delete-workflow.js +21 -0
- package/dist/tools/workflows/delete-workflow.js.map +1 -0
- package/dist/tools/workflows/ephemeral-memory.d.ts +7 -0
- package/dist/tools/workflows/ephemeral-memory.d.ts.map +1 -0
- package/dist/tools/workflows/ephemeral-memory.js +45 -0
- package/dist/tools/workflows/ephemeral-memory.js.map +1 -0
- package/dist/tools/workflows/extract-json-schema.d.ts +12 -0
- package/dist/tools/workflows/extract-json-schema.d.ts.map +1 -0
- package/dist/tools/workflows/extract-json-schema.js +22 -0
- package/dist/tools/workflows/extract-json-schema.js.map +1 -0
- package/dist/tools/workflows/get-workflow.d.ts +11 -0
- package/dist/tools/workflows/get-workflow.d.ts.map +1 -0
- package/dist/tools/workflows/get-workflow.js +34 -0
- package/dist/tools/workflows/get-workflow.js.map +1 -0
- package/dist/tools/workflows/list-available-agents.d.ts +8 -0
- package/dist/tools/workflows/list-available-agents.d.ts.map +1 -0
- package/dist/tools/workflows/list-available-agents.js +32 -0
- package/dist/tools/workflows/list-available-agents.js.map +1 -0
- package/dist/tools/workflows/list-available-tools.d.ts +9 -0
- package/dist/tools/workflows/list-available-tools.d.ts.map +1 -0
- package/dist/tools/workflows/list-available-tools.js +40 -0
- package/dist/tools/workflows/list-available-tools.js.map +1 -0
- package/dist/tools/workflows/list-available-workflows.d.ts +9 -0
- package/dist/tools/workflows/list-available-workflows.d.ts.map +1 -0
- package/dist/tools/workflows/list-available-workflows.js +32 -0
- package/dist/tools/workflows/list-available-workflows.js.map +1 -0
- package/dist/tools/workflows/list-workflows.d.ts +9 -0
- package/dist/tools/workflows/list-workflows.d.ts.map +1 -0
- package/dist/tools/workflows/list-workflows.js +33 -0
- package/dist/tools/workflows/list-workflows.js.map +1 -0
- package/dist/tools/workflows/run-workflow.d.ts +9 -0
- package/dist/tools/workflows/run-workflow.d.ts.map +1 -0
- package/dist/tools/workflows/run-workflow.js +52 -0
- package/dist/tools/workflows/run-workflow.js.map +1 -0
- package/dist/tools/workflows/save-workflow.d.ts +1015 -0
- package/dist/tools/workflows/save-workflow.d.ts.map +1 -0
- package/dist/tools/workflows/save-workflow.js +28 -0
- package/dist/tools/workflows/save-workflow.js.map +1 -0
- package/dist/tools/workflows/tool-ids.d.ts +15 -0
- package/dist/tools/workflows/tool-ids.d.ts.map +1 -0
- package/dist/tools/workflows/tool-ids.js +19 -0
- package/dist/tools/workflows/tool-ids.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 +78 -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 +59 -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 +196 -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 +61 -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 +10 -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 +62 -0
- package/dist/utils/plan-diff.js.map +1 -0
- package/dist/utils/plans.d.ts +59 -0
- package/dist/utils/plans.d.ts.map +1 -0
- package/dist/utils/plans.js +117 -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 +364 -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 +122 -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 +142 -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 +109 -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 +96 -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 +121 -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 +274 -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 +112 -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 +101 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/dist/utils/update-check.js +383 -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 +144 -0
- package/dist/voice/stt-registry.js.map +1 -0
- package/dist/workflows/register-primitives.d.ts +52 -0
- package/dist/workflows/register-primitives.d.ts.map +1 -0
- package/dist/workflows/register-primitives.js +40 -0
- package/dist/workflows/register-primitives.js.map +1 -0
- package/dist/workflows/service.d.ts +64 -0
- package/dist/workflows/service.d.ts.map +1 -0
- package/dist/workflows/service.js +53 -0
- package/dist/workflows/service.js.map +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ToolsInput } from '@mastra/core/agent';
|
|
2
|
+
import type { Mastra } from '@mastra/core/mastra';
|
|
3
|
+
import type { RequestContext } from '@mastra/core/request-context';
|
|
4
|
+
import { Workspace, LocalFilesystem, LocalSandbox } from '@mastra/core/workspace';
|
|
5
|
+
import type { SkillSource } from '@mastra/core/workspace';
|
|
6
|
+
export declare function buildSkillPaths(projectPath: string, configDir: string, homeDir?: string, pluginSkillPaths?: string[]): string[];
|
|
7
|
+
export interface WorkspaceSkillExtension {
|
|
8
|
+
/** Distinguishes extended workspaces from the default resolver cache. */
|
|
9
|
+
id: string;
|
|
10
|
+
/** Additional read-only skill roots prepended to normal project/global skill roots. */
|
|
11
|
+
paths: string[];
|
|
12
|
+
/** Compose the additional roots with the workspace's normal skill source. */
|
|
13
|
+
createSource: (fallback: SkillSource, fallbackSkillRoots: string[]) => SkillSource;
|
|
14
|
+
}
|
|
15
|
+
export declare function getDynamicWorkspace({ requestContext, mastra, skillExtension, }: {
|
|
16
|
+
requestContext: RequestContext;
|
|
17
|
+
mastra?: Mastra;
|
|
18
|
+
skillExtension?: WorkspaceSkillExtension;
|
|
19
|
+
}): Promise<Workspace<LocalFilesystem, LocalSandbox, undefined>>;
|
|
20
|
+
/**
|
|
21
|
+
* Resolver for the agent's `goal.tools` config. Builds the request's workspace
|
|
22
|
+
* (same per-request resolution as the agent's own tools) and returns only the
|
|
23
|
+
* read-only verification subset, remapped to mastracode's tool names (`view`,
|
|
24
|
+
* `search_content`, etc.). Returns `undefined` when no workspace can be resolved
|
|
25
|
+
* (e.g. no project path), keeping the default judge text-only rather than
|
|
26
|
+
* throwing inside the goal step.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getGoalJudgeTools({ requestContext, mastra, }: {
|
|
29
|
+
requestContext: RequestContext;
|
|
30
|
+
mastra?: Mastra;
|
|
31
|
+
}): Promise<ToolsInput | undefined>;
|
|
32
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/agents/workspace.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAwB,MAAM,wBAAwB,CAAC;AACxG,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAyGrE,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,SAAe,EACtB,gBAAgB,GAAE,MAAM,EAAO,GAC9B,MAAM,EAAE,CA0BV;AAED,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,uFAAuF;IACvF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6EAA6E;IAC7E,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,WAAW,CAAC;CACpF;AA2BD,wBAAsB,mBAAmB,CAAC,EACxC,cAAc,EACd,MAAM,EACN,cAAc,GACf,EAAE;IACD,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC1C,gEA0EA;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,cAAc,EACd,MAAM,GACP,EAAE;IACD,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAclC"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import "../constants.js";
|
|
2
|
+
import { loadSettings, resolveLspSetting } from "../onboarding/settings.js";
|
|
3
|
+
import { getPlansDir } from "../utils/plans.js";
|
|
4
|
+
import { isPathWithinRoot } from "../utils/path-security.js";
|
|
5
|
+
import { GOAL_JUDGE_READONLY_TOOLS, MASTRACODE_WORKSPACE_TOOLS } from "./tool-availability.js";
|
|
6
|
+
import fs, { existsSync } from "fs";
|
|
7
|
+
import os from "os";
|
|
8
|
+
import path, { dirname, join } from "path";
|
|
9
|
+
import { fileURLToPath } from "url";
|
|
10
|
+
import { LocalFilesystem, LocalSandbox, Workspace, createWorkspaceTools } from "@mastra/core/workspace";
|
|
11
|
+
//#region src/agents/workspace.ts
|
|
12
|
+
function buildSandboxEnv() {
|
|
13
|
+
return {
|
|
14
|
+
...process.env,
|
|
15
|
+
FORCE_COLOR: "1",
|
|
16
|
+
CLICOLOR_FORCE: "1",
|
|
17
|
+
TERM: process.env.TERM || "xterm-256color",
|
|
18
|
+
CI: "true",
|
|
19
|
+
NONINTERACTIVE: "1",
|
|
20
|
+
DEBIAN_FRONTEND: "noninteractive"
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function collectSkillPaths(skillsDirs, allowedRoot) {
|
|
24
|
+
const paths = [];
|
|
25
|
+
const seen = /* @__PURE__ */ new Set();
|
|
26
|
+
let realAllowedRoot;
|
|
27
|
+
if (allowedRoot) try {
|
|
28
|
+
realAllowedRoot = fs.realpathSync(allowedRoot);
|
|
29
|
+
} catch {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
for (const skillsDir of skillsDirs) {
|
|
33
|
+
const skillsDirExists = fs.existsSync(skillsDir);
|
|
34
|
+
if (skillsDirExists && realAllowedRoot) try {
|
|
35
|
+
if (!isPathWithinRoot(fs.realpathSync(skillsDir), realAllowedRoot)) continue;
|
|
36
|
+
} catch {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const resolved = path.resolve(skillsDir);
|
|
40
|
+
if (!seen.has(resolved)) {
|
|
41
|
+
seen.add(resolved);
|
|
42
|
+
paths.push(skillsDir);
|
|
43
|
+
}
|
|
44
|
+
if (!skillsDirExists) continue;
|
|
45
|
+
try {
|
|
46
|
+
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
47
|
+
for (const entry of entries) if (entry.isSymbolicLink()) try {
|
|
48
|
+
const linkPath = path.join(skillsDir, entry.name);
|
|
49
|
+
const realPath = fs.realpathSync(linkPath);
|
|
50
|
+
if (realAllowedRoot && !isPathWithinRoot(realPath, realAllowedRoot)) continue;
|
|
51
|
+
if (fs.statSync(realPath).isDirectory()) {
|
|
52
|
+
const realParent = path.dirname(realPath);
|
|
53
|
+
if (realAllowedRoot && !isPathWithinRoot(realParent, realAllowedRoot)) continue;
|
|
54
|
+
if (!seen.has(realParent)) {
|
|
55
|
+
seen.add(realParent);
|
|
56
|
+
paths.push(realParent);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
} catch {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
} catch {}
|
|
63
|
+
}
|
|
64
|
+
return paths;
|
|
65
|
+
}
|
|
66
|
+
function buildSkillPaths(projectPath, configDir, homeDir = os.homedir(), pluginSkillPaths = []) {
|
|
67
|
+
const mastraCodeLocalSkillsPath = path.join(projectPath, configDir, "skills");
|
|
68
|
+
const claudeLocalSkillsPath = path.join(projectPath, ".claude", "skills");
|
|
69
|
+
const agentSkillsLocalPath = path.join(projectPath, ".agents", "skills");
|
|
70
|
+
const mastraCodeGlobalSkillsPath = path.join(homeDir, configDir, "skills");
|
|
71
|
+
const claudeGlobalSkillsPath = path.join(homeDir, ".claude", "skills");
|
|
72
|
+
const agentSkillsGlobalPath = path.join(homeDir, ".agents", "skills");
|
|
73
|
+
const paths = [
|
|
74
|
+
...collectSkillPaths([
|
|
75
|
+
mastraCodeLocalSkillsPath,
|
|
76
|
+
claudeLocalSkillsPath,
|
|
77
|
+
agentSkillsLocalPath
|
|
78
|
+
], projectPath),
|
|
79
|
+
...collectSkillPaths([
|
|
80
|
+
mastraCodeGlobalSkillsPath,
|
|
81
|
+
claudeGlobalSkillsPath,
|
|
82
|
+
agentSkillsGlobalPath
|
|
83
|
+
]),
|
|
84
|
+
...pluginSkillPaths.flatMap((pluginSkillPath) => collectSkillPaths([pluginSkillPath], pluginSkillPath))
|
|
85
|
+
];
|
|
86
|
+
const seenPaths = /* @__PURE__ */ new Set();
|
|
87
|
+
return paths.filter((skillPath) => {
|
|
88
|
+
let resolved;
|
|
89
|
+
try {
|
|
90
|
+
resolved = fs.realpathSync(skillPath);
|
|
91
|
+
} catch {
|
|
92
|
+
resolved = path.resolve(skillPath);
|
|
93
|
+
}
|
|
94
|
+
if (seenPaths.has(resolved)) return false;
|
|
95
|
+
seenPaths.add(resolved);
|
|
96
|
+
return true;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Paths the agent is always allowed to access (in addition to the project root
|
|
101
|
+
* and any per-thread sandboxAllowedPaths). The OS temp directory is included
|
|
102
|
+
* so the agent can use it as a scratchpad without requesting access every time.
|
|
103
|
+
*/
|
|
104
|
+
const DEFAULT_ALLOWED_PATHS = [
|
|
105
|
+
os.tmpdir(),
|
|
106
|
+
"/tmp",
|
|
107
|
+
getPlansDir()
|
|
108
|
+
].reduce((acc, p) => {
|
|
109
|
+
const resolved = path.resolve(p);
|
|
110
|
+
if (!acc.includes(resolved)) acc.push(resolved);
|
|
111
|
+
return acc;
|
|
112
|
+
}, []);
|
|
113
|
+
const WORKSPACE_ID_PREFIX = "mastra-code-workspace";
|
|
114
|
+
/**
|
|
115
|
+
* Detect the project's package runner from lock files.
|
|
116
|
+
* Used as a fallback packageRunner for LSP when no binary is found locally or on PATH.
|
|
117
|
+
*/
|
|
118
|
+
function detectPackageRunner(projectPath) {
|
|
119
|
+
if (existsSync(join(projectPath, "pnpm-lock.yaml"))) return "pnpm dlx";
|
|
120
|
+
if (existsSync(join(projectPath, "bun.lockb")) || existsSync(join(projectPath, "bun.lock"))) return "bunx";
|
|
121
|
+
if (existsSync(join(projectPath, "yarn.lock"))) return "yarn dlx";
|
|
122
|
+
if (existsSync(join(projectPath, "package-lock.json"))) return "npx --yes";
|
|
123
|
+
return "npx --yes";
|
|
124
|
+
}
|
|
125
|
+
async function getDynamicWorkspace({ requestContext, mastra, skillExtension }) {
|
|
126
|
+
const state = requestContext.get("controller")?.getState();
|
|
127
|
+
const rawProjectPath = state?.projectPath;
|
|
128
|
+
if (!rawProjectPath) throw new Error("Project path is required");
|
|
129
|
+
const projectPath = path.resolve(rawProjectPath);
|
|
130
|
+
const projectSkillPaths = buildSkillPaths(projectPath, state?.configDir ?? ".mastracode", state?.homeDir, state?.pluginSkillPaths ?? []);
|
|
131
|
+
const skillPaths = [...skillExtension?.paths ?? [], ...projectSkillPaths];
|
|
132
|
+
const extensionId = skillExtension ? `-${skillExtension.id}` : "";
|
|
133
|
+
const workspaceId = `${WORKSPACE_ID_PREFIX}-${projectPath}${extensionId}`;
|
|
134
|
+
const sandboxPaths = state?.sandboxAllowedPaths ?? [];
|
|
135
|
+
const allowedPaths = [
|
|
136
|
+
...projectSkillPaths,
|
|
137
|
+
...DEFAULT_ALLOWED_PATHS,
|
|
138
|
+
...sandboxPaths.map((p) => path.resolve(p))
|
|
139
|
+
];
|
|
140
|
+
const workspaceTools = MASTRACODE_WORKSPACE_TOOLS;
|
|
141
|
+
let existing;
|
|
142
|
+
try {
|
|
143
|
+
existing = mastra?.getWorkspaceById(workspaceId);
|
|
144
|
+
} catch {}
|
|
145
|
+
if (existing) {
|
|
146
|
+
existing.filesystem.setAllowedPaths(allowedPaths);
|
|
147
|
+
existing.setToolsConfig(workspaceTools);
|
|
148
|
+
return existing;
|
|
149
|
+
}
|
|
150
|
+
const userLsp = resolveLspSetting(loadSettings().lsp);
|
|
151
|
+
let lspConfig = false;
|
|
152
|
+
if (userLsp !== false) {
|
|
153
|
+
const mcModulePath = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
154
|
+
lspConfig = {
|
|
155
|
+
maxOpenClients: 4,
|
|
156
|
+
...userLsp,
|
|
157
|
+
packageRunner: userLsp.packageRunner || detectPackageRunner(projectPath),
|
|
158
|
+
searchPaths: [mcModulePath, ...userLsp.searchPaths ?? []]
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const filesystem = new LocalFilesystem({
|
|
162
|
+
basePath: projectPath,
|
|
163
|
+
allowedPaths
|
|
164
|
+
});
|
|
165
|
+
return new Workspace({
|
|
166
|
+
id: workspaceId,
|
|
167
|
+
name: "Mastra Code Workspace",
|
|
168
|
+
filesystem,
|
|
169
|
+
sandbox: new LocalSandbox({
|
|
170
|
+
workingDirectory: projectPath,
|
|
171
|
+
env: buildSandboxEnv()
|
|
172
|
+
}),
|
|
173
|
+
tools: workspaceTools,
|
|
174
|
+
skills: skillPaths,
|
|
175
|
+
...skillExtension ? { skillSource: skillExtension.createSource(filesystem, projectSkillPaths) } : {},
|
|
176
|
+
lsp: lspConfig
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Resolver for the agent's `goal.tools` config. Builds the request's workspace
|
|
181
|
+
* (same per-request resolution as the agent's own tools) and returns only the
|
|
182
|
+
* read-only verification subset, remapped to mastracode's tool names (`view`,
|
|
183
|
+
* `search_content`, etc.). Returns `undefined` when no workspace can be resolved
|
|
184
|
+
* (e.g. no project path), keeping the default judge text-only rather than
|
|
185
|
+
* throwing inside the goal step.
|
|
186
|
+
*/
|
|
187
|
+
async function getGoalJudgeTools({ requestContext, mastra }) {
|
|
188
|
+
let workspace;
|
|
189
|
+
try {
|
|
190
|
+
workspace = await getDynamicWorkspace({
|
|
191
|
+
requestContext,
|
|
192
|
+
mastra
|
|
193
|
+
});
|
|
194
|
+
} catch {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const allTools = await createWorkspaceTools(workspace, {
|
|
198
|
+
requestContext,
|
|
199
|
+
workspace
|
|
200
|
+
});
|
|
201
|
+
const readonly = {};
|
|
202
|
+
for (const name of GOAL_JUDGE_READONLY_TOOLS) if (allTools[name]) readonly[name] = allTools[name];
|
|
203
|
+
return Object.keys(readonly).length > 0 ? readonly : void 0;
|
|
204
|
+
}
|
|
205
|
+
//#endregion
|
|
206
|
+
export { buildSkillPaths, getDynamicWorkspace, getGoalJudgeTools };
|
|
207
|
+
|
|
208
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","names":[],"sources":["../../src/agents/workspace.ts"],"sourcesContent":["import fs, { existsSync } from 'node:fs';\nimport os from 'node:os';\nimport path, { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { Workspace, LocalFilesystem, LocalSandbox, createWorkspaceTools } from '@mastra/core/workspace';\nimport type { LSPConfig, SkillSource } from '@mastra/core/workspace';\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport { loadSettings, resolveLspSetting } from '../onboarding/settings.js';\nimport type { MastraCodeState } from '../schema.js';\nimport { isPathWithinRoot } from '../utils/path-security.js';\nimport { getPlansDir } from '../utils/plans.js';\n\nimport { GOAL_JUDGE_READONLY_TOOLS, MASTRACODE_WORKSPACE_TOOLS } from './tool-availability.js';\n\n// =============================================================================\n// Sandbox Environment\n// =============================================================================\n\nfunction buildSandboxEnv(): NodeJS.ProcessEnv {\n return {\n ...process.env,\n // Explicit overrides for non-interactive subprocess execution\n FORCE_COLOR: '1',\n CLICOLOR_FORCE: '1',\n TERM: process.env.TERM || 'xterm-256color',\n CI: 'true',\n NONINTERACTIVE: '1',\n DEBIAN_FRONTEND: 'noninteractive',\n };\n}\n\n// =============================================================================\n// Create Workspace with Skills\n// =============================================================================\n\n// We support multiple skill locations for compatibility:\n// 1. Project-local: <configDir>/skills (project-specific mastracode skills)\n// 2. Project-local: .claude/skills (Claude Code compatible skills)\n// 3. Project-local: .agents/skills (Agent Skills spec compatible)\n// 4. Global: ~/<configDir>/skills (user-wide mastracode skills)\n// 5. Global: ~/.claude/skills (user-wide Claude Code skills)\n// 6. Global: ~/.agents/skills (user-wide Agent Skills spec compatible)\n\n// Mastra's LocalSkillSource.readdir uses Node's Dirent.isDirectory() which\n// returns false for symlinks. Tools like `npx skills add` install skills as\n// symlinks, so we need to resolve them. For each symlinked skill directory,\n// we add the real (resolved) parent path as an additional skill scan path.\nfunction collectSkillPaths(skillsDirs: string[], allowedRoot?: string): string[] {\n const paths: string[] = [];\n const seen = new Set<string>();\n let realAllowedRoot: string | undefined;\n\n if (allowedRoot) {\n try {\n realAllowedRoot = fs.realpathSync(allowedRoot);\n } catch {\n return [];\n }\n }\n\n for (const skillsDir of skillsDirs) {\n const skillsDirExists = fs.existsSync(skillsDir);\n if (skillsDirExists && realAllowedRoot) {\n try {\n const realSkillsDir = fs.realpathSync(skillsDir);\n if (!isPathWithinRoot(realSkillsDir, realAllowedRoot)) continue;\n } catch {\n continue;\n }\n }\n\n const resolved = path.resolve(skillsDir);\n if (!seen.has(resolved)) {\n seen.add(resolved);\n paths.push(skillsDir);\n }\n\n if (!skillsDirExists) continue;\n\n try {\n const entries = fs.readdirSync(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isSymbolicLink()) {\n try {\n const linkPath = path.join(skillsDir, entry.name);\n const realPath = fs.realpathSync(linkPath);\n if (realAllowedRoot && !isPathWithinRoot(realPath, realAllowedRoot)) continue;\n const stat = fs.statSync(realPath);\n if (stat.isDirectory()) {\n const realParent = path.dirname(realPath);\n if (realAllowedRoot && !isPathWithinRoot(realParent, realAllowedRoot)) continue;\n if (!seen.has(realParent)) {\n seen.add(realParent);\n paths.push(realParent);\n }\n }\n } catch {\n continue;\n }\n }\n }\n } catch {\n // Ignore errors during symlink resolution\n }\n }\n\n return paths;\n}\n\n// Build skill paths dynamically based on configDir and projectPath\nexport function buildSkillPaths(\n projectPath: string,\n configDir: string,\n homeDir = os.homedir(),\n pluginSkillPaths: string[] = [],\n): string[] {\n const mastraCodeLocalSkillsPath = path.join(projectPath, configDir, 'skills');\n const claudeLocalSkillsPath = path.join(projectPath, '.claude', 'skills');\n const agentSkillsLocalPath = path.join(projectPath, '.agents', 'skills');\n const mastraCodeGlobalSkillsPath = path.join(homeDir, configDir, 'skills');\n const claudeGlobalSkillsPath = path.join(homeDir, '.claude', 'skills');\n const agentSkillsGlobalPath = path.join(homeDir, '.agents', 'skills');\n\n const paths = [\n ...collectSkillPaths([mastraCodeLocalSkillsPath, claudeLocalSkillsPath, agentSkillsLocalPath], projectPath),\n ...collectSkillPaths([mastraCodeGlobalSkillsPath, claudeGlobalSkillsPath, agentSkillsGlobalPath]),\n ...pluginSkillPaths.flatMap(pluginSkillPath => collectSkillPaths([pluginSkillPath], pluginSkillPath)),\n ];\n\n const seenPaths = new Set<string>();\n return paths.filter(skillPath => {\n let resolved: string;\n try {\n resolved = fs.realpathSync(skillPath);\n } catch {\n resolved = path.resolve(skillPath);\n }\n if (seenPaths.has(resolved)) return false;\n seenPaths.add(resolved);\n return true;\n });\n}\n\nexport interface WorkspaceSkillExtension {\n /** Distinguishes extended workspaces from the default resolver cache. */\n id: string;\n /** Additional read-only skill roots prepended to normal project/global skill roots. */\n paths: string[];\n /** Compose the additional roots with the workspace's normal skill source. */\n createSource: (fallback: SkillSource, fallbackSkillRoots: string[]) => SkillSource;\n}\n\n/**\n * Paths the agent is always allowed to access (in addition to the project root\n * and any per-thread sandboxAllowedPaths). The OS temp directory is included\n * so the agent can use it as a scratchpad without requesting access every time.\n */\nconst DEFAULT_ALLOWED_PATHS: string[] = [os.tmpdir(), '/tmp', getPlansDir()].reduce<string[]>((acc, p) => {\n const resolved = path.resolve(p);\n if (!acc.includes(resolved)) acc.push(resolved);\n return acc;\n}, []);\n\nconst WORKSPACE_ID_PREFIX = 'mastra-code-workspace';\n\n/**\n * Detect the project's package runner from lock files.\n * Used as a fallback packageRunner for LSP when no binary is found locally or on PATH.\n */\nfunction detectPackageRunner(projectPath: string): string | undefined {\n if (existsSync(join(projectPath, 'pnpm-lock.yaml'))) return 'pnpm dlx';\n if (existsSync(join(projectPath, 'bun.lockb')) || existsSync(join(projectPath, 'bun.lock'))) return 'bunx';\n if (existsSync(join(projectPath, 'yarn.lock'))) return 'yarn dlx';\n if (existsSync(join(projectPath, 'package-lock.json'))) return 'npx --yes';\n return 'npx --yes';\n}\n\nexport async function getDynamicWorkspace({\n requestContext,\n mastra,\n skillExtension,\n}: {\n requestContext: RequestContext;\n mastra?: Mastra;\n skillExtension?: WorkspaceSkillExtension;\n}) {\n const ctx = requestContext.get('controller') as AgentControllerRequestContext<MastraCodeState> | undefined;\n const state = ctx?.getState();\n\n const rawProjectPath = state?.projectPath;\n\n if (!rawProjectPath) {\n throw new Error('Project path is required');\n }\n\n const projectPath = path.resolve(rawProjectPath);\n const configDir = state?.configDir ?? DEFAULT_CONFIG_DIR;\n const projectSkillPaths = buildSkillPaths(projectPath, configDir, state?.homeDir, state?.pluginSkillPaths ?? []);\n const skillPaths = [...(skillExtension?.paths ?? []), ...projectSkillPaths];\n const extensionId = skillExtension ? `-${skillExtension.id}` : '';\n const workspaceId = `${WORKSPACE_ID_PREFIX}-${projectPath}${extensionId}`;\n const sandboxPaths = state?.sandboxAllowedPaths ?? [];\n const allowedPaths = [\n ...projectSkillPaths,\n ...DEFAULT_ALLOWED_PATHS,\n ...sandboxPaths.map((p: string) => path.resolve(p)),\n ];\n\n // All modes share the same workspace tool configuration. Per-mode tool\n // visibility is enforced at LLM-call time via `availableTools` /\n // `activeTools` on the AgentController, not by mutating workspace capabilities.\n const workspaceTools = MASTRACODE_WORKSPACE_TOOLS;\n\n // Reuse existing workspace if already registered (preserves ProcessManager state)\n let existing: Workspace<LocalFilesystem, LocalSandbox> | undefined;\n try {\n existing = mastra?.getWorkspaceById(workspaceId) as Workspace<LocalFilesystem, LocalSandbox>;\n } catch {\n // Not registered yet\n }\n\n if (existing) {\n existing.filesystem.setAllowedPaths(allowedPaths);\n existing.setToolsConfig(workspaceTools);\n return existing;\n }\n\n // LSP is opt-in. When disabled we pass `false` so core skips the dependency\n // check, the LSP manager, and the `lsp_inspect` tool entirely.\n const userLsp = resolveLspSetting(loadSettings().lsp);\n let lspConfig: LSPConfig | false = false;\n if (userLsp !== false) {\n const mcModulePath = join(dirname(fileURLToPath(import.meta.url)), '..');\n lspConfig = {\n maxOpenClients: 4,\n ...userLsp,\n packageRunner: userLsp.packageRunner || detectPackageRunner(projectPath), // Detected runner is the fallback — user's packageRunner always wins\n searchPaths: [mcModulePath, ...(userLsp.searchPaths ?? [])],\n };\n }\n\n // First call for this project — create the workspace\n const filesystem = new LocalFilesystem({\n basePath: projectPath,\n allowedPaths,\n });\n return new Workspace({\n id: workspaceId,\n name: 'Mastra Code Workspace',\n filesystem,\n sandbox: new LocalSandbox({\n workingDirectory: projectPath,\n env: buildSandboxEnv(),\n }),\n tools: workspaceTools,\n skills: skillPaths,\n ...(skillExtension ? { skillSource: skillExtension.createSource(filesystem, projectSkillPaths) } : {}),\n lsp: lspConfig,\n });\n}\n\n/**\n * Resolver for the agent's `goal.tools` config. Builds the request's workspace\n * (same per-request resolution as the agent's own tools) and returns only the\n * read-only verification subset, remapped to mastracode's tool names (`view`,\n * `search_content`, etc.). Returns `undefined` when no workspace can be resolved\n * (e.g. no project path), keeping the default judge text-only rather than\n * throwing inside the goal step.\n */\nexport async function getGoalJudgeTools({\n requestContext,\n mastra,\n}: {\n requestContext: RequestContext;\n mastra?: Mastra;\n}): Promise<ToolsInput | undefined> {\n let workspace: Workspace;\n try {\n workspace = await getDynamicWorkspace({ requestContext, mastra });\n } catch {\n return undefined;\n }\n\n const allTools = await createWorkspaceTools(workspace, { requestContext, workspace });\n const readonly: ToolsInput = {};\n for (const name of GOAL_JUDGE_READONLY_TOOLS) {\n if (allTools[name]) readonly[name] = allTools[name];\n }\n return Object.keys(readonly).length > 0 ? readonly : undefined;\n}\n"],"mappings":";;;;;;;;;;;AAsBA,SAAS,kBAAqC;CAC5C,OAAO;EACL,GAAG,QAAQ;EAEX,aAAa;EACb,gBAAgB;EAChB,MAAM,QAAQ,IAAI,QAAQ;EAC1B,IAAI;EACJ,gBAAgB;EAChB,iBAAiB;CACnB;AACF;AAkBA,SAAS,kBAAkB,YAAsB,aAAgC;CAC/E,MAAM,QAAkB,CAAC;CACzB,MAAM,uBAAO,IAAI,IAAY;CAC7B,IAAI;CAEJ,IAAI,aACF,IAAI;EACF,kBAAkB,GAAG,aAAa,WAAW;CAC/C,QAAQ;EACN,OAAO,CAAC;CACV;CAGF,KAAK,MAAM,aAAa,YAAY;EAClC,MAAM,kBAAkB,GAAG,WAAW,SAAS;EAC/C,IAAI,mBAAmB,iBACrB,IAAI;GAEF,IAAI,CAAC,iBADiB,GAAG,aAAa,SACJ,GAAG,eAAe,GAAG;EACzD,QAAQ;GACN;EACF;EAGF,MAAM,WAAW,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAK,IAAI,QAAQ,GAAG;GACvB,KAAK,IAAI,QAAQ;GACjB,MAAM,KAAK,SAAS;EACtB;EAEA,IAAI,CAAC,iBAAiB;EAEtB,IAAI;GACF,MAAM,UAAU,GAAG,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC;GACjE,KAAK,MAAM,SAAS,SAClB,IAAI,MAAM,eAAe,GACvB,IAAI;IACF,MAAM,WAAW,KAAK,KAAK,WAAW,MAAM,IAAI;IAChD,MAAM,WAAW,GAAG,aAAa,QAAQ;IACzC,IAAI,mBAAmB,CAAC,iBAAiB,UAAU,eAAe,GAAG;IAErE,IADa,GAAG,SAAS,QAClB,CAAC,CAAC,YAAY,GAAG;KACtB,MAAM,aAAa,KAAK,QAAQ,QAAQ;KACxC,IAAI,mBAAmB,CAAC,iBAAiB,YAAY,eAAe,GAAG;KACvE,IAAI,CAAC,KAAK,IAAI,UAAU,GAAG;MACzB,KAAK,IAAI,UAAU;MACnB,MAAM,KAAK,UAAU;KACvB;IACF;GACF,QAAQ;IACN;GACF;EAGN,QAAQ,CAER;CACF;CAEA,OAAO;AACT;AAGA,SAAgB,gBACd,aACA,WACA,UAAU,GAAG,QAAQ,GACrB,mBAA6B,CAAC,GACpB;CACV,MAAM,4BAA4B,KAAK,KAAK,aAAa,WAAW,QAAQ;CAC5E,MAAM,wBAAwB,KAAK,KAAK,aAAa,WAAW,QAAQ;CACxE,MAAM,uBAAuB,KAAK,KAAK,aAAa,WAAW,QAAQ;CACvE,MAAM,6BAA6B,KAAK,KAAK,SAAS,WAAW,QAAQ;CACzE,MAAM,yBAAyB,KAAK,KAAK,SAAS,WAAW,QAAQ;CACrE,MAAM,wBAAwB,KAAK,KAAK,SAAS,WAAW,QAAQ;CAEpE,MAAM,QAAQ;EACZ,GAAG,kBAAkB;GAAC;GAA2B;GAAuB;EAAoB,GAAG,WAAW;EAC1G,GAAG,kBAAkB;GAAC;GAA4B;GAAwB;EAAqB,CAAC;EAChG,GAAG,iBAAiB,SAAQ,oBAAmB,kBAAkB,CAAC,eAAe,GAAG,eAAe,CAAC;CACtG;CAEA,MAAM,4BAAY,IAAI,IAAY;CAClC,OAAO,MAAM,QAAO,cAAa;EAC/B,IAAI;EACJ,IAAI;GACF,WAAW,GAAG,aAAa,SAAS;EACtC,QAAQ;GACN,WAAW,KAAK,QAAQ,SAAS;EACnC;EACA,IAAI,UAAU,IAAI,QAAQ,GAAG,OAAO;EACpC,UAAU,IAAI,QAAQ;EACtB,OAAO;CACT,CAAC;AACH;;;;;;AAgBA,MAAM,wBAAkC;CAAC,GAAG,OAAO;CAAG;CAAQ,YAAY;AAAC,CAAC,CAAC,QAAkB,KAAK,MAAM;CACxG,MAAM,WAAW,KAAK,QAAQ,CAAC;CAC/B,IAAI,CAAC,IAAI,SAAS,QAAQ,GAAG,IAAI,KAAK,QAAQ;CAC9C,OAAO;AACT,GAAG,CAAC,CAAC;AAEL,MAAM,sBAAsB;;;;;AAM5B,SAAS,oBAAoB,aAAyC;CACpE,IAAI,WAAW,KAAK,aAAa,gBAAgB,CAAC,GAAG,OAAO;CAC5D,IAAI,WAAW,KAAK,aAAa,WAAW,CAAC,KAAK,WAAW,KAAK,aAAa,UAAU,CAAC,GAAG,OAAO;CACpG,IAAI,WAAW,KAAK,aAAa,WAAW,CAAC,GAAG,OAAO;CACvD,IAAI,WAAW,KAAK,aAAa,mBAAmB,CAAC,GAAG,OAAO;CAC/D,OAAO;AACT;AAEA,eAAsB,oBAAoB,EACxC,gBACA,QACA,kBAKC;CAED,MAAM,QADM,eAAe,IAAI,YACf,CAAC,EAAE,SAAS;CAE5B,MAAM,iBAAiB,OAAO;CAE9B,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,0BAA0B;CAG5C,MAAM,cAAc,KAAK,QAAQ,cAAc;CAE/C,MAAM,oBAAoB,gBAAgB,aADxB,OAAO,aAAA,eACyC,OAAO,SAAS,OAAO,oBAAoB,CAAC,CAAC;CAC/G,MAAM,aAAa,CAAC,GAAI,gBAAgB,SAAS,CAAC,GAAI,GAAG,iBAAiB;CAC1E,MAAM,cAAc,iBAAiB,IAAI,eAAe,OAAO;CAC/D,MAAM,cAAc,GAAG,oBAAoB,GAAG,cAAc;CAC5D,MAAM,eAAe,OAAO,uBAAuB,CAAC;CACpD,MAAM,eAAe;EACnB,GAAG;EACH,GAAG;EACH,GAAG,aAAa,KAAK,MAAc,KAAK,QAAQ,CAAC,CAAC;CACpD;CAKA,MAAM,iBAAiB;CAGvB,IAAI;CACJ,IAAI;EACF,WAAW,QAAQ,iBAAiB,WAAW;CACjD,QAAQ,CAER;CAEA,IAAI,UAAU;EACZ,SAAS,WAAW,gBAAgB,YAAY;EAChD,SAAS,eAAe,cAAc;EACtC,OAAO;CACT;CAIA,MAAM,UAAU,kBAAkB,aAAa,CAAC,CAAC,GAAG;CACpD,IAAI,YAA+B;CACnC,IAAI,YAAY,OAAO;EACrB,MAAM,eAAe,KAAK,QAAQ,cAAc,OAAO,KAAK,GAAG,CAAC,GAAG,IAAI;EACvE,YAAY;GACV,gBAAgB;GAChB,GAAG;GACH,eAAe,QAAQ,iBAAiB,oBAAoB,WAAW;GACvE,aAAa,CAAC,cAAc,GAAI,QAAQ,eAAe,CAAC,CAAE;EAC5D;CACF;CAGA,MAAM,aAAa,IAAI,gBAAgB;EACrC,UAAU;EACV;CACF,CAAC;CACD,OAAO,IAAI,UAAU;EACnB,IAAI;EACJ,MAAM;EACN;EACA,SAAS,IAAI,aAAa;GACxB,kBAAkB;GAClB,KAAK,gBAAgB;EACvB,CAAC;EACD,OAAO;EACP,QAAQ;EACR,GAAI,iBAAiB,EAAE,aAAa,eAAe,aAAa,YAAY,iBAAiB,EAAE,IAAI,CAAC;EACpG,KAAK;CACP,CAAC;AACH;;;;;;;;;AAUA,eAAsB,kBAAkB,EACtC,gBACA,UAIkC;CAClC,IAAI;CACJ,IAAI;EACF,YAAY,MAAM,oBAAoB;GAAE;GAAgB;EAAO,CAAC;CAClE,QAAQ;EACN;CACF;CAEA,MAAM,WAAW,MAAM,qBAAqB,WAAW;EAAE;EAAgB;CAAU,CAAC;CACpF,MAAM,WAAuB,CAAC;CAC9B,KAAK,MAAM,QAAQ,2BACjB,IAAI,SAAS,OAAO,SAAS,QAAQ,SAAS;CAEhD,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,SAAS,IAAI,WAAW,KAAA;AACvD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function getMastraAnalyticsDistinctId(configPath?: string): string;
|
|
2
|
+
export type MastraCodeAnalyticsEvent = 'mastracode_session_started' | 'mastracode_prompt_submitted' | 'mastracode_thread_changed' | 'mastracode_model_changed' | 'mastracode_command_used' | 'mastracode_interactive_prompt_shown';
|
|
3
|
+
export interface MastraCodeAnalytics {
|
|
4
|
+
capture(event: MastraCodeAnalyticsEvent, properties?: Record<string, unknown>): void;
|
|
5
|
+
trackCommand(command: string, properties?: Record<string, unknown>): void;
|
|
6
|
+
trackInteractivePrompt(promptType: string, properties?: Record<string, unknown>): void;
|
|
7
|
+
shutdown(): Promise<void>;
|
|
8
|
+
isEnabled(): boolean;
|
|
9
|
+
}
|
|
10
|
+
interface MastraCodeAnalyticsOptions {
|
|
11
|
+
version: string;
|
|
12
|
+
host?: string;
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function isTelemetryDisabled(env?: NodeJS.ProcessEnv): boolean;
|
|
16
|
+
export declare function createMastraCodeAnalytics(options: MastraCodeAnalyticsOptions): MastraCodeAnalytics;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAsCA,wBAAgB,4BAA4B,CAAC,UAAU,SAAwB,GAAG,MAAM,CAmBvF;AAeD,MAAM,MAAM,wBAAwB,GAChC,4BAA4B,GAC5B,6BAA6B,GAC7B,2BAA2B,GAC3B,0BAA0B,GAC1B,yBAAyB,GACzB,qCAAqC,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,KAAK,EAAE,wBAAwB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrF,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1E,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACvF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC;CACtB;AAED,UAAU,0BAA0B;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA8FD,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAOjF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,mBAAmB,CAOlG"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { randomUUID } from "crypto";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
3
|
+
import os from "os";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { PostHog } from "posthog-node";
|
|
6
|
+
//#region src/analytics.ts
|
|
7
|
+
const POSTHOG_API_KEY = "phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT";
|
|
8
|
+
const POSTHOG_HOST = "https://us.posthog.com";
|
|
9
|
+
const MASTRA_SOURCE = "mastracode";
|
|
10
|
+
const TRUTHY_DISABLED_VALUES = /* @__PURE__ */ new Set([
|
|
11
|
+
"1",
|
|
12
|
+
"true",
|
|
13
|
+
"yes",
|
|
14
|
+
"on"
|
|
15
|
+
]);
|
|
16
|
+
const ANALYTICS_CONFIG_PATH = path.join(os.homedir(), ".mastracode", "analytics.json");
|
|
17
|
+
function createMastraAnalyticsDistinctId() {
|
|
18
|
+
return `mastra-${randomUUID()}`;
|
|
19
|
+
}
|
|
20
|
+
function isHostnameDerivedDistinctId(distinctId, hostname = os.hostname()) {
|
|
21
|
+
return distinctId === `mastra-${hostname}`;
|
|
22
|
+
}
|
|
23
|
+
function isValidMastraAnalyticsDistinctId(distinctId) {
|
|
24
|
+
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);
|
|
25
|
+
}
|
|
26
|
+
function writeAnalyticsConfig(distinctId, configPath = ANALYTICS_CONFIG_PATH) {
|
|
27
|
+
try {
|
|
28
|
+
mkdirSync(path.dirname(configPath), { recursive: true });
|
|
29
|
+
writeFileSync(configPath, JSON.stringify({ distinctId }));
|
|
30
|
+
} catch {}
|
|
31
|
+
}
|
|
32
|
+
function getMastraAnalyticsDistinctId(configPath = ANALYTICS_CONFIG_PATH) {
|
|
33
|
+
try {
|
|
34
|
+
if (existsSync(configPath)) {
|
|
35
|
+
const config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
36
|
+
if (config.distinctId && isValidMastraAnalyticsDistinctId(config.distinctId) && !isHostnameDerivedDistinctId(config.distinctId)) return config.distinctId;
|
|
37
|
+
}
|
|
38
|
+
} catch {}
|
|
39
|
+
const distinctId = createMastraAnalyticsDistinctId();
|
|
40
|
+
writeAnalyticsConfig(distinctId, configPath);
|
|
41
|
+
return distinctId;
|
|
42
|
+
}
|
|
43
|
+
function isAnalyticsDebugEnabled() {
|
|
44
|
+
return TRUTHY_DISABLED_VALUES.has(process.env.MASTRACODE_ANALYTICS_DEBUG?.trim().toLowerCase() ?? "");
|
|
45
|
+
}
|
|
46
|
+
function debugAnalytics(message, properties) {
|
|
47
|
+
if (!isAnalyticsDebugEnabled()) return;
|
|
48
|
+
const suffix = properties ? ` ${JSON.stringify(properties)}` : "";
|
|
49
|
+
process.stderr.write(`[mastracode analytics] ${message}${suffix}\n`);
|
|
50
|
+
}
|
|
51
|
+
var NoopMastraCodeAnalytics = class {
|
|
52
|
+
capture(event) {
|
|
53
|
+
debugAnalytics("capture skipped: telemetry disabled", { event });
|
|
54
|
+
}
|
|
55
|
+
trackCommand(command) {
|
|
56
|
+
debugAnalytics("command skipped: telemetry disabled", { command });
|
|
57
|
+
}
|
|
58
|
+
trackInteractivePrompt(promptType) {
|
|
59
|
+
debugAnalytics("interactive prompt skipped: telemetry disabled", { promptType });
|
|
60
|
+
}
|
|
61
|
+
async shutdown() {
|
|
62
|
+
debugAnalytics("shutdown skipped: telemetry disabled");
|
|
63
|
+
}
|
|
64
|
+
isEnabled() {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
var PostHogMastraCodeAnalytics = class {
|
|
69
|
+
client;
|
|
70
|
+
distinctId;
|
|
71
|
+
sessionId = randomUUID();
|
|
72
|
+
version;
|
|
73
|
+
constructor({ version, apiKey = POSTHOG_API_KEY, host = POSTHOG_HOST }) {
|
|
74
|
+
this.version = version;
|
|
75
|
+
this.distinctId = getMastraAnalyticsDistinctId();
|
|
76
|
+
this.client = new PostHog(apiKey, {
|
|
77
|
+
host,
|
|
78
|
+
flushAt: 1,
|
|
79
|
+
flushInterval: 0,
|
|
80
|
+
disableGeoip: false
|
|
81
|
+
});
|
|
82
|
+
this.client.register({ mastraSource: MASTRA_SOURCE });
|
|
83
|
+
debugAnalytics("enabled", {
|
|
84
|
+
host,
|
|
85
|
+
distinctId: this.distinctId,
|
|
86
|
+
version
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
capture(event, properties) {
|
|
90
|
+
try {
|
|
91
|
+
const eventProperties = {
|
|
92
|
+
...this.getBaseProperties(),
|
|
93
|
+
...properties
|
|
94
|
+
};
|
|
95
|
+
debugAnalytics("capture", {
|
|
96
|
+
event,
|
|
97
|
+
properties: eventProperties
|
|
98
|
+
});
|
|
99
|
+
this.client.capture({
|
|
100
|
+
distinctId: this.distinctId,
|
|
101
|
+
event,
|
|
102
|
+
properties: eventProperties
|
|
103
|
+
});
|
|
104
|
+
} catch (error) {
|
|
105
|
+
debugAnalytics("capture failed", {
|
|
106
|
+
event,
|
|
107
|
+
error: error instanceof Error ? error.message : String(error)
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
trackCommand(command, properties) {
|
|
112
|
+
this.capture("mastracode_command_used", {
|
|
113
|
+
command,
|
|
114
|
+
...properties
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
trackInteractivePrompt(promptType, properties) {
|
|
118
|
+
this.capture("mastracode_interactive_prompt_shown", {
|
|
119
|
+
promptType,
|
|
120
|
+
...properties
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async shutdown() {
|
|
124
|
+
try {
|
|
125
|
+
debugAnalytics("shutdown start");
|
|
126
|
+
await this.client.shutdown();
|
|
127
|
+
debugAnalytics("shutdown complete");
|
|
128
|
+
} catch (error) {
|
|
129
|
+
debugAnalytics("shutdown failed", { error: error instanceof Error ? error.message : String(error) });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
isEnabled() {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
getBaseProperties() {
|
|
136
|
+
return {
|
|
137
|
+
mastraSource: MASTRA_SOURCE,
|
|
138
|
+
sessionId: this.sessionId,
|
|
139
|
+
version: this.version,
|
|
140
|
+
os: process.platform,
|
|
141
|
+
osVersion: os.release(),
|
|
142
|
+
nodeVersion: process.version,
|
|
143
|
+
platform: process.arch,
|
|
144
|
+
machineId: os.hostname()
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
function isTelemetryDisabled(env = process.env) {
|
|
149
|
+
const value = env.MASTRA_TELEMETRY_DISABLED;
|
|
150
|
+
if (!value) return false;
|
|
151
|
+
return TRUTHY_DISABLED_VALUES.has(value.trim().toLowerCase());
|
|
152
|
+
}
|
|
153
|
+
function createMastraCodeAnalytics(options) {
|
|
154
|
+
if (isTelemetryDisabled()) {
|
|
155
|
+
debugAnalytics("disabled by MASTRA_TELEMETRY_DISABLED", { value: process.env.MASTRA_TELEMETRY_DISABLED });
|
|
156
|
+
return new NoopMastraCodeAnalytics();
|
|
157
|
+
}
|
|
158
|
+
return new PostHogMastraCodeAnalytics(options);
|
|
159
|
+
}
|
|
160
|
+
//#endregion
|
|
161
|
+
export { createMastraCodeAnalytics, getMastraAnalyticsDistinctId, isTelemetryDisabled };
|
|
162
|
+
|
|
163
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","names":[],"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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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forgiving parser for user-pasted OAuth authorization input.
|
|
3
|
+
*
|
|
4
|
+
* Accepts, in order of preference:
|
|
5
|
+
* - a full redirect URL (`https://.../callback?code=...&state=...`)
|
|
6
|
+
* - the `code#state` form shown on Anthropic's hosted callback page
|
|
7
|
+
* - a raw query string (`code=...&state=...`)
|
|
8
|
+
* - a bare authorization code
|
|
9
|
+
*
|
|
10
|
+
* Ported from pi-mono's `parseAuthorizationInput`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseAuthorizationInput(input: string): {
|
|
13
|
+
code?: string;
|
|
14
|
+
state?: string;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=authorization-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization-input.d.ts","sourceRoot":"","sources":["../../src/auth/authorization-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CA4BA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//#region src/auth/authorization-input.ts
|
|
2
|
+
/**
|
|
3
|
+
* Forgiving parser for user-pasted OAuth authorization input.
|
|
4
|
+
*
|
|
5
|
+
* Accepts, in order of preference:
|
|
6
|
+
* - a full redirect URL (`https://.../callback?code=...&state=...`)
|
|
7
|
+
* - the `code#state` form shown on Anthropic's hosted callback page
|
|
8
|
+
* - a raw query string (`code=...&state=...`)
|
|
9
|
+
* - a bare authorization code
|
|
10
|
+
*
|
|
11
|
+
* Ported from pi-mono's `parseAuthorizationInput`.
|
|
12
|
+
*/
|
|
13
|
+
function parseAuthorizationInput(input) {
|
|
14
|
+
const value = input.trim();
|
|
15
|
+
if (!value) return {};
|
|
16
|
+
try {
|
|
17
|
+
const url = new URL(value);
|
|
18
|
+
return {
|
|
19
|
+
code: url.searchParams.get("code") ?? void 0,
|
|
20
|
+
state: url.searchParams.get("state") ?? void 0
|
|
21
|
+
};
|
|
22
|
+
} catch {}
|
|
23
|
+
if (value.includes("#")) {
|
|
24
|
+
const [code, state] = value.split("#", 2);
|
|
25
|
+
return {
|
|
26
|
+
code,
|
|
27
|
+
state
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (value.includes("code=")) {
|
|
31
|
+
const params = new URLSearchParams(value);
|
|
32
|
+
return {
|
|
33
|
+
code: params.get("code") ?? void 0,
|
|
34
|
+
state: params.get("state") ?? void 0
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return { code: value };
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { parseAuthorizationInput };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=authorization-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization-input.js","names":[],"sources":["../../src/auth/authorization-input.ts"],"sourcesContent":["/**\n * Forgiving parser for user-pasted OAuth authorization input.\n *\n * Accepts, in order of preference:\n * - a full redirect URL (`https://.../callback?code=...&state=...`)\n * - the `code#state` form shown on Anthropic's hosted callback page\n * - a raw query string (`code=...&state=...`)\n * - a bare authorization code\n *\n * Ported from pi-mono's `parseAuthorizationInput`.\n */\nexport function parseAuthorizationInput(input: string): {\n code?: string;\n state?: string;\n} {\n const value = input.trim();\n if (!value) return {};\n\n try {\n const url = new URL(value);\n return {\n code: url.searchParams.get('code') ?? undefined,\n state: url.searchParams.get('state') ?? undefined,\n };\n } catch {\n // not a URL\n }\n\n if (value.includes('#')) {\n const [code, state] = value.split('#', 2);\n return { code, state };\n }\n\n if (value.includes('code=')) {\n const params = new URLSearchParams(value);\n return {\n code: params.get('code') ?? undefined,\n state: params.get('state') ?? undefined,\n };\n }\n\n return { code: value };\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,wBAAwB,OAGtC;CACA,MAAM,QAAQ,MAAM,KAAK;CACzB,IAAI,CAAC,OAAO,OAAO,CAAC;CAEpB,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EACzB,OAAO;GACL,MAAM,IAAI,aAAa,IAAI,MAAM,KAAK,KAAA;GACtC,OAAO,IAAI,aAAa,IAAI,OAAO,KAAK,KAAA;EAC1C;CACF,QAAQ,CAER;CAEA,IAAI,MAAM,SAAS,GAAG,GAAG;EACvB,MAAM,CAAC,MAAM,SAAS,MAAM,MAAM,KAAK,CAAC;EACxC,OAAO;GAAE;GAAM;EAAM;CACvB;CAEA,IAAI,MAAM,SAAS,OAAO,GAAG;EAC3B,MAAM,SAAS,IAAI,gBAAgB,KAAK;EACxC,OAAO;GACL,MAAM,OAAO,IAAI,MAAM,KAAK,KAAA;GAC5B,OAAO,OAAO,IAAI,OAAO,KAAK,KAAA;EAChC;CACF;CAEA,OAAO,EAAE,MAAM,MAAM;AACvB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic RFC 8628 (OAuth 2.0 Device Authorization Grant) polling helpers.
|
|
3
|
+
*
|
|
4
|
+
* Ported from pi-mono's device-code utility, restructured as a single-step
|
|
5
|
+
* API so the same poll semantics can be driven two ways:
|
|
6
|
+
* - `pollDeviceCodeUntilComplete()` — blocking loop for TUI flows.
|
|
7
|
+
* - `stepDeviceCodePoll()` — exactly one upstream poll per call, with a
|
|
8
|
+
* JSON-serializable `DeviceCodePollState` so web routes can persist the
|
|
9
|
+
* state between HTTP requests (any replica can continue the poll).
|
|
10
|
+
*
|
|
11
|
+
* Inspired by pi-mono:
|
|
12
|
+
* https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/device-code.ts
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Serializable poll-loop state. Safe to round-trip through JSON (e.g. a
|
|
16
|
+
* `pending jsonb` column) so device-code polling can span HTTP requests.
|
|
17
|
+
*/
|
|
18
|
+
export interface DeviceCodePollState {
|
|
19
|
+
/** ms epoch after which the device authorization is considered expired. */
|
|
20
|
+
deadlineAt: number;
|
|
21
|
+
/** Current base poll interval in ms (grows on slow_down responses). */
|
|
22
|
+
intervalMs: number;
|
|
23
|
+
/** Number of slow_down responses observed so far. */
|
|
24
|
+
slowDownResponses: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function createDeviceCodePollState(options: {
|
|
27
|
+
/** Poll interval suggested by the server, in seconds. Defaults to 5 (RFC 8628). */
|
|
28
|
+
intervalSeconds?: number;
|
|
29
|
+
/** Lifetime of the device code, in seconds. */
|
|
30
|
+
expiresInSeconds: number;
|
|
31
|
+
/** Override "now" for tests. */
|
|
32
|
+
now?: number;
|
|
33
|
+
}): DeviceCodePollState;
|
|
34
|
+
/**
|
|
35
|
+
* Classified result of one upstream token-endpoint poll. Providers implement
|
|
36
|
+
* the HTTP request and map their response shape onto this union.
|
|
37
|
+
*/
|
|
38
|
+
export type DeviceCodePollOutcome<T> = {
|
|
39
|
+
status: 'complete';
|
|
40
|
+
result: T;
|
|
41
|
+
} | {
|
|
42
|
+
status: 'pending';
|
|
43
|
+
intervalSeconds?: number;
|
|
44
|
+
} | {
|
|
45
|
+
status: 'slow_down';
|
|
46
|
+
intervalSeconds?: number;
|
|
47
|
+
} | {
|
|
48
|
+
status: 'failed';
|
|
49
|
+
error: string;
|
|
50
|
+
};
|
|
51
|
+
export type DeviceCodeStepResult<T> = {
|
|
52
|
+
status: 'complete';
|
|
53
|
+
result: T;
|
|
54
|
+
state: DeviceCodePollState;
|
|
55
|
+
} | {
|
|
56
|
+
status: 'pending';
|
|
57
|
+
nextPollMs: number;
|
|
58
|
+
state: DeviceCodePollState;
|
|
59
|
+
} | {
|
|
60
|
+
status: 'slow_down';
|
|
61
|
+
nextPollMs: number;
|
|
62
|
+
state: DeviceCodePollState;
|
|
63
|
+
} | {
|
|
64
|
+
status: 'failed';
|
|
65
|
+
error: string;
|
|
66
|
+
state: DeviceCodePollState;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Delay to wait before the next poll, honoring slow_down growth and clamped
|
|
70
|
+
* to the remaining lifetime of the device code.
|
|
71
|
+
*/
|
|
72
|
+
export declare function nextPollDelayMs(state: DeviceCodePollState, now?: number): number;
|
|
73
|
+
/**
|
|
74
|
+
* Perform exactly one upstream poll and fold the outcome into the poll state.
|
|
75
|
+
* Never throws for flow-level conditions — timeouts and provider errors are
|
|
76
|
+
* reported as `{ status: 'failed' }` so callers can persist/report them.
|
|
77
|
+
*/
|
|
78
|
+
export declare function stepDeviceCodePoll<T>(state: DeviceCodePollState, pollOnce: () => Promise<DeviceCodePollOutcome<T>>, now?: number): Promise<DeviceCodeStepResult<T>>;
|
|
79
|
+
/** Sleep that can be interrupted by an AbortSignal. */
|
|
80
|
+
export declare function abortableSleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Blocking poll loop for TUI flows: waits the appropriate interval between
|
|
83
|
+
* polls, honors slow_down growth, aborts on the signal, and throws on
|
|
84
|
+
* failure/timeout (with a clock-drift hint after slow_down responses).
|
|
85
|
+
*/
|
|
86
|
+
export declare function pollDeviceCodeUntilComplete<T>(options: {
|
|
87
|
+
state: DeviceCodePollState;
|
|
88
|
+
pollOnce: () => Promise<DeviceCodePollOutcome<T>>;
|
|
89
|
+
signal?: AbortSignal;
|
|
90
|
+
/** Override the sleep implementation for tests. */
|
|
91
|
+
sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
92
|
+
}): Promise<T>;
|
|
93
|
+
//# sourceMappingURL=device-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-code.d.ts","sourceRoot":"","sources":["../../src/auth/device-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,gBAAgB,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,mBAAmB,CAWtB;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAC/B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAC9B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAC7D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GACrE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GACvE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAWpE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAK5F;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EACjD,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAiClC;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9E;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,CAAC,EAAE,OAAO,EAAE;IAC5D,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mDAAmD;IACnD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,GAAG,OAAO,CAAC,CAAC,CAAC,CAwBb"}
|