@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,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* request_access tool — requests permission to access a directory outside the project root.
|
|
3
|
+
* The user can approve or deny the request via TUI dialog.
|
|
4
|
+
*/
|
|
5
|
+
export declare const requestSandboxAccessTool: import("@mastra/core/tools").Tool<unknown, unknown, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, string, unknown>;
|
|
6
|
+
//# sourceMappingURL=request-sandbox-access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-sandbox-access.d.ts","sourceRoot":"","sources":["../../src/tools/request-sandbox-access.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2BH,eAAO,MAAM,wBAAwB,sKA6F5B,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { getAllowedPathsFromContext, isPathAllowed } from "./utils.js";
|
|
2
|
+
import * as os$1 from "os";
|
|
3
|
+
import * as path$1 from "path";
|
|
4
|
+
import { createTool } from "@mastra/core/tools";
|
|
5
|
+
import { LocalFilesystem } from "@mastra/core/workspace";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
//#region src/tools/request-sandbox-access.ts
|
|
8
|
+
/**
|
|
9
|
+
* request_access tool — requests permission to access a directory outside the project root.
|
|
10
|
+
* The user can approve or deny the request via TUI dialog.
|
|
11
|
+
*/
|
|
12
|
+
function expandTilde(p) {
|
|
13
|
+
if (p === "~") return os$1.homedir();
|
|
14
|
+
if (p.startsWith("~/") || p.startsWith("~\\")) return path$1.join(os$1.homedir(), p.slice(2));
|
|
15
|
+
return p;
|
|
16
|
+
}
|
|
17
|
+
const requestSandboxAccessTool = createTool({
|
|
18
|
+
id: "request_access",
|
|
19
|
+
description: `Request permission to access a directory outside the current project. Use this when you need to read or write files in a directory that is not within the project root. The user will be prompted to approve or deny the request.`,
|
|
20
|
+
inputSchema: z.object({
|
|
21
|
+
path: z.string().min(1).describe("The absolute path to the directory you need access to."),
|
|
22
|
+
reason: z.string().min(1).describe("Brief explanation of why you need access to this directory.")
|
|
23
|
+
}),
|
|
24
|
+
suspendSchema: z.object({
|
|
25
|
+
kind: z.literal("sandbox_access_request"),
|
|
26
|
+
path: z.string(),
|
|
27
|
+
reason: z.string()
|
|
28
|
+
}),
|
|
29
|
+
resumeSchema: z.union([z.string(), z.array(z.string())]),
|
|
30
|
+
execute: async ({ path: requestedPath, reason }, context) => {
|
|
31
|
+
try {
|
|
32
|
+
const agentControllerCtx = context?.requestContext?.get("controller");
|
|
33
|
+
const expanded = expandTilde(requestedPath);
|
|
34
|
+
const absolutePath = path$1.isAbsolute(expanded) ? expanded : path$1.resolve(process.cwd(), expanded);
|
|
35
|
+
if (isPathAllowed(absolutePath, process.cwd(), getAllowedPathsFromContext(context))) return {
|
|
36
|
+
content: `Access already granted: "${absolutePath}" is within the project root or allowed paths.`,
|
|
37
|
+
isError: false
|
|
38
|
+
};
|
|
39
|
+
const suspend = context?.agent?.suspend ?? context?.suspend;
|
|
40
|
+
const resumeData = context?.agent?.resumeData ?? context?.resumeData;
|
|
41
|
+
if (resumeData === void 0) {
|
|
42
|
+
if (!suspend) return {
|
|
43
|
+
content: `Cannot request sandbox access: interactive context not available. The user should manually run /sandbox add ${absolutePath}`,
|
|
44
|
+
isError: true
|
|
45
|
+
};
|
|
46
|
+
await suspend({
|
|
47
|
+
kind: "sandbox_access_request",
|
|
48
|
+
path: absolutePath,
|
|
49
|
+
reason
|
|
50
|
+
});
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const answerText = Array.isArray(resumeData) ? resumeData.join(", ") : String(resumeData);
|
|
54
|
+
if (answerText.toLowerCase().startsWith("y") || answerText.toLowerCase() === "approve") {
|
|
55
|
+
const currentAllowed = (agentControllerCtx?.getState())?.sandboxAllowedPaths ?? [];
|
|
56
|
+
const nextAllowed = currentAllowed.includes(absolutePath) ? currentAllowed : [...currentAllowed, absolutePath];
|
|
57
|
+
if (!currentAllowed.includes(absolutePath)) await agentControllerCtx?.setState({ sandboxAllowedPaths: nextAllowed });
|
|
58
|
+
const fs = agentControllerCtx?.workspace?.filesystem ?? context?.workspace?.filesystem;
|
|
59
|
+
if (fs instanceof LocalFilesystem) fs.setAllowedPaths((prev) => [...prev, absolutePath]);
|
|
60
|
+
return {
|
|
61
|
+
content: `Access granted: "${absolutePath}" has been added to allowed paths. You can now access files in this directory.`,
|
|
62
|
+
isError: false
|
|
63
|
+
};
|
|
64
|
+
} else return {
|
|
65
|
+
content: `Access denied: The user declined access to "${absolutePath}".`,
|
|
66
|
+
isError: false
|
|
67
|
+
};
|
|
68
|
+
} catch (error) {
|
|
69
|
+
return {
|
|
70
|
+
content: `Failed to request sandbox access: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
71
|
+
isError: true
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
//#endregion
|
|
77
|
+
export { requestSandboxAccessTool };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=request-sandbox-access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-sandbox-access.js","names":["os","path"],"sources":["../../src/tools/request-sandbox-access.ts"],"sourcesContent":["/**\n * request_access tool — requests permission to access a directory outside the project root.\n * The user can approve or deny the request via TUI dialog.\n */\n\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport { createTool } from '@mastra/core/tools';\nimport { LocalFilesystem } from '@mastra/core/workspace';\nimport { z } from 'zod';\nimport type { MastraCodeState } from '../schema.js';\nimport { isPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\nfunction expandTilde(p: string): string {\n if (p === '~') return os.homedir();\n if (p.startsWith('~/') || p.startsWith('~\\\\')) return path.join(os.homedir(), p.slice(2));\n return p;\n}\n\ntype RequestSandboxAccessInput = {\n path: string;\n reason: string;\n};\n\nconst requestSandboxAccessInputSchema = z.object({\n path: z.string().min(1).describe('The absolute path to the directory you need access to.'),\n reason: z.string().min(1).describe('Brief explanation of why you need access to this directory.'),\n});\n\nexport const requestSandboxAccessTool = createTool({\n id: 'request_access',\n description: `Request permission to access a directory outside the current project. Use this when you need to read or write files in a directory that is not within the project root. The user will be prompted to approve or deny the request.`,\n inputSchema: requestSandboxAccessInputSchema,\n suspendSchema: z.object({\n kind: z.literal('sandbox_access_request'),\n path: z.string(),\n reason: z.string(),\n }),\n resumeSchema: z.union([z.string(), z.array(z.string())]),\n execute: async ({ path: requestedPath, reason }: RequestSandboxAccessInput, context: any) => {\n try {\n const agentControllerCtx = context?.requestContext?.get('controller') as\n | AgentControllerRequestContext<MastraCodeState>\n | undefined;\n\n // Resolve to absolute path (expand ~ first since Node path APIs don't handle it)\n const expanded = expandTilde(requestedPath);\n const absolutePath = path.isAbsolute(expanded) ? expanded : path.resolve(process.cwd(), expanded);\n\n // Check if already allowed\n const projectRoot = process.cwd();\n const allowedPaths = getAllowedPathsFromContext(context);\n if (isPathAllowed(absolutePath, projectRoot, allowedPaths)) {\n return {\n content: `Access already granted: \"${absolutePath}\" is within the project root or allowed paths.`,\n isError: false,\n };\n }\n\n const suspend = context?.agent?.suspend ?? context?.suspend;\n const resumeData = context?.agent?.resumeData ?? context?.resumeData;\n\n // First pass: pause via the native tool-suspension primitive so the host can\n // prompt the user. The suspend payload carries the request details; the host\n // resumes with the user's answer as resume data.\n if (resumeData === undefined) {\n if (!suspend) {\n return {\n content: `Cannot request sandbox access: interactive context not available. The user should manually run /sandbox add ${absolutePath}`,\n isError: true,\n };\n }\n await suspend({ kind: 'sandbox_access_request', path: absolutePath, reason });\n return;\n }\n\n const answerText = Array.isArray(resumeData) ? resumeData.join(', ') : String(resumeData);\n const approved = answerText.toLowerCase().startsWith('y') || answerText.toLowerCase() === 'approve';\n if (approved) {\n // Persist to controller state first (and await it) so the value is\n // committed before the next tool call re-derives the workspace's\n // allowed paths from state. The workspace factory rebuilds the\n // filesystem allowlist from `sandboxAllowedPaths` on every call\n // (getDynamicWorkspace), so an unawaited setState would let that\n // rebuild clobber the in-turn widen below before the grant lands.\n const controllerState = agentControllerCtx?.getState();\n const currentAllowed = (controllerState?.sandboxAllowedPaths as string[] | undefined) ?? [];\n const nextAllowed = currentAllowed.includes(absolutePath) ? currentAllowed : [...currentAllowed, absolutePath];\n if (!currentAllowed.includes(absolutePath)) {\n await agentControllerCtx?.setState({\n sandboxAllowedPaths: nextAllowed,\n });\n }\n\n // Also update the live workspace filesystem immediately so tools in\n // the same turn (e.g. `view`) can access the path without waiting for\n // a fresh workspace build. The resolved workspace is carried on the\n // controller request context — the tool-execution context does not expose\n // it — so read the filesystem from there.\n const fs = agentControllerCtx?.workspace?.filesystem ?? context?.workspace?.filesystem;\n if (fs instanceof LocalFilesystem) {\n fs.setAllowedPaths((prev: readonly string[]) => [...prev, absolutePath]);\n }\n\n return {\n content: `Access granted: \"${absolutePath}\" has been added to allowed paths. You can now access files in this directory.`,\n isError: false,\n };\n } else {\n return {\n content: `Access denied: The user declined access to \"${absolutePath}\".`,\n isError: false,\n };\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `Failed to request sandbox access: ${msg}`,\n isError: true,\n };\n }\n },\n} as any);\n"],"mappings":";;;;;;;;;;;AAcA,SAAS,YAAY,GAAmB;CACtC,IAAI,MAAM,KAAK,OAAOA,KAAG,QAAQ;CACjC,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,KAAK,GAAG,OAAOC,OAAK,KAAKD,KAAG,QAAQ,GAAG,EAAE,MAAM,CAAC,CAAC;CACxF,OAAO;AACT;AAYA,MAAa,2BAA2B,WAAW;CACjD,IAAI;CACJ,aAAa;CACb,aARsC,EAAE,OAAO;EAC/C,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,wDAAwD;EACzF,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,6DAA6D;CAClG,CAKe;CACb,eAAe,EAAE,OAAO;EACtB,MAAM,EAAE,QAAQ,wBAAwB;EACxC,MAAM,EAAE,OAAO;EACf,QAAQ,EAAE,OAAO;CACnB,CAAC;CACD,cAAc,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD,SAAS,OAAO,EAAE,MAAM,eAAe,UAAqC,YAAiB;EAC3F,IAAI;GACF,MAAM,qBAAqB,SAAS,gBAAgB,IAAI,YAAY;GAKpE,MAAM,WAAW,YAAY,aAAa;GAC1C,MAAM,eAAeC,OAAK,WAAW,QAAQ,IAAI,WAAWA,OAAK,QAAQ,QAAQ,IAAI,GAAG,QAAQ;GAKhG,IAAI,cAAc,cAFE,QAAQ,IAEc,GADrB,2BAA2B,OACQ,CAAC,GACvD,OAAO;IACL,SAAS,4BAA4B,aAAa;IAClD,SAAS;GACX;GAGF,MAAM,UAAU,SAAS,OAAO,WAAW,SAAS;GACpD,MAAM,aAAa,SAAS,OAAO,cAAc,SAAS;GAK1D,IAAI,eAAe,KAAA,GAAW;IAC5B,IAAI,CAAC,SACH,OAAO;KACL,SAAS,+GAA+G;KACxH,SAAS;IACX;IAEF,MAAM,QAAQ;KAAE,MAAM;KAA0B,MAAM;KAAc;IAAO,CAAC;IAC5E;GACF;GAEA,MAAM,aAAa,MAAM,QAAQ,UAAU,IAAI,WAAW,KAAK,IAAI,IAAI,OAAO,UAAU;GAExF,IADiB,WAAW,YAAY,CAAC,CAAC,WAAW,GAAG,KAAK,WAAW,YAAY,MAAM,WAC5E;IAQZ,MAAM,kBADkB,oBAAoB,SAAS,EAAA,EACZ,uBAAgD,CAAC;IAC1F,MAAM,cAAc,eAAe,SAAS,YAAY,IAAI,iBAAiB,CAAC,GAAG,gBAAgB,YAAY;IAC7G,IAAI,CAAC,eAAe,SAAS,YAAY,GACvC,MAAM,oBAAoB,SAAS,EACjC,qBAAqB,YACvB,CAAC;IAQH,MAAM,KAAK,oBAAoB,WAAW,cAAc,SAAS,WAAW;IAC5E,IAAI,cAAc,iBAChB,GAAG,iBAAiB,SAA4B,CAAC,GAAG,MAAM,YAAY,CAAC;IAGzE,OAAO;KACL,SAAS,oBAAoB,aAAa;KAC1C,SAAS;IACX;GACF,OACE,OAAO;IACL,SAAS,+CAA+C,aAAa;IACrE,SAAS;GACX;EAEJ,SAAS,OAAO;GAEd,OAAO;IACL,SAAS,qCAFC,iBAAiB,QAAQ,MAAM,UAAU;IAGnD,SAAS;GACX;EACF;CACF;AACF,CAAQ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check whether `targetPath` falls inside `projectRoot` or any of the
|
|
3
|
+
* additional `allowedPaths`. All arguments are expected to be absolute.
|
|
4
|
+
*
|
|
5
|
+
* Returns `true` when access should be **allowed**.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isPathAllowed(targetPath: string, projectRoot: string, allowedPaths?: string[]): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Read allowed paths from the Mastra controller runtime context.
|
|
10
|
+
* Combines skill paths (computed dynamically from projectPath and configDir)
|
|
11
|
+
* with user-approved sandbox paths from controller state so that both parent
|
|
12
|
+
* and subagent tools have the same access.
|
|
13
|
+
* Returns default skill paths when the context is unavailable (e.g. in tests).
|
|
14
|
+
*/
|
|
15
|
+
export declare function getAllowedPathsFromContext(toolContext: {
|
|
16
|
+
requestContext?: {
|
|
17
|
+
get: (key: string) => unknown;
|
|
18
|
+
};
|
|
19
|
+
} | undefined): string[];
|
|
20
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,OAAO,CAK3G;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE;IAAE,cAAc,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,GAC9E,MAAM,EAAE,CAgBV"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import "../constants.js";
|
|
2
|
+
import { buildSkillPaths } from "../agents/workspace.js";
|
|
3
|
+
import * as path$1 from "path";
|
|
4
|
+
//#region src/tools/utils.ts
|
|
5
|
+
/**
|
|
6
|
+
* Check whether `targetPath` falls inside `projectRoot` or any of the
|
|
7
|
+
* additional `allowedPaths`. All arguments are expected to be absolute.
|
|
8
|
+
*
|
|
9
|
+
* Returns `true` when access should be **allowed**.
|
|
10
|
+
*/
|
|
11
|
+
function isPathAllowed(targetPath, projectRoot, allowedPaths = []) {
|
|
12
|
+
const resolved = path$1.resolve(targetPath);
|
|
13
|
+
return [projectRoot, ...allowedPaths].map((p) => path$1.resolve(p)).some((root) => resolved === root || resolved.startsWith(root + path$1.sep));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read allowed paths from the Mastra controller runtime context.
|
|
17
|
+
* Combines skill paths (computed dynamically from projectPath and configDir)
|
|
18
|
+
* with user-approved sandbox paths from controller state so that both parent
|
|
19
|
+
* and subagent tools have the same access.
|
|
20
|
+
* Returns default skill paths when the context is unavailable (e.g. in tests).
|
|
21
|
+
*/
|
|
22
|
+
function getAllowedPathsFromContext(toolContext) {
|
|
23
|
+
const agentControllerCtx = toolContext?.requestContext?.get("controller");
|
|
24
|
+
const state = agentControllerCtx?.getState?.() ?? agentControllerCtx?.session?.state?.get?.();
|
|
25
|
+
const skillPaths = buildSkillPaths(state?.projectPath ? path$1.resolve(state.projectPath) : process.cwd(), state?.configDir ?? ".mastracode");
|
|
26
|
+
const sandboxPaths = state?.sandboxAllowedPaths ?? [];
|
|
27
|
+
return [...skillPaths, ...sandboxPaths];
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
export { getAllowedPathsFromContext, isPathAllowed };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":["path"],"sources":["../../src/tools/utils.ts"],"sourcesContent":["import * as path from 'node:path';\nimport { buildSkillPaths } from '../agents/workspace.js';\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\n\n/**\n * Check whether `targetPath` falls inside `projectRoot` or any of the\n * additional `allowedPaths`. All arguments are expected to be absolute.\n *\n * Returns `true` when access should be **allowed**.\n */\nexport function isPathAllowed(targetPath: string, projectRoot: string, allowedPaths: string[] = []): boolean {\n const resolved = path.resolve(targetPath);\n const roots = [projectRoot, ...allowedPaths].map(p => path.resolve(p));\n\n return roots.some(root => resolved === root || resolved.startsWith(root + path.sep));\n}\n\n/**\n * Read allowed paths from the Mastra controller runtime context.\n * Combines skill paths (computed dynamically from projectPath and configDir)\n * with user-approved sandbox paths from controller state so that both parent\n * and subagent tools have the same access.\n * Returns default skill paths when the context is unavailable (e.g. in tests).\n */\nexport function getAllowedPathsFromContext(\n toolContext: { requestContext?: { get: (key: string) => unknown } } | undefined,\n): string[] {\n const agentControllerCtx = toolContext?.requestContext?.get('controller') as\n | {\n getState?: () => { sandboxAllowedPaths?: string[]; projectPath?: string; configDir?: string };\n session?: {\n state?: { get?: () => { sandboxAllowedPaths?: string[]; projectPath?: string; configDir?: string } };\n };\n }\n | undefined;\n const state = agentControllerCtx?.getState?.() ?? agentControllerCtx?.session?.state?.get?.();\n const projectPath = state?.projectPath ? path.resolve(state.projectPath) : process.cwd();\n const configDir = state?.configDir ?? DEFAULT_CONFIG_DIR;\n const skillPaths = buildSkillPaths(projectPath, configDir);\n const sandboxPaths = state?.sandboxAllowedPaths ?? [];\n\n return [...skillPaths, ...sandboxPaths];\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,cAAc,YAAoB,aAAqB,eAAyB,CAAC,GAAY;CAC3G,MAAM,WAAWA,OAAK,QAAQ,UAAU;CAGxC,OAFc,CAAC,aAAa,GAAG,YAAY,CAAC,CAAC,KAAI,MAAKA,OAAK,QAAQ,CAAC,CAEzD,CAAC,CAAC,MAAK,SAAQ,aAAa,QAAQ,SAAS,WAAW,OAAOA,OAAK,GAAG,CAAC;AACrF;;;;;;;;AASA,SAAgB,2BACd,aACU;CACV,MAAM,qBAAqB,aAAa,gBAAgB,IAAI,YAAY;CAQxE,MAAM,QAAQ,oBAAoB,WAAW,KAAK,oBAAoB,SAAS,OAAO,MAAM;CAG5F,MAAM,aAAa,gBAFC,OAAO,cAAcA,OAAK,QAAQ,MAAM,WAAW,IAAI,QAAQ,IAAI,GACrE,OAAO,aAAA,aACgC;CACzD,MAAM,eAAe,OAAO,uBAAuB,CAAC;CAEpD,OAAO,CAAC,GAAG,YAAY,GAAG,YAAY;AACxC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { type WebSearchProviderSetting } from '../onboarding/settings.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check whether a Tavily API key is available in the environment.
|
|
4
|
+
* Used to select model-independent web tools before falling back to
|
|
5
|
+
* model-native web search.
|
|
6
|
+
*/
|
|
7
|
+
export declare function hasTavilyKey(): boolean;
|
|
8
|
+
/** Check whether a Parallel API key is available in the environment. */
|
|
9
|
+
export declare function hasParallelKey(): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Wraps the @mastra/tavily search tool with mastracode-specific behavior:
|
|
12
|
+
* relevance filtering, markdown string formatting, and token truncation.
|
|
13
|
+
* The underlying Tavily tool handles client init, input validation, and the API call.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createWebSearchTool(): import("@mastra/core/tools").Tool<{
|
|
16
|
+
query: string;
|
|
17
|
+
searchDepth?: "advanced" | "basic" | "fast" | "ultra-fast" | undefined;
|
|
18
|
+
maxResults?: number | undefined;
|
|
19
|
+
includeAnswer?: "advanced" | "basic" | boolean | undefined;
|
|
20
|
+
includeImages?: boolean | undefined;
|
|
21
|
+
includeImageDescriptions?: boolean | undefined;
|
|
22
|
+
includeRawContent?: "markdown" | "text" | false | undefined;
|
|
23
|
+
includeDomains?: string[] | undefined;
|
|
24
|
+
excludeDomains?: string[] | undefined;
|
|
25
|
+
timeRange?: "day" | "month" | "week" | "year" | undefined;
|
|
26
|
+
}, unknown, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "web-search", unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* Wraps the @mastra/tavily extract tool with mastracode-specific behavior:
|
|
29
|
+
* markdown string formatting and token truncation.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createWebExtractTool(): import("@mastra/core/tools").Tool<{
|
|
32
|
+
urls: string[];
|
|
33
|
+
extractDepth?: "advanced" | "basic" | undefined;
|
|
34
|
+
query?: string | undefined;
|
|
35
|
+
includeImages?: boolean | undefined;
|
|
36
|
+
format?: "markdown" | "text" | undefined;
|
|
37
|
+
}, unknown, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "web-extract", unknown>;
|
|
38
|
+
/**
|
|
39
|
+
* Wraps the @mastra/parallel search tool with Mastra Code's standard tool id,
|
|
40
|
+
* markdown string output, and token truncation.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createParallelWebSearchTool(): import("@mastra/core/tools").Tool<{
|
|
43
|
+
query: string;
|
|
44
|
+
}, unknown, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "web-search", unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* Wraps the @mastra/parallel extract tool with Mastra Code's standard tool id,
|
|
47
|
+
* markdown string output, and token truncation.
|
|
48
|
+
*/
|
|
49
|
+
export declare function createParallelWebExtractTool(): import("@mastra/core/tools").Tool<{
|
|
50
|
+
urls: string[];
|
|
51
|
+
objective?: string | undefined;
|
|
52
|
+
searchQueries?: string[] | undefined;
|
|
53
|
+
excerptMaxCharsPerResult?: number | undefined;
|
|
54
|
+
clientModel?: string | undefined;
|
|
55
|
+
fullContent?: number | boolean | undefined;
|
|
56
|
+
maxCharsTotal?: number | undefined;
|
|
57
|
+
fetchPolicy?: {
|
|
58
|
+
maxAgeSeconds?: number | undefined;
|
|
59
|
+
timeoutSeconds?: number | undefined;
|
|
60
|
+
disableCacheFallback?: boolean | undefined;
|
|
61
|
+
} | undefined;
|
|
62
|
+
sessionId?: string | undefined;
|
|
63
|
+
}, unknown, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "web-extract", unknown>;
|
|
64
|
+
/**
|
|
65
|
+
* Resolve which model-independent web provider to use. An explicit user
|
|
66
|
+
* preference wins while its API key is configured; otherwise `auto` picks the
|
|
67
|
+
* first configured provider key (Tavily, then Parallel).
|
|
68
|
+
*/
|
|
69
|
+
export declare function resolveWebSearchProvider(preference?: WebSearchProviderSetting): 'tavily' | 'parallel' | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Create the configured model-independent web tools for the provider selected
|
|
72
|
+
* via the `webSearchProvider` preference (set in the TUI settings panel).
|
|
73
|
+
*/
|
|
74
|
+
export declare function createConfiguredWebTools(): {
|
|
75
|
+
web_search: import("@mastra/core/tools").Tool<{
|
|
76
|
+
query: string;
|
|
77
|
+
}, unknown, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "web-search", unknown>;
|
|
78
|
+
web_extract: import("@mastra/core/tools").Tool<{
|
|
79
|
+
urls: string[];
|
|
80
|
+
objective?: string | undefined;
|
|
81
|
+
searchQueries?: string[] | undefined;
|
|
82
|
+
excerptMaxCharsPerResult?: number | undefined;
|
|
83
|
+
clientModel?: string | undefined;
|
|
84
|
+
fullContent?: number | boolean | undefined;
|
|
85
|
+
maxCharsTotal?: number | undefined;
|
|
86
|
+
fetchPolicy?: {
|
|
87
|
+
maxAgeSeconds?: number | undefined;
|
|
88
|
+
timeoutSeconds?: number | undefined;
|
|
89
|
+
disableCacheFallback?: boolean | undefined;
|
|
90
|
+
} | undefined;
|
|
91
|
+
sessionId?: string | undefined;
|
|
92
|
+
}, unknown, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "web-extract", unknown>;
|
|
93
|
+
} | {
|
|
94
|
+
web_search: import("@mastra/core/tools").Tool<{
|
|
95
|
+
query: string;
|
|
96
|
+
searchDepth?: "advanced" | "basic" | "fast" | "ultra-fast" | undefined;
|
|
97
|
+
maxResults?: number | undefined;
|
|
98
|
+
includeAnswer?: "advanced" | "basic" | boolean | undefined;
|
|
99
|
+
includeImages?: boolean | undefined;
|
|
100
|
+
includeImageDescriptions?: boolean | undefined;
|
|
101
|
+
includeRawContent?: "markdown" | "text" | false | undefined;
|
|
102
|
+
includeDomains?: string[] | undefined;
|
|
103
|
+
excludeDomains?: string[] | undefined;
|
|
104
|
+
timeRange?: "day" | "month" | "week" | "year" | undefined;
|
|
105
|
+
}, unknown, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "web-search", unknown>;
|
|
106
|
+
web_extract: import("@mastra/core/tools").Tool<{
|
|
107
|
+
urls: string[];
|
|
108
|
+
extractDepth?: "advanced" | "basic" | undefined;
|
|
109
|
+
query?: string | undefined;
|
|
110
|
+
includeImages?: boolean | undefined;
|
|
111
|
+
format?: "markdown" | "text" | undefined;
|
|
112
|
+
}, unknown, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "web-extract", unknown>;
|
|
113
|
+
} | undefined;
|
|
114
|
+
//# sourceMappingURL=web-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,KAAK,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAwBxF;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wEAAwE;AACxE,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB;;;;;;;;;;;mIA8BlC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB;;;;;;oIAwBnC;AAED;;;GAGG;AACH,wBAAgB,2BAA2B;;mIAuB1C;AAED;;;GAGG;AACH,wBAAgB,4BAA4B;;;;;;;;;qBAtI1C,CAAC;sBAEK,CAAC;4BAEe,CAAC;;;oIA0JxB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,GAAE,wBAAiC,GAC5C,QAAQ,GAAG,UAAU,GAAG,SAAS,CAQnC;AAED;;;GAGG;AACH,wBAAgB,wBAAwB;;;;;;;;;;;;;yBArLtC,CAAC;0BAEK,CAAC;gCAEe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;cAmMxB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { loadSettings } from "../onboarding/settings.js";
|
|
2
|
+
import { truncateStringForTokenEstimate } from "../utils/token-estimator.js";
|
|
3
|
+
import { createTool, isValidationError } from "@mastra/core/tools";
|
|
4
|
+
import { createParallelExtractTool, createParallelSearchTool } from "@mastra/parallel";
|
|
5
|
+
import { createTavilyExtractTool, createTavilySearchTool } from "@mastra/tavily";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
//#region src/tools/web-search.ts
|
|
8
|
+
const MAX_WEB_SEARCH_TOKENS = 2e3;
|
|
9
|
+
const MAX_WEB_EXTRACT_TOKENS = 2e3;
|
|
10
|
+
const MIN_RELEVANCE_SCORE = .25;
|
|
11
|
+
const parallelWebSearchInputSchema = z.object({ query: z.string().min(1).describe("The search query") });
|
|
12
|
+
function requireParallelOutput(output, operation) {
|
|
13
|
+
if (output === void 0) throw new Error(`Parallel ${operation} returned no output`);
|
|
14
|
+
if (isValidationError(output)) throw new Error(output.message);
|
|
15
|
+
return output;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check whether a Tavily API key is available in the environment.
|
|
19
|
+
* Used to select model-independent web tools before falling back to
|
|
20
|
+
* model-native web search.
|
|
21
|
+
*/
|
|
22
|
+
function hasTavilyKey() {
|
|
23
|
+
return !!process.env.TAVILY_API_KEY;
|
|
24
|
+
}
|
|
25
|
+
/** Check whether a Parallel API key is available in the environment. */
|
|
26
|
+
function hasParallelKey() {
|
|
27
|
+
return !!process.env.PARALLEL_API_KEY;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Wraps the @mastra/tavily search tool with mastracode-specific behavior:
|
|
31
|
+
* relevance filtering, markdown string formatting, and token truncation.
|
|
32
|
+
* The underlying Tavily tool handles client init, input validation, and the API call.
|
|
33
|
+
*/
|
|
34
|
+
function createWebSearchTool() {
|
|
35
|
+
const tavilySearchTool = createTavilySearchTool();
|
|
36
|
+
return createTool({
|
|
37
|
+
id: "web-search",
|
|
38
|
+
description: tavilySearchTool.description,
|
|
39
|
+
inputSchema: tavilySearchTool.inputSchema,
|
|
40
|
+
execute: async (input, context) => {
|
|
41
|
+
const output = await tavilySearchTool.execute(input, context);
|
|
42
|
+
const parts = [];
|
|
43
|
+
if (output.answer) parts.push(`Answer: ${output.answer}`);
|
|
44
|
+
const filtered = output.results.filter((r) => (r.score ?? 1) >= MIN_RELEVANCE_SCORE);
|
|
45
|
+
for (const r of filtered) parts.push(`## ${r.title}\n${r.url}\n${r.content}`);
|
|
46
|
+
const images = (output.images || []).map((img) => img.url).filter(Boolean);
|
|
47
|
+
if (images.length > 0) parts.push(`Images:\n${images.join("\n")}`);
|
|
48
|
+
return truncateStringForTokenEstimate(parts.join("\n\n"), MAX_WEB_SEARCH_TOKENS);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Wraps the @mastra/tavily extract tool with mastracode-specific behavior:
|
|
54
|
+
* markdown string formatting and token truncation.
|
|
55
|
+
*/
|
|
56
|
+
function createWebExtractTool() {
|
|
57
|
+
const tavilyExtractTool = createTavilyExtractTool();
|
|
58
|
+
return createTool({
|
|
59
|
+
id: "web-extract",
|
|
60
|
+
description: tavilyExtractTool.description,
|
|
61
|
+
inputSchema: tavilyExtractTool.inputSchema,
|
|
62
|
+
execute: async (input, context) => {
|
|
63
|
+
const output = await tavilyExtractTool.execute(input, context);
|
|
64
|
+
const parts = [];
|
|
65
|
+
for (const r of output.results) parts.push(`## ${r.url}\n${r.rawContent}`);
|
|
66
|
+
for (const r of output.failedResults) parts.push(`## ${r.url}\nError: ${r.error}`);
|
|
67
|
+
return truncateStringForTokenEstimate(parts.join("\n\n"), MAX_WEB_EXTRACT_TOKENS);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Wraps the @mastra/parallel search tool with Mastra Code's standard tool id,
|
|
73
|
+
* markdown string output, and token truncation.
|
|
74
|
+
*/
|
|
75
|
+
function createParallelWebSearchTool() {
|
|
76
|
+
const parallelSearchTool = createParallelSearchTool();
|
|
77
|
+
return createTool({
|
|
78
|
+
id: "web-search",
|
|
79
|
+
description: parallelSearchTool.description,
|
|
80
|
+
inputSchema: parallelWebSearchInputSchema,
|
|
81
|
+
execute: async (input, context) => {
|
|
82
|
+
const output = requireParallelOutput(await parallelSearchTool.execute({ searchQueries: [input.query] }, context), "search");
|
|
83
|
+
const parts = [];
|
|
84
|
+
for (const result of output.results) {
|
|
85
|
+
const title = result.title || result.url;
|
|
86
|
+
const excerpts = (result.excerpts || []).filter(Boolean).join("\n");
|
|
87
|
+
parts.push([
|
|
88
|
+
`## ${title}`,
|
|
89
|
+
result.url,
|
|
90
|
+
excerpts
|
|
91
|
+
].filter(Boolean).join("\n"));
|
|
92
|
+
}
|
|
93
|
+
return truncateStringForTokenEstimate(parts.join("\n\n"), MAX_WEB_SEARCH_TOKENS);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Wraps the @mastra/parallel extract tool with Mastra Code's standard tool id,
|
|
99
|
+
* markdown string output, and token truncation.
|
|
100
|
+
*/
|
|
101
|
+
function createParallelWebExtractTool() {
|
|
102
|
+
const parallelExtractTool = createParallelExtractTool();
|
|
103
|
+
return createTool({
|
|
104
|
+
id: "web-extract",
|
|
105
|
+
description: parallelExtractTool.description,
|
|
106
|
+
inputSchema: parallelExtractTool.inputSchema,
|
|
107
|
+
execute: async (input, context) => {
|
|
108
|
+
const output = requireParallelOutput(await parallelExtractTool.execute(input, context), "extract");
|
|
109
|
+
const parts = [];
|
|
110
|
+
for (const result of output.results) {
|
|
111
|
+
const content = result.fullContent || (result.excerpts || []).filter(Boolean).join("\n");
|
|
112
|
+
parts.push([`## ${result.url}`, content].filter(Boolean).join("\n"));
|
|
113
|
+
}
|
|
114
|
+
for (const error of output.errors) {
|
|
115
|
+
const status = error.httpStatusCode ? ` (${error.httpStatusCode})` : "";
|
|
116
|
+
parts.push([
|
|
117
|
+
`## ${error.url}`,
|
|
118
|
+
`Error: ${error.errorType}${status}`,
|
|
119
|
+
error.content
|
|
120
|
+
].filter(Boolean).join("\n"));
|
|
121
|
+
}
|
|
122
|
+
return truncateStringForTokenEstimate(parts.join("\n\n"), MAX_WEB_EXTRACT_TOKENS);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Resolve which model-independent web provider to use. An explicit user
|
|
128
|
+
* preference wins while its API key is configured; otherwise `auto` picks the
|
|
129
|
+
* first configured provider key (Tavily, then Parallel).
|
|
130
|
+
*/
|
|
131
|
+
function resolveWebSearchProvider(preference = "auto") {
|
|
132
|
+
if (preference === "tavily" && hasTavilyKey()) return "tavily";
|
|
133
|
+
if (preference === "parallel" && hasParallelKey()) return "parallel";
|
|
134
|
+
if (hasTavilyKey()) return "tavily";
|
|
135
|
+
if (hasParallelKey()) return "parallel";
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Create the configured model-independent web tools for the provider selected
|
|
139
|
+
* via the `webSearchProvider` preference (set in the TUI settings panel).
|
|
140
|
+
*/
|
|
141
|
+
function createConfiguredWebTools() {
|
|
142
|
+
const provider = resolveWebSearchProvider(loadSettings().preferences.webSearchProvider);
|
|
143
|
+
if (provider === "parallel") return {
|
|
144
|
+
web_search: createParallelWebSearchTool(),
|
|
145
|
+
web_extract: createParallelWebExtractTool()
|
|
146
|
+
};
|
|
147
|
+
if (provider === "tavily") return {
|
|
148
|
+
web_search: createWebSearchTool(),
|
|
149
|
+
web_extract: createWebExtractTool()
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//#endregion
|
|
153
|
+
export { createConfiguredWebTools, createParallelWebExtractTool, createParallelWebSearchTool, createWebExtractTool, createWebSearchTool, hasParallelKey, hasTavilyKey, resolveWebSearchProvider };
|
|
154
|
+
|
|
155
|
+
//# sourceMappingURL=web-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.js","names":[],"sources":["../../src/tools/web-search.ts"],"sourcesContent":["import { createTool, isValidationError, type ValidationError } from '@mastra/core/tools';\nimport { createParallelSearchTool, createParallelExtractTool } from '@mastra/parallel';\nimport { createTavilySearchTool, createTavilyExtractTool } from '@mastra/tavily';\nimport { z } from 'zod';\n\nimport { loadSettings, type WebSearchProviderSetting } from '../onboarding/settings.js';\nimport { truncateStringForTokenEstimate } from '../utils/token-estimator.js';\n\nconst MAX_WEB_SEARCH_TOKENS = 2_000;\nconst MAX_WEB_EXTRACT_TOKENS = 2_000;\n\nconst MIN_RELEVANCE_SCORE = 0.25;\n\nconst parallelWebSearchInputSchema = z.object({\n query: z.string().min(1).describe('The search query'),\n});\n\nfunction requireParallelOutput<T>(output: T | ValidationError | void, operation: 'search' | 'extract'): T {\n if (output === undefined) {\n throw new Error(`Parallel ${operation} returned no output`);\n }\n\n if (isValidationError(output)) {\n throw new Error(output.message);\n }\n\n return output;\n}\n\n/**\n * Check whether a Tavily API key is available in the environment.\n * Used to select model-independent web tools before falling back to\n * model-native web search.\n */\nexport function hasTavilyKey(): boolean {\n return !!process.env.TAVILY_API_KEY;\n}\n\n/** Check whether a Parallel API key is available in the environment. */\nexport function hasParallelKey(): boolean {\n return !!process.env.PARALLEL_API_KEY;\n}\n\n/**\n * Wraps the @mastra/tavily search tool with mastracode-specific behavior:\n * relevance filtering, markdown string formatting, and token truncation.\n * The underlying Tavily tool handles client init, input validation, and the API call.\n */\nexport function createWebSearchTool() {\n const tavilySearchTool = createTavilySearchTool();\n\n return createTool({\n id: 'web-search',\n description: tavilySearchTool.description!,\n inputSchema: tavilySearchTool.inputSchema!,\n execute: async (input, context) => {\n const output: any = await tavilySearchTool.execute!(input as any, context as any);\n\n const parts: string[] = [];\n\n if (output.answer) {\n parts.push(`Answer: ${output.answer}`);\n }\n\n const filtered = output.results.filter((r: any) => (r.score ?? 1) >= MIN_RELEVANCE_SCORE);\n for (const r of filtered) {\n parts.push(`## ${r.title}\\n${r.url}\\n${r.content}`);\n }\n\n const images = (output.images || []).map((img: any) => img.url).filter(Boolean);\n if (images.length > 0) {\n parts.push(`Images:\\n${images.join('\\n')}`);\n }\n\n const text = parts.join('\\n\\n');\n return truncateStringForTokenEstimate(text, MAX_WEB_SEARCH_TOKENS);\n },\n });\n}\n\n/**\n * Wraps the @mastra/tavily extract tool with mastracode-specific behavior:\n * markdown string formatting and token truncation.\n */\nexport function createWebExtractTool() {\n const tavilyExtractTool = createTavilyExtractTool();\n\n return createTool({\n id: 'web-extract',\n description: tavilyExtractTool.description!,\n inputSchema: tavilyExtractTool.inputSchema!,\n execute: async (input, context) => {\n const output: any = await tavilyExtractTool.execute!(input as any, context as any);\n\n const parts: string[] = [];\n\n for (const r of output.results) {\n parts.push(`## ${r.url}\\n${r.rawContent}`);\n }\n\n for (const r of output.failedResults) {\n parts.push(`## ${r.url}\\nError: ${r.error}`);\n }\n\n const text = parts.join('\\n\\n');\n return truncateStringForTokenEstimate(text, MAX_WEB_EXTRACT_TOKENS);\n },\n });\n}\n\n/**\n * Wraps the @mastra/parallel search tool with Mastra Code's standard tool id,\n * markdown string output, and token truncation.\n */\nexport function createParallelWebSearchTool() {\n const parallelSearchTool = createParallelSearchTool();\n\n return createTool({\n id: 'web-search',\n description: parallelSearchTool.description!,\n inputSchema: parallelWebSearchInputSchema,\n execute: async (input, context) => {\n const output = requireParallelOutput(\n await parallelSearchTool.execute!({ searchQueries: [input.query] }, context),\n 'search',\n );\n const parts: string[] = [];\n\n for (const result of output.results) {\n const title = result.title || result.url;\n const excerpts = (result.excerpts || []).filter(Boolean).join('\\n');\n parts.push([`## ${title}`, result.url, excerpts].filter(Boolean).join('\\n'));\n }\n\n return truncateStringForTokenEstimate(parts.join('\\n\\n'), MAX_WEB_SEARCH_TOKENS);\n },\n });\n}\n\n/**\n * Wraps the @mastra/parallel extract tool with Mastra Code's standard tool id,\n * markdown string output, and token truncation.\n */\nexport function createParallelWebExtractTool() {\n const parallelExtractTool = createParallelExtractTool();\n\n return createTool({\n id: 'web-extract',\n description: parallelExtractTool.description!,\n inputSchema: parallelExtractTool.inputSchema!,\n execute: async (input, context) => {\n const output = requireParallelOutput(await parallelExtractTool.execute!(input, context), 'extract');\n const parts: string[] = [];\n\n for (const result of output.results) {\n const content = result.fullContent || (result.excerpts || []).filter(Boolean).join('\\n');\n parts.push([`## ${result.url}`, content].filter(Boolean).join('\\n'));\n }\n\n for (const error of output.errors) {\n const status = error.httpStatusCode ? ` (${error.httpStatusCode})` : '';\n parts.push([`## ${error.url}`, `Error: ${error.errorType}${status}`, error.content].filter(Boolean).join('\\n'));\n }\n\n return truncateStringForTokenEstimate(parts.join('\\n\\n'), MAX_WEB_EXTRACT_TOKENS);\n },\n });\n}\n\n/**\n * Resolve which model-independent web provider to use. An explicit user\n * preference wins while its API key is configured; otherwise `auto` picks the\n * first configured provider key (Tavily, then Parallel).\n */\nexport function resolveWebSearchProvider(\n preference: WebSearchProviderSetting = 'auto',\n): 'tavily' | 'parallel' | undefined {\n if (preference === 'tavily' && hasTavilyKey()) return 'tavily';\n if (preference === 'parallel' && hasParallelKey()) return 'parallel';\n\n // `auto`, or an explicit choice whose key is no longer configured.\n if (hasTavilyKey()) return 'tavily';\n if (hasParallelKey()) return 'parallel';\n return undefined;\n}\n\n/**\n * Create the configured model-independent web tools for the provider selected\n * via the `webSearchProvider` preference (set in the TUI settings panel).\n */\nexport function createConfiguredWebTools() {\n const provider = resolveWebSearchProvider(loadSettings().preferences.webSearchProvider);\n\n if (provider === 'parallel') {\n return {\n web_search: createParallelWebSearchTool(),\n web_extract: createParallelWebExtractTool(),\n };\n }\n\n if (provider === 'tavily') {\n return {\n web_search: createWebSearchTool(),\n web_extract: createWebExtractTool(),\n };\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;AAQA,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAE/B,MAAM,sBAAsB;AAE5B,MAAM,+BAA+B,EAAE,OAAO,EAC5C,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB,EACtD,CAAC;AAED,SAAS,sBAAyB,QAAoC,WAAoC;CACxG,IAAI,WAAW,KAAA,GACb,MAAM,IAAI,MAAM,YAAY,UAAU,oBAAoB;CAG5D,IAAI,kBAAkB,MAAM,GAC1B,MAAM,IAAI,MAAM,OAAO,OAAO;CAGhC,OAAO;AACT;;;;;;AAOA,SAAgB,eAAwB;CACtC,OAAO,CAAC,CAAC,QAAQ,IAAI;AACvB;;AAGA,SAAgB,iBAA0B;CACxC,OAAO,CAAC,CAAC,QAAQ,IAAI;AACvB;;;;;;AAOA,SAAgB,sBAAsB;CACpC,MAAM,mBAAmB,uBAAuB;CAEhD,OAAO,WAAW;EAChB,IAAI;EACJ,aAAa,iBAAiB;EAC9B,aAAa,iBAAiB;EAC9B,SAAS,OAAO,OAAO,YAAY;GACjC,MAAM,SAAc,MAAM,iBAAiB,QAAS,OAAc,OAAc;GAEhF,MAAM,QAAkB,CAAC;GAEzB,IAAI,OAAO,QACT,MAAM,KAAK,WAAW,OAAO,QAAQ;GAGvC,MAAM,WAAW,OAAO,QAAQ,QAAQ,OAAY,EAAE,SAAS,MAAM,mBAAmB;GACxF,KAAK,MAAM,KAAK,UACd,MAAM,KAAK,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,IAAI,EAAE,SAAS;GAGpD,MAAM,UAAU,OAAO,UAAU,CAAC,EAAA,CAAG,KAAK,QAAa,IAAI,GAAG,CAAC,CAAC,OAAO,OAAO;GAC9E,IAAI,OAAO,SAAS,GAClB,MAAM,KAAK,YAAY,OAAO,KAAK,IAAI,GAAG;GAI5C,OAAO,+BADM,MAAM,KAAK,MACiB,GAAG,qBAAqB;EACnE;CACF,CAAC;AACH;;;;;AAMA,SAAgB,uBAAuB;CACrC,MAAM,oBAAoB,wBAAwB;CAElD,OAAO,WAAW;EAChB,IAAI;EACJ,aAAa,kBAAkB;EAC/B,aAAa,kBAAkB;EAC/B,SAAS,OAAO,OAAO,YAAY;GACjC,MAAM,SAAc,MAAM,kBAAkB,QAAS,OAAc,OAAc;GAEjF,MAAM,QAAkB,CAAC;GAEzB,KAAK,MAAM,KAAK,OAAO,SACrB,MAAM,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,YAAY;GAG3C,KAAK,MAAM,KAAK,OAAO,eACrB,MAAM,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,OAAO;GAI7C,OAAO,+BADM,MAAM,KAAK,MACiB,GAAG,sBAAsB;EACpE;CACF,CAAC;AACH;;;;;AAMA,SAAgB,8BAA8B;CAC5C,MAAM,qBAAqB,yBAAyB;CAEpD,OAAO,WAAW;EAChB,IAAI;EACJ,aAAa,mBAAmB;EAChC,aAAa;EACb,SAAS,OAAO,OAAO,YAAY;GACjC,MAAM,SAAS,sBACb,MAAM,mBAAmB,QAAS,EAAE,eAAe,CAAC,MAAM,KAAK,EAAE,GAAG,OAAO,GAC3E,QACF;GACA,MAAM,QAAkB,CAAC;GAEzB,KAAK,MAAM,UAAU,OAAO,SAAS;IACnC,MAAM,QAAQ,OAAO,SAAS,OAAO;IACrC,MAAM,YAAY,OAAO,YAAY,CAAC,EAAA,CAAG,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI;IAClE,MAAM,KAAK;KAAC,MAAM;KAAS,OAAO;KAAK;IAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;GAC7E;GAEA,OAAO,+BAA+B,MAAM,KAAK,MAAM,GAAG,qBAAqB;EACjF;CACF,CAAC;AACH;;;;;AAMA,SAAgB,+BAA+B;CAC7C,MAAM,sBAAsB,0BAA0B;CAEtD,OAAO,WAAW;EAChB,IAAI;EACJ,aAAa,oBAAoB;EACjC,aAAa,oBAAoB;EACjC,SAAS,OAAO,OAAO,YAAY;GACjC,MAAM,SAAS,sBAAsB,MAAM,oBAAoB,QAAS,OAAO,OAAO,GAAG,SAAS;GAClG,MAAM,QAAkB,CAAC;GAEzB,KAAK,MAAM,UAAU,OAAO,SAAS;IACnC,MAAM,UAAU,OAAO,gBAAgB,OAAO,YAAY,CAAC,EAAA,CAAG,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI;IACvF,MAAM,KAAK,CAAC,MAAM,OAAO,OAAO,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;GACrE;GAEA,KAAK,MAAM,SAAS,OAAO,QAAQ;IACjC,MAAM,SAAS,MAAM,iBAAiB,KAAK,MAAM,eAAe,KAAK;IACrE,MAAM,KAAK;KAAC,MAAM,MAAM;KAAO,UAAU,MAAM,YAAY;KAAU,MAAM;IAAO,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;GAChH;GAEA,OAAO,+BAA+B,MAAM,KAAK,MAAM,GAAG,sBAAsB;EAClF;CACF,CAAC;AACH;;;;;;AAOA,SAAgB,yBACd,aAAuC,QACJ;CACnC,IAAI,eAAe,YAAY,aAAa,GAAG,OAAO;CACtD,IAAI,eAAe,cAAc,eAAe,GAAG,OAAO;CAG1D,IAAI,aAAa,GAAG,OAAO;CAC3B,IAAI,eAAe,GAAG,OAAO;AAE/B;;;;;AAMA,SAAgB,2BAA2B;CACzC,MAAM,WAAW,yBAAyB,aAAa,CAAC,CAAC,YAAY,iBAAiB;CAEtF,IAAI,aAAa,YACf,OAAO;EACL,YAAY,4BAA4B;EACxC,aAAa,6BAA6B;CAC5C;CAGF,IAAI,aAAa,UACf,OAAO;EACL,YAAY,oBAAoB;EAChC,aAAa,qBAAqB;CACpC;AAIJ"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const createWorkflowTool: import("@mastra/core/tools").Tool<{
|
|
2
|
+
request: string;
|
|
3
|
+
}, {
|
|
4
|
+
summary: string;
|
|
5
|
+
workflowId?: string | undefined;
|
|
6
|
+
}, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "create-workflow", unknown>;
|
|
7
|
+
//# sourceMappingURL=create-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-workflow.d.ts","sourceRoot":"","sources":["../../../src/tools/workflows/create-workflow.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,kBAAkB;;;;;8HAsG7B,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { createTool } from "@mastra/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
//#region src/tools/workflows/create-workflow.ts
|
|
4
|
+
/**
|
|
5
|
+
* Coerce an unknown thrown value into a readable string. Sub-agent tool errors
|
|
6
|
+
* come through the stream in various shapes (Error, plain object, string) —
|
|
7
|
+
* normalise so the parent tool's error message is always useful.
|
|
8
|
+
*/
|
|
9
|
+
function stringifyError(err) {
|
|
10
|
+
if (err instanceof Error) return err.message;
|
|
11
|
+
if (typeof err === "string") return err;
|
|
12
|
+
try {
|
|
13
|
+
return JSON.stringify(err) ?? String(err);
|
|
14
|
+
} catch {
|
|
15
|
+
return String(err);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const createWorkflowTool = createTool({
|
|
19
|
+
id: "create-workflow",
|
|
20
|
+
description: "Build and save a Dynamic Workflow on behalf of the user. Pass the user request verbatim — a focused sub-agent handles discovery, construction, and persistence, then returns a summary. Use this whenever the user asks to \"build a workflow\", \"compose a workflow\", or similar. Do NOT try to construct workflows inline yourself.",
|
|
21
|
+
inputSchema: z.object({ request: z.string().describe("The user request, verbatim — do not paraphrase or summarise.") }),
|
|
22
|
+
outputSchema: z.object({
|
|
23
|
+
summary: z.string().describe("Natural-language summary of what the sub-agent built. Relay this to the user."),
|
|
24
|
+
workflowId: z.string().optional().describe("The id of the saved workflow, if save-workflow returned ok.")
|
|
25
|
+
}),
|
|
26
|
+
execute: async ({ request }, { mastra, requestContext }) => {
|
|
27
|
+
if (!mastra) throw new Error("create-workflow requires a Mastra context.");
|
|
28
|
+
const builder = mastra.getAgent("workflow-builder");
|
|
29
|
+
if (!builder) throw new Error("The \"workflow-builder\" sub-agent is not registered on this Mastra instance. Cannot build workflows.");
|
|
30
|
+
const stream = await builder.stream(request, { requestContext });
|
|
31
|
+
let workflowId;
|
|
32
|
+
let saveAttempted = false;
|
|
33
|
+
let saveSucceeded = false;
|
|
34
|
+
const toolErrors = [];
|
|
35
|
+
const reader = stream.fullStream.getReader();
|
|
36
|
+
let streamCompleted = false;
|
|
37
|
+
try {
|
|
38
|
+
while (true) {
|
|
39
|
+
const { value, done } = await reader.read();
|
|
40
|
+
if (done) {
|
|
41
|
+
streamCompleted = true;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
if (value?.type === "tool-call" && value.payload?.toolName === "save-workflow") saveAttempted = true;
|
|
45
|
+
if (value?.type === "tool-result" && value.payload?.toolName === "save-workflow") {
|
|
46
|
+
const result = value.payload.result;
|
|
47
|
+
if (result && result.ok === true && typeof result.id === "string") {
|
|
48
|
+
workflowId = result.id;
|
|
49
|
+
saveSucceeded = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (value?.type === "tool-error" && typeof value.payload?.toolName === "string") toolErrors.push({
|
|
53
|
+
toolName: value.payload.toolName,
|
|
54
|
+
error: stringifyError(value.payload.error)
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
} finally {
|
|
58
|
+
if (!streamCompleted) await reader.cancel().catch(() => void 0);
|
|
59
|
+
reader.releaseLock();
|
|
60
|
+
}
|
|
61
|
+
const summary = await stream.text;
|
|
62
|
+
const saveErrors = toolErrors.filter((e) => e.toolName === "save-workflow");
|
|
63
|
+
if (saveErrors.length > 0 && !saveSucceeded) throw new Error(`create-workflow failed: save-workflow threw ${saveErrors.length} error(s):\n- ${saveErrors.map((e) => e.error).join("\n- ")}\n\nSub-agent summary (unreliable, save did not succeed):\n${summary}`);
|
|
64
|
+
if (!saveAttempted) {
|
|
65
|
+
const otherErrors = toolErrors.length ? `\n\nOther sub-agent tool errors:\n- ${toolErrors.map((e) => `${e.toolName}: ${e.error}`).join("\n- ")}` : "";
|
|
66
|
+
throw new Error(`create-workflow failed: the workflow-builder sub-agent never called save-workflow. No workflow was persisted.${otherErrors}\n\nSub-agent summary:\n${summary}`);
|
|
67
|
+
}
|
|
68
|
+
if (!saveSucceeded) {
|
|
69
|
+
const otherErrors = toolErrors.length ? `\n\nSub-agent tool errors:\n- ${toolErrors.map((e) => `${e.toolName}: ${e.error}`).join("\n- ")}` : "";
|
|
70
|
+
throw new Error(`create-workflow failed: save-workflow was called but did not return { ok: true }.${otherErrors}\n\nSub-agent summary:\n${summary}`);
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
summary,
|
|
74
|
+
workflowId
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
//#endregion
|
|
79
|
+
export { createWorkflowTool };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=create-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-workflow.js","names":[],"sources":["../../../src/tools/workflows/create-workflow.ts"],"sourcesContent":["/**\n * Parent-mode tool: delegate workflow construction to the workflow-builder\n * sub-agent. The parent code-agent calls this with the user's request verbatim;\n * the sub-agent runs its own discovery → compose → save loop and returns a\n * one-paragraph summary the parent relays to the user.\n *\n * The split exists so the parent code-agent's system prompt stays focused on\n * coding and isn't polluted with the long workflow-authoring contract.\n */\nimport type { Mastra } from '@mastra/core/mastra';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\n\n/**\n * Coerce an unknown thrown value into a readable string. Sub-agent tool errors\n * come through the stream in various shapes (Error, plain object, string) —\n * normalise so the parent tool's error message is always useful.\n */\nfunction stringifyError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === 'string') return err;\n try {\n return JSON.stringify(err) ?? String(err);\n } catch {\n return String(err);\n }\n}\n\nexport const createWorkflowTool = createTool({\n id: 'create-workflow',\n description:\n 'Build and save a Dynamic Workflow on behalf of the user. Pass the user request verbatim — a focused sub-agent handles discovery, construction, and persistence, then returns a summary. Use this whenever the user asks to \"build a workflow\", \"compose a workflow\", or similar. Do NOT try to construct workflows inline yourself.',\n inputSchema: z.object({\n request: z.string().describe('The user request, verbatim — do not paraphrase or summarise.'),\n }),\n outputSchema: z.object({\n summary: z.string().describe('Natural-language summary of what the sub-agent built. Relay this to the user.'),\n workflowId: z.string().optional().describe('The id of the saved workflow, if save-workflow returned ok.'),\n }),\n execute: async ({ request }, { mastra, requestContext }) => {\n if (!mastra) throw new Error('create-workflow requires a Mastra context.');\n const builder = (mastra as Mastra).getAgent('workflow-builder' as never);\n if (!builder) {\n throw new Error(\n 'The \"workflow-builder\" sub-agent is not registered on this Mastra instance. Cannot build workflows.',\n );\n }\n\n // Propagate the parent code-agent's requestContext so the sub-agent's\n // dynamic model resolver (getDynamicModel) sees controller.session.modelId.\n // Without this the sub-agent throws \"No model selected\" even when the user\n // has /models configured for the main code-agent.\n const stream = await builder.stream(request, { requestContext });\n\n // Sub-agent runs its own tool loop. We MUST verify save-workflow actually\n // ran and returned ok — otherwise the sub-agent's natural-language \"summary\"\n // is worthless (it will happily claim success without ever calling the tool,\n // or claim success after save-workflow threw). Surface every error the\n // sub-agent's tools produce so the caller sees them instead of a fake ok.\n let workflowId: string | undefined;\n let saveAttempted = false;\n let saveSucceeded = false;\n const toolErrors: Array<{ toolName: string; error: string }> = [];\n\n const reader = stream.fullStream.getReader();\n let streamCompleted = false;\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n streamCompleted = true;\n break;\n }\n if (value?.type === 'tool-call' && value.payload?.toolName === 'save-workflow') {\n saveAttempted = true;\n }\n if (value?.type === 'tool-result' && value.payload?.toolName === 'save-workflow') {\n const result = value.payload.result as { id?: string; ok?: boolean } | undefined;\n if (result && result.ok === true && typeof result.id === 'string') {\n workflowId = result.id;\n saveSucceeded = true;\n }\n }\n if (value?.type === 'tool-error' && typeof value.payload?.toolName === 'string') {\n toolErrors.push({ toolName: value.payload.toolName, error: stringifyError(value.payload.error) });\n }\n }\n } finally {\n if (!streamCompleted) {\n await reader.cancel().catch(() => undefined);\n }\n reader.releaseLock();\n }\n\n const summary = await stream.text;\n\n // If save-workflow errored, surface that error explicitly — do NOT return\n // the sub-agent's summary as if things were fine.\n const saveErrors = toolErrors.filter(e => e.toolName === 'save-workflow');\n if (saveErrors.length > 0 && !saveSucceeded) {\n throw new Error(\n `create-workflow failed: save-workflow threw ${saveErrors.length} error(s):\\n- ${saveErrors\n .map(e => e.error)\n .join('\\n- ')}\\n\\nSub-agent summary (unreliable, save did not succeed):\\n${summary}`,\n );\n }\n\n // If save-workflow was never called, the sub-agent gave up (or hallucinated\n // success). Fail loudly so the caller doesn't think a workflow exists.\n if (!saveAttempted) {\n const otherErrors = toolErrors.length\n ? `\\n\\nOther sub-agent tool errors:\\n- ${toolErrors.map(e => `${e.toolName}: ${e.error}`).join('\\n- ')}`\n : '';\n throw new Error(\n `create-workflow failed: the workflow-builder sub-agent never called save-workflow. No workflow was persisted.${otherErrors}\\n\\nSub-agent summary:\\n${summary}`,\n );\n }\n\n // Save was attempted but never returned ok (no tool-result with { ok: true, id }).\n if (!saveSucceeded) {\n const otherErrors = toolErrors.length\n ? `\\n\\nSub-agent tool errors:\\n- ${toolErrors.map(e => `${e.toolName}: ${e.error}`).join('\\n- ')}`\n : '';\n throw new Error(\n `create-workflow failed: save-workflow was called but did not return { ok: true }.${otherErrors}\\n\\nSub-agent summary:\\n${summary}`,\n );\n }\n\n return { summary, workflowId };\n },\n});\n"],"mappings":";;;;;;;;AAkBA,SAAS,eAAe,KAAsB;CAC5C,IAAI,eAAe,OAAO,OAAO,IAAI;CACrC,IAAI,OAAO,QAAQ,UAAU,OAAO;CACpC,IAAI;EACF,OAAO,KAAK,UAAU,GAAG,KAAK,OAAO,GAAG;CAC1C,QAAQ;EACN,OAAO,OAAO,GAAG;CACnB;AACF;AAEA,MAAa,qBAAqB,WAAW;CAC3C,IAAI;CACJ,aACE;CACF,aAAa,EAAE,OAAO,EACpB,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,8DAA8D,EAC7F,CAAC;CACD,cAAc,EAAE,OAAO;EACrB,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,+EAA+E;EAC5G,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,6DAA6D;CAC1G,CAAC;CACD,SAAS,OAAO,EAAE,WAAW,EAAE,QAAQ,qBAAqB;EAC1D,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,4CAA4C;EACzE,MAAM,UAAW,OAAkB,SAAS,kBAA2B;EACvE,IAAI,CAAC,SACH,MAAM,IAAI,MACR,uGACF;EAOF,MAAM,SAAS,MAAM,QAAQ,OAAO,SAAS,EAAE,eAAe,CAAC;EAO/D,IAAI;EACJ,IAAI,gBAAgB;EACpB,IAAI,gBAAgB;EACpB,MAAM,aAAyD,CAAC;EAEhE,MAAM,SAAS,OAAO,WAAW,UAAU;EAC3C,IAAI,kBAAkB;EACtB,IAAI;GACF,OAAO,MAAM;IACX,MAAM,EAAE,OAAO,SAAS,MAAM,OAAO,KAAK;IAC1C,IAAI,MAAM;KACR,kBAAkB;KAClB;IACF;IACA,IAAI,OAAO,SAAS,eAAe,MAAM,SAAS,aAAa,iBAC7D,gBAAgB;IAElB,IAAI,OAAO,SAAS,iBAAiB,MAAM,SAAS,aAAa,iBAAiB;KAChF,MAAM,SAAS,MAAM,QAAQ;KAC7B,IAAI,UAAU,OAAO,OAAO,QAAQ,OAAO,OAAO,OAAO,UAAU;MACjE,aAAa,OAAO;MACpB,gBAAgB;KAClB;IACF;IACA,IAAI,OAAO,SAAS,gBAAgB,OAAO,MAAM,SAAS,aAAa,UACrE,WAAW,KAAK;KAAE,UAAU,MAAM,QAAQ;KAAU,OAAO,eAAe,MAAM,QAAQ,KAAK;IAAE,CAAC;GAEpG;EACF,UAAU;GACR,IAAI,CAAC,iBACH,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;GAE7C,OAAO,YAAY;EACrB;EAEA,MAAM,UAAU,MAAM,OAAO;EAI7B,MAAM,aAAa,WAAW,QAAO,MAAK,EAAE,aAAa,eAAe;EACxE,IAAI,WAAW,SAAS,KAAK,CAAC,eAC5B,MAAM,IAAI,MACR,+CAA+C,WAAW,OAAO,gBAAgB,WAC9E,KAAI,MAAK,EAAE,KAAK,CAAC,CACjB,KAAK,MAAM,EAAE,6DAA6D,SAC/E;EAKF,IAAI,CAAC,eAAe;GAClB,MAAM,cAAc,WAAW,SAC3B,uCAAuC,WAAW,KAAI,MAAK,GAAG,EAAE,SAAS,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,MAAM,MACnG;GACJ,MAAM,IAAI,MACR,gHAAgH,YAAY,0BAA0B,SACxJ;EACF;EAGA,IAAI,CAAC,eAAe;GAClB,MAAM,cAAc,WAAW,SAC3B,iCAAiC,WAAW,KAAI,MAAK,GAAG,EAAE,SAAS,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,MAAM,MAC7F;GACJ,MAAM,IAAI,MACR,oFAAoF,YAAY,0BAA0B,SAC5H;EACF;EAEA,OAAO;GAAE;GAAS;EAAW;CAC/B;AACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const deleteWorkflowTool: import("@mastra/core/tools").Tool<{
|
|
2
|
+
id: string;
|
|
3
|
+
}, {
|
|
4
|
+
ok: true;
|
|
5
|
+
id: string;
|
|
6
|
+
}, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "delete-workflow", unknown>;
|
|
7
|
+
//# sourceMappingURL=delete-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-workflow.d.ts","sourceRoot":"","sources":["../../../src/tools/workflows/delete-workflow.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,kBAAkB;;;;;8HAe7B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { deleteWorkflow } from "../../workflows/service.js";
|
|
2
|
+
import { createTool } from "@mastra/core/tools";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
//#region src/tools/workflows/delete-workflow.ts
|
|
5
|
+
const deleteWorkflowTool = createTool({
|
|
6
|
+
id: "delete-workflow",
|
|
7
|
+
description: "Remove a saved workflow from storage and unregister the live in-process Workflow instance. Idempotent. Subsequent save-workflow calls with the same id re-register cleanly.",
|
|
8
|
+
inputSchema: z.object({ id: z.string().describe("The workflow id to delete.") }),
|
|
9
|
+
outputSchema: z.object({
|
|
10
|
+
ok: z.literal(true),
|
|
11
|
+
id: z.string()
|
|
12
|
+
}),
|
|
13
|
+
execute: async ({ id }, { mastra }) => {
|
|
14
|
+
if (!mastra) throw new Error("delete-workflow requires a Mastra context.");
|
|
15
|
+
return deleteWorkflow(mastra, id);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
//#endregion
|
|
19
|
+
export { deleteWorkflowTool };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=delete-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-workflow.js","names":[],"sources":["../../../src/tools/workflows/delete-workflow.ts"],"sourcesContent":["/**\n * Parent-mode tool: delete a saved workflow from storage and unregister the\n * live in-process Workflow instance so a subsequent save-workflow with the\n * same id re-registers cleanly.\n */\nimport type { Mastra } from '@mastra/core/mastra';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\nimport { deleteWorkflow } from '../../workflows/service.js';\n\nexport const deleteWorkflowTool = createTool({\n id: 'delete-workflow',\n description:\n 'Remove a saved workflow from storage and unregister the live in-process Workflow instance. Idempotent. Subsequent save-workflow calls with the same id re-register cleanly.',\n inputSchema: z.object({\n id: z.string().describe('The workflow id to delete.'),\n }),\n outputSchema: z.object({\n ok: z.literal(true),\n id: z.string(),\n }),\n execute: async ({ id }, { mastra }) => {\n if (!mastra) throw new Error('delete-workflow requires a Mastra context.');\n return deleteWorkflow(mastra as Mastra, id);\n },\n});\n"],"mappings":";;;;AAUA,MAAa,qBAAqB,WAAW;CAC3C,IAAI;CACJ,aACE;CACF,aAAa,EAAE,OAAO,EACpB,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,4BAA4B,EACtD,CAAC;CACD,cAAc,EAAE,OAAO;EACrB,IAAI,EAAE,QAAQ,IAAI;EAClB,IAAI,EAAE,OAAO;CACf,CAAC;CACD,SAAS,OAAO,EAAE,MAAM,EAAE,aAAa;EACrC,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,4CAA4C;EACzE,OAAO,eAAe,QAAkB,EAAE;CAC5C;AACF,CAAC"}
|