@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,238 @@
|
|
|
1
|
+
import { createScorer, filterRun } from "@mastra/core/evals";
|
|
2
|
+
import { isBuildCommand, isTestCommand, getExitCode } from "./classify-command.js";
|
|
3
|
+
import { extractToolCalls } from "./extract-tools.js";
|
|
4
|
+
const WEIGHTS = {
|
|
5
|
+
build: 0.3,
|
|
6
|
+
tests: 0.25,
|
|
7
|
+
toolErrors: 0.2,
|
|
8
|
+
loops: 0.1,
|
|
9
|
+
regression: 0.1,
|
|
10
|
+
autonomy: 0.05
|
|
11
|
+
};
|
|
12
|
+
const THRESHOLDS = {
|
|
13
|
+
/** Multiplier for tool error rate penalty. Score = max(0, 1 - rate × this). */
|
|
14
|
+
toolErrorPenaltyMultiplier: 1,
|
|
15
|
+
/** How many consecutive identical calls (or same-error repeats) before it's a "loop". */
|
|
16
|
+
loopMinRepetitions: 3,
|
|
17
|
+
/** Score penalty per detected loop. */
|
|
18
|
+
loopPenaltyPerOccurrence: 0.3,
|
|
19
|
+
/** Score deducted per ask_user call. */
|
|
20
|
+
autonomyPenaltyPerAsk: 0.25,
|
|
21
|
+
/** Score when a command ran but exit code is ambiguous. */
|
|
22
|
+
ambiguousExitScore: 0.75,
|
|
23
|
+
/** Minimum tool calls required to produce a meaningful score. */
|
|
24
|
+
minToolCalls: 1,
|
|
25
|
+
/** Tool names whose errors are expected/benign (not penalized). */
|
|
26
|
+
benignErrorTools: ["search_content", "find_files", "lsp_inspect"]
|
|
27
|
+
};
|
|
28
|
+
function isBuildArgs(args) {
|
|
29
|
+
return isBuildCommand(String(args.command ?? ""));
|
|
30
|
+
}
|
|
31
|
+
function isTestArgs(args) {
|
|
32
|
+
return isTestCommand(String(args.command ?? ""));
|
|
33
|
+
}
|
|
34
|
+
function scoreBuild(execResults) {
|
|
35
|
+
const builds = execResults.filter((r) => r.toolName === "execute_command" && isBuildArgs(r.args));
|
|
36
|
+
if (builds.length === 0) return { score: 0, detail: "No build/typecheck ran", applicable: false };
|
|
37
|
+
const last = builds[builds.length - 1];
|
|
38
|
+
if (last.isError) return { score: 0, detail: "Build/typecheck tool errored", applicable: true };
|
|
39
|
+
const exitCode = getExitCode(last.result);
|
|
40
|
+
if (exitCode === 0) return { score: 1, detail: "Build/typecheck passed", applicable: true };
|
|
41
|
+
if (exitCode !== null && exitCode !== 0)
|
|
42
|
+
return { score: 0, detail: `Build failed (exit ${exitCode})`, applicable: true };
|
|
43
|
+
const text = typeof last.result === "string" ? last.result : JSON.stringify(last.result ?? "");
|
|
44
|
+
if (/error TS\d+|Cannot find module|is not assignable/i.test(text)) {
|
|
45
|
+
return { score: 0, detail: "Build failed (TypeScript errors in output)", applicable: true };
|
|
46
|
+
}
|
|
47
|
+
return { score: THRESHOLDS.ambiguousExitScore, detail: "Build ran, outcome unclear", applicable: true };
|
|
48
|
+
}
|
|
49
|
+
function scoreTests(execResults) {
|
|
50
|
+
const tests = execResults.filter((r) => r.toolName === "execute_command" && isTestArgs(r.args));
|
|
51
|
+
if (tests.length === 0) return { score: 0, detail: "No tests ran", applicable: false };
|
|
52
|
+
const last = tests[tests.length - 1];
|
|
53
|
+
if (last.isError) return { score: 0, detail: "Test command errored", applicable: true };
|
|
54
|
+
const exitCode = getExitCode(last.result);
|
|
55
|
+
if (exitCode === 0) return { score: 1, detail: "Tests passed", applicable: true };
|
|
56
|
+
if (exitCode !== null && exitCode !== 0)
|
|
57
|
+
return { score: 0, detail: `Tests failed (exit ${exitCode})`, applicable: true };
|
|
58
|
+
const text = typeof last.result === "string" ? last.result : JSON.stringify(last.result ?? "");
|
|
59
|
+
if (/\d+ (?:tests? )?passed|✓|PASS/i.test(text) && !/\bfail(?:ed|ure)?\b|\berror\b/i.test(text)) {
|
|
60
|
+
return { score: 1, detail: "Tests passed (inferred)", applicable: true };
|
|
61
|
+
}
|
|
62
|
+
if (/\bFAIL\b|failed|✗|✘/i.test(text)) {
|
|
63
|
+
return { score: 0, detail: "Tests failed (inferred)", applicable: true };
|
|
64
|
+
}
|
|
65
|
+
return { score: THRESHOLDS.ambiguousExitScore, detail: "Tests ran, outcome unclear", applicable: true };
|
|
66
|
+
}
|
|
67
|
+
function scoreToolErrors(results) {
|
|
68
|
+
if (results.length === 0) return { score: 1, detail: "No tool calls", applicable: false };
|
|
69
|
+
const nonBenign = results.filter((r) => !THRESHOLDS.benignErrorTools.includes(r.toolName));
|
|
70
|
+
if (nonBenign.length === 0) return { score: 1, detail: "All tool calls are benign-error tools", applicable: true };
|
|
71
|
+
const errors = nonBenign.filter((r) => r.isError);
|
|
72
|
+
const rate = errors.length / nonBenign.length;
|
|
73
|
+
if (rate === 0) return { score: 1, detail: "No tool errors", applicable: true };
|
|
74
|
+
const score = Math.max(0, 1 - rate * THRESHOLDS.toolErrorPenaltyMultiplier);
|
|
75
|
+
return {
|
|
76
|
+
score,
|
|
77
|
+
detail: `${errors.length}/${nonBenign.length} tools errored (${(rate * 100).toFixed(0)}%)`,
|
|
78
|
+
applicable: true
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function scoreStuckLoops(results) {
|
|
82
|
+
if (results.length < 3) return { score: 1, detail: "Too few calls for loop detection", applicable: true };
|
|
83
|
+
const fingerprint = (r) => `${r.toolName}:${JSON.stringify(r.args)}`;
|
|
84
|
+
let maxConsecutive = 1;
|
|
85
|
+
let currentRun = 1;
|
|
86
|
+
for (let i = 1; i < results.length; i++) {
|
|
87
|
+
if (fingerprint(results[i]) === fingerprint(results[i - 1])) {
|
|
88
|
+
currentRun++;
|
|
89
|
+
maxConsecutive = Math.max(maxConsecutive, currentRun);
|
|
90
|
+
} else {
|
|
91
|
+
currentRun = 1;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const errorCounts = /* @__PURE__ */ new Map();
|
|
95
|
+
for (const r of results) {
|
|
96
|
+
if (!r.isError) continue;
|
|
97
|
+
const fp = fingerprint(r);
|
|
98
|
+
errorCounts.set(fp, (errorCounts.get(fp) ?? 0) + 1);
|
|
99
|
+
}
|
|
100
|
+
const maxErrorRepeat = Math.max(0, ...[...errorCounts.values()]);
|
|
101
|
+
const minReps = THRESHOLDS.loopMinRepetitions;
|
|
102
|
+
const loopSeverity = Math.max(
|
|
103
|
+
maxConsecutive >= minReps ? maxConsecutive - (minReps - 1) : 0,
|
|
104
|
+
maxErrorRepeat >= minReps ? maxErrorRepeat - (minReps - 1) : 0
|
|
105
|
+
);
|
|
106
|
+
if (loopSeverity === 0) return { score: 1, detail: "No stuck loops", applicable: true };
|
|
107
|
+
const score = Math.max(0, 1 - loopSeverity * THRESHOLDS.loopPenaltyPerOccurrence);
|
|
108
|
+
const details = [];
|
|
109
|
+
if (maxConsecutive >= minReps) details.push(`${maxConsecutive} consecutive identical calls`);
|
|
110
|
+
if (maxErrorRepeat >= minReps) details.push(`same error repeated ${maxErrorRepeat}x`);
|
|
111
|
+
return { score, detail: details.join("; "), applicable: true };
|
|
112
|
+
}
|
|
113
|
+
function scoreRegression(execResults) {
|
|
114
|
+
const regressions = [];
|
|
115
|
+
for (const [label, filter] of [
|
|
116
|
+
["Build", isBuildArgs],
|
|
117
|
+
["Tests", isTestArgs]
|
|
118
|
+
]) {
|
|
119
|
+
const cmds = execResults.filter((r) => r.toolName === "execute_command" && filter(r.args));
|
|
120
|
+
if (cmds.length < 2) continue;
|
|
121
|
+
let sawPass = false;
|
|
122
|
+
let sawRegression = false;
|
|
123
|
+
for (const cmd of cmds) {
|
|
124
|
+
const exit = getExitCode(cmd.result);
|
|
125
|
+
if (exit === 0) {
|
|
126
|
+
if (sawRegression) {
|
|
127
|
+
regressions.push({ label, recovered: true });
|
|
128
|
+
sawRegression = false;
|
|
129
|
+
}
|
|
130
|
+
sawPass = true;
|
|
131
|
+
}
|
|
132
|
+
if (sawPass && exit !== null && exit !== 0) {
|
|
133
|
+
sawRegression = true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (sawRegression) {
|
|
137
|
+
regressions.push({ label, recovered: false });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (regressions.length === 0) return { score: 1, detail: "No regressions", applicable: true };
|
|
141
|
+
const persistentCount = regressions.filter((r) => !r.recovered).length;
|
|
142
|
+
const recoveredCount = regressions.filter((r) => r.recovered).length;
|
|
143
|
+
const score = Math.max(0, 1 - persistentCount * 0.5 - recoveredCount * 0.1);
|
|
144
|
+
const details = regressions.map(
|
|
145
|
+
(r) => `${r.label} ${r.recovered ? "regressed then recovered" : "regressed (persisted)"}`
|
|
146
|
+
);
|
|
147
|
+
return { score, detail: details.join("; "), applicable: true };
|
|
148
|
+
}
|
|
149
|
+
function scoreAutonomy(results) {
|
|
150
|
+
const askUserCalls = results.filter((r) => r.toolName === "ask_user");
|
|
151
|
+
const count = askUserCalls.length;
|
|
152
|
+
if (count === 0) return { score: 1, detail: "No ask_user calls (fully autonomous)", applicable: true };
|
|
153
|
+
const score = Math.max(0, 1 - count * THRESHOLDS.autonomyPenaltyPerAsk);
|
|
154
|
+
return { score, detail: `${count} ask_user call${count > 1 ? "s" : ""}`, applicable: true };
|
|
155
|
+
}
|
|
156
|
+
function weightedAverage(dimensions, weights) {
|
|
157
|
+
let totalWeight = 0;
|
|
158
|
+
let weightedSum = 0;
|
|
159
|
+
for (const [key, result] of Object.entries(dimensions)) {
|
|
160
|
+
if (!result.applicable) continue;
|
|
161
|
+
const weight = weights[key] ?? 0;
|
|
162
|
+
totalWeight += weight;
|
|
163
|
+
weightedSum += result.score * weight;
|
|
164
|
+
}
|
|
165
|
+
if (totalWeight === 0) return null;
|
|
166
|
+
return weightedSum / totalWeight;
|
|
167
|
+
}
|
|
168
|
+
function createOutcomeScorer() {
|
|
169
|
+
return createScorer({
|
|
170
|
+
id: "mastracode-outcome",
|
|
171
|
+
name: "MastraCode Outcome",
|
|
172
|
+
description: "Grades coding session outcomes: build/test pass, tool errors, stuck loops, regressions, autonomy. Always-on.",
|
|
173
|
+
type: "agent",
|
|
174
|
+
prepareRun: filterRun({ partTypes: ["tool-invocation", "text"] })
|
|
175
|
+
}).preprocess(async ({ run }) => {
|
|
176
|
+
const messages = run.output ?? [];
|
|
177
|
+
const allResults = extractToolCalls(messages);
|
|
178
|
+
const totalCalls = allResults.length;
|
|
179
|
+
if (totalCalls < THRESHOLDS.minToolCalls) {
|
|
180
|
+
const empty = { score: 0, detail: "No tool calls", applicable: false };
|
|
181
|
+
return {
|
|
182
|
+
empty: true,
|
|
183
|
+
build: empty,
|
|
184
|
+
tests: empty,
|
|
185
|
+
toolErrors: empty,
|
|
186
|
+
loops: empty,
|
|
187
|
+
regression: empty,
|
|
188
|
+
autonomy: empty,
|
|
189
|
+
totalCalls
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const execResults = allResults.filter((r) => r.toolName === "execute_command");
|
|
193
|
+
return {
|
|
194
|
+
empty: false,
|
|
195
|
+
build: scoreBuild(execResults),
|
|
196
|
+
tests: scoreTests(execResults),
|
|
197
|
+
toolErrors: scoreToolErrors(allResults),
|
|
198
|
+
loops: scoreStuckLoops(allResults),
|
|
199
|
+
regression: scoreRegression(execResults),
|
|
200
|
+
autonomy: scoreAutonomy(allResults),
|
|
201
|
+
totalCalls
|
|
202
|
+
};
|
|
203
|
+
}).generateScore(({ results }) => {
|
|
204
|
+
const p = results.preprocessStepResult;
|
|
205
|
+
if (p.empty) return 0;
|
|
206
|
+
const score = weightedAverage(
|
|
207
|
+
{
|
|
208
|
+
build: p.build,
|
|
209
|
+
tests: p.tests,
|
|
210
|
+
toolErrors: p.toolErrors,
|
|
211
|
+
loops: p.loops,
|
|
212
|
+
regression: p.regression,
|
|
213
|
+
autonomy: p.autonomy
|
|
214
|
+
},
|
|
215
|
+
WEIGHTS
|
|
216
|
+
);
|
|
217
|
+
return score === null ? 0 : Math.round(score * 100) / 100;
|
|
218
|
+
}).generateReason(({ results, score }) => {
|
|
219
|
+
const p = results.preprocessStepResult;
|
|
220
|
+
if (p.empty) {
|
|
221
|
+
return `Score: 0 (${p.totalCalls} tool calls \u2014 below minimum threshold for scoring)`;
|
|
222
|
+
}
|
|
223
|
+
const pct = (w) => `${(w * 100).toFixed(0)}%`;
|
|
224
|
+
const dimLine = (name, weight, r) => r.applicable ? `${name} (${pct(weight)}): ${r.detail} [${r.score}]` : `${name}: ${r.detail} [N/A \u2014 excluded from average]`;
|
|
225
|
+
const parts = [`Score: ${score} (${p.totalCalls} tool calls total)`];
|
|
226
|
+
parts.push(dimLine("Build", WEIGHTS.build, p.build));
|
|
227
|
+
parts.push(dimLine("Tests", WEIGHTS.tests, p.tests));
|
|
228
|
+
parts.push(dimLine("Tool errors", WEIGHTS.toolErrors, p.toolErrors));
|
|
229
|
+
parts.push(dimLine("Loops", WEIGHTS.loops, p.loops));
|
|
230
|
+
parts.push(dimLine("Regression", WEIGHTS.regression, p.regression));
|
|
231
|
+
parts.push(dimLine("Autonomy", WEIGHTS.autonomy, p.autonomy));
|
|
232
|
+
return parts.join("\n");
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
export {
|
|
236
|
+
createOutcomeScorer
|
|
237
|
+
};
|
|
238
|
+
//# sourceMappingURL=outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/evals/scorers/outcome.ts"],"sourcesContent":["/**\n * MastraCode Outcome Scorer (Code-based, Agent type, always-on)\n *\n * Grades the objective outcome of a coding session by checking hard facts:\n * - Did the build/typecheck pass?\n * - Did tests pass?\n * - What was the tool error rate?\n * - Did the agent get stuck in a loop?\n * - Was there a regression (build passed earlier, failed later)?\n * - Did the agent use ask_user unnecessarily? (autonomy)\n *\n * This scorer is always-on (no sampling) because it's cheap — it only\n * reads exit codes and error states from tool results already in the messages.\n *\n * Scoring philosophy (from Anthropic's eval guidance):\n * \"Grade outcomes, not paths\" — we check what happened, not how.\n * Partial credit: a session that passes build but fails tests scores\n * higher than one that fails build entirely.\n *\n * Dimensions that don't apply to a session (e.g. build for a docs-only task)\n * are excluded from the weighted average, so sessions aren't penalized for\n * irrelevant criteria.\n */\n\nimport type { MastraDBMessage } from '@mastra/core/agent';\nimport { createScorer, filterRun } from '@mastra/core/evals';\n\nimport { isBuildCommand, isTestCommand, getExitCode } from './classify-command.js';\nimport type { ExtractedToolCall } from './extract-tools.js';\nimport { extractToolCalls } from './extract-tools.js';\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// CONFIGURATION — Adjust weights and thresholds here\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Dimension weights. Used to compute the weighted average of applicable dimensions.\n * Dimensions that don't apply (e.g. no build ran) are excluded from the average.\n */\nconst WEIGHTS = {\n build: 0.3,\n tests: 0.25,\n toolErrors: 0.2,\n loops: 0.1,\n regression: 0.1,\n autonomy: 0.05,\n} as const;\n\n/**\n * Scoring thresholds and multipliers.\n */\nconst THRESHOLDS = {\n /** Multiplier for tool error rate penalty. Score = max(0, 1 - rate × this). */\n toolErrorPenaltyMultiplier: 1.0,\n\n /** How many consecutive identical calls (or same-error repeats) before it's a \"loop\". */\n loopMinRepetitions: 3,\n\n /** Score penalty per detected loop. */\n loopPenaltyPerOccurrence: 0.3,\n\n /** Score deducted per ask_user call. */\n autonomyPenaltyPerAsk: 0.25,\n\n /** Score when a command ran but exit code is ambiguous. */\n ambiguousExitScore: 0.75,\n\n /** Minimum tool calls required to produce a meaningful score. */\n minToolCalls: 1,\n\n /** Tool names whose errors are expected/benign (not penalized). */\n benignErrorTools: ['search_content', 'find_files', 'lsp_inspect'] as string[],\n} as const;\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\ntype DimensionResult = { score: number; detail: string; applicable: boolean };\n\n/**\n * Check if the primary verb of an execute_command is a build/typecheck command.\n * Splits compound commands (&&, ;) and checks the first segment.\n */\n/** Extract command string from tool call args, then delegate to shared classifier. */\nfunction isBuildArgs(args: Record<string, unknown>): boolean {\n return isBuildCommand(String(args.command ?? ''));\n}\n\nfunction isTestArgs(args: Record<string, unknown>): boolean {\n return isTestCommand(String(args.command ?? ''));\n}\n\n/**\n * Score build/typecheck outcome (final state).\n */\nfunction scoreBuild(execResults: ExtractedToolCall[]): DimensionResult {\n const builds = execResults.filter(r => r.toolName === 'execute_command' && isBuildArgs(r.args));\n if (builds.length === 0) return { score: 0, detail: 'No build/typecheck ran', applicable: false };\n\n const last = builds[builds.length - 1]!;\n if (last.isError) return { score: 0, detail: 'Build/typecheck tool errored', applicable: true };\n\n const exitCode = getExitCode(last.result);\n if (exitCode === 0) return { score: 1, detail: 'Build/typecheck passed', applicable: true };\n if (exitCode !== null && exitCode !== 0)\n return { score: 0, detail: `Build failed (exit ${exitCode})`, applicable: true };\n\n // Fallback: check result text for TS errors\n const text = typeof last.result === 'string' ? last.result : JSON.stringify(last.result ?? '');\n if (/error TS\\d+|Cannot find module|is not assignable/i.test(text)) {\n return { score: 0, detail: 'Build failed (TypeScript errors in output)', applicable: true };\n }\n\n return { score: THRESHOLDS.ambiguousExitScore, detail: 'Build ran, outcome unclear', applicable: true };\n}\n\n/**\n * Score test outcome (final state).\n */\nfunction scoreTests(execResults: ExtractedToolCall[]): DimensionResult {\n const tests = execResults.filter(r => r.toolName === 'execute_command' && isTestArgs(r.args));\n if (tests.length === 0) return { score: 0, detail: 'No tests ran', applicable: false };\n\n const last = tests[tests.length - 1]!;\n if (last.isError) return { score: 0, detail: 'Test command errored', applicable: true };\n\n const exitCode = getExitCode(last.result);\n if (exitCode === 0) return { score: 1, detail: 'Tests passed', applicable: true };\n if (exitCode !== null && exitCode !== 0)\n return { score: 0, detail: `Tests failed (exit ${exitCode})`, applicable: true };\n\n const text = typeof last.result === 'string' ? last.result : JSON.stringify(last.result ?? '');\n if (/\\d+ (?:tests? )?passed|✓|PASS/i.test(text) && !/\\bfail(?:ed|ure)?\\b|\\berror\\b/i.test(text)) {\n return { score: 1, detail: 'Tests passed (inferred)', applicable: true };\n }\n if (/\\bFAIL\\b|failed|✗|✘/i.test(text)) {\n return { score: 0, detail: 'Tests failed (inferred)', applicable: true };\n }\n\n return { score: THRESHOLDS.ambiguousExitScore, detail: 'Tests ran, outcome unclear', applicable: true };\n}\n\n/**\n * Score tool error rate, excluding benign errors from expected-to-fail tools.\n */\nfunction scoreToolErrors(results: ExtractedToolCall[]): DimensionResult {\n if (results.length === 0) return { score: 1, detail: 'No tool calls', applicable: false };\n\n // Only count errors from non-benign tools\n const nonBenign = results.filter(r => !THRESHOLDS.benignErrorTools.includes(r.toolName));\n if (nonBenign.length === 0) return { score: 1, detail: 'All tool calls are benign-error tools', applicable: true };\n\n const errors = nonBenign.filter(r => r.isError);\n const rate = errors.length / nonBenign.length;\n\n if (rate === 0) return { score: 1, detail: 'No tool errors', applicable: true };\n\n const score = Math.max(0, 1 - rate * THRESHOLDS.toolErrorPenaltyMultiplier);\n return {\n score,\n detail: `${errors.length}/${nonBenign.length} tools errored (${(rate * 100).toFixed(0)}%)`,\n applicable: true,\n };\n}\n\n/**\n * Detect stuck loops: same tool + same args appearing 3+ times consecutively,\n * or same tool + same args erroring 3+ times total.\n */\nfunction scoreStuckLoops(results: ExtractedToolCall[]): DimensionResult {\n if (results.length < 3) return { score: 1, detail: 'Too few calls for loop detection', applicable: true };\n\n const fingerprint = (r: ExtractedToolCall) => `${r.toolName}:${JSON.stringify(r.args)}`;\n\n // Check consecutive identical calls\n let maxConsecutive = 1;\n let currentRun = 1;\n for (let i = 1; i < results.length; i++) {\n if (fingerprint(results[i]!) === fingerprint(results[i - 1]!)) {\n currentRun++;\n maxConsecutive = Math.max(maxConsecutive, currentRun);\n } else {\n currentRun = 1;\n }\n }\n\n // Check repeated error fingerprints\n const errorCounts = new Map<string, number>();\n for (const r of results) {\n if (!r.isError) continue;\n const fp = fingerprint(r);\n errorCounts.set(fp, (errorCounts.get(fp) ?? 0) + 1);\n }\n const maxErrorRepeat = Math.max(0, ...[...errorCounts.values()]);\n\n const minReps = THRESHOLDS.loopMinRepetitions;\n const loopSeverity = Math.max(\n maxConsecutive >= minReps ? maxConsecutive - (minReps - 1) : 0,\n maxErrorRepeat >= minReps ? maxErrorRepeat - (minReps - 1) : 0,\n );\n\n if (loopSeverity === 0) return { score: 1, detail: 'No stuck loops', applicable: true };\n\n const score = Math.max(0, 1 - loopSeverity * THRESHOLDS.loopPenaltyPerOccurrence);\n const details: string[] = [];\n if (maxConsecutive >= minReps) details.push(`${maxConsecutive} consecutive identical calls`);\n if (maxErrorRepeat >= minReps) details.push(`same error repeated ${maxErrorRepeat}x`);\n return { score, detail: details.join('; '), applicable: true };\n}\n\n/**\n * Detect regressions: build/test passed at some point, then failed later.\n * Gives partial credit if the agent recovered (final state passes).\n */\nfunction scoreRegression(execResults: ExtractedToolCall[]): DimensionResult {\n const regressions: { label: string; recovered: boolean }[] = [];\n\n for (const [label, filter] of [\n ['Build', isBuildArgs],\n ['Tests', isTestArgs],\n ] as const) {\n const cmds = execResults.filter(r => r.toolName === 'execute_command' && filter(r.args));\n if (cmds.length < 2) continue;\n\n let sawPass = false;\n let sawRegression = false;\n for (const cmd of cmds) {\n const exit = getExitCode(cmd.result);\n if (exit === 0) {\n if (sawRegression) {\n // Recovered from regression\n regressions.push({ label, recovered: true });\n sawRegression = false;\n }\n sawPass = true;\n }\n if (sawPass && exit !== null && exit !== 0) {\n sawRegression = true;\n }\n }\n\n if (sawRegression) {\n // Regression persisted at end of session\n regressions.push({ label, recovered: false });\n }\n }\n\n if (regressions.length === 0) return { score: 1, detail: 'No regressions', applicable: true };\n\n // Persistent regressions are severe (0), recovered regressions get partial credit (0.5)\n const persistentCount = regressions.filter(r => !r.recovered).length;\n const recoveredCount = regressions.filter(r => r.recovered).length;\n const score = Math.max(0, 1 - persistentCount * 0.5 - recoveredCount * 0.1);\n const details = regressions.map(\n r => `${r.label} ${r.recovered ? 'regressed then recovered' : 'regressed (persisted)'}`,\n );\n return { score, detail: details.join('; '), applicable: true };\n}\n\n/**\n * Score autonomy: penalize ask_user calls.\n * 0 calls = 1.0, each call reduces by 0.25 (up to a floor of 0).\n */\nfunction scoreAutonomy(results: ExtractedToolCall[]): DimensionResult {\n const askUserCalls = results.filter(r => r.toolName === 'ask_user');\n const count = askUserCalls.length;\n\n if (count === 0) return { score: 1, detail: 'No ask_user calls (fully autonomous)', applicable: true };\n\n const score = Math.max(0, 1 - count * THRESHOLDS.autonomyPenaltyPerAsk);\n return { score, detail: `${count} ask_user call${count > 1 ? 's' : ''}`, applicable: true };\n}\n\n/**\n * Compute weighted average of only applicable dimensions.\n * Returns null if no dimensions are applicable.\n */\nfunction weightedAverage(dimensions: Record<string, DimensionResult>, weights: Record<string, number>): number | null {\n let totalWeight = 0;\n let weightedSum = 0;\n\n for (const [key, result] of Object.entries(dimensions)) {\n if (!result.applicable) continue;\n const weight = weights[key] ?? 0;\n totalWeight += weight;\n weightedSum += result.score * weight;\n }\n\n if (totalWeight === 0) return null;\n return weightedSum / totalWeight;\n}\n\nexport function createOutcomeScorer() {\n return createScorer({\n id: 'mastracode-outcome',\n name: 'MastraCode Outcome',\n description:\n 'Grades coding session outcomes: build/test pass, tool errors, stuck loops, regressions, autonomy. Always-on.',\n type: 'agent',\n prepareRun: filterRun({ partTypes: ['tool-invocation', 'text'] }),\n })\n .preprocess(async ({ run }) => {\n const messages = (run.output ?? []) as MastraDBMessage[];\n const allResults = extractToolCalls(messages);\n const totalCalls = allResults.length;\n\n // H1: Empty sessions or sessions with no tool calls → score 0\n if (totalCalls < THRESHOLDS.minToolCalls) {\n const empty: DimensionResult = { score: 0, detail: 'No tool calls', applicable: false };\n return {\n empty: true as const,\n build: empty,\n tests: empty,\n toolErrors: empty,\n loops: empty,\n regression: empty,\n autonomy: empty,\n totalCalls,\n };\n }\n\n const execResults = allResults.filter(r => r.toolName === 'execute_command');\n\n return {\n empty: false as const,\n build: scoreBuild(execResults),\n tests: scoreTests(execResults),\n toolErrors: scoreToolErrors(allResults),\n loops: scoreStuckLoops(allResults),\n regression: scoreRegression(execResults),\n autonomy: scoreAutonomy(allResults),\n totalCalls,\n };\n })\n .generateScore(({ results }) => {\n const p = results.preprocessStepResult;\n if (p.empty) return 0;\n\n const score = weightedAverage(\n {\n build: p.build,\n tests: p.tests,\n toolErrors: p.toolErrors,\n loops: p.loops,\n regression: p.regression,\n autonomy: p.autonomy,\n },\n WEIGHTS,\n );\n\n return score === null ? 0 : Math.round(score * 100) / 100;\n })\n .generateReason(({ results, score }) => {\n const p = results.preprocessStepResult;\n if (p.empty) {\n return `Score: 0 (${p.totalCalls} tool calls — below minimum threshold for scoring)`;\n }\n\n const pct = (w: number) => `${(w * 100).toFixed(0)}%`;\n const dimLine = (name: string, weight: number, r: DimensionResult) =>\n r.applicable\n ? `${name} (${pct(weight)}): ${r.detail} [${r.score}]`\n : `${name}: ${r.detail} [N/A — excluded from average]`;\n\n const parts: string[] = [`Score: ${score} (${p.totalCalls} tool calls total)`];\n parts.push(dimLine('Build', WEIGHTS.build, p.build));\n parts.push(dimLine('Tests', WEIGHTS.tests, p.tests));\n parts.push(dimLine('Tool errors', WEIGHTS.toolErrors, p.toolErrors));\n parts.push(dimLine('Loops', WEIGHTS.loops, p.loops));\n parts.push(dimLine('Regression', WEIGHTS.regression, p.regression));\n parts.push(dimLine('Autonomy', WEIGHTS.autonomy, p.autonomy));\n\n return parts.join('\\n');\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { PermissionMode, RunMode, ThinkingLevel } from './types.js';
|
|
2
|
+
/** Consolidated output mode (replaces the old `--format` + `--output-format`). */
|
|
3
|
+
export type OutputMode = 'human' | 'json' | 'jsonl';
|
|
4
|
+
export interface HeadlessArgs {
|
|
5
|
+
prompt?: string;
|
|
6
|
+
/** Timeout in seconds (CLI surface); converted to ms before `runMC`. */
|
|
7
|
+
timeout?: number;
|
|
8
|
+
output: OutputMode;
|
|
9
|
+
continue_: boolean;
|
|
10
|
+
model?: string;
|
|
11
|
+
mode?: RunMode;
|
|
12
|
+
thinkingLevel?: ThinkingLevel;
|
|
13
|
+
settings?: string;
|
|
14
|
+
thread?: string;
|
|
15
|
+
title?: string;
|
|
16
|
+
cloneThread: boolean;
|
|
17
|
+
resourceId?: string;
|
|
18
|
+
/** Max agentic turns before the run aborts with exit code 1. */
|
|
19
|
+
maxTurns?: number;
|
|
20
|
+
/** Named permission mode resolving to a built-in policy. Defaults to `auto`. */
|
|
21
|
+
permissionMode?: PermissionMode;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns true if `argv` selects headless mode. This must agree with what
|
|
25
|
+
* {@link parseHeadlessArgs} (and `runMCCli`) accept as a prompt: `--prompt`/`-p`
|
|
26
|
+
* or a bare positional prompt (e.g. `mastracode "Fix the bug"`). Note that a
|
|
27
|
+
* prompt piped via stdin without a flag is handled separately by the caller.
|
|
28
|
+
*/
|
|
29
|
+
export declare function hasHeadlessFlag(argv: string[]): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Parse CLI arguments for headless mode. The flag table in `flags.ts` is the
|
|
32
|
+
* single source of truth: each flag carries its own coercion/validation, so this
|
|
33
|
+
* function just walks {@link FLAGS} and assembles the typed {@link HeadlessArgs}.
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseHeadlessArgs(argv: string[]): HeadlessArgs;
|
|
36
|
+
export declare function printHeadlessUsage(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Headless CLI entry point: parse arguments, read stdin, initialize MastraCode,
|
|
39
|
+
* run via `runMC`, render output, and exit with the mapped code.
|
|
40
|
+
*/
|
|
41
|
+
export declare function runMCCli(predrainedInput?: string | null): Promise<never>;
|
|
42
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/headless/cli.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzE,kFAAkF;AAClF,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAID;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAcvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAsC9D;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CA+BzC;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CA+G9E"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { createMastraCode } from "../index.js";
|
|
4
|
+
import { setupDebugLogging } from "../utils/debug-log.js";
|
|
5
|
+
import { releaseAllThreadLocks } from "../utils/thread-lock.js";
|
|
6
|
+
import { buildParseArgsOptions, FLAGS, renderFlagUsage } from "./flags.js";
|
|
7
|
+
import { createHumanFormatState, formatHuman, formatJsonl, renderJsonResult } from "./format.js";
|
|
8
|
+
import { permissionModeToPolicy } from "./policy.js";
|
|
9
|
+
import { runMC } from "./run-mc.js";
|
|
10
|
+
const parseArgsOptions = buildParseArgsOptions();
|
|
11
|
+
function hasHeadlessFlag(argv) {
|
|
12
|
+
if (argv.some((a) => a === "--prompt" || a === "-p")) return true;
|
|
13
|
+
try {
|
|
14
|
+
const { values, positionals } = parseArgs({
|
|
15
|
+
args: argv.slice(2),
|
|
16
|
+
options: parseArgsOptions,
|
|
17
|
+
strict: false,
|
|
18
|
+
allowPositionals: true
|
|
19
|
+
});
|
|
20
|
+
return positionals.length > 0 && !values.help;
|
|
21
|
+
} catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function parseHeadlessArgs(argv) {
|
|
26
|
+
const { values, positionals } = parseArgs({
|
|
27
|
+
args: argv.slice(2),
|
|
28
|
+
options: parseArgsOptions,
|
|
29
|
+
strict: false,
|
|
30
|
+
allowPositionals: true
|
|
31
|
+
});
|
|
32
|
+
const args = {
|
|
33
|
+
output: "human",
|
|
34
|
+
continue_: false,
|
|
35
|
+
cloneThread: false
|
|
36
|
+
};
|
|
37
|
+
const sink = args;
|
|
38
|
+
for (const flag of FLAGS) {
|
|
39
|
+
if (!flag.field) continue;
|
|
40
|
+
const raw = values[flag.key];
|
|
41
|
+
if (raw === void 0) continue;
|
|
42
|
+
if (flag.type === "boolean") {
|
|
43
|
+
sink[flag.field] = Boolean(raw);
|
|
44
|
+
} else if (typeof raw === "string") {
|
|
45
|
+
sink[flag.field] = flag.coerce ? flag.coerce(raw) : raw;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (args.prompt === void 0 && positionals[0] !== void 0) {
|
|
49
|
+
args.prompt = positionals[0];
|
|
50
|
+
}
|
|
51
|
+
if (args.continue_ && args.thread) {
|
|
52
|
+
throw new Error("--continue and --thread cannot be used together");
|
|
53
|
+
}
|
|
54
|
+
return args;
|
|
55
|
+
}
|
|
56
|
+
function printHeadlessUsage() {
|
|
57
|
+
process.stdout.write(`
|
|
58
|
+
Usage: mastracode --prompt <text> [options]
|
|
59
|
+
|
|
60
|
+
Headless (non-interactive) mode options:
|
|
61
|
+
${renderFlagUsage()}
|
|
62
|
+
|
|
63
|
+
Thread behavior:
|
|
64
|
+
By default, a new thread is created for each run.
|
|
65
|
+
Use --continue to resume the most recent thread, or --thread to target a specific one.
|
|
66
|
+
Use --clone-thread to branch off a copy before running.
|
|
67
|
+
|
|
68
|
+
Settings file:
|
|
69
|
+
Uses the same settings.json as the interactive TUI. Pass --settings to use
|
|
70
|
+
a custom settings file (e.g., settings-ci.json for CI). All model, pack,
|
|
71
|
+
subagent, and OM configuration is resolved from settings at startup.
|
|
72
|
+
|
|
73
|
+
Exit codes:
|
|
74
|
+
0 Agent completed successfully
|
|
75
|
+
1 Error, aborted, or max turns reached
|
|
76
|
+
2 Timeout
|
|
77
|
+
|
|
78
|
+
Examples:
|
|
79
|
+
mastracode --prompt "Fix the bug in auth.ts"
|
|
80
|
+
mastracode --prompt "Add tests" --timeout 300 --output json
|
|
81
|
+
mastracode --prompt "Refactor" --output jsonl
|
|
82
|
+
mastracode --prompt "Review this PR" --permission-mode deny --max-turns 10
|
|
83
|
+
mastracode --settings ./settings-ci.json --prompt "Run tests"
|
|
84
|
+
mastracode -c --prompt "Continue where you left off"
|
|
85
|
+
echo "Summarize the repo" | mastracode --prompt -
|
|
86
|
+
`);
|
|
87
|
+
}
|
|
88
|
+
async function runMCCli(predrainedInput) {
|
|
89
|
+
if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
90
|
+
printHeadlessUsage();
|
|
91
|
+
process.exit(0);
|
|
92
|
+
}
|
|
93
|
+
let args;
|
|
94
|
+
try {
|
|
95
|
+
args = parseHeadlessArgs(process.argv);
|
|
96
|
+
} catch (e) {
|
|
97
|
+
process.stderr.write(`Error: ${e.message}
|
|
98
|
+
`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
let prompt = args.prompt;
|
|
102
|
+
if (predrainedInput !== void 0) {
|
|
103
|
+
prompt = predrainedInput ?? "";
|
|
104
|
+
} else if (prompt === "-" || !prompt && !process.stdin.isTTY) {
|
|
105
|
+
const chunks = [];
|
|
106
|
+
for await (const chunk of process.stdin) {
|
|
107
|
+
chunks.push(chunk);
|
|
108
|
+
}
|
|
109
|
+
prompt = Buffer.concat(chunks).toString("utf-8").trim();
|
|
110
|
+
}
|
|
111
|
+
if (!prompt) {
|
|
112
|
+
printHeadlessUsage();
|
|
113
|
+
process.stderr.write("Error: --prompt is required (or pipe via stdin)\n");
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
if (args.settings && !existsSync(args.settings)) {
|
|
117
|
+
process.stderr.write(`Error: Settings file not found: ${args.settings}
|
|
118
|
+
`);
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
const boot = await createMastraCode({ settingsPath: args.settings });
|
|
122
|
+
const { controller, session, mcpManager, effectiveDefaults } = boot;
|
|
123
|
+
if (mcpManager?.hasServers()) {
|
|
124
|
+
try {
|
|
125
|
+
await mcpManager.initInBackground();
|
|
126
|
+
} catch (err) {
|
|
127
|
+
process.stderr.write(`Warning: MCP server initialization failed: ${err.message ?? err}
|
|
128
|
+
`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
setupDebugLogging();
|
|
132
|
+
let exitCode = 1;
|
|
133
|
+
try {
|
|
134
|
+
const humanState = createHumanFormatState();
|
|
135
|
+
const run = runMC({
|
|
136
|
+
controller,
|
|
137
|
+
session,
|
|
138
|
+
prompt,
|
|
139
|
+
model: args.model,
|
|
140
|
+
mode: args.mode,
|
|
141
|
+
modeDefaults: effectiveDefaults,
|
|
142
|
+
thinkingLevel: args.thinkingLevel,
|
|
143
|
+
thread: { id: args.thread, continueLatest: args.continue_, clone: args.cloneThread },
|
|
144
|
+
resourceId: args.resourceId,
|
|
145
|
+
title: args.title,
|
|
146
|
+
timeoutMs: args.timeout ? args.timeout * 1e3 : void 0,
|
|
147
|
+
maxTurns: args.maxTurns,
|
|
148
|
+
policy: args.permissionMode ? permissionModeToPolicy(args.permissionMode) : void 0
|
|
149
|
+
});
|
|
150
|
+
for await (const event of run) {
|
|
151
|
+
if (args.output === "human") {
|
|
152
|
+
const out = formatHuman(event, humanState);
|
|
153
|
+
if (out.stdout) process.stdout.write(out.stdout);
|
|
154
|
+
if (out.stderr) process.stderr.write(out.stderr);
|
|
155
|
+
} else if (args.output === "jsonl") {
|
|
156
|
+
process.stdout.write(JSON.stringify(formatJsonl(event)) + "\n");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const result = await run.result;
|
|
160
|
+
exitCode = result.exitCode;
|
|
161
|
+
if (args.output === "json") {
|
|
162
|
+
process.stdout.write(renderJsonResult(result));
|
|
163
|
+
} else if (args.output === "jsonl") {
|
|
164
|
+
process.stdout.write(JSON.stringify({ type: "result", ...result }) + "\n");
|
|
165
|
+
}
|
|
166
|
+
if (result.status === "timeout") {
|
|
167
|
+
process.stderr.write(`
|
|
168
|
+
Timeout elapsed. Aborted.
|
|
169
|
+
`);
|
|
170
|
+
} else if (result.error && args.output === "human") {
|
|
171
|
+
process.stderr.write(`Error: ${result.error.message}
|
|
172
|
+
`);
|
|
173
|
+
}
|
|
174
|
+
} catch (err) {
|
|
175
|
+
process.stderr.write(`Error: ${err.message ?? err}
|
|
176
|
+
`);
|
|
177
|
+
exitCode = 1;
|
|
178
|
+
} finally {
|
|
179
|
+
releaseAllThreadLocks();
|
|
180
|
+
const closeSignalsPubSub = boot.signalsPubSub?.close;
|
|
181
|
+
await Promise.allSettled([
|
|
182
|
+
mcpManager?.disconnect(),
|
|
183
|
+
controller.getMastra()?.stopWorkers(),
|
|
184
|
+
controller?.stopIntervals(),
|
|
185
|
+
closeSignalsPubSub?.()
|
|
186
|
+
]);
|
|
187
|
+
}
|
|
188
|
+
process.exit(exitCode);
|
|
189
|
+
}
|
|
190
|
+
export {
|
|
191
|
+
hasHeadlessFlag,
|
|
192
|
+
parseHeadlessArgs,
|
|
193
|
+
printHeadlessUsage,
|
|
194
|
+
runMCCli
|
|
195
|
+
};
|
|
196
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/headless/cli.ts"],"sourcesContent":["/**\n * CLI adapter for headless MastraCode runs.\n *\n * This is the only headless layer that touches the process: it parses argv,\n * reads stdin, bootstraps MastraCode via `createMastraCode`, drives `runMC`,\n * renders events/results to stdout/stderr through the pure formatters, maps the\n * result to an exit code, and owns teardown + `process.exit`.\n */\nimport { existsSync } from 'node:fs';\nimport { parseArgs } from 'node:util';\n\nimport { createMastraCode } from '../index.js';\nimport { setupDebugLogging } from '../utils/debug-log.js';\nimport { releaseAllThreadLocks } from '../utils/thread-lock.js';\n\nimport { buildParseArgsOptions, FLAGS, renderFlagUsage } from './flags.js';\nimport { createHumanFormatState, formatHuman, formatJsonl, renderJsonResult } from './format.js';\nimport { permissionModeToPolicy } from './policy.js';\nimport { runMC } from './run-mc.js';\nimport type { PermissionMode, RunMode, ThinkingLevel } from './types.js';\n\n/** Consolidated output mode (replaces the old `--format` + `--output-format`). */\nexport type OutputMode = 'human' | 'json' | 'jsonl';\n\nexport interface HeadlessArgs {\n prompt?: string;\n /** Timeout in seconds (CLI surface); converted to ms before `runMC`. */\n timeout?: number;\n output: OutputMode;\n continue_: boolean;\n model?: string;\n mode?: RunMode;\n thinkingLevel?: ThinkingLevel;\n settings?: string;\n thread?: string;\n title?: string;\n cloneThread: boolean;\n resourceId?: string;\n /** Max agentic turns before the run aborts with exit code 1. */\n maxTurns?: number;\n /** Named permission mode resolving to a built-in policy. Defaults to `auto`. */\n permissionMode?: PermissionMode;\n}\n\nconst parseArgsOptions = buildParseArgsOptions();\n\n/**\n * Returns true if `argv` selects headless mode. This must agree with what\n * {@link parseHeadlessArgs} (and `runMCCli`) accept as a prompt: `--prompt`/`-p`\n * or a bare positional prompt (e.g. `mastracode \"Fix the bug\"`). Note that a\n * prompt piped via stdin without a flag is handled separately by the caller.\n */\nexport function hasHeadlessFlag(argv: string[]): boolean {\n if (argv.some(a => a === '--prompt' || a === '-p')) return true;\n try {\n const { values, positionals } = parseArgs({\n args: argv.slice(2),\n options: parseArgsOptions,\n strict: false,\n allowPositionals: true,\n });\n // A positional prompt only counts when not asking for help.\n return positionals.length > 0 && !values.help;\n } catch {\n return false;\n }\n}\n\n/**\n * Parse CLI arguments for headless mode. The flag table in `flags.ts` is the\n * single source of truth: each flag carries its own coercion/validation, so this\n * function just walks {@link FLAGS} and assembles the typed {@link HeadlessArgs}.\n */\nexport function parseHeadlessArgs(argv: string[]): HeadlessArgs {\n const { values, positionals } = parseArgs({\n args: argv.slice(2),\n options: parseArgsOptions,\n strict: false,\n allowPositionals: true,\n });\n\n // Seed defaults; per-flag values below override these.\n const args: HeadlessArgs = {\n output: 'human',\n continue_: false,\n cloneThread: false,\n };\n const sink = args as unknown as Record<string, unknown>;\n\n for (const flag of FLAGS) {\n if (!flag.field) continue; // e.g. --help, handled by the caller\n const raw = values[flag.key];\n if (raw === undefined) continue;\n\n if (flag.type === 'boolean') {\n sink[flag.field] = Boolean(raw);\n } else if (typeof raw === 'string') {\n sink[flag.field] = flag.coerce ? flag.coerce(raw) : raw;\n }\n }\n\n // A bare positional acts as the prompt when --prompt/-p is absent.\n if (args.prompt === undefined && positionals[0] !== undefined) {\n args.prompt = positionals[0];\n }\n\n if (args.continue_ && args.thread) {\n throw new Error('--continue and --thread cannot be used together');\n }\n\n return args;\n}\n\nexport function printHeadlessUsage(): void {\n process.stdout.write(`\nUsage: mastracode --prompt <text> [options]\n\nHeadless (non-interactive) mode options:\n${renderFlagUsage()}\n\nThread behavior:\n By default, a new thread is created for each run.\n Use --continue to resume the most recent thread, or --thread to target a specific one.\n Use --clone-thread to branch off a copy before running.\n\nSettings file:\n Uses the same settings.json as the interactive TUI. Pass --settings to use\n a custom settings file (e.g., settings-ci.json for CI). All model, pack,\n subagent, and OM configuration is resolved from settings at startup.\n\nExit codes:\n 0 Agent completed successfully\n 1 Error, aborted, or max turns reached\n 2 Timeout\n\nExamples:\n mastracode --prompt \"Fix the bug in auth.ts\"\n mastracode --prompt \"Add tests\" --timeout 300 --output json\n mastracode --prompt \"Refactor\" --output jsonl\n mastracode --prompt \"Review this PR\" --permission-mode deny --max-turns 10\n mastracode --settings ./settings-ci.json --prompt \"Run tests\"\n mastracode -c --prompt \"Continue where you left off\"\n echo \"Summarize the repo\" | mastracode --prompt -\n`);\n}\n\n/**\n * Headless CLI entry point: parse arguments, read stdin, initialize MastraCode,\n * run via `runMC`, render output, and exit with the mapped code.\n */\nexport async function runMCCli(predrainedInput?: string | null): Promise<never> {\n if (process.argv.includes('--help') || process.argv.includes('-h')) {\n printHeadlessUsage();\n process.exit(0);\n }\n\n let args: HeadlessArgs;\n try {\n args = parseHeadlessArgs(process.argv);\n } catch (e) {\n process.stderr.write(`Error: ${(e as Error).message}\\n`);\n process.exit(1);\n }\n\n let prompt = args.prompt;\n if (predrainedInput !== undefined) {\n prompt = predrainedInput ?? '';\n } else if (prompt === '-' || (!prompt && !process.stdin.isTTY)) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n printHeadlessUsage();\n process.stderr.write('Error: --prompt is required (or pipe via stdin)\\n');\n process.exit(1);\n }\n\n if (args.settings && !existsSync(args.settings)) {\n process.stderr.write(`Error: Settings file not found: ${args.settings}\\n`);\n process.exit(1);\n }\n\n const boot = await createMastraCode({ settingsPath: args.settings });\n const { controller, session, mcpManager, effectiveDefaults } = boot;\n\n if (mcpManager?.hasServers()) {\n try {\n await mcpManager.initInBackground();\n } catch (err) {\n process.stderr.write(`Warning: MCP server initialization failed: ${(err as Error).message ?? err}\\n`);\n }\n }\n\n setupDebugLogging();\n\n // Default to a non-zero exit so an unexpected throw before the run resolves\n // still surfaces as a failure to the caller / CI.\n let exitCode = 1;\n try {\n const humanState = createHumanFormatState();\n const run = runMC({\n controller,\n session,\n prompt,\n model: args.model,\n mode: args.mode,\n modeDefaults: effectiveDefaults,\n thinkingLevel: args.thinkingLevel,\n thread: { id: args.thread, continueLatest: args.continue_, clone: args.cloneThread },\n resourceId: args.resourceId,\n title: args.title,\n timeoutMs: args.timeout ? args.timeout * 1000 : undefined,\n maxTurns: args.maxTurns,\n policy: args.permissionMode ? permissionModeToPolicy(args.permissionMode) : undefined,\n });\n\n // Stream live events for human + jsonl modes. (json mode prints only the final object.)\n for await (const event of run) {\n if (args.output === 'human') {\n const out = formatHuman(event, humanState);\n if (out.stdout) process.stdout.write(out.stdout);\n if (out.stderr) process.stderr.write(out.stderr);\n } else if (args.output === 'jsonl') {\n process.stdout.write(JSON.stringify(formatJsonl(event)) + '\\n');\n }\n }\n\n const result = await run.result;\n exitCode = result.exitCode;\n\n if (args.output === 'json') {\n process.stdout.write(renderJsonResult(result));\n } else if (args.output === 'jsonl') {\n process.stdout.write(JSON.stringify({ type: 'result', ...result }) + '\\n');\n }\n\n if (result.status === 'timeout') {\n process.stderr.write(`\\nTimeout elapsed. Aborted.\\n`);\n } else if (result.error && args.output === 'human') {\n process.stderr.write(`Error: ${result.error.message}\\n`);\n }\n } catch (err) {\n process.stderr.write(`Error: ${(err as Error).message ?? err}\\n`);\n exitCode = 1;\n } finally {\n // --- Teardown (always runs, even on a thrown error) ---\n releaseAllThreadLocks();\n const closeSignalsPubSub = (boot.signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n controller.getMastra()?.stopWorkers(),\n controller?.stopIntervals(),\n closeSignalsPubSub?.(),\n ]);\n }\n\n process.exit(exitCode);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const VALID_OUTPUTS: readonly ["human", "json", "jsonl"];
|
|
2
|
+
/**
|
|
3
|
+
* One CLI flag. `key` is the long name (e.g. `output`); `field` is the
|
|
4
|
+
* {@link import('./cli.js').HeadlessArgs} property it populates. `coerce`
|
|
5
|
+
* converts the raw string and validates it. Boolean flags omit `coerce` and set
|
|
6
|
+
* `field` to `true` when present.
|
|
7
|
+
*/
|
|
8
|
+
export interface FlagSpec {
|
|
9
|
+
/** Long flag name without the leading `--`. */
|
|
10
|
+
key: string;
|
|
11
|
+
/** Single-character alias (without the leading `-`), if any. */
|
|
12
|
+
short?: string;
|
|
13
|
+
/** Whether the flag takes a value (`string`) or is a switch (`boolean`). */
|
|
14
|
+
type: 'string' | 'boolean';
|
|
15
|
+
/** Target field on `HeadlessArgs`. Omit for flags handled out-of-band (e.g. help). */
|
|
16
|
+
field?: string;
|
|
17
|
+
/** Coerce/validate a string value. Required for `type: 'string'` flags that map to a field. */
|
|
18
|
+
coerce?: (raw: string) => unknown;
|
|
19
|
+
/** `<...>` value placeholder shown in usage, e.g. `<text>`. */
|
|
20
|
+
placeholder?: string;
|
|
21
|
+
/** One-line (or multi-line) help description shown in usage. */
|
|
22
|
+
help: string | string[];
|
|
23
|
+
}
|
|
24
|
+
export declare const FLAGS: FlagSpec[];
|
|
25
|
+
/** `parseArgs` option config derived from {@link FLAGS}. */
|
|
26
|
+
export declare function buildParseArgsOptions(): Record<string, {
|
|
27
|
+
type: "string" | "boolean";
|
|
28
|
+
short?: string;
|
|
29
|
+
default?: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
/** Render the aligned `--flag description` block of the usage text from {@link FLAGS}. */
|
|
32
|
+
export declare function renderFlagUsage(): string;
|
|
33
|
+
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/headless/flags.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,aAAa,qCAAsC,CAAC;AA6BjE;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,EAiI3B,CAAC;AAEF,4DAA4D;AAC5D,wBAAgB,qBAAqB;UACG,QAAQ,GAAG,SAAS;YAAU,MAAM;cAAY,OAAO;GAM9F;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,IAAI,MAAM,CAmBxC"}
|