@mastra/code-sdk 0.0.0-aggregate-trace-20261015182851
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 +284 -0
- package/dist/acp/agent.d.ts +48 -0
- package/dist/acp/agent.d.ts.map +1 -0
- package/dist/acp/agent.js +416 -0
- package/dist/acp/agent.js.map +1 -0
- package/dist/acp/errors.d.ts +3 -0
- package/dist/acp/errors.d.ts.map +1 -0
- package/dist/acp/errors.js +14 -0
- package/dist/acp/errors.js.map +1 -0
- package/dist/acp/event-mapper.d.ts +28 -0
- package/dist/acp/event-mapper.d.ts.map +1 -0
- package/dist/acp/event-mapper.js +279 -0
- package/dist/acp/event-mapper.js.map +1 -0
- package/dist/acp/index.d.ts +9 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +24 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/runtime.d.ts +5 -0
- package/dist/acp/runtime.d.ts.map +1 -0
- package/dist/acp/runtime.js +91 -0
- package/dist/acp/runtime.js.map +1 -0
- package/dist/acp/server.d.ts +4 -0
- package/dist/acp/server.d.ts.map +1 -0
- package/dist/acp/server.js +38 -0
- package/dist/acp/server.js.map +1 -0
- package/dist/acp/skills.d.ts +6 -0
- package/dist/acp/skills.d.ts.map +1 -0
- package/dist/acp/skills.js +33 -0
- package/dist/acp/skills.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/agent-connections/messaging-processor.d.ts +17 -0
- package/dist/agent-connections/messaging-processor.d.ts.map +1 -0
- package/dist/agent-connections/messaging-processor.js +134 -0
- package/dist/agent-connections/messaging-processor.js.map +1 -0
- package/dist/agent-connections/ownership.d.ts +24 -0
- package/dist/agent-connections/ownership.d.ts.map +1 -0
- package/dist/agent-connections/ownership.js +99 -0
- package/dist/agent-connections/ownership.js.map +1 -0
- package/dist/agent-connections/registry.d.ts +20 -0
- package/dist/agent-connections/registry.d.ts.map +1 -0
- package/dist/agent-connections/registry.js +170 -0
- package/dist/agent-connections/registry.js.map +1 -0
- package/dist/agent-connections/session-advertisement.d.ts +27 -0
- package/dist/agent-connections/session-advertisement.d.ts.map +1 -0
- package/dist/agent-connections/session-advertisement.js +89 -0
- package/dist/agent-connections/session-advertisement.js.map +1 -0
- package/dist/agent-connections/signal-provider.d.ts +141 -0
- package/dist/agent-connections/signal-provider.d.ts.map +1 -0
- package/dist/agent-connections/signal-provider.js +38 -0
- package/dist/agent-connections/signal-provider.js.map +1 -0
- package/dist/agent-connections/state-processor.d.ts +23 -0
- package/dist/agent-connections/state-processor.d.ts.map +1 -0
- package/dist/agent-connections/state-processor.js +273 -0
- package/dist/agent-connections/state-processor.js.map +1 -0
- package/dist/agent-connections/thread-state.d.ts +41 -0
- package/dist/agent-connections/thread-state.d.ts.map +1 -0
- package/dist/agent-connections/thread-state.js +160 -0
- package/dist/agent-connections/thread-state.js.map +1 -0
- package/dist/agent-connections/tools.d.ts +133 -0
- package/dist/agent-connections/tools.d.ts.map +1 -0
- package/dist/agent-connections/tools.js +552 -0
- package/dist/agent-connections/tools.js.map +1 -0
- package/dist/agent-connections/types.d.ts +99 -0
- package/dist/agent-connections/types.d.ts.map +1 -0
- package/dist/agent-connections/types.js +7 -0
- package/dist/agent-connections/types.js.map +1 -0
- package/dist/agent-connections/untrusted-text.d.ts +5 -0
- package/dist/agent-connections/untrusted-text.d.ts.map +1 -0
- package/dist/agent-connections/untrusted-text.js +22 -0
- package/dist/agent-connections/untrusted-text.js.map +1 -0
- package/dist/agents/background-completion-events.d.ts +16 -0
- package/dist/agents/background-completion-events.d.ts.map +1 -0
- package/dist/agents/background-completion-events.js +19 -0
- package/dist/agents/background-completion-events.js.map +1 -0
- package/dist/agents/background-completion.d.ts +9 -0
- package/dist/agents/background-completion.d.ts.map +1 -0
- package/dist/agents/background-completion.js +59 -0
- package/dist/agents/background-completion.js.map +1 -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 +67 -0
- package/dist/agents/credential-resolver.d.ts.map +1 -0
- package/dist/agents/credential-resolver.js +136 -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 +40 -0
- package/dist/agents/instructions.d.ts.map +1 -0
- package/dist/agents/instructions.js +63 -0
- package/dist/agents/instructions.js.map +1 -0
- package/dist/agents/mastracode-gateway.d.ts +76 -0
- package/dist/agents/mastracode-gateway.d.ts.map +1 -0
- package/dist/agents/mastracode-gateway.js +434 -0
- package/dist/agents/mastracode-gateway.js.map +1 -0
- package/dist/agents/memory.d.ts +39 -0
- package/dist/agents/memory.d.ts.map +1 -0
- package/dist/agents/memory.js +266 -0
- package/dist/agents/memory.js.map +1 -0
- package/dist/agents/model.d.ts +123 -0
- package/dist/agents/model.d.ts.map +1 -0
- package/dist/agents/model.js +295 -0
- package/dist/agents/model.js.map +1 -0
- package/dist/agents/modes/build.d.ts +12 -0
- package/dist/agents/modes/build.d.ts.map +1 -0
- package/dist/agents/modes/build.js +36 -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 +28 -0
- package/dist/agents/modes/explore.js.map +1 -0
- package/dist/agents/modes/plan.d.ts +8 -0
- package/dist/agents/modes/plan.d.ts.map +1 -0
- package/dist/agents/modes/plan.js +46 -0
- package/dist/agents/modes/plan.js.map +1 -0
- package/dist/agents/prompts/agent-instructions.d.ts +99 -0
- package/dist/agents/prompts/agent-instructions.d.ts.map +1 -0
- package/dist/agents/prompts/agent-instructions.js +275 -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 +54 -0
- package/dist/agents/prompts/index.d.ts.map +1 -0
- package/dist/agents/prompts/index.js +127 -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 +8 -0
- package/dist/agents/prompts/plan.d.ts.map +1 -0
- package/dist/agents/prompts/plan.js +129 -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 +181 -0
- package/dist/agents/prompts/tool-guidance.js.map +1 -0
- package/dist/agents/sandbox-filesystem.d.ts +151 -0
- package/dist/agents/sandbox-filesystem.d.ts.map +1 -0
- package/dist/agents/sandbox-filesystem.js +581 -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 +12 -0
- package/dist/agents/tool-availability.d.ts.map +1 -0
- package/dist/agents/tool-availability.js +129 -0
- package/dist/agents/tool-availability.js.map +1 -0
- package/dist/agents/tools.d.ts +37 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +131 -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 +82 -0
- package/dist/agents/workflow-builder-agent.js.map +1 -0
- package/dist/agents/workspace.d.ts +33 -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 +162 -0
- package/dist/analytics.js.map +1 -0
- package/dist/auth/account-rotation-processor.d.ts +182 -0
- package/dist/auth/account-rotation-processor.d.ts.map +1 -0
- package/dist/auth/account-rotation-processor.js +609 -0
- package/dist/auth/account-rotation-processor.js.map +1 -0
- package/dist/auth/account-routing-context.d.ts +13 -0
- package/dist/auth/account-routing-context.d.ts.map +1 -0
- package/dist/auth/account-routing-context.js +41 -0
- package/dist/auth/account-routing-context.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 +13 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +9 -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 +120 -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 +362 -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 +228 -0
- package/dist/auth/providers/kimi-coding.js.map +1 -0
- package/dist/auth/providers/openai-codex.d.ts +141 -0
- package/dist/auth/providers/openai-codex.d.ts.map +1 -0
- package/dist/auth/providers/openai-codex.js +533 -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 +226 -0
- package/dist/auth/providers/xai.js.map +1 -0
- package/dist/auth/storage.d.ts +214 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +774 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/auth/types.d.ts +164 -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 +12 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +20 -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/experimental-agent.d.ts +11 -0
- package/dist/experimental-agent.d.ts.map +1 -0
- package/dist/experimental-agent.js +36 -0
- package/dist/experimental-agent.js.map +1 -0
- package/dist/goal-manager.d.ts +114 -0
- package/dist/goal-manager.d.ts.map +1 -0
- package/dist/goal-manager.js +354 -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 +48 -0
- package/dist/headless/cli.d.ts.map +1 -0
- package/dist/headless/cli.js +239 -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 +203 -0
- package/dist/headless/flags.js.map +1 -0
- package/dist/headless/format.d.ts +39 -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 +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 +408 -0
- package/dist/headless/run-mc.js.map +1 -0
- package/dist/headless/types.d.ts +174 -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 +80 -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 +463 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1305 -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 +123 -0
- package/dist/knowledge-inspector.d.ts.map +1 -0
- package/dist/knowledge-inspector.js +516 -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 +77 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +316 -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 +102 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +650 -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 +139 -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 +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 +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 +47 -0
- package/dist/onboarding/om-settings.d.ts.map +1 -0
- package/dist/onboarding/om-settings.js +83 -0
- package/dist/onboarding/om-settings.js.map +1 -0
- package/dist/onboarding/pack-activation.d.ts +52 -0
- package/dist/onboarding/pack-activation.d.ts.map +1 -0
- package/dist/onboarding/pack-activation.js +108 -0
- package/dist/onboarding/pack-activation.js.map +1 -0
- package/dist/onboarding/packs.d.ts +102 -0
- package/dist/onboarding/packs.d.ts.map +1 -0
- package/dist/onboarding/packs.js +278 -0
- package/dist/onboarding/packs.js.map +1 -0
- package/dist/onboarding/settings.d.ts +538 -0
- package/dist/onboarding/settings.d.ts.map +1 -0
- package/dist/onboarding/settings.js +1060 -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 +142 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plugin.d.ts +156 -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 +87 -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 +260 -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 +499 -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 +144 -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/anthropic-prompt-cache.d.ts +19 -0
- package/dist/providers/anthropic-prompt-cache.d.ts.map +1 -0
- package/dist/providers/anthropic-prompt-cache.js +11 -0
- package/dist/providers/anthropic-prompt-cache.js.map +1 -0
- package/dist/providers/anthropic-thinking.d.ts +5 -0
- package/dist/providers/anthropic-thinking.d.ts.map +1 -0
- package/dist/providers/anthropic-thinking.js +25 -0
- package/dist/providers/anthropic-thinking.js.map +1 -0
- package/dist/providers/claude-max.d.ts +67 -0
- package/dist/providers/claude-max.d.ts.map +1 -0
- package/dist/providers/claude-max.js +226 -0
- package/dist/providers/claude-max.js.map +1 -0
- package/dist/providers/github-copilot-gateway.d.ts +35 -0
- package/dist/providers/github-copilot-gateway.d.ts.map +1 -0
- package/dist/providers/github-copilot-gateway.js +61 -0
- package/dist/providers/github-copilot-gateway.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 +318 -0
- package/dist/providers/github-copilot.js.map +1 -0
- package/dist/providers/google-thinking.d.ts +31 -0
- package/dist/providers/google-thinking.d.ts.map +1 -0
- package/dist/providers/google-thinking.js +67 -0
- package/dist/providers/google-thinking.js.map +1 -0
- package/dist/providers/kimi-coding.d.ts +14 -0
- package/dist/providers/kimi-coding.d.ts.map +1 -0
- package/dist/providers/kimi-coding.js +78 -0
- package/dist/providers/kimi-coding.js.map +1 -0
- package/dist/providers/model-ids.d.ts +30 -0
- package/dist/providers/model-ids.d.ts.map +1 -0
- package/dist/providers/model-ids.js +79 -0
- package/dist/providers/model-ids.js.map +1 -0
- package/dist/providers/openai-codex.d.ts +84 -0
- package/dist/providers/openai-codex.d.ts.map +1 -0
- package/dist/providers/openai-codex.js +347 -0
- package/dist/providers/openai-codex.js.map +1 -0
- package/dist/providers/provider-thinking.d.ts +23 -0
- package/dist/providers/provider-thinking.d.ts.map +1 -0
- package/dist/providers/provider-thinking.js +64 -0
- package/dist/providers/provider-thinking.js.map +1 -0
- package/dist/providers/thinking-request.d.ts +14 -0
- package/dist/providers/thinking-request.d.ts.map +1 -0
- package/dist/providers/thinking-request.js +90 -0
- package/dist/providers/thinking-request.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/schedules/index.d.ts +10 -0
- package/dist/schedules/index.d.ts.map +1 -0
- package/dist/schedules/index.js +6 -0
- package/dist/schedules/interval.d.ts +49 -0
- package/dist/schedules/interval.d.ts.map +1 -0
- package/dist/schedules/interval.js +215 -0
- package/dist/schedules/interval.js.map +1 -0
- package/dist/schedules/prompt.d.ts +36 -0
- package/dist/schedules/prompt.d.ts.map +1 -0
- package/dist/schedules/prompt.js +39 -0
- package/dist/schedules/prompt.js.map +1 -0
- package/dist/schedules/run-script.d.ts +8 -0
- package/dist/schedules/run-script.d.ts.map +1 -0
- package/dist/schedules/run-script.js +83 -0
- package/dist/schedules/run-script.js.map +1 -0
- package/dist/schedules/scheduler.d.ts +101 -0
- package/dist/schedules/scheduler.d.ts.map +1 -0
- package/dist/schedules/scheduler.js +169 -0
- package/dist/schedules/scheduler.js.map +1 -0
- package/dist/schedules/tools.d.ts +57 -0
- package/dist/schedules/tools.d.ts.map +1 -0
- package/dist/schedules/tools.js +220 -0
- package/dist/schedules/tools.js.map +1 -0
- package/dist/schema.d.ts +499 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +134 -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-catalog.d.ts +4 -0
- package/dist/thinking-catalog.d.ts.map +1 -0
- package/dist/thinking-catalog.js +13 -0
- package/dist/thinking-catalog.js.map +1 -0
- package/dist/thinking.d.ts +37 -0
- package/dist/thinking.d.ts.map +1 -0
- package/dist/thinking.js +137 -0
- package/dist/thinking.js.map +1 -0
- package/dist/tool-names.d.ts +77 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tool-names.js +56 -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 +80 -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 +28 -0
- package/dist/tools/workflows/ephemeral-memory.d.ts.map +1 -0
- package/dist/tools/workflows/ephemeral-memory.js +44 -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-classifiers.d.ts +19 -0
- package/dist/tools/workflows/list-available-classifiers.d.ts.map +1 -0
- package/dist/tools/workflows/list-available-classifiers.js +56 -0
- package/dist/tools/workflows/list-available-classifiers.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 +1125 -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 +16 -0
- package/dist/tools/workflows/tool-ids.d.ts.map +1 -0
- package/dist/tools/workflows/tool-ids.js +20 -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/discarding-scores-storage.d.ts +33 -0
- package/dist/utils/discarding-scores-storage.d.ts.map +1 -0
- package/dist/utils/discarding-scores-storage.js +54 -0
- package/dist/utils/discarding-scores-storage.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/maintenance-lock.d.ts +42 -0
- package/dist/utils/maintenance-lock.d.ts.map +1 -0
- package/dist/utils/maintenance-lock.js +199 -0
- package/dist/utils/maintenance-lock.js.map +1 -0
- package/dist/utils/notification-dispatch.d.ts +59 -0
- package/dist/utils/notification-dispatch.d.ts.map +1 -0
- package/dist/utils/notification-dispatch.js +109 -0
- package/dist/utils/notification-dispatch.js.map +1 -0
- package/dist/utils/open-url.d.ts +10 -0
- package/dist/utils/open-url.d.ts.map +1 -0
- package/dist/utils/open-url.js +30 -0
- package/dist/utils/open-url.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/prune-cli.d.ts +24 -0
- package/dist/utils/prune-cli.d.ts.map +1 -0
- package/dist/utils/prune-cli.js +125 -0
- package/dist/utils/prune-cli.js.map +1 -0
- package/dist/utils/signals-pubsub.d.ts +101 -0
- package/dist/utils/signals-pubsub.d.ts.map +1 -0
- package/dist/utils/signals-pubsub.js +410 -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 +121 -0
- package/dist/utils/storage-maintenance.d.ts.map +1 -0
- package/dist/utils/storage-maintenance.js +355 -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 +151 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/dist/utils/update-check.js +432 -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 +107 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { DEFAULT_CONFIG_DIR } from "../constants.js";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { createHash } from "crypto";
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import { execFile, execSync } from "child_process";
|
|
6
|
+
import os from "os";
|
|
7
|
+
//#region src/utils/project.ts
|
|
8
|
+
/**
|
|
9
|
+
* Project detection utilities
|
|
10
|
+
*
|
|
11
|
+
* Detects project identity from git repo or filesystem path.
|
|
12
|
+
* Handles git worktrees by finding the main repository.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Run a git command and return stdout, or undefined if it fails
|
|
16
|
+
*/
|
|
17
|
+
function git(args, cwd) {
|
|
18
|
+
try {
|
|
19
|
+
return execSync(`git ${args}`, {
|
|
20
|
+
cwd,
|
|
21
|
+
encoding: "utf-8",
|
|
22
|
+
stdio: [
|
|
23
|
+
"pipe",
|
|
24
|
+
"pipe",
|
|
25
|
+
"pipe"
|
|
26
|
+
]
|
|
27
|
+
}).trim();
|
|
28
|
+
} catch {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Slugify a string for use in IDs
|
|
34
|
+
*/
|
|
35
|
+
function slugify(str) {
|
|
36
|
+
return str.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a short hash of a string
|
|
40
|
+
*/
|
|
41
|
+
function shortHash(str) {
|
|
42
|
+
return createHash("sha256").update(str).digest("hex").slice(0, 12);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Normalize a git URL to a canonical form for comparison
|
|
46
|
+
* - Removes .git suffix
|
|
47
|
+
* - Converts SSH to HTTPS format for consistency
|
|
48
|
+
* - Lowercases
|
|
49
|
+
*/
|
|
50
|
+
function normalizeGitUrl(url) {
|
|
51
|
+
return url.replace(/\.git$/, "").replace(/^git@([^:]+):/, "https://$1/").replace(/^ssh:\/\/git@/, "https://").toLowerCase();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Detect project info from a directory path
|
|
55
|
+
*/
|
|
56
|
+
function detectProject(projectPath) {
|
|
57
|
+
const absolutePath = path.resolve(projectPath);
|
|
58
|
+
const gitDir = git("rev-parse --git-dir", absolutePath);
|
|
59
|
+
const isGitRepo = gitDir !== void 0;
|
|
60
|
+
let rootPath = absolutePath;
|
|
61
|
+
let gitUrl;
|
|
62
|
+
let gitBranch;
|
|
63
|
+
let isWorktree = false;
|
|
64
|
+
let mainRepoPath;
|
|
65
|
+
if (isGitRepo) {
|
|
66
|
+
rootPath = git("rev-parse --show-toplevel", absolutePath) || absolutePath;
|
|
67
|
+
const commonDir = git("rev-parse --git-common-dir", absolutePath);
|
|
68
|
+
if (commonDir && commonDir !== ".git" && commonDir !== gitDir) {
|
|
69
|
+
isWorktree = true;
|
|
70
|
+
mainRepoPath = path.dirname(path.resolve(rootPath, commonDir));
|
|
71
|
+
}
|
|
72
|
+
gitUrl = git("remote get-url origin", absolutePath);
|
|
73
|
+
if (!gitUrl) {
|
|
74
|
+
const remotes = git("remote", absolutePath);
|
|
75
|
+
if (remotes) {
|
|
76
|
+
const firstRemote = remotes.split("\n")[0];
|
|
77
|
+
if (firstRemote) gitUrl = git(`remote get-url ${firstRemote}`, absolutePath);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
gitBranch = git("rev-parse --abbrev-ref HEAD", absolutePath);
|
|
81
|
+
}
|
|
82
|
+
let resourceIdSource;
|
|
83
|
+
if (gitUrl) resourceIdSource = normalizeGitUrl(gitUrl);
|
|
84
|
+
else if (mainRepoPath) resourceIdSource = mainRepoPath;
|
|
85
|
+
else resourceIdSource = rootPath;
|
|
86
|
+
const baseName = gitUrl ? gitUrl.split("/").pop()?.replace(/\.git$/, "") || "project" : path.basename(rootPath);
|
|
87
|
+
return {
|
|
88
|
+
resourceId: `${slugify(baseName)}-${shortHash(resourceIdSource)}`,
|
|
89
|
+
name: baseName,
|
|
90
|
+
rootPath,
|
|
91
|
+
gitUrl,
|
|
92
|
+
gitBranch,
|
|
93
|
+
isWorktree,
|
|
94
|
+
mainRepoPath
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get the current git branch for a given directory.
|
|
99
|
+
* Lightweight alternative to detectProject() for refreshing just the branch.
|
|
100
|
+
*/
|
|
101
|
+
function getCurrentGitBranch(cwd) {
|
|
102
|
+
return git("rev-parse --abbrev-ref HEAD", cwd);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Async version of getCurrentGitBranch — avoids blocking the event loop
|
|
106
|
+
* with execSync. Falls back to undefined on any failure.
|
|
107
|
+
*/
|
|
108
|
+
function getCurrentGitBranchAsync(cwd) {
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
execFile("git", [
|
|
111
|
+
"rev-parse",
|
|
112
|
+
"--abbrev-ref",
|
|
113
|
+
"HEAD"
|
|
114
|
+
], {
|
|
115
|
+
cwd,
|
|
116
|
+
encoding: "utf-8"
|
|
117
|
+
}, (err, stdout) => {
|
|
118
|
+
if (err) {
|
|
119
|
+
resolve(void 0);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
resolve(stdout.trim() || void 0);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get the application data directory for mastracode
|
|
128
|
+
* - macOS: ~/Library/Application Support/mastracode
|
|
129
|
+
* - Linux: ~/.local/share/mastracode
|
|
130
|
+
* - Windows: %APPDATA%/mastracode
|
|
131
|
+
*/
|
|
132
|
+
function getAppDataDir() {
|
|
133
|
+
if (process.env.MASTRA_APP_DATA_DIR) {
|
|
134
|
+
fs.mkdirSync(process.env.MASTRA_APP_DATA_DIR, { recursive: true });
|
|
135
|
+
return process.env.MASTRA_APP_DATA_DIR;
|
|
136
|
+
}
|
|
137
|
+
const platform = os.platform();
|
|
138
|
+
let baseDir;
|
|
139
|
+
if (platform === "darwin") baseDir = path.join(os.homedir(), "Library", "Application Support");
|
|
140
|
+
else if (platform === "win32") baseDir = process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming");
|
|
141
|
+
else baseDir = process.env.XDG_DATA_HOME || path.join(os.homedir(), ".local", "share");
|
|
142
|
+
const appDir = path.join(baseDir, "mastracode");
|
|
143
|
+
if (!fs.existsSync(appDir)) fs.mkdirSync(appDir, { recursive: true });
|
|
144
|
+
return appDir;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get the database path for mastracode
|
|
148
|
+
* Can be overridden with the MASTRA_DB_PATH environment variable for debugging.
|
|
149
|
+
*/
|
|
150
|
+
function getDatabasePath() {
|
|
151
|
+
if (process.env.MASTRA_DB_PATH) return process.env.MASTRA_DB_PATH;
|
|
152
|
+
return path.join(getAppDataDir(), "mastra.db");
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get the vector database path for mastracode.
|
|
156
|
+
* Separate from the main DB to avoid bloating it with embedding data.
|
|
157
|
+
*/
|
|
158
|
+
function getVectorDatabasePath() {
|
|
159
|
+
return path.join(getAppDataDir(), "mastra-vectors.db");
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get the observability DuckDB database path for mastracode.
|
|
163
|
+
* Separate from the main DB — DuckDB is used for OLAP-style trace/score/feedback queries.
|
|
164
|
+
* Can be overridden with the MASTRA_OBSERVABILITY_DB_PATH environment variable.
|
|
165
|
+
*/
|
|
166
|
+
function getObservabilityDatabasePath() {
|
|
167
|
+
if (process.env.MASTRA_OBSERVABILITY_DB_PATH) return process.env.MASTRA_OBSERVABILITY_DB_PATH;
|
|
168
|
+
return path.join(getAppDataDir(), "observability.duckdb");
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get the resolved storage configuration.
|
|
172
|
+
*
|
|
173
|
+
* Priority (highest to lowest):
|
|
174
|
+
* 1. Environment variables: MASTRA_STORAGE_BACKEND + backend-specific vars
|
|
175
|
+
* 2. Global settings (from /settings): settings.storage
|
|
176
|
+
* 3. Legacy config files: .mastracode/database.json (LibSQL only)
|
|
177
|
+
* 4. Local file database (LibSQL default)
|
|
178
|
+
*
|
|
179
|
+
* For PG, the env vars are:
|
|
180
|
+
* MASTRA_STORAGE_BACKEND=pg
|
|
181
|
+
* MASTRA_PG_CONNECTION_STRING or MASTRA_PG_HOST/PORT/DATABASE/USER/PASSWORD
|
|
182
|
+
* MASTRA_PG_SCHEMA_NAME (optional)
|
|
183
|
+
*
|
|
184
|
+
* For LibSQL, the legacy env vars still work:
|
|
185
|
+
* MASTRA_DB_URL + MASTRA_DB_AUTH_TOKEN
|
|
186
|
+
*/
|
|
187
|
+
function getStorageConfig(projectDir, storageSettings, configDirName = DEFAULT_CONFIG_DIR) {
|
|
188
|
+
const envBackend = process.env.MASTRA_STORAGE_BACKEND;
|
|
189
|
+
if (envBackend === "pg") return resolvePgFromEnv();
|
|
190
|
+
if (envBackend === "libsql" || process.env.MASTRA_DB_URL) return resolveLibSQLFromEnv();
|
|
191
|
+
if (storageSettings && storageSettings.backend === "pg") return resolvePgFromSettings(storageSettings);
|
|
192
|
+
if (storageSettings && storageSettings.backend === "libsql" && storageSettings.libsql.url) return {
|
|
193
|
+
backend: "libsql",
|
|
194
|
+
url: storageSettings.libsql.url,
|
|
195
|
+
authToken: storageSettings.libsql.authToken,
|
|
196
|
+
isRemote: !storageSettings.libsql.url.startsWith("file:")
|
|
197
|
+
};
|
|
198
|
+
if (projectDir) {
|
|
199
|
+
const projectConfig = loadDatabaseConfig(path.join(projectDir, configDirName, "database.json"));
|
|
200
|
+
if (projectConfig) return projectConfig;
|
|
201
|
+
}
|
|
202
|
+
const globalConfig = loadDatabaseConfig(path.join(os.homedir(), configDirName, "database.json"));
|
|
203
|
+
if (globalConfig) return globalConfig;
|
|
204
|
+
return {
|
|
205
|
+
backend: "libsql",
|
|
206
|
+
url: `file:${getDatabasePath()}`,
|
|
207
|
+
isRemote: false
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function resolveLibSQLFromEnv() {
|
|
211
|
+
const url = process.env.MASTRA_DB_URL;
|
|
212
|
+
return {
|
|
213
|
+
backend: "libsql",
|
|
214
|
+
url,
|
|
215
|
+
authToken: process.env.MASTRA_DB_AUTH_TOKEN,
|
|
216
|
+
isRemote: !url.startsWith("file:")
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function resolvePgFromEnv() {
|
|
220
|
+
const connectionString = process.env.MASTRA_PG_CONNECTION_STRING;
|
|
221
|
+
if (connectionString) return {
|
|
222
|
+
backend: "pg",
|
|
223
|
+
connectionString,
|
|
224
|
+
schemaName: process.env.MASTRA_PG_SCHEMA_NAME
|
|
225
|
+
};
|
|
226
|
+
return {
|
|
227
|
+
backend: "pg",
|
|
228
|
+
host: process.env.MASTRA_PG_HOST,
|
|
229
|
+
port: process.env.MASTRA_PG_PORT ? parseInt(process.env.MASTRA_PG_PORT, 10) : void 0,
|
|
230
|
+
database: process.env.MASTRA_PG_DATABASE,
|
|
231
|
+
user: process.env.MASTRA_PG_USER,
|
|
232
|
+
password: process.env.MASTRA_PG_PASSWORD,
|
|
233
|
+
schemaName: process.env.MASTRA_PG_SCHEMA_NAME
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function resolvePgFromSettings(settings) {
|
|
237
|
+
const pg = settings.pg;
|
|
238
|
+
return {
|
|
239
|
+
backend: "pg",
|
|
240
|
+
connectionString: pg.connectionString,
|
|
241
|
+
host: pg.host,
|
|
242
|
+
port: pg.port,
|
|
243
|
+
database: pg.database,
|
|
244
|
+
user: pg.user,
|
|
245
|
+
password: pg.password,
|
|
246
|
+
schemaName: pg.schemaName,
|
|
247
|
+
disableInit: pg.disableInit,
|
|
248
|
+
skipDefaultIndexes: pg.skipDefaultIndexes
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Load database config from a legacy JSON file.
|
|
253
|
+
* Expected format: { "url": "libsql://...", "authToken": "..." }
|
|
254
|
+
*/
|
|
255
|
+
function loadDatabaseConfig(filePath) {
|
|
256
|
+
try {
|
|
257
|
+
if (!fs.existsSync(filePath)) return null;
|
|
258
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
259
|
+
const parsed = JSON.parse(raw);
|
|
260
|
+
if (typeof parsed?.url === "string" && parsed.url) return {
|
|
261
|
+
backend: "libsql",
|
|
262
|
+
url: parsed.url,
|
|
263
|
+
authToken: typeof parsed.authToken === "string" ? parsed.authToken : void 0,
|
|
264
|
+
isRemote: !parsed.url.startsWith("file:")
|
|
265
|
+
};
|
|
266
|
+
return null;
|
|
267
|
+
} catch {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Get the current user identity.
|
|
273
|
+
*
|
|
274
|
+
* Priority:
|
|
275
|
+
* 1. MASTRA_USER_ID environment variable
|
|
276
|
+
* 2. git config user.email (from project dir or global)
|
|
277
|
+
* 3. OS username as fallback
|
|
278
|
+
*/
|
|
279
|
+
function getUserId(projectDir) {
|
|
280
|
+
if (process.env.MASTRA_USER_ID) return process.env.MASTRA_USER_ID;
|
|
281
|
+
const email = git("config user.email", projectDir || process.cwd());
|
|
282
|
+
if (email) return email;
|
|
283
|
+
return os.userInfo().username || "unknown";
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Get the current user's display name.
|
|
287
|
+
*
|
|
288
|
+
* Priority:
|
|
289
|
+
* 1. git config user.name
|
|
290
|
+
* 2. OS username as fallback
|
|
291
|
+
*/
|
|
292
|
+
function getUserName(projectDir) {
|
|
293
|
+
const name = git("config user.name", projectDir || process.cwd());
|
|
294
|
+
if (name) return name;
|
|
295
|
+
return os.userInfo().username || "unknown";
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Get the configured observational memory scope.
|
|
299
|
+
*
|
|
300
|
+
* Priority:
|
|
301
|
+
* 1. MASTRA_OM_SCOPE environment variable ("thread" or "resource")
|
|
302
|
+
* 2. Project config: .mastracode/database.json → omScope
|
|
303
|
+
* 3. Global config: ~/.mastracode/database.json → omScope
|
|
304
|
+
* 4. Default: "thread"
|
|
305
|
+
*/
|
|
306
|
+
function getOmScope(projectDir, configDirName = DEFAULT_CONFIG_DIR) {
|
|
307
|
+
const envScope = process.env.MASTRA_OM_SCOPE;
|
|
308
|
+
if (envScope === "thread" || envScope === "resource") return envScope;
|
|
309
|
+
if (projectDir) {
|
|
310
|
+
const scope = loadOmScopeFromConfig(path.join(projectDir, configDirName, "database.json"));
|
|
311
|
+
if (scope) return scope;
|
|
312
|
+
}
|
|
313
|
+
const scope = loadOmScopeFromConfig(path.join(os.homedir(), configDirName, "database.json"));
|
|
314
|
+
if (scope) return scope;
|
|
315
|
+
return "thread";
|
|
316
|
+
}
|
|
317
|
+
function loadOmScopeFromConfig(filePath) {
|
|
318
|
+
try {
|
|
319
|
+
if (!fs.existsSync(filePath)) return null;
|
|
320
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
321
|
+
const parsed = JSON.parse(raw);
|
|
322
|
+
if (parsed?.omScope === "thread" || parsed?.omScope === "resource") return parsed.omScope;
|
|
323
|
+
return null;
|
|
324
|
+
} catch {
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Get an explicit resource ID override, if configured.
|
|
330
|
+
*
|
|
331
|
+
* Resource IDs act as shared tags — two users who set the same resourceId
|
|
332
|
+
* will share threads and observations for that resource.
|
|
333
|
+
*
|
|
334
|
+
* Priority:
|
|
335
|
+
* 1. MASTRA_RESOURCE_ID environment variable
|
|
336
|
+
* 2. Project config: .mastracode/database.json → resourceId
|
|
337
|
+
* 3. Global config: ~/.mastracode/database.json → resourceId
|
|
338
|
+
* 4. null (use auto-detected value)
|
|
339
|
+
*/
|
|
340
|
+
function getResourceIdOverride(projectDir, configDirName = DEFAULT_CONFIG_DIR) {
|
|
341
|
+
if (process.env.MASTRA_RESOURCE_ID) return process.env.MASTRA_RESOURCE_ID;
|
|
342
|
+
if (projectDir) {
|
|
343
|
+
const rid = loadStringField(path.join(projectDir, configDirName, "database.json"), "resourceId");
|
|
344
|
+
if (rid) return rid;
|
|
345
|
+
}
|
|
346
|
+
const rid = loadStringField(path.join(os.homedir(), configDirName, "database.json"), "resourceId");
|
|
347
|
+
if (rid) return rid;
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
function loadStringField(filePath, field) {
|
|
351
|
+
try {
|
|
352
|
+
if (!fs.existsSync(filePath)) return null;
|
|
353
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
354
|
+
const value = JSON.parse(raw)?.[field];
|
|
355
|
+
if (typeof value === "string" && value) return value;
|
|
356
|
+
return null;
|
|
357
|
+
} catch {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
//#endregion
|
|
362
|
+
export { detectProject, getAppDataDir, getCurrentGitBranch, getCurrentGitBranchAsync, getDatabasePath, getObservabilityDatabasePath, getOmScope, getResourceIdOverride, getStorageConfig, getUserId, getUserName, getVectorDatabasePath };
|
|
363
|
+
|
|
364
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","names":[],"sources":["../../src/utils/project.ts"],"sourcesContent":["/**\n * Project detection utilities\n *\n * Detects project identity from git repo or filesystem path.\n * Handles git worktrees by finding the main repository.\n */\n\nimport { execFile, execSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nexport interface ProjectInfo {\n /** Unique resource ID for this project (used for thread grouping) */\n resourceId: string;\n /** Human-readable project name */\n name: string;\n /** Absolute path to the project root */\n rootPath: string;\n /** Git remote URL if available */\n gitUrl?: string;\n /** Current git branch */\n gitBranch?: string;\n /** Whether this is a git worktree */\n isWorktree: boolean;\n /** Path to main git repo (different from rootPath if worktree) */\n mainRepoPath?: string;\n /** Whether the resourceId was explicitly overridden (env var or config) */\n resourceIdOverride?: boolean;\n}\n\n/**\n * Run a git command and return stdout, or undefined if it fails\n */\nfunction git(args: string, cwd: string): string | undefined {\n try {\n return execSync(`git ${args}`, {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return undefined;\n }\n}\n\n/**\n * Slugify a string for use in IDs\n */\nfunction slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * Create a short hash of a string\n */\nfunction shortHash(str: string): string {\n return createHash('sha256').update(str).digest('hex').slice(0, 12);\n}\n\n/**\n * Normalize a git URL to a canonical form for comparison\n * - Removes .git suffix\n * - Converts SSH to HTTPS format for consistency\n * - Lowercases\n */\nfunction normalizeGitUrl(url: string): string {\n return url\n .replace(/\\.git$/, '')\n .replace(/^git@([^:]+):/, 'https://$1/')\n .replace(/^ssh:\\/\\/git@/, 'https://')\n .toLowerCase();\n}\n\n/**\n * Detect project info from a directory path\n */\nexport function detectProject(projectPath: string): ProjectInfo {\n const absolutePath = path.resolve(projectPath);\n\n // Check if this is a git repo\n const gitDir = git('rev-parse --git-dir', absolutePath);\n const isGitRepo = gitDir !== undefined;\n\n let rootPath = absolutePath;\n let gitUrl: string | undefined;\n let gitBranch: string | undefined;\n let isWorktree = false;\n let mainRepoPath: string | undefined;\n\n if (isGitRepo) {\n // Get the repo root (handles being in a subdirectory)\n rootPath = git('rev-parse --show-toplevel', absolutePath) || absolutePath;\n\n // Check for worktree - git-common-dir differs from git-dir in worktrees\n const commonDir = git('rev-parse --git-common-dir', absolutePath);\n if (commonDir && commonDir !== '.git' && commonDir !== gitDir) {\n isWorktree = true;\n // The common dir is inside the main repo's .git folder\n mainRepoPath = path.dirname(path.resolve(rootPath, commonDir));\n }\n\n // Get remote URL (prefer origin, fall back to first remote)\n gitUrl = git('remote get-url origin', absolutePath);\n if (!gitUrl) {\n const remotes = git('remote', absolutePath);\n if (remotes) {\n const firstRemote = remotes.split('\\n')[0];\n if (firstRemote) {\n gitUrl = git(`remote get-url ${firstRemote}`, absolutePath);\n }\n }\n }\n\n // Get current branch\n gitBranch = git('rev-parse --abbrev-ref HEAD', absolutePath);\n }\n\n // Generate resource ID\n // Priority: normalized git URL > main repo path (for worktrees) > absolute path\n let resourceIdSource: string;\n if (gitUrl) {\n resourceIdSource = normalizeGitUrl(gitUrl);\n } else if (mainRepoPath) {\n resourceIdSource = mainRepoPath;\n } else {\n resourceIdSource = rootPath;\n }\n\n // Create a readable but unique resource ID\n // Format: slugified-name-shorthash\n const baseName = gitUrl\n ? gitUrl\n .split('/')\n .pop()\n ?.replace(/\\.git$/, '') || 'project'\n : path.basename(rootPath);\n\n const resourceId = `${slugify(baseName)}-${shortHash(resourceIdSource)}`;\n\n return {\n resourceId,\n name: baseName,\n rootPath,\n gitUrl,\n gitBranch,\n isWorktree,\n mainRepoPath,\n };\n}\n\n/**\n * Get the current git branch for a given directory.\n * Lightweight alternative to detectProject() for refreshing just the branch.\n */\nexport function getCurrentGitBranch(cwd: string): string | undefined {\n return git('rev-parse --abbrev-ref HEAD', cwd);\n}\n\n/**\n * Async version of getCurrentGitBranch — avoids blocking the event loop\n * with execSync. Falls back to undefined on any failure.\n */\nexport function getCurrentGitBranchAsync(cwd: string): Promise<string | undefined> {\n return new Promise(resolve => {\n execFile('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, encoding: 'utf-8' }, (err, stdout) => {\n if (err) {\n resolve(undefined);\n return;\n }\n const branch = stdout.trim();\n resolve(branch || undefined);\n });\n });\n}\n\n/**\n * Get the application data directory for mastracode\n * - macOS: ~/Library/Application Support/mastracode\n * - Linux: ~/.local/share/mastracode\n * - Windows: %APPDATA%/mastracode\n */\nexport function getAppDataDir(): string {\n if (process.env.MASTRA_APP_DATA_DIR) {\n fs.mkdirSync(process.env.MASTRA_APP_DATA_DIR, { recursive: true });\n return process.env.MASTRA_APP_DATA_DIR;\n }\n\n const platform = os.platform();\n let baseDir: string;\n\n if (platform === 'darwin') {\n baseDir = path.join(os.homedir(), 'Library', 'Application Support');\n } else if (platform === 'win32') {\n baseDir = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming');\n } else {\n // Linux and others - follow XDG spec\n baseDir = process.env.XDG_DATA_HOME || path.join(os.homedir(), '.local', 'share');\n }\n\n const appDir = path.join(baseDir, 'mastracode');\n\n // Ensure directory exists\n if (!fs.existsSync(appDir)) {\n fs.mkdirSync(appDir, { recursive: true });\n }\n\n return appDir;\n}\n/**\n * Get the database path for mastracode\n * Can be overridden with the MASTRA_DB_PATH environment variable for debugging.\n */\nexport function getDatabasePath(): string {\n if (process.env.MASTRA_DB_PATH) {\n return process.env.MASTRA_DB_PATH;\n }\n return path.join(getAppDataDir(), 'mastra.db');\n}\n\n/**\n * Get the vector database path for mastracode.\n * Separate from the main DB to avoid bloating it with embedding data.\n */\nexport function getVectorDatabasePath(): string {\n return path.join(getAppDataDir(), 'mastra-vectors.db');\n}\n\n/**\n * Get the observability DuckDB database path for mastracode.\n * Separate from the main DB — DuckDB is used for OLAP-style trace/score/feedback queries.\n * Can be overridden with the MASTRA_OBSERVABILITY_DB_PATH environment variable.\n */\nexport function getObservabilityDatabasePath(): string {\n if (process.env.MASTRA_OBSERVABILITY_DB_PATH) {\n return process.env.MASTRA_OBSERVABILITY_DB_PATH;\n }\n return path.join(getAppDataDir(), 'observability.duckdb');\n}\n\nimport type { StorageBackend, StorageSettings } from '../onboarding/settings.js';\n\n/**\n * LibSQL storage configuration.\n */\nexport interface LibSQLStorageConfig {\n backend: 'libsql';\n url: string;\n authToken?: string;\n isRemote: boolean;\n /**\n * Optional explicit url for the recall vector DB. When omitted, the factory\n * uses the shared default vector file.\n */\n vectorUrl?: string;\n /** Auth token for the vector DB when `vectorUrl` points at a remote libSQL. */\n vectorAuthToken?: string;\n}\n\n/**\n * PostgreSQL storage configuration.\n */\nexport interface PgStorageConfig {\n backend: 'pg';\n connectionString?: string;\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n schemaName?: string;\n disableInit?: boolean;\n skipDefaultIndexes?: boolean;\n}\n\n/**\n * Resolved storage configuration for either backend.\n */\nexport type StorageConfig = LibSQLStorageConfig | PgStorageConfig;\n\n/**\n * Get the resolved storage configuration.\n *\n * Priority (highest to lowest):\n * 1. Environment variables: MASTRA_STORAGE_BACKEND + backend-specific vars\n * 2. Global settings (from /settings): settings.storage\n * 3. Legacy config files: .mastracode/database.json (LibSQL only)\n * 4. Local file database (LibSQL default)\n *\n * For PG, the env vars are:\n * MASTRA_STORAGE_BACKEND=pg\n * MASTRA_PG_CONNECTION_STRING or MASTRA_PG_HOST/PORT/DATABASE/USER/PASSWORD\n * MASTRA_PG_SCHEMA_NAME (optional)\n *\n * For LibSQL, the legacy env vars still work:\n * MASTRA_DB_URL + MASTRA_DB_AUTH_TOKEN\n */\nexport function getStorageConfig(\n projectDir?: string,\n storageSettings?: StorageSettings,\n configDirName = DEFAULT_CONFIG_DIR,\n): StorageConfig {\n // 1. Environment variable — explicit backend selection\n const envBackend = process.env.MASTRA_STORAGE_BACKEND as StorageBackend | undefined;\n\n if (envBackend === 'pg') {\n return resolvePgFromEnv();\n }\n\n // Legacy LibSQL env vars (MASTRA_DB_URL) — treat as explicit libsql\n if (envBackend === 'libsql' || process.env.MASTRA_DB_URL) {\n return resolveLibSQLFromEnv();\n }\n\n // 2. Global settings (from /settings)\n if (storageSettings && storageSettings.backend === 'pg') {\n return resolvePgFromSettings(storageSettings);\n }\n\n if (storageSettings && storageSettings.backend === 'libsql' && storageSettings.libsql.url) {\n return {\n backend: 'libsql',\n url: storageSettings.libsql.url,\n authToken: storageSettings.libsql.authToken,\n isRemote: !storageSettings.libsql.url.startsWith('file:'),\n };\n }\n\n // 3. Legacy project/global config files (.mastracode/database.json)\n if (projectDir) {\n const projectConfig = loadDatabaseConfig(path.join(projectDir, configDirName, 'database.json'));\n if (projectConfig) return projectConfig;\n }\n const globalConfig = loadDatabaseConfig(path.join(os.homedir(), configDirName, 'database.json'));\n if (globalConfig) return globalConfig;\n\n // 4. Default: local LibSQL file database\n return {\n backend: 'libsql',\n url: `file:${getDatabasePath()}`,\n isRemote: false,\n };\n}\n\nfunction resolveLibSQLFromEnv(): LibSQLStorageConfig {\n const url = process.env.MASTRA_DB_URL!;\n return {\n backend: 'libsql',\n url,\n authToken: process.env.MASTRA_DB_AUTH_TOKEN,\n isRemote: !url.startsWith('file:'),\n };\n}\n\nfunction resolvePgFromEnv(): PgStorageConfig {\n const connectionString = process.env.MASTRA_PG_CONNECTION_STRING;\n if (connectionString) {\n return {\n backend: 'pg',\n connectionString,\n schemaName: process.env.MASTRA_PG_SCHEMA_NAME,\n };\n }\n\n // Host/port style\n return {\n backend: 'pg',\n host: process.env.MASTRA_PG_HOST,\n port: process.env.MASTRA_PG_PORT ? parseInt(process.env.MASTRA_PG_PORT, 10) : undefined,\n database: process.env.MASTRA_PG_DATABASE,\n user: process.env.MASTRA_PG_USER,\n password: process.env.MASTRA_PG_PASSWORD,\n schemaName: process.env.MASTRA_PG_SCHEMA_NAME,\n };\n}\n\nfunction resolvePgFromSettings(settings: StorageSettings): PgStorageConfig {\n const pg = settings.pg;\n return {\n backend: 'pg',\n connectionString: pg.connectionString,\n host: pg.host,\n port: pg.port,\n database: pg.database,\n user: pg.user,\n password: pg.password,\n schemaName: pg.schemaName,\n disableInit: pg.disableInit,\n skipDefaultIndexes: pg.skipDefaultIndexes,\n };\n}\n\n/**\n * Load database config from a legacy JSON file.\n * Expected format: { \"url\": \"libsql://...\", \"authToken\": \"...\" }\n */\nfunction loadDatabaseConfig(filePath: string): LibSQLStorageConfig | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw);\n if (typeof parsed?.url === 'string' && parsed.url) {\n return {\n backend: 'libsql',\n url: parsed.url,\n authToken: typeof parsed.authToken === 'string' ? parsed.authToken : undefined,\n isRemote: !parsed.url.startsWith('file:'),\n };\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the current user identity.\n *\n * Priority:\n * 1. MASTRA_USER_ID environment variable\n * 2. git config user.email (from project dir or global)\n * 3. OS username as fallback\n */\nexport function getUserId(projectDir?: string): string {\n // 1. Environment variable override\n if (process.env.MASTRA_USER_ID) {\n return process.env.MASTRA_USER_ID;\n }\n\n // 2. git user.email\n const cwd = projectDir || process.cwd();\n const email = git('config user.email', cwd);\n if (email) {\n return email;\n }\n\n // 3. OS username fallback\n return os.userInfo().username || 'unknown';\n}\n\n/**\n * Get the current user's display name.\n *\n * Priority:\n * 1. git config user.name\n * 2. OS username as fallback\n */\nexport function getUserName(projectDir?: string): string {\n const cwd = projectDir || process.cwd();\n const name = git('config user.name', cwd);\n if (name) {\n return name;\n }\n return os.userInfo().username || 'unknown';\n}\n\n/**\n * Observational memory scope: \"thread\" (per-conversation) or \"resource\" (shared across threads).\n */\nexport type OmScope = 'thread' | 'resource';\n\n/**\n * Get the configured observational memory scope.\n *\n * Priority:\n * 1. MASTRA_OM_SCOPE environment variable (\"thread\" or \"resource\")\n * 2. Project config: .mastracode/database.json → omScope\n * 3. Global config: ~/.mastracode/database.json → omScope\n * 4. Default: \"thread\"\n */\nexport function getOmScope(projectDir?: string, configDirName = DEFAULT_CONFIG_DIR): OmScope {\n // 1. Environment variable\n const envScope = process.env.MASTRA_OM_SCOPE;\n if (envScope === 'thread' || envScope === 'resource') {\n return envScope;\n }\n\n // 2. Project-level config\n if (projectDir) {\n const scope = loadOmScopeFromConfig(path.join(projectDir, configDirName, 'database.json'));\n if (scope) return scope;\n }\n\n // 3. Global config\n const scope = loadOmScopeFromConfig(path.join(os.homedir(), configDirName, 'database.json'));\n if (scope) return scope;\n\n // 4. Default\n return 'thread';\n}\n\nfunction loadOmScopeFromConfig(filePath: string): OmScope | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw);\n if (parsed?.omScope === 'thread' || parsed?.omScope === 'resource') {\n return parsed.omScope;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get an explicit resource ID override, if configured.\n *\n * Resource IDs act as shared tags — two users who set the same resourceId\n * will share threads and observations for that resource.\n *\n * Priority:\n * 1. MASTRA_RESOURCE_ID environment variable\n * 2. Project config: .mastracode/database.json → resourceId\n * 3. Global config: ~/.mastracode/database.json → resourceId\n * 4. null (use auto-detected value)\n */\nexport function getResourceIdOverride(projectDir?: string, configDirName = DEFAULT_CONFIG_DIR): string | null {\n // 1. Environment variable\n if (process.env.MASTRA_RESOURCE_ID) {\n return process.env.MASTRA_RESOURCE_ID;\n }\n\n // 2. Project-level config\n if (projectDir) {\n const rid = loadStringField(path.join(projectDir, configDirName, 'database.json'), 'resourceId');\n if (rid) return rid;\n }\n\n // 3. Global config\n const rid = loadStringField(path.join(os.homedir(), configDirName, 'database.json'), 'resourceId');\n if (rid) return rid;\n\n return null;\n}\n\nfunction loadStringField(filePath: string, field: string): string | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw);\n const value = parsed?.[field];\n if (typeof value === 'string' && value) {\n return value;\n }\n return null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mastracode prune` — storage maintenance from a non-interactive shell.
|
|
3
|
+
*
|
|
4
|
+
* The in-TUI `/prune` command has to stop the UI, quiesce background writers
|
|
5
|
+
* (MCP, workers, intervals) and then exit the process, because retention
|
|
6
|
+
* deletes and VACUUM need the database to themselves. A standalone process
|
|
7
|
+
* already satisfies that contract — and, unlike `/prune`, it does not require a
|
|
8
|
+
* rendered prompt first, so maintenance stays reachable when the TUI cannot
|
|
9
|
+
* start. Without it a large mastra.db has no in-app remedy (issue #22056).
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* mastracode prune delete rows older than the retention policies
|
|
13
|
+
* mastracode prune --vacuum prune, then checkpoint WAL + VACUUM to return disk to the OS
|
|
14
|
+
* (local libsql only; remote libsql and Postgres only prune rows)
|
|
15
|
+
* mastracode prune --keep-memory prune, but keep chat history (messages/threads)
|
|
16
|
+
*/
|
|
17
|
+
import type { StorageConfig } from './project.js';
|
|
18
|
+
/**
|
|
19
|
+
* Run storage maintenance for the project in the current directory.
|
|
20
|
+
* Returns the process exit code (0 on success).
|
|
21
|
+
*/
|
|
22
|
+
export declare function runPruneCommand(args: string[]): Promise<number>;
|
|
23
|
+
export declare function describeStorageTarget(config: StorageConfig): string;
|
|
24
|
+
//# sourceMappingURL=prune-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-cli.d.ts","sourceRoot":"","sources":["../../src/utils/prune-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAiBlD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCrE;AA2ED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CASnE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { DEFAULT_CONFIG_DIR } from "../constants.js";
|
|
2
|
+
import { detectProject, getStorageConfig } from "./project.js";
|
|
3
|
+
import { loadSettings } from "../onboarding/settings.js";
|
|
4
|
+
import { acquireMaintenanceLock } from "./maintenance-lock.js";
|
|
5
|
+
import { DEFAULT_RETENTION, createStorageMaintenance, resolveLocalDbFiles, runStorageMaintenance } from "./storage-maintenance.js";
|
|
6
|
+
import { createStorage, createVectorStore } from "./storage-factory.js";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import { LibSQLVector } from "@mastra/libsql";
|
|
9
|
+
//#region src/utils/prune-cli.ts
|
|
10
|
+
/**
|
|
11
|
+
* `mastracode prune` — storage maintenance from a non-interactive shell.
|
|
12
|
+
*
|
|
13
|
+
* The in-TUI `/prune` command has to stop the UI, quiesce background writers
|
|
14
|
+
* (MCP, workers, intervals) and then exit the process, because retention
|
|
15
|
+
* deletes and VACUUM need the database to themselves. A standalone process
|
|
16
|
+
* already satisfies that contract — and, unlike `/prune`, it does not require a
|
|
17
|
+
* rendered prompt first, so maintenance stays reachable when the TUI cannot
|
|
18
|
+
* start. Without it a large mastra.db has no in-app remedy (issue #22056).
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* mastracode prune delete rows older than the retention policies
|
|
22
|
+
* mastracode prune --vacuum prune, then checkpoint WAL + VACUUM to return disk to the OS
|
|
23
|
+
* (local libsql only; remote libsql and Postgres only prune rows)
|
|
24
|
+
* mastracode prune --keep-memory prune, but keep chat history (messages/threads)
|
|
25
|
+
*/
|
|
26
|
+
const USAGE = `Usage: mastracode prune [--vacuum] [--keep-memory]
|
|
27
|
+
|
|
28
|
+
--vacuum After pruning, compact the local database files so freed
|
|
29
|
+
pages are returned to the OS. Needs free disk for the copy.
|
|
30
|
+
Local libsql only; remote libsql and Postgres only prune rows.
|
|
31
|
+
--keep-memory Prune everything except chat history (messages/threads).
|
|
32
|
+
`;
|
|
33
|
+
/**
|
|
34
|
+
* Run storage maintenance for the project in the current directory.
|
|
35
|
+
* Returns the process exit code (0 on success).
|
|
36
|
+
*/
|
|
37
|
+
async function runPruneCommand(args) {
|
|
38
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
39
|
+
console.log(USAGE);
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
const flags = new Set(args.map((a) => a.toLowerCase()));
|
|
43
|
+
const unknown = [...flags].filter((f) => f !== "--vacuum" && f !== "--keep-memory");
|
|
44
|
+
if (unknown.length > 0) {
|
|
45
|
+
console.error(`Unknown prune option: ${unknown.join(", ")}\n${USAGE}`);
|
|
46
|
+
return 1;
|
|
47
|
+
}
|
|
48
|
+
const vacuum = flags.has("--vacuum");
|
|
49
|
+
const keepMemory = flags.has("--keep-memory");
|
|
50
|
+
try {
|
|
51
|
+
process.loadEnvFile(path.join(process.cwd(), ".env"));
|
|
52
|
+
} catch {}
|
|
53
|
+
let releaseLock;
|
|
54
|
+
try {
|
|
55
|
+
releaseLock = acquireMaintenanceLock();
|
|
56
|
+
} catch (err) {
|
|
57
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
return await prune({
|
|
62
|
+
vacuum,
|
|
63
|
+
keepMemory
|
|
64
|
+
});
|
|
65
|
+
} finally {
|
|
66
|
+
releaseLock();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function prune({ vacuum, keepMemory }) {
|
|
70
|
+
const settings = loadSettings();
|
|
71
|
+
const storageConfig = getStorageConfig(detectProject(process.cwd()).rootPath, settings.storage, DEFAULT_CONFIG_DIR);
|
|
72
|
+
console.log(`Storage target: ${describeStorageTarget(storageConfig)}`);
|
|
73
|
+
const { storage, backend, warning } = await createStorage(storageConfig);
|
|
74
|
+
if (warning) console.log(warning);
|
|
75
|
+
let vector;
|
|
76
|
+
try {
|
|
77
|
+
await storage.init();
|
|
78
|
+
const localDbFiles = resolveLocalDbFiles(storageConfig, backend);
|
|
79
|
+
if (localDbFiles.length > 0) console.log(`Database: ${localDbFiles.join(", ")}`);
|
|
80
|
+
if (vacuum && localDbFiles.length > 0) vector = await createVectorStore(storageConfig, backend);
|
|
81
|
+
const libsqlVector = vector instanceof LibSQLVector ? vector : void 0;
|
|
82
|
+
await runStorageMaintenance({
|
|
83
|
+
maintenance: createStorageMaintenance({
|
|
84
|
+
storage,
|
|
85
|
+
backend,
|
|
86
|
+
retention: DEFAULT_RETENTION,
|
|
87
|
+
localDbFiles,
|
|
88
|
+
...libsqlVector ? { closeVector: () => libsqlVector.close() } : {}
|
|
89
|
+
}),
|
|
90
|
+
vacuum,
|
|
91
|
+
keepMemory,
|
|
92
|
+
log: (line) => console.log(line)
|
|
93
|
+
});
|
|
94
|
+
console.log("Storage maintenance complete.");
|
|
95
|
+
return 0;
|
|
96
|
+
} catch (err) {
|
|
97
|
+
console.error(`Storage maintenance failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
98
|
+
try {
|
|
99
|
+
await storage.close?.();
|
|
100
|
+
if (vector instanceof LibSQLVector) await vector.close();
|
|
101
|
+
} catch {}
|
|
102
|
+
return 1;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Credential-free URL: drops userinfo and the query string (e.g. ?authToken=). */
|
|
106
|
+
function redactUrl(raw) {
|
|
107
|
+
try {
|
|
108
|
+
const url = new URL(raw);
|
|
109
|
+
url.username = "";
|
|
110
|
+
url.password = "";
|
|
111
|
+
url.search = "";
|
|
112
|
+
return url.toString();
|
|
113
|
+
} catch {
|
|
114
|
+
return "<unparseable URL>";
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function describeStorageTarget(config) {
|
|
118
|
+
if (config.backend === "libsql") return config.url.startsWith("file:") ? `libsql file ${config.url.slice(5)}` : `libsql ${redactUrl(config.url)}`;
|
|
119
|
+
if (config.connectionString) return `pg ${redactUrl(config.connectionString)}`;
|
|
120
|
+
return `pg postgres://${`${config.host ?? "localhost"}${config.port ? `:${config.port}` : ""}`}/${config.database ?? ""}`;
|
|
121
|
+
}
|
|
122
|
+
//#endregion
|
|
123
|
+
export { describeStorageTarget, runPruneCommand };
|
|
124
|
+
|
|
125
|
+
//# sourceMappingURL=prune-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-cli.js","names":[],"sources":["../../src/utils/prune-cli.ts"],"sourcesContent":["/**\n * `mastracode prune` — storage maintenance from a non-interactive shell.\n *\n * The in-TUI `/prune` command has to stop the UI, quiesce background writers\n * (MCP, workers, intervals) and then exit the process, because retention\n * deletes and VACUUM need the database to themselves. A standalone process\n * already satisfies that contract — and, unlike `/prune`, it does not require a\n * rendered prompt first, so maintenance stays reachable when the TUI cannot\n * start. Without it a large mastra.db has no in-app remedy (issue #22056).\n *\n * Usage:\n * mastracode prune delete rows older than the retention policies\n * mastracode prune --vacuum prune, then checkpoint WAL + VACUUM to return disk to the OS\n * (local libsql only; remote libsql and Postgres only prune rows)\n * mastracode prune --keep-memory prune, but keep chat history (messages/threads)\n */\n\nimport path from 'node:path';\n\nimport type { MastraVector } from '@mastra/core/vector';\nimport { LibSQLVector } from '@mastra/libsql';\n\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport { loadSettings } from '../onboarding/settings.js';\n\nimport { acquireMaintenanceLock } from './maintenance-lock.js';\nimport { detectProject, getStorageConfig } from './project.js';\nimport type { StorageConfig } from './project.js';\nimport { createStorage, createVectorStore } from './storage-factory.js';\nimport {\n DEFAULT_RETENTION,\n createStorageMaintenance,\n resolveLocalDbFiles,\n runStorageMaintenance,\n} from './storage-maintenance.js';\n\nconst USAGE = `Usage: mastracode prune [--vacuum] [--keep-memory]\n\n --vacuum After pruning, compact the local database files so freed\n pages are returned to the OS. Needs free disk for the copy.\n Local libsql only; remote libsql and Postgres only prune rows.\n --keep-memory Prune everything except chat history (messages/threads).\n`;\n\n/**\n * Run storage maintenance for the project in the current directory.\n * Returns the process exit code (0 on success).\n */\nexport async function runPruneCommand(args: string[]): Promise<number> {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(USAGE);\n return 0;\n }\n\n const flags = new Set(args.map(a => a.toLowerCase()));\n const unknown = [...flags].filter(f => f !== '--vacuum' && f !== '--keep-memory');\n if (unknown.length > 0) {\n console.error(`Unknown prune option: ${unknown.join(', ')}\\n${USAGE}`);\n return 1;\n }\n const vacuum = flags.has('--vacuum');\n const keepMemory = flags.has('--keep-memory');\n\n // Startup loads the project .env before registering its session and resolving\n // storage (MASTRA_APP_DATA_DIR, MASTRA_DB_PATH, ...). Do the same before taking\n // the lock, or prune locks/scans a different app data dir or opens another DB.\n try {\n process.loadEnvFile(path.join(process.cwd(), '.env'));\n } catch {\n // No .env file — keys may be in the shell environment\n }\n\n // Maintenance needs the database to itself: hold the lock for the whole run\n // and refuse while any mastracode session is registered.\n let releaseLock: () => void;\n try {\n releaseLock = acquireMaintenanceLock();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n\n try {\n return await prune({ vacuum, keepMemory });\n } finally {\n releaseLock();\n }\n}\n\nasync function prune({ vacuum, keepMemory }: { vacuum: boolean; keepMemory: boolean }): Promise<number> {\n // Resolve storage exactly the way startup does, so prune targets the same\n // database the TUI uses — honoring MASTRA_DB_PATH / MASTRA_STORAGE_BACKEND,\n // global settings, and a project's own .mastracode/database.json.\n const settings = loadSettings();\n const project = detectProject(process.cwd());\n const storageConfig = getStorageConfig(project.rootPath, settings.storage, DEFAULT_CONFIG_DIR);\n\n // A project .env can point storage elsewhere (startup honors it too), so say\n // exactly what is about to be pruned before anything is deleted.\n console.log(`Storage target: ${describeStorageTarget(storageConfig)}`);\n\n const { storage, backend, warning } = await createStorage(storageConfig);\n if (warning) console.log(warning);\n\n let vector: MastraVector | undefined;\n try {\n // The libsql factory does not init (the PG path already has); init is\n // coalesced, so tables are guaranteed to exist before we delete from them.\n await storage.init();\n\n const localDbFiles = resolveLocalDbFiles(storageConfig, backend);\n if (localDbFiles.length > 0) {\n console.log(`Database: ${localDbFiles.join(', ')}`);\n }\n\n // Only the local-libsql compaction needs the vector connection (its file\n // swap refuses while any connection is open). Opening it otherwise would\n // create mastra-vectors.db as a side effect.\n if (vacuum && localDbFiles.length > 0) {\n vector = await createVectorStore(storageConfig, backend);\n }\n const libsqlVector = vector instanceof LibSQLVector ? vector : undefined;\n\n const maintenance = createStorageMaintenance({\n storage,\n backend,\n retention: DEFAULT_RETENTION,\n localDbFiles,\n ...(libsqlVector ? { closeVector: () => libsqlVector.close() } : {}),\n });\n\n await runStorageMaintenance({ maintenance, vacuum, keepMemory, log: line => console.log(line) });\n console.log('Storage maintenance complete.');\n return 0;\n } catch (err) {\n console.error(`Storage maintenance failed: ${err instanceof Error ? err.message : String(err)}`);\n // runStorageMaintenance closes storage on its success path. If it threw\n // first, release the connections here so a retry isn't blocked by our own\n // open handles. Best effort — the original failure is what matters.\n try {\n await storage.close?.();\n if (vector instanceof LibSQLVector) await vector.close();\n } catch {\n // ignore cleanup errors\n }\n return 1;\n }\n}\n\n/** Credential-free URL: drops userinfo and the query string (e.g. ?authToken=). */\nfunction redactUrl(raw: string): string {\n try {\n const url = new URL(raw);\n url.username = '';\n url.password = '';\n url.search = '';\n return url.toString();\n } catch {\n return '<unparseable URL>';\n }\n}\n\nexport function describeStorageTarget(config: StorageConfig): string {\n if (config.backend === 'libsql') {\n return config.url.startsWith('file:')\n ? `libsql file ${config.url.slice('file:'.length)}`\n : `libsql ${redactUrl(config.url)}`;\n }\n if (config.connectionString) return `pg ${redactUrl(config.connectionString)}`;\n const host = `${config.host ?? 'localhost'}${config.port ? `:${config.port}` : ''}`;\n return `pg postgres://${host}/${config.database ?? ''}`;\n}\n"],"mappings":"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"}
|