@mastra/code-sdk 0.0.0-mastracode-cloud-20260706153555
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/LICENSE.md +30 -0
- package/README.md +50 -0
- package/dist/acp/agent.d.ts +35 -0
- package/dist/acp/agent.d.ts.map +1 -0
- package/dist/acp/agent.js +173 -0
- package/dist/acp/agent.js.map +1 -0
- package/dist/acp/event-mapper.d.ts +22 -0
- package/dist/acp/event-mapper.d.ts.map +1 -0
- package/dist/acp/event-mapper.js +166 -0
- package/dist/acp/event-mapper.js.map +1 -0
- package/dist/acp/index.d.ts +8 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +54 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/server.d.ts +7 -0
- package/dist/acp/server.d.ts.map +1 -0
- package/dist/acp/server.js +34 -0
- package/dist/acp/server.js.map +1 -0
- package/dist/acp.d.ts +2 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +5 -0
- package/dist/acp.js.map +1 -0
- package/dist/agents/instructions.d.ts +6 -0
- package/dist/agents/instructions.d.ts.map +1 -0
- package/dist/agents/instructions.js +41 -0
- package/dist/agents/instructions.js.map +1 -0
- package/dist/agents/mastracode-gateway.d.ts +65 -0
- package/dist/agents/mastracode-gateway.d.ts.map +1 -0
- package/dist/agents/mastracode-gateway.js +442 -0
- package/dist/agents/mastracode-gateway.js.map +1 -0
- package/dist/agents/memory.d.ts +13 -0
- package/dist/agents/memory.d.ts.map +1 -0
- package/dist/agents/memory.js +107 -0
- package/dist/agents/memory.js.map +1 -0
- package/dist/agents/model.d.ts +55 -0
- package/dist/agents/model.d.ts.map +1 -0
- package/dist/agents/model.js +115 -0
- package/dist/agents/model.js.map +1 -0
- package/dist/agents/modes/build.d.ts +10 -0
- package/dist/agents/modes/build.d.ts.map +1 -0
- package/dist/agents/modes/build.js +45 -0
- package/dist/agents/modes/build.js.map +1 -0
- package/dist/agents/modes/explore.d.ts +10 -0
- package/dist/agents/modes/explore.d.ts.map +1 -0
- package/dist/agents/modes/explore.js +38 -0
- package/dist/agents/modes/explore.js.map +1 -0
- package/dist/agents/modes/plan.d.ts +6 -0
- package/dist/agents/modes/plan.d.ts.map +1 -0
- package/dist/agents/modes/plan.js +38 -0
- package/dist/agents/modes/plan.js.map +1 -0
- package/dist/agents/prompts/agent-instructions.d.ts +20 -0
- package/dist/agents/prompts/agent-instructions.d.ts.map +1 -0
- package/dist/agents/prompts/agent-instructions.js +82 -0
- package/dist/agents/prompts/agent-instructions.js.map +1 -0
- package/dist/agents/prompts/build.d.ts +12 -0
- package/dist/agents/prompts/build.d.ts.map +1 -0
- package/dist/agents/prompts/build.js +73 -0
- package/dist/agents/prompts/build.js.map +1 -0
- package/dist/agents/prompts/fast.d.ts +5 -0
- package/dist/agents/prompts/fast.d.ts.map +1 -0
- package/dist/agents/prompts/fast.js +22 -0
- package/dist/agents/prompts/fast.js.map +1 -0
- package/dist/agents/prompts/index.d.ts +19 -0
- package/dist/agents/prompts/index.d.ts.map +1 -0
- package/dist/agents/prompts/index.js +57 -0
- package/dist/agents/prompts/index.js.map +1 -0
- package/dist/agents/prompts/model.d.ts +5 -0
- package/dist/agents/prompts/model.d.ts.map +1 -0
- package/dist/agents/prompts/model.js +22 -0
- package/dist/agents/prompts/model.js.map +1 -0
- package/dist/agents/prompts/plan.d.ts +6 -0
- package/dist/agents/prompts/plan.d.ts.map +1 -0
- package/dist/agents/prompts/plan.js +107 -0
- package/dist/agents/prompts/plan.js.map +1 -0
- package/dist/agents/prompts/tool-guidance.d.ts +13 -0
- package/dist/agents/prompts/tool-guidance.d.ts.map +1 -0
- package/dist/agents/prompts/tool-guidance.js +181 -0
- package/dist/agents/prompts/tool-guidance.js.map +1 -0
- package/dist/agents/sandbox-filesystem.d.ts +89 -0
- package/dist/agents/sandbox-filesystem.d.ts.map +1 -0
- package/dist/agents/sandbox-filesystem.js +268 -0
- package/dist/agents/sandbox-filesystem.js.map +1 -0
- package/dist/agents/sandbox-reattach.d.ts +19 -0
- package/dist/agents/sandbox-reattach.d.ts.map +1 -0
- package/dist/agents/sandbox-reattach.js +17 -0
- package/dist/agents/sandbox-reattach.js.map +1 -0
- package/dist/agents/thread-caveman-state.d.ts +17 -0
- package/dist/agents/thread-caveman-state.d.ts.map +1 -0
- package/dist/agents/thread-caveman-state.js +96 -0
- package/dist/agents/thread-caveman-state.js.map +1 -0
- package/dist/agents/tool-availability.d.ts +10 -0
- package/dist/agents/tool-availability.d.ts.map +1 -0
- package/dist/agents/tool-availability.js +105 -0
- package/dist/agents/tool-availability.js.map +1 -0
- package/dist/agents/tools.d.ts +18 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +126 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/agents/workspace.d.ts +22 -0
- package/dist/agents/workspace.d.ts.map +1 -0
- package/dist/agents/workspace.js +194 -0
- package/dist/agents/workspace.js.map +1 -0
- package/dist/analytics.d.ts +18 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +152 -0
- package/dist/analytics.js.map +1 -0
- package/dist/auth/index.d.ts +9 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/pkce.d.ts +13 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +21 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/providers/anthropic.d.ts +17 -0
- package/dist/auth/providers/anthropic.d.ts.map +1 -0
- package/dist/auth/providers/anthropic.js +94 -0
- package/dist/auth/providers/anthropic.js.map +1 -0
- package/dist/auth/providers/github-copilot.d.ts +100 -0
- package/dist/auth/providers/github-copilot.d.ts.map +1 -0
- package/dist/auth/providers/github-copilot.js +302 -0
- package/dist/auth/providers/github-copilot.js.map +1 -0
- package/dist/auth/providers/openai-codex.d.ts +95 -0
- package/dist/auth/providers/openai-codex.d.ts.map +1 -0
- package/dist/auth/providers/openai-codex.js +527 -0
- package/dist/auth/providers/openai-codex.js.map +1 -0
- package/dist/auth/storage.d.ts +91 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +187 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/auth/types.d.ts +68 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +1 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/clipboard/index.d.ts +26 -0
- package/dist/clipboard/index.d.ts.map +1 -0
- package/dist/clipboard/index.js +192 -0
- package/dist/clipboard/index.js.map +1 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +23 -0
- package/dist/constants.js.map +1 -0
- package/dist/error-classification.d.ts +10 -0
- package/dist/error-classification.d.ts.map +1 -0
- package/dist/error-classification.js +14 -0
- package/dist/error-classification.js.map +1 -0
- package/dist/evals/context-builder.d.ts +41 -0
- package/dist/evals/context-builder.d.ts.map +1 -0
- package/dist/evals/context-builder.js +120 -0
- package/dist/evals/context-builder.js.map +1 -0
- package/dist/evals/index.d.ts +4 -0
- package/dist/evals/index.d.ts.map +1 -0
- package/dist/evals/index.js +8 -0
- package/dist/evals/index.js.map +1 -0
- package/dist/evals/scorers/classify-command.d.ts +31 -0
- package/dist/evals/scorers/classify-command.d.ts.map +1 -0
- package/dist/evals/scorers/classify-command.js +52 -0
- package/dist/evals/scorers/classify-command.js.map +1 -0
- package/dist/evals/scorers/efficiency.d.ts +44 -0
- package/dist/evals/scorers/efficiency.d.ts.map +1 -0
- package/dist/evals/scorers/efficiency.js +201 -0
- package/dist/evals/scorers/efficiency.js.map +1 -0
- package/dist/evals/scorers/extract-tools.d.ts +25 -0
- package/dist/evals/scorers/extract-tools.d.ts.map +1 -0
- package/dist/evals/scorers/extract-tools.js +56 -0
- package/dist/evals/scorers/extract-tools.js.map +1 -0
- package/dist/evals/scorers/index.d.ts +3 -0
- package/dist/evals/scorers/index.d.ts.map +1 -0
- package/dist/evals/scorers/index.js +7 -0
- package/dist/evals/scorers/index.js.map +1 -0
- package/dist/evals/scorers/outcome.d.ts +49 -0
- package/dist/evals/scorers/outcome.d.ts.map +1 -0
- package/dist/evals/scorers/outcome.js +238 -0
- package/dist/evals/scorers/outcome.js.map +1 -0
- package/dist/headless/cli.d.ts +42 -0
- package/dist/headless/cli.d.ts.map +1 -0
- package/dist/headless/cli.js +196 -0
- package/dist/headless/cli.js.map +1 -0
- package/dist/headless/flags.d.ts +33 -0
- package/dist/headless/flags.d.ts.map +1 -0
- package/dist/headless/flags.js +188 -0
- package/dist/headless/flags.js.map +1 -0
- package/dist/headless/format.d.ts +38 -0
- package/dist/headless/format.d.ts.map +1 -0
- package/dist/headless/format.js +85 -0
- package/dist/headless/format.js.map +1 -0
- package/dist/headless/index.d.ts +25 -0
- package/dist/headless/index.d.ts.map +1 -0
- package/dist/headless/index.js +32 -0
- package/dist/headless/index.js.map +1 -0
- package/dist/headless/policy.d.ts +17 -0
- package/dist/headless/policy.d.ts.map +1 -0
- package/dist/headless/policy.js +38 -0
- package/dist/headless/policy.js.map +1 -0
- package/dist/headless/run-mc.d.ts +7 -0
- package/dist/headless/run-mc.d.ts.map +1 -0
- package/dist/headless/run-mc.js +296 -0
- package/dist/headless/run-mc.js.map +1 -0
- package/dist/headless/types.d.ts +134 -0
- package/dist/headless/types.d.ts.map +1 -0
- package/dist/headless/types.js +9 -0
- package/dist/headless/types.js.map +1 -0
- package/dist/hooks/config.d.ts +11 -0
- package/dist/hooks/config.d.ts.map +1 -0
- package/dist/hooks/config.js +78 -0
- package/dist/hooks/config.js.map +1 -0
- package/dist/hooks/executor.d.ts +13 -0
- package/dist/hooks/executor.d.ts.map +1 -0
- package/dist/hooks/executor.js +125 -0
- package/dist/hooks/executor.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +16 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/manager.d.ts +47 -0
- package/dist/hooks/manager.d.ts.map +1 -0
- package/dist/hooks/manager.js +284 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/types.d.ts +152 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +7 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +241 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +712 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/ipc-reporter.d.ts +14 -0
- package/dist/ipc/ipc-reporter.d.ts.map +1 -0
- package/dist/ipc/ipc-reporter.js +24 -0
- package/dist/ipc/ipc-reporter.js.map +1 -0
- package/dist/lsp/client.d.ts +56 -0
- package/dist/lsp/client.d.ts.map +1 -0
- package/dist/lsp/client.js +309 -0
- package/dist/lsp/client.js.map +1 -0
- package/dist/lsp/index.d.ts +4 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +9 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/language.d.ts +9 -0
- package/dist/lsp/language.d.ts.map +1 -0
- package/dist/lsp/language.js +48 -0
- package/dist/lsp/language.js.map +1 -0
- package/dist/lsp/manager.d.ts +34 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +97 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/server.d.ts +27 -0
- package/dist/lsp/server.d.ts.map +1 -0
- package/dist/lsp/server.js +128 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp/workspace.d.ts +9 -0
- package/dist/lsp/workspace.d.ts.map +1 -0
- package/dist/lsp/workspace.js +52 -0
- package/dist/lsp/workspace.js.map +1 -0
- package/dist/mcp/config.d.ts +34 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +205 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +10 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +49 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +374 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/types.d.ts +85 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +1 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/onboarding/custom-packs.d.ts +7 -0
- package/dist/onboarding/custom-packs.d.ts.map +1 -0
- package/dist/onboarding/custom-packs.js +20 -0
- package/dist/onboarding/custom-packs.js.map +1 -0
- package/dist/onboarding/custom-providers.d.ts +4 -0
- package/dist/onboarding/custom-providers.d.ts.map +1 -0
- package/dist/onboarding/custom-providers.js +28 -0
- package/dist/onboarding/custom-providers.js.map +1 -0
- package/dist/onboarding/index.d.ts +5 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +21 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/om-settings.d.ts +20 -0
- package/dist/onboarding/om-settings.d.ts.map +1 -0
- package/dist/onboarding/om-settings.js +26 -0
- package/dist/onboarding/om-settings.js.map +1 -0
- package/dist/onboarding/packs.d.ts +48 -0
- package/dist/onboarding/packs.d.ts.map +1 -0
- package/dist/onboarding/packs.js +111 -0
- package/dist/onboarding/packs.js.map +1 -0
- package/dist/onboarding/settings.d.ts +323 -0
- package/dist/onboarding/settings.d.ts.map +1 -0
- package/dist/onboarding/settings.js +594 -0
- package/dist/onboarding/settings.js.map +1 -0
- package/dist/permissions.d.ts +55 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +119 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plugin.d.ts +81 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +30 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugins/install.d.ts +20 -0
- package/dist/plugins/install.d.ts.map +1 -0
- package/dist/plugins/install.js +179 -0
- package/dist/plugins/install.js.map +1 -0
- package/dist/plugins/loader.d.ts +15 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +221 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manager.d.ts +60 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +369 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/manifest.d.ts +14 -0
- package/dist/plugins/manifest.d.ts.map +1 -0
- package/dist/plugins/manifest.js +75 -0
- package/dist/plugins/manifest.js.map +1 -0
- package/dist/plugins/package-link.d.ts +2 -0
- package/dist/plugins/package-link.d.ts.map +1 -0
- package/dist/plugins/package-link.js +20 -0
- package/dist/plugins/package-link.js.map +1 -0
- package/dist/plugins/paths.d.ts +10 -0
- package/dist/plugins/paths.d.ts.map +1 -0
- package/dist/plugins/paths.js +26 -0
- package/dist/plugins/paths.js.map +1 -0
- package/dist/plugins/registry.d.ts +8 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +96 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/scaffold.d.ts +10 -0
- package/dist/plugins/scaffold.d.ts.map +1 -0
- package/dist/plugins/scaffold.js +152 -0
- package/dist/plugins/scaffold.js.map +1 -0
- package/dist/plugins/types.d.ts +45 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +1 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/processors/plan-rejection-abort.d.ts +12 -0
- package/dist/processors/plan-rejection-abort.d.ts.map +1 -0
- package/dist/processors/plan-rejection-abort.js +53 -0
- package/dist/processors/plan-rejection-abort.js.map +1 -0
- package/dist/providers/amazon-bedrock-gateway.d.ts +40 -0
- package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -0
- package/dist/providers/amazon-bedrock-gateway.js +79 -0
- package/dist/providers/amazon-bedrock-gateway.js.map +1 -0
- package/dist/providers/amazon-bedrock.d.ts +28 -0
- package/dist/providers/amazon-bedrock.d.ts.map +1 -0
- package/dist/providers/amazon-bedrock.js +62 -0
- package/dist/providers/amazon-bedrock.js.map +1 -0
- package/dist/providers/claude-max.d.ts +50 -0
- package/dist/providers/claude-max.d.ts.map +1 -0
- package/dist/providers/claude-max.js +151 -0
- package/dist/providers/claude-max.js.map +1 -0
- package/dist/providers/github-copilot.d.ts +58 -0
- package/dist/providers/github-copilot.d.ts.map +1 -0
- package/dist/providers/github-copilot.js +263 -0
- package/dist/providers/github-copilot.js.map +1 -0
- package/dist/providers/openai-codex.d.ts +70 -0
- package/dist/providers/openai-codex.d.ts.map +1 -0
- package/dist/providers/openai-codex.js +291 -0
- package/dist/providers/openai-codex.js.map +1 -0
- package/dist/schema.d.ts +167 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +92 -0
- package/dist/schema.js.map +1 -0
- package/dist/theme-palette.d.ts +17 -0
- package/dist/theme-palette.d.ts.map +1 -0
- package/dist/theme-palette.js +17 -0
- package/dist/theme-palette.js.map +1 -0
- package/dist/tool-names.d.ts +73 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tool-names.js +43 -0
- package/dist/tool-names.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/request-sandbox-access.d.ts +6 -0
- package/dist/tools/request-sandbox-access.d.ts.map +1 -0
- package/dist/tools/request-sandbox-access.js +88 -0
- package/dist/tools/request-sandbox-access.js.map +1 -0
- package/dist/tools/utils.d.ts +20 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +22 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/web-search.d.ts +35 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +65 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/utils/binaries.d.ts +7 -0
- package/dist/utils/binaries.d.ts.map +1 -0
- package/dist/utils/binaries.js +74 -0
- package/dist/utils/binaries.js.map +1 -0
- package/dist/utils/debug-log.d.ts +12 -0
- package/dist/utils/debug-log.d.ts.map +1 -0
- package/dist/utils/debug-log.js +55 -0
- package/dist/utils/debug-log.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +207 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/gateway-sync.d.ts +26 -0
- package/dist/utils/gateway-sync.d.ts.map +1 -0
- package/dist/utils/gateway-sync.js +49 -0
- package/dist/utils/gateway-sync.js.map +1 -0
- package/dist/utils/plan-diff.d.ts +25 -0
- package/dist/utils/plan-diff.d.ts.map +1 -0
- package/dist/utils/plan-diff.js +43 -0
- package/dist/utils/plan-diff.js.map +1 -0
- package/dist/utils/plans.d.ts +56 -0
- package/dist/utils/plans.d.ts.map +1 -0
- package/dist/utils/plans.js +99 -0
- package/dist/utils/plans.js.map +1 -0
- package/dist/utils/project.d.ts +161 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +302 -0
- package/dist/utils/project.js.map +1 -0
- package/dist/utils/signals-pubsub.d.ts +41 -0
- package/dist/utils/signals-pubsub.d.ts.map +1 -0
- package/dist/utils/signals-pubsub.js +104 -0
- package/dist/utils/signals-pubsub.js.map +1 -0
- package/dist/utils/slash-command-loader.d.ts +48 -0
- package/dist/utils/slash-command-loader.d.ts.map +1 -0
- package/dist/utils/slash-command-loader.js +155 -0
- package/dist/utils/slash-command-loader.js.map +1 -0
- package/dist/utils/slash-command-processor.d.ts +14 -0
- package/dist/utils/slash-command-processor.d.ts.map +1 -0
- package/dist/utils/slash-command-processor.js +96 -0
- package/dist/utils/slash-command-processor.js.map +1 -0
- package/dist/utils/stdin-pipe.d.ts +33 -0
- package/dist/utils/stdin-pipe.d.ts.map +1 -0
- package/dist/utils/stdin-pipe.js +72 -0
- package/dist/utils/stdin-pipe.js.map +1 -0
- package/dist/utils/storage-factory.d.ts +50 -0
- package/dist/utils/storage-factory.d.ts.map +1 -0
- package/dist/utils/storage-factory.js +98 -0
- package/dist/utils/storage-factory.js.map +1 -0
- package/dist/utils/thread-lock.d.ts +26 -0
- package/dist/utils/thread-lock.d.ts.map +1 -0
- package/dist/utils/thread-lock.js +108 -0
- package/dist/utils/thread-lock.js.map +1 -0
- package/dist/utils/token-estimator.d.ts +3 -0
- package/dist/utils/token-estimator.d.ts.map +1 -0
- package/dist/utils/token-estimator.js +21 -0
- package/dist/utils/token-estimator.js.map +1 -0
- package/dist/utils/update-check.d.ts +52 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/dist/utils/update-check.js +177 -0
- package/dist/utils/update-check.js.map +1 -0
- package/dist/voice/stt-registry.d.ts +64 -0
- package/dist/voice/stt-registry.d.ts.map +1 -0
- package/dist/voice/stt-registry.js +126 -0
- package/dist/voice/stt-registry.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { DEFAULT_CONFIG_DIR } from "../constants.js";
|
|
5
|
+
const VALID_EVENTS = [
|
|
6
|
+
"PreToolUse",
|
|
7
|
+
"PostToolUse",
|
|
8
|
+
"Stop",
|
|
9
|
+
"UserPromptSubmit",
|
|
10
|
+
"SessionStart",
|
|
11
|
+
"SessionEnd",
|
|
12
|
+
"Notification",
|
|
13
|
+
"AgentStart",
|
|
14
|
+
"AgentEnd",
|
|
15
|
+
"PermissionRequest",
|
|
16
|
+
"PermissionResult",
|
|
17
|
+
"Interrupt",
|
|
18
|
+
"SubagentStart",
|
|
19
|
+
"SubagentEnd"
|
|
20
|
+
];
|
|
21
|
+
function loadHooksConfig(projectDir, configDirName = DEFAULT_CONFIG_DIR, homeDir) {
|
|
22
|
+
const globalPath = getGlobalHooksPath(configDirName, homeDir);
|
|
23
|
+
const projectPath = getProjectHooksPath(projectDir, configDirName);
|
|
24
|
+
const globalConfig = loadSingleConfig(globalPath);
|
|
25
|
+
const projectConfig = loadSingleConfig(projectPath);
|
|
26
|
+
return mergeConfigs(globalConfig, projectConfig);
|
|
27
|
+
}
|
|
28
|
+
function getProjectHooksPath(projectDir, configDirName = DEFAULT_CONFIG_DIR) {
|
|
29
|
+
return path.join(projectDir, configDirName, "hooks.json");
|
|
30
|
+
}
|
|
31
|
+
function getGlobalHooksPath(configDirName = DEFAULT_CONFIG_DIR, homeDir = os.homedir()) {
|
|
32
|
+
return path.join(homeDir, configDirName, "hooks.json");
|
|
33
|
+
}
|
|
34
|
+
function loadSingleConfig(filePath) {
|
|
35
|
+
try {
|
|
36
|
+
if (!fs.existsSync(filePath)) return {};
|
|
37
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
38
|
+
return validateConfig(JSON.parse(raw));
|
|
39
|
+
} catch {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function validateConfig(raw) {
|
|
44
|
+
if (!raw || typeof raw !== "object") return {};
|
|
45
|
+
const config = {};
|
|
46
|
+
const obj = raw;
|
|
47
|
+
for (const event of VALID_EVENTS) {
|
|
48
|
+
if (Array.isArray(obj[event])) {
|
|
49
|
+
const hooks = obj[event].filter(isValidHook);
|
|
50
|
+
if (hooks.length > 0) {
|
|
51
|
+
config[event] = hooks;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return config;
|
|
56
|
+
}
|
|
57
|
+
function isValidHook(raw) {
|
|
58
|
+
if (!raw || typeof raw !== "object") return false;
|
|
59
|
+
const obj = raw;
|
|
60
|
+
return obj.type === "command" && typeof obj.command === "string";
|
|
61
|
+
}
|
|
62
|
+
function mergeConfigs(global, project) {
|
|
63
|
+
const merged = {};
|
|
64
|
+
for (const event of VALID_EVENTS) {
|
|
65
|
+
const combined = [...global[event] ?? [], ...project[event] ?? []];
|
|
66
|
+
if (combined.length > 0) {
|
|
67
|
+
merged[event] = combined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return merged;
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
VALID_EVENTS,
|
|
74
|
+
getGlobalHooksPath,
|
|
75
|
+
getProjectHooksPath,
|
|
76
|
+
loadHooksConfig
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/config.ts"],"sourcesContent":["/**\n * Hook configuration loading from filesystem.\n * Loads from global (~/.mastracode/hooks.json) and project (.mastracode/hooks.json).\n * Global hooks run first, project hooks append.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport type { HooksConfig, HookDefinition, HookEventName } from './types.js';\n\nexport const VALID_EVENTS: HookEventName[] = [\n 'PreToolUse',\n 'PostToolUse',\n 'Stop',\n 'UserPromptSubmit',\n 'SessionStart',\n 'SessionEnd',\n 'Notification',\n 'AgentStart',\n 'AgentEnd',\n 'PermissionRequest',\n 'PermissionResult',\n 'Interrupt',\n 'SubagentStart',\n 'SubagentEnd',\n];\n\nexport function loadHooksConfig(projectDir: string, configDirName = DEFAULT_CONFIG_DIR, homeDir?: string): HooksConfig {\n const globalPath = getGlobalHooksPath(configDirName, homeDir);\n const projectPath = getProjectHooksPath(projectDir, configDirName);\n\n const globalConfig = loadSingleConfig(globalPath);\n const projectConfig = loadSingleConfig(projectPath);\n\n return mergeConfigs(globalConfig, projectConfig);\n}\n\nexport function getProjectHooksPath(projectDir: string, configDirName = DEFAULT_CONFIG_DIR): string {\n return path.join(projectDir, configDirName, 'hooks.json');\n}\n\nexport function getGlobalHooksPath(configDirName = DEFAULT_CONFIG_DIR, homeDir = os.homedir()): string {\n return path.join(homeDir, configDirName, 'hooks.json');\n}\n\nfunction loadSingleConfig(filePath: string): HooksConfig {\n try {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n return validateConfig(JSON.parse(raw));\n } catch {\n return {};\n }\n}\n\nfunction validateConfig(raw: unknown): HooksConfig {\n if (!raw || typeof raw !== 'object') return {};\n\n const config: HooksConfig = {};\n const obj = raw as Record<string, unknown>;\n\n for (const event of VALID_EVENTS) {\n if (Array.isArray(obj[event])) {\n const hooks = (obj[event] as unknown[]).filter(isValidHook);\n if (hooks.length > 0) {\n config[event] = hooks;\n }\n }\n }\n\n return config;\n}\n\nfunction isValidHook(raw: unknown): raw is HookDefinition {\n if (!raw || typeof raw !== 'object') return false;\n const obj = raw as Record<string, unknown>;\n return obj.type === 'command' && typeof obj.command === 'string';\n}\n\nfunction mergeConfigs(global: HooksConfig, project: HooksConfig): HooksConfig {\n const merged: HooksConfig = {};\n\n for (const event of VALID_EVENTS) {\n const combined = [...(global[event] ?? []), ...(project[event] ?? [])];\n if (combined.length > 0) {\n merged[event] = combined;\n }\n }\n\n return merged;\n}\n"],"mappings":"AAMA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,0BAA0B;AAG5B,MAAM,eAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,gBAAgB,YAAoB,gBAAgB,oBAAoB,SAA+B;AACrH,QAAM,aAAa,mBAAmB,eAAe,OAAO;AAC5D,QAAM,cAAc,oBAAoB,YAAY,aAAa;AAEjE,QAAM,eAAe,iBAAiB,UAAU;AAChD,QAAM,gBAAgB,iBAAiB,WAAW;AAElD,SAAO,aAAa,cAAc,aAAa;AACjD;AAEO,SAAS,oBAAoB,YAAoB,gBAAgB,oBAA4B;AAClG,SAAO,KAAK,KAAK,YAAY,eAAe,YAAY;AAC1D;AAEO,SAAS,mBAAmB,gBAAgB,oBAAoB,UAAU,GAAG,QAAQ,GAAW;AACrG,SAAO,KAAK,KAAK,SAAS,eAAe,YAAY;AACvD;AAEA,SAAS,iBAAiB,UAA+B;AACvD,MAAI;AACF,QAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,QAAO,CAAC;AACtC,UAAM,MAAM,GAAG,aAAa,UAAU,OAAO;AAC7C,WAAO,eAAe,KAAK,MAAM,GAAG,CAAC;AAAA,EACvC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,eAAe,KAA2B;AACjD,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO,CAAC;AAE7C,QAAM,SAAsB,CAAC;AAC7B,QAAM,MAAM;AAEZ,aAAW,SAAS,cAAc;AAChC,QAAI,MAAM,QAAQ,IAAI,KAAK,CAAC,GAAG;AAC7B,YAAM,QAAS,IAAI,KAAK,EAAgB,OAAO,WAAW;AAC1D,UAAI,MAAM,SAAS,GAAG;AACpB,eAAO,KAAK,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,KAAqC;AACxD,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAM;AACZ,SAAO,IAAI,SAAS,aAAa,OAAO,IAAI,YAAY;AAC1D;AAEA,SAAS,aAAa,QAAqB,SAAmC;AAC5E,QAAM,SAAsB,CAAC;AAE7B,aAAW,SAAS,cAAc;AAChC,UAAM,WAAW,CAAC,GAAI,OAAO,KAAK,KAAK,CAAC,GAAI,GAAI,QAAQ,KAAK,KAAK,CAAC,CAAE;AACrE,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook process execution.
|
|
3
|
+
* Spawns shell commands, handles stdin/stdout/exit-code protocol.
|
|
4
|
+
*/
|
|
5
|
+
import type { HookDefinition, HookStdin, HookResult, HookEventResult } from './types.js';
|
|
6
|
+
export declare function executeHook(hook: HookDefinition, stdinPayload: HookStdin): Promise<HookResult>;
|
|
7
|
+
export declare function matchesHook(hook: HookDefinition, context: {
|
|
8
|
+
tool_name?: string;
|
|
9
|
+
}): boolean;
|
|
10
|
+
export declare function runHooksForEvent(hooks: HookDefinition[], stdinPayload: HookStdin, matchContext?: {
|
|
11
|
+
tool_name?: string;
|
|
12
|
+
}): Promise<HookEventResult>;
|
|
13
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/hooks/executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAc,eAAe,EAAE,MAAM,YAAY,CAAC;AAKrG,wBAAsB,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAiFpG;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAa1F;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,cAAc,EAAE,EACvB,YAAY,EAAE,SAAS,EACvB,YAAY,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACxC,OAAO,CAAC,eAAe,CAAC,CA8C1B"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { isBlockingEvent } from "./types.js";
|
|
3
|
+
const DEFAULT_TIMEOUT = 1e4;
|
|
4
|
+
async function executeHook(hook, stdinPayload) {
|
|
5
|
+
const timeout = hook.timeout ?? DEFAULT_TIMEOUT;
|
|
6
|
+
const startTime = Date.now();
|
|
7
|
+
return new Promise((resolve) => {
|
|
8
|
+
const isWindows = process.platform === "win32";
|
|
9
|
+
const shell = isWindows ? "cmd" : "/bin/sh";
|
|
10
|
+
const shellArgs = isWindows ? ["/c", hook.command] : ["-c", hook.command];
|
|
11
|
+
const child = spawn(shell, shellArgs, {
|
|
12
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
13
|
+
cwd: stdinPayload.cwd,
|
|
14
|
+
env: {
|
|
15
|
+
...process.env,
|
|
16
|
+
MASTRA_HOOK_EVENT: stdinPayload.hook_event_name
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
let stdout = "";
|
|
20
|
+
let stderr = "";
|
|
21
|
+
let timedOut = false;
|
|
22
|
+
let resolved = false;
|
|
23
|
+
const timer = setTimeout(() => {
|
|
24
|
+
timedOut = true;
|
|
25
|
+
child.kill("SIGKILL");
|
|
26
|
+
}, timeout);
|
|
27
|
+
child.stdout?.on("data", (data) => {
|
|
28
|
+
stdout += data.toString();
|
|
29
|
+
});
|
|
30
|
+
child.stderr?.on("data", (data) => {
|
|
31
|
+
stderr += data.toString();
|
|
32
|
+
});
|
|
33
|
+
child.on("close", (exitCode) => {
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
if (resolved) return;
|
|
36
|
+
resolved = true;
|
|
37
|
+
let parsedStdout;
|
|
38
|
+
if (stdout.trim()) {
|
|
39
|
+
try {
|
|
40
|
+
parsedStdout = JSON.parse(stdout.trim());
|
|
41
|
+
} catch {
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
resolve({
|
|
45
|
+
hook,
|
|
46
|
+
exitCode: exitCode ?? 1,
|
|
47
|
+
stdout: parsedStdout,
|
|
48
|
+
stderr: stderr.trim() || void 0,
|
|
49
|
+
timedOut,
|
|
50
|
+
durationMs: Date.now() - startTime
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
child.on("error", (error) => {
|
|
54
|
+
clearTimeout(timer);
|
|
55
|
+
if (resolved) return;
|
|
56
|
+
resolved = true;
|
|
57
|
+
resolve({
|
|
58
|
+
hook,
|
|
59
|
+
exitCode: 1,
|
|
60
|
+
stderr: error.message,
|
|
61
|
+
timedOut: false,
|
|
62
|
+
durationMs: Date.now() - startTime
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
try {
|
|
66
|
+
child.stdin?.write(JSON.stringify(stdinPayload));
|
|
67
|
+
child.stdin?.end();
|
|
68
|
+
} catch {
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function matchesHook(hook, context) {
|
|
73
|
+
if (!hook.matcher) return true;
|
|
74
|
+
if (hook.matcher.tool_name) {
|
|
75
|
+
if (!context.tool_name) return false;
|
|
76
|
+
try {
|
|
77
|
+
return new RegExp(hook.matcher.tool_name).test(context.tool_name);
|
|
78
|
+
} catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
async function runHooksForEvent(hooks, stdinPayload, matchContext = {}) {
|
|
85
|
+
const results = [];
|
|
86
|
+
const warnings = [];
|
|
87
|
+
let additionalContext;
|
|
88
|
+
const applicable = hooks.filter((h) => matchesHook(h, matchContext));
|
|
89
|
+
if (applicable.length === 0) {
|
|
90
|
+
return { allowed: true, results: [], warnings: [] };
|
|
91
|
+
}
|
|
92
|
+
const blocking = isBlockingEvent(stdinPayload.hook_event_name);
|
|
93
|
+
for (const hook of applicable) {
|
|
94
|
+
const result = await executeHook(hook, stdinPayload);
|
|
95
|
+
results.push(result);
|
|
96
|
+
if (result.stdout?.additionalContext) {
|
|
97
|
+
additionalContext = additionalContext ? `${additionalContext}
|
|
98
|
+
${result.stdout.additionalContext}` : result.stdout.additionalContext;
|
|
99
|
+
}
|
|
100
|
+
if (result.timedOut) {
|
|
101
|
+
warnings.push(`Hook timed out after ${hook.timeout ?? DEFAULT_TIMEOUT}ms: ${hook.command}`);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (result.exitCode === 2 && blocking) {
|
|
105
|
+
const reason = result.stdout?.reason || result.stderr || `Blocked by hook: ${hook.description || hook.command}`;
|
|
106
|
+
return {
|
|
107
|
+
allowed: false,
|
|
108
|
+
blockReason: reason,
|
|
109
|
+
additionalContext,
|
|
110
|
+
results,
|
|
111
|
+
warnings
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (result.exitCode === 0) continue;
|
|
115
|
+
const warnMsg = result.stderr || `Hook exited with code ${result.exitCode}`;
|
|
116
|
+
warnings.push(`${hook.description || hook.command}: ${warnMsg}`);
|
|
117
|
+
}
|
|
118
|
+
return { allowed: true, additionalContext, results, warnings };
|
|
119
|
+
}
|
|
120
|
+
export {
|
|
121
|
+
executeHook,
|
|
122
|
+
matchesHook,
|
|
123
|
+
runHooksForEvent
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/executor.ts"],"sourcesContent":["/**\n * Hook process execution.\n * Spawns shell commands, handles stdin/stdout/exit-code protocol.\n */\n\nimport { spawn } from 'node:child_process';\nimport type { HookDefinition, HookStdin, HookResult, HookStdout, HookEventResult } from './types.js';\nimport { isBlockingEvent } from './types.js';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport async function executeHook(hook: HookDefinition, stdinPayload: HookStdin): Promise<HookResult> {\n const timeout = hook.timeout ?? DEFAULT_TIMEOUT;\n const startTime = Date.now();\n\n return new Promise<HookResult>(resolve => {\n const isWindows = process.platform === 'win32';\n const shell = isWindows ? 'cmd' : '/bin/sh';\n const shellArgs = isWindows ? ['/c', hook.command] : ['-c', hook.command];\n\n const child = spawn(shell, shellArgs, {\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: stdinPayload.cwd,\n env: {\n ...process.env,\n MASTRA_HOOK_EVENT: stdinPayload.hook_event_name,\n },\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let resolved = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, timeout);\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', exitCode => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n let parsedStdout: HookStdout | undefined;\n if (stdout.trim()) {\n try {\n parsedStdout = JSON.parse(stdout.trim()) as HookStdout;\n } catch {\n // Not valid JSON — ignore\n }\n }\n\n resolve({\n hook,\n exitCode: exitCode ?? 1,\n stdout: parsedStdout,\n stderr: stderr.trim() || undefined,\n timedOut,\n durationMs: Date.now() - startTime,\n });\n });\n\n child.on('error', error => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n resolve({\n hook,\n exitCode: 1,\n stderr: error.message,\n timedOut: false,\n durationMs: Date.now() - startTime,\n });\n });\n\n try {\n child.stdin?.write(JSON.stringify(stdinPayload));\n child.stdin?.end();\n } catch {\n // stdin write failure — process continues\n }\n });\n}\n\nexport function matchesHook(hook: HookDefinition, context: { tool_name?: string }): boolean {\n if (!hook.matcher) return true;\n\n if (hook.matcher.tool_name) {\n if (!context.tool_name) return false;\n try {\n return new RegExp(hook.matcher.tool_name).test(context.tool_name);\n } catch {\n return false;\n }\n }\n\n return true;\n}\n\nexport async function runHooksForEvent(\n hooks: HookDefinition[],\n stdinPayload: HookStdin,\n matchContext: { tool_name?: string } = {},\n): Promise<HookEventResult> {\n const results: HookResult[] = [];\n const warnings: string[] = [];\n let additionalContext: string | undefined;\n\n const applicable = hooks.filter(h => matchesHook(h, matchContext));\n if (applicable.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const blocking = isBlockingEvent(stdinPayload.hook_event_name);\n\n for (const hook of applicable) {\n const result = await executeHook(hook, stdinPayload);\n results.push(result);\n\n if (result.stdout?.additionalContext) {\n additionalContext = additionalContext\n ? `${additionalContext}\\n${result.stdout.additionalContext}`\n : result.stdout.additionalContext;\n }\n\n if (result.timedOut) {\n warnings.push(`Hook timed out after ${hook.timeout ?? DEFAULT_TIMEOUT}ms: ${hook.command}`);\n continue;\n }\n\n if (result.exitCode === 2 && blocking) {\n const reason = result.stdout?.reason || result.stderr || `Blocked by hook: ${hook.description || hook.command}`;\n\n return {\n allowed: false,\n blockReason: reason,\n additionalContext,\n results,\n warnings,\n };\n }\n\n if (result.exitCode === 0) continue;\n\n const warnMsg = result.stderr || `Hook exited with code ${result.exitCode}`;\n warnings.push(`${hook.description || hook.command}: ${warnMsg}`);\n }\n\n return { allowed: true, additionalContext, results, warnings };\n}\n"],"mappings":"AAKA,SAAS,aAAa;AAEtB,SAAS,uBAAuB;AAEhC,MAAM,kBAAkB;AAExB,eAAsB,YAAY,MAAsB,cAA8C;AACpG,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,YAAY,KAAK,IAAI;AAE3B,SAAO,IAAI,QAAoB,aAAW;AACxC,UAAM,YAAY,QAAQ,aAAa;AACvC,UAAM,QAAQ,YAAY,QAAQ;AAClC,UAAM,YAAY,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO;AAExE,UAAM,QAAQ,MAAM,OAAO,WAAW;AAAA,MACpC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK,aAAa;AAAA,MAClB,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,mBAAmB,aAAa;AAAA,MAClC;AAAA,IACF,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,WAAW;AACf,QAAI,WAAW;AAEf,UAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAW;AACX,YAAM,KAAK,SAAS;AAAA,IACtB,GAAG,OAAO;AAEV,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AACzC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AACzC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AAED,UAAM,GAAG,SAAS,cAAY;AAC5B,mBAAa,KAAK;AAClB,UAAI,SAAU;AACd,iBAAW;AAEX,UAAI;AACJ,UAAI,OAAO,KAAK,GAAG;AACjB,YAAI;AACF,yBAAe,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,QACzC,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,cAAQ;AAAA,QACN;AAAA,QACA,UAAU,YAAY;AAAA,QACtB,QAAQ;AAAA,QACR,QAAQ,OAAO,KAAK,KAAK;AAAA,QACzB;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAED,UAAM,GAAG,SAAS,WAAS;AACzB,mBAAa,KAAK;AAClB,UAAI,SAAU;AACd,iBAAW;AAEX,cAAQ;AAAA,QACN;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,MAAM;AAAA,QACd,UAAU;AAAA,QACV,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAED,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,UAAU,YAAY,CAAC;AAC/C,YAAM,OAAO,IAAI;AAAA,IACnB,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AACH;AAEO,SAAS,YAAY,MAAsB,SAA0C;AAC1F,MAAI,CAAC,KAAK,QAAS,QAAO;AAE1B,MAAI,KAAK,QAAQ,WAAW;AAC1B,QAAI,CAAC,QAAQ,UAAW,QAAO;AAC/B,QAAI;AACF,aAAO,IAAI,OAAO,KAAK,QAAQ,SAAS,EAAE,KAAK,QAAQ,SAAS;AAAA,IAClE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,iBACpB,OACA,cACA,eAAuC,CAAC,GACd;AAC1B,QAAM,UAAwB,CAAC;AAC/B,QAAM,WAAqB,CAAC;AAC5B,MAAI;AAEJ,QAAM,aAAa,MAAM,OAAO,OAAK,YAAY,GAAG,YAAY,CAAC;AACjE,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,EAAE,SAAS,MAAM,SAAS,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACpD;AAEA,QAAM,WAAW,gBAAgB,aAAa,eAAe;AAE7D,aAAW,QAAQ,YAAY;AAC7B,UAAM,SAAS,MAAM,YAAY,MAAM,YAAY;AACnD,YAAQ,KAAK,MAAM;AAEnB,QAAI,OAAO,QAAQ,mBAAmB;AACpC,0BAAoB,oBAChB,GAAG,iBAAiB;AAAA,EAAK,OAAO,OAAO,iBAAiB,KACxD,OAAO,OAAO;AAAA,IACpB;AAEA,QAAI,OAAO,UAAU;AACnB,eAAS,KAAK,wBAAwB,KAAK,WAAW,eAAe,OAAO,KAAK,OAAO,EAAE;AAC1F;AAAA,IACF;AAEA,QAAI,OAAO,aAAa,KAAK,UAAU;AACrC,YAAM,SAAS,OAAO,QAAQ,UAAU,OAAO,UAAU,oBAAoB,KAAK,eAAe,KAAK,OAAO;AAE7G,aAAO;AAAA,QACL,SAAS;AAAA,QACT,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,aAAa,EAAG;AAE3B,UAAM,UAAU,OAAO,UAAU,yBAAyB,OAAO,QAAQ;AACzE,aAAS,KAAK,GAAG,KAAK,eAAe,KAAK,OAAO,KAAK,OAAO,EAAE;AAAA,EACjE;AAEA,SAAO,EAAE,SAAS,MAAM,mBAAmB,SAAS,SAAS;AAC/D;","names":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { HookManager } from './manager.js';
|
|
2
|
+
export { loadHooksConfig, getProjectHooksPath, getGlobalHooksPath, VALID_EVENTS } from './config.js';
|
|
3
|
+
export { executeHook, runHooksForEvent, matchesHook } from './executor.js';
|
|
4
|
+
export { isBlockingEvent } from './types.js';
|
|
5
|
+
export type { HookEventName, HookDefinition, HookMatcher, HooksConfig, HookStdin, HookStdinBase, HookStdinToolEvent, HookStdinUserPrompt, HookStdinStop, HookStdinSession, HookStdinNotification, HookStdinAgentStart, HookStdinAgentEnd, HookStdinPermissionRequest, HookStdinPermissionResult, HookStdinInterrupt, HookStdinSubagentStart, HookStdinSubagentEnd, HookStdout, HookResult, HookEventResult, BlockingHookEvent, LifecycleHookEvent, PermissionKind, PermissionDecision, InterruptReason, } from './types.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { HookManager } from "./manager.js";
|
|
2
|
+
import { loadHooksConfig, getProjectHooksPath, getGlobalHooksPath, VALID_EVENTS } from "./config.js";
|
|
3
|
+
import { executeHook, runHooksForEvent, matchesHook } from "./executor.js";
|
|
4
|
+
import { isBlockingEvent } from "./types.js";
|
|
5
|
+
export {
|
|
6
|
+
HookManager,
|
|
7
|
+
VALID_EVENTS,
|
|
8
|
+
executeHook,
|
|
9
|
+
getGlobalHooksPath,
|
|
10
|
+
getProjectHooksPath,
|
|
11
|
+
isBlockingEvent,
|
|
12
|
+
loadHooksConfig,
|
|
13
|
+
matchesHook,
|
|
14
|
+
runHooksForEvent
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/index.ts"],"sourcesContent":["export { HookManager } from './manager.js';\nexport { loadHooksConfig, getProjectHooksPath, getGlobalHooksPath, VALID_EVENTS } from './config.js';\nexport { executeHook, runHooksForEvent, matchesHook } from './executor.js';\nexport { isBlockingEvent } from './types.js';\nexport type {\n HookEventName,\n HookDefinition,\n HookMatcher,\n HooksConfig,\n HookStdin,\n HookStdinBase,\n HookStdinToolEvent,\n HookStdinUserPrompt,\n HookStdinStop,\n HookStdinSession,\n HookStdinNotification,\n HookStdinAgentStart,\n HookStdinAgentEnd,\n HookStdinPermissionRequest,\n HookStdinPermissionResult,\n HookStdinInterrupt,\n HookStdinSubagentStart,\n HookStdinSubagentEnd,\n HookStdout,\n HookResult,\n HookEventResult,\n BlockingHookEvent,\n LifecycleHookEvent,\n PermissionKind,\n PermissionDecision,\n InterruptReason,\n} from './types.js';\n"],"mappings":"AAAA,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB,qBAAqB,oBAAoB,oBAAoB;AACvF,SAAS,aAAa,kBAAkB,mBAAmB;AAC3D,SAAS,uBAAuB;","names":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { HooksConfig, HookEventResult, PermissionKind, PermissionDecision, InterruptReason } from './types.js';
|
|
2
|
+
export declare class HookManager {
|
|
3
|
+
private config;
|
|
4
|
+
private projectDir;
|
|
5
|
+
private sessionId;
|
|
6
|
+
private configDirName;
|
|
7
|
+
private homeDir?;
|
|
8
|
+
private runId?;
|
|
9
|
+
constructor(projectDir: string, sessionId: string, configDirName?: string, homeDir?: string);
|
|
10
|
+
reload(): void;
|
|
11
|
+
setSessionId(sessionId: string): void;
|
|
12
|
+
/** Set the active agent run id. Included as `run_id` in all hook stdin while a run is active. */
|
|
13
|
+
setRunId(runId: string): void;
|
|
14
|
+
/** Clear the active run id. Call only after end-of-run hooks (AgentEnd, Stop) have been dispatched. */
|
|
15
|
+
clearRunId(): void;
|
|
16
|
+
getRunId(): string | undefined;
|
|
17
|
+
hasHooks(): boolean;
|
|
18
|
+
getConfig(): HooksConfig;
|
|
19
|
+
getConfigPaths(): {
|
|
20
|
+
project: string;
|
|
21
|
+
global: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Build the common stdin base fields. `run_id` is included when an active run
|
|
25
|
+
* is set, so every event dispatched during a run carries the same identifier.
|
|
26
|
+
*/
|
|
27
|
+
private baseStdinFields;
|
|
28
|
+
runPreToolUse(toolName: string, toolInput: unknown): Promise<HookEventResult>;
|
|
29
|
+
runPostToolUse(toolName: string, toolInput: unknown, toolOutput: unknown, toolError: boolean): Promise<HookEventResult>;
|
|
30
|
+
runUserPromptSubmit(userMessage: string): Promise<HookEventResult>;
|
|
31
|
+
runStop(assistantMessage: string | undefined, stopReason: 'complete' | 'aborted' | 'error'): Promise<HookEventResult>;
|
|
32
|
+
runSessionStart(): Promise<HookEventResult>;
|
|
33
|
+
runSessionEnd(): Promise<HookEventResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Fire notification hooks (non-blocking, fire-and-forget).
|
|
36
|
+
* Called when the TUI is waiting for user input.
|
|
37
|
+
*/
|
|
38
|
+
runNotification(reason: string, message?: string): void;
|
|
39
|
+
runAgentStart(): Promise<HookEventResult>;
|
|
40
|
+
runAgentEnd(stopReason: 'complete' | 'aborted' | 'error' | 'suspended'): Promise<HookEventResult>;
|
|
41
|
+
runPermissionRequest(permissionKind: PermissionKind, toolCallId: string, toolName: string, toolInput?: unknown): Promise<HookEventResult>;
|
|
42
|
+
runPermissionResult(permissionKind: PermissionKind, toolCallId: string, toolName: string, decision: PermissionDecision, toolInput?: unknown): Promise<HookEventResult>;
|
|
43
|
+
runInterrupt(reason: InterruptReason): Promise<HookEventResult>;
|
|
44
|
+
runSubagentStart(toolCallId: string, agentType: string, task: string, modelId?: string, forked?: boolean): Promise<HookEventResult>;
|
|
45
|
+
runSubagentEnd(toolCallId: string, agentType: string, result: unknown, isError: boolean, durationMs: number): Promise<HookEventResult>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/hooks/manager.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAcf,cAAc,EACd,kBAAkB,EAClB,eAAe,EAChB,MAAM,YAAY,CAAC;AAIpB,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,KAAK,CAAC,CAAS;gBAEX,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,SAAqB,EAAE,OAAO,CAAC,EAAE,MAAM;IAQvG,MAAM,IAAI,IAAI;IAId,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC,iGAAiG;IACjG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,uGAAuG;IACvG,UAAU,IAAI,IAAI;IAIlB,QAAQ,IAAI,MAAM,GAAG,SAAS;IAI9B,QAAQ,IAAI,OAAO;IAInB,SAAS,IAAI,WAAW;IAIxB,cAAc,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAWrD;;;OAGG;IACH,OAAO,CAAC,eAAe;IAqBjB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAe7E,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,eAAe,CAAC;IAiBrB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAclE,OAAO,CACX,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,GAC3C,OAAO,CAAC,eAAe,CAAC;IAerB,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC;IAY3C,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;IAa/C;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAkBjD,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;IAkBzC,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAmBjG,oBAAoB,CACxB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,OAAO,GAClB,OAAO,CAAC,eAAe,CAAC;IAsBrB,mBAAmB,CACvB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,CAAC,EAAE,OAAO,GAClB,OAAO,CAAC,eAAe,CAAC;IAwBrB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAoB/D,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,eAAe,CAAC;IAuBrB,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC;CAsB5B"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { DEFAULT_CONFIG_DIR } from "../constants.js";
|
|
2
|
+
import { loadHooksConfig, getProjectHooksPath, getGlobalHooksPath } from "./config.js";
|
|
3
|
+
import { runHooksForEvent } from "./executor.js";
|
|
4
|
+
const emptyResult = () => ({ allowed: true, results: [], warnings: [] });
|
|
5
|
+
class HookManager {
|
|
6
|
+
config;
|
|
7
|
+
projectDir;
|
|
8
|
+
sessionId;
|
|
9
|
+
configDirName;
|
|
10
|
+
homeDir;
|
|
11
|
+
runId;
|
|
12
|
+
constructor(projectDir, sessionId, configDirName = DEFAULT_CONFIG_DIR, homeDir) {
|
|
13
|
+
this.projectDir = projectDir;
|
|
14
|
+
this.sessionId = sessionId;
|
|
15
|
+
this.configDirName = configDirName;
|
|
16
|
+
this.homeDir = homeDir;
|
|
17
|
+
this.config = loadHooksConfig(projectDir, configDirName, homeDir);
|
|
18
|
+
}
|
|
19
|
+
reload() {
|
|
20
|
+
this.config = loadHooksConfig(this.projectDir, this.configDirName, this.homeDir);
|
|
21
|
+
}
|
|
22
|
+
setSessionId(sessionId) {
|
|
23
|
+
this.sessionId = sessionId;
|
|
24
|
+
}
|
|
25
|
+
/** Set the active agent run id. Included as `run_id` in all hook stdin while a run is active. */
|
|
26
|
+
setRunId(runId) {
|
|
27
|
+
this.runId = runId;
|
|
28
|
+
}
|
|
29
|
+
/** Clear the active run id. Call only after end-of-run hooks (AgentEnd, Stop) have been dispatched. */
|
|
30
|
+
clearRunId() {
|
|
31
|
+
this.runId = void 0;
|
|
32
|
+
}
|
|
33
|
+
getRunId() {
|
|
34
|
+
return this.runId;
|
|
35
|
+
}
|
|
36
|
+
hasHooks() {
|
|
37
|
+
return Object.keys(this.config).length > 0;
|
|
38
|
+
}
|
|
39
|
+
getConfig() {
|
|
40
|
+
return this.config;
|
|
41
|
+
}
|
|
42
|
+
getConfigPaths() {
|
|
43
|
+
return {
|
|
44
|
+
project: getProjectHooksPath(this.projectDir, this.configDirName),
|
|
45
|
+
global: getGlobalHooksPath(this.configDirName, this.homeDir)
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// =========================================================================
|
|
49
|
+
// Stdin Helpers
|
|
50
|
+
// =========================================================================
|
|
51
|
+
/**
|
|
52
|
+
* Build the common stdin base fields. `run_id` is included when an active run
|
|
53
|
+
* is set, so every event dispatched during a run carries the same identifier.
|
|
54
|
+
*/
|
|
55
|
+
baseStdinFields(hook_event_name) {
|
|
56
|
+
const base = {
|
|
57
|
+
session_id: this.sessionId,
|
|
58
|
+
cwd: this.projectDir,
|
|
59
|
+
hook_event_name
|
|
60
|
+
};
|
|
61
|
+
if (this.runId) base.run_id = this.runId;
|
|
62
|
+
return base;
|
|
63
|
+
}
|
|
64
|
+
// =========================================================================
|
|
65
|
+
// Blocking Event Methods (decisions enforced by callers)
|
|
66
|
+
// =========================================================================
|
|
67
|
+
async runPreToolUse(toolName, toolInput) {
|
|
68
|
+
const hooks = this.config.PreToolUse;
|
|
69
|
+
if (!hooks || hooks.length === 0) {
|
|
70
|
+
return emptyResult();
|
|
71
|
+
}
|
|
72
|
+
const stdin = {
|
|
73
|
+
...this.baseStdinFields("PreToolUse"),
|
|
74
|
+
tool_name: toolName,
|
|
75
|
+
tool_input: toolInput
|
|
76
|
+
};
|
|
77
|
+
return runHooksForEvent(hooks, stdin, { tool_name: toolName });
|
|
78
|
+
}
|
|
79
|
+
async runPostToolUse(toolName, toolInput, toolOutput, toolError) {
|
|
80
|
+
const hooks = this.config.PostToolUse;
|
|
81
|
+
if (!hooks || hooks.length === 0) {
|
|
82
|
+
return emptyResult();
|
|
83
|
+
}
|
|
84
|
+
const stdin = {
|
|
85
|
+
...this.baseStdinFields("PostToolUse"),
|
|
86
|
+
tool_name: toolName,
|
|
87
|
+
tool_input: toolInput,
|
|
88
|
+
tool_output: toolOutput,
|
|
89
|
+
tool_error: toolError
|
|
90
|
+
};
|
|
91
|
+
return runHooksForEvent(hooks, stdin, { tool_name: toolName });
|
|
92
|
+
}
|
|
93
|
+
async runUserPromptSubmit(userMessage) {
|
|
94
|
+
const hooks = this.config.UserPromptSubmit;
|
|
95
|
+
if (!hooks || hooks.length === 0) {
|
|
96
|
+
return emptyResult();
|
|
97
|
+
}
|
|
98
|
+
const stdin = {
|
|
99
|
+
...this.baseStdinFields("UserPromptSubmit"),
|
|
100
|
+
user_message: userMessage
|
|
101
|
+
};
|
|
102
|
+
return runHooksForEvent(hooks, stdin);
|
|
103
|
+
}
|
|
104
|
+
async runStop(assistantMessage, stopReason) {
|
|
105
|
+
const hooks = this.config.Stop;
|
|
106
|
+
if (!hooks || hooks.length === 0) {
|
|
107
|
+
return emptyResult();
|
|
108
|
+
}
|
|
109
|
+
const stdin = {
|
|
110
|
+
...this.baseStdinFields("Stop"),
|
|
111
|
+
assistant_message: assistantMessage,
|
|
112
|
+
stop_reason: stopReason
|
|
113
|
+
};
|
|
114
|
+
return runHooksForEvent(hooks, stdin);
|
|
115
|
+
}
|
|
116
|
+
async runSessionStart() {
|
|
117
|
+
const hooks = this.config.SessionStart;
|
|
118
|
+
if (!hooks || hooks.length === 0) {
|
|
119
|
+
return emptyResult();
|
|
120
|
+
}
|
|
121
|
+
const stdin = {
|
|
122
|
+
...this.baseStdinFields("SessionStart")
|
|
123
|
+
};
|
|
124
|
+
return runHooksForEvent(hooks, stdin);
|
|
125
|
+
}
|
|
126
|
+
async runSessionEnd() {
|
|
127
|
+
const hooks = this.config.SessionEnd;
|
|
128
|
+
if (!hooks || hooks.length === 0) {
|
|
129
|
+
return emptyResult();
|
|
130
|
+
}
|
|
131
|
+
const stdin = {
|
|
132
|
+
...this.baseStdinFields("SessionEnd")
|
|
133
|
+
};
|
|
134
|
+
return runHooksForEvent(hooks, stdin);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Fire notification hooks (non-blocking, fire-and-forget).
|
|
138
|
+
* Called when the TUI is waiting for user input.
|
|
139
|
+
*/
|
|
140
|
+
runNotification(reason, message) {
|
|
141
|
+
const hooks = this.config.Notification;
|
|
142
|
+
if (!hooks || hooks.length === 0) return;
|
|
143
|
+
const stdin = {
|
|
144
|
+
...this.baseStdinFields("Notification"),
|
|
145
|
+
reason,
|
|
146
|
+
message
|
|
147
|
+
};
|
|
148
|
+
runHooksForEvent(hooks, stdin).catch(() => {
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// =========================================================================
|
|
152
|
+
// Lifecycle Event Methods (non-blocking: observe behavior, never enforce)
|
|
153
|
+
// =========================================================================
|
|
154
|
+
async runAgentStart() {
|
|
155
|
+
const hooks = this.config.AgentStart;
|
|
156
|
+
if (!hooks || hooks.length === 0) {
|
|
157
|
+
return emptyResult();
|
|
158
|
+
}
|
|
159
|
+
const runId = this.runId;
|
|
160
|
+
if (!runId) {
|
|
161
|
+
return emptyResult();
|
|
162
|
+
}
|
|
163
|
+
const stdin = {
|
|
164
|
+
...this.baseStdinFields("AgentStart"),
|
|
165
|
+
run_id: runId
|
|
166
|
+
};
|
|
167
|
+
return runHooksForEvent(hooks, stdin);
|
|
168
|
+
}
|
|
169
|
+
async runAgentEnd(stopReason) {
|
|
170
|
+
const hooks = this.config.AgentEnd;
|
|
171
|
+
if (!hooks || hooks.length === 0) {
|
|
172
|
+
return emptyResult();
|
|
173
|
+
}
|
|
174
|
+
const runId = this.runId;
|
|
175
|
+
if (!runId) {
|
|
176
|
+
return emptyResult();
|
|
177
|
+
}
|
|
178
|
+
const stdin = {
|
|
179
|
+
...this.baseStdinFields("AgentEnd"),
|
|
180
|
+
run_id: runId,
|
|
181
|
+
stop_reason: stopReason
|
|
182
|
+
};
|
|
183
|
+
return runHooksForEvent(hooks, stdin);
|
|
184
|
+
}
|
|
185
|
+
async runPermissionRequest(permissionKind, toolCallId, toolName, toolInput) {
|
|
186
|
+
const hooks = this.config.PermissionRequest;
|
|
187
|
+
if (!hooks || hooks.length === 0) {
|
|
188
|
+
return emptyResult();
|
|
189
|
+
}
|
|
190
|
+
const runId = this.runId;
|
|
191
|
+
if (!runId) {
|
|
192
|
+
return emptyResult();
|
|
193
|
+
}
|
|
194
|
+
const stdin = {
|
|
195
|
+
...this.baseStdinFields("PermissionRequest"),
|
|
196
|
+
run_id: runId,
|
|
197
|
+
permission_kind: permissionKind,
|
|
198
|
+
tool_call_id: toolCallId,
|
|
199
|
+
tool_name: toolName,
|
|
200
|
+
...toolInput !== void 0 ? { tool_input: toolInput } : {}
|
|
201
|
+
};
|
|
202
|
+
return runHooksForEvent(hooks, stdin);
|
|
203
|
+
}
|
|
204
|
+
async runPermissionResult(permissionKind, toolCallId, toolName, decision, toolInput) {
|
|
205
|
+
const hooks = this.config.PermissionResult;
|
|
206
|
+
if (!hooks || hooks.length === 0) {
|
|
207
|
+
return emptyResult();
|
|
208
|
+
}
|
|
209
|
+
const runId = this.runId;
|
|
210
|
+
if (!runId) {
|
|
211
|
+
return emptyResult();
|
|
212
|
+
}
|
|
213
|
+
const stdin = {
|
|
214
|
+
...this.baseStdinFields("PermissionResult"),
|
|
215
|
+
run_id: runId,
|
|
216
|
+
permission_kind: permissionKind,
|
|
217
|
+
tool_call_id: toolCallId,
|
|
218
|
+
tool_name: toolName,
|
|
219
|
+
decision,
|
|
220
|
+
...toolInput !== void 0 ? { tool_input: toolInput } : {}
|
|
221
|
+
};
|
|
222
|
+
return runHooksForEvent(hooks, stdin);
|
|
223
|
+
}
|
|
224
|
+
async runInterrupt(reason) {
|
|
225
|
+
const hooks = this.config.Interrupt;
|
|
226
|
+
if (!hooks || hooks.length === 0) {
|
|
227
|
+
return emptyResult();
|
|
228
|
+
}
|
|
229
|
+
const runId = this.runId;
|
|
230
|
+
if (!runId) {
|
|
231
|
+
return emptyResult();
|
|
232
|
+
}
|
|
233
|
+
const stdin = {
|
|
234
|
+
...this.baseStdinFields("Interrupt"),
|
|
235
|
+
run_id: runId,
|
|
236
|
+
reason
|
|
237
|
+
};
|
|
238
|
+
return runHooksForEvent(hooks, stdin);
|
|
239
|
+
}
|
|
240
|
+
async runSubagentStart(toolCallId, agentType, task, modelId, forked) {
|
|
241
|
+
const hooks = this.config.SubagentStart;
|
|
242
|
+
if (!hooks || hooks.length === 0) {
|
|
243
|
+
return emptyResult();
|
|
244
|
+
}
|
|
245
|
+
const runId = this.runId;
|
|
246
|
+
if (!runId) {
|
|
247
|
+
return emptyResult();
|
|
248
|
+
}
|
|
249
|
+
const stdin = {
|
|
250
|
+
...this.baseStdinFields("SubagentStart"),
|
|
251
|
+
run_id: runId,
|
|
252
|
+
tool_call_id: toolCallId,
|
|
253
|
+
agent_type: agentType,
|
|
254
|
+
task,
|
|
255
|
+
...modelId !== void 0 ? { model_id: modelId } : {},
|
|
256
|
+
...forked !== void 0 ? { forked } : {}
|
|
257
|
+
};
|
|
258
|
+
return runHooksForEvent(hooks, stdin);
|
|
259
|
+
}
|
|
260
|
+
async runSubagentEnd(toolCallId, agentType, result, isError, durationMs) {
|
|
261
|
+
const hooks = this.config.SubagentEnd;
|
|
262
|
+
if (!hooks || hooks.length === 0) {
|
|
263
|
+
return emptyResult();
|
|
264
|
+
}
|
|
265
|
+
const runId = this.runId;
|
|
266
|
+
if (!runId) {
|
|
267
|
+
return emptyResult();
|
|
268
|
+
}
|
|
269
|
+
const stdin = {
|
|
270
|
+
...this.baseStdinFields("SubagentEnd"),
|
|
271
|
+
run_id: runId,
|
|
272
|
+
tool_call_id: toolCallId,
|
|
273
|
+
agent_type: agentType,
|
|
274
|
+
result,
|
|
275
|
+
is_error: isError,
|
|
276
|
+
duration_ms: durationMs
|
|
277
|
+
};
|
|
278
|
+
return runHooksForEvent(hooks, stdin);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
export {
|
|
282
|
+
HookManager
|
|
283
|
+
};
|
|
284
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/manager.ts"],"sourcesContent":["/**\n * HookManager — high-level orchestration for the hooks system.\n * Created once at startup, provides methods for each lifecycle event.\n */\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport { loadHooksConfig, getProjectHooksPath, getGlobalHooksPath } from './config.js';\nimport { runHooksForEvent } from './executor.js';\nimport type {\n HooksConfig,\n HookEventResult,\n HookEventName,\n HookStdinToolEvent,\n HookStdinUserPrompt,\n HookStdinStop,\n HookStdinSession,\n HookStdinNotification,\n HookStdinAgentStart,\n HookStdinAgentEnd,\n HookStdinPermissionRequest,\n HookStdinPermissionResult,\n HookStdinInterrupt,\n HookStdinSubagentStart,\n HookStdinSubagentEnd,\n PermissionKind,\n PermissionDecision,\n InterruptReason,\n} from './types.js';\n\nconst emptyResult = (): HookEventResult => ({ allowed: true, results: [], warnings: [] });\n\nexport class HookManager {\n private config: HooksConfig;\n private projectDir: string;\n private sessionId: string;\n private configDirName: string;\n private homeDir?: string;\n private runId?: string;\n\n constructor(projectDir: string, sessionId: string, configDirName = DEFAULT_CONFIG_DIR, homeDir?: string) {\n this.projectDir = projectDir;\n this.sessionId = sessionId;\n this.configDirName = configDirName;\n this.homeDir = homeDir;\n this.config = loadHooksConfig(projectDir, configDirName, homeDir);\n }\n\n reload(): void {\n this.config = loadHooksConfig(this.projectDir, this.configDirName, this.homeDir);\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n /** Set the active agent run id. Included as `run_id` in all hook stdin while a run is active. */\n setRunId(runId: string): void {\n this.runId = runId;\n }\n\n /** Clear the active run id. Call only after end-of-run hooks (AgentEnd, Stop) have been dispatched. */\n clearRunId(): void {\n this.runId = undefined;\n }\n\n getRunId(): string | undefined {\n return this.runId;\n }\n\n hasHooks(): boolean {\n return Object.keys(this.config).length > 0;\n }\n\n getConfig(): HooksConfig {\n return this.config;\n }\n\n getConfigPaths(): { project: string; global: string } {\n return {\n project: getProjectHooksPath(this.projectDir, this.configDirName),\n global: getGlobalHooksPath(this.configDirName, this.homeDir),\n };\n }\n\n // =========================================================================\n // Stdin Helpers\n // =========================================================================\n\n /**\n * Build the common stdin base fields. `run_id` is included when an active run\n * is set, so every event dispatched during a run carries the same identifier.\n */\n private baseStdinFields<T extends HookEventName>(\n hook_event_name: T,\n ): {\n session_id: string;\n cwd: string;\n hook_event_name: T;\n run_id?: string;\n } {\n const base: { session_id: string; cwd: string; hook_event_name: T; run_id?: string } = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name,\n };\n if (this.runId) base.run_id = this.runId;\n return base;\n }\n\n // =========================================================================\n // Blocking Event Methods (decisions enforced by callers)\n // =========================================================================\n\n async runPreToolUse(toolName: string, toolInput: unknown): Promise<HookEventResult> {\n const hooks = this.config.PreToolUse;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinToolEvent = {\n ...this.baseStdinFields('PreToolUse'),\n tool_name: toolName,\n tool_input: toolInput,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runPostToolUse(\n toolName: string,\n toolInput: unknown,\n toolOutput: unknown,\n toolError: boolean,\n ): Promise<HookEventResult> {\n const hooks = this.config.PostToolUse;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinToolEvent = {\n ...this.baseStdinFields('PostToolUse'),\n tool_name: toolName,\n tool_input: toolInput,\n tool_output: toolOutput,\n tool_error: toolError,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runUserPromptSubmit(userMessage: string): Promise<HookEventResult> {\n const hooks = this.config.UserPromptSubmit;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinUserPrompt = {\n ...this.baseStdinFields('UserPromptSubmit'),\n user_message: userMessage,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runStop(\n assistantMessage: string | undefined,\n stopReason: 'complete' | 'aborted' | 'error',\n ): Promise<HookEventResult> {\n const hooks = this.config.Stop;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinStop = {\n ...this.baseStdinFields('Stop'),\n assistant_message: assistantMessage,\n stop_reason: stopReason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSessionStart(): Promise<HookEventResult> {\n const hooks = this.config.SessionStart;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinSession = {\n ...this.baseStdinFields('SessionStart'),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n async runSessionEnd(): Promise<HookEventResult> {\n const hooks = this.config.SessionEnd;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinSession = {\n ...this.baseStdinFields('SessionEnd'),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n /**\n * Fire notification hooks (non-blocking, fire-and-forget).\n * Called when the TUI is waiting for user input.\n */\n runNotification(reason: string, message?: string): void {\n const hooks = this.config.Notification;\n if (!hooks || hooks.length === 0) return;\n\n const stdin: HookStdinNotification = {\n ...this.baseStdinFields('Notification'),\n reason,\n message,\n };\n\n // Fire-and-forget — don't await\n runHooksForEvent(hooks, stdin).catch(() => {});\n }\n\n // =========================================================================\n // Lifecycle Event Methods (non-blocking: observe behavior, never enforce)\n // =========================================================================\n\n async runAgentStart(): Promise<HookEventResult> {\n const hooks = this.config.AgentStart;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinAgentStart = {\n ...this.baseStdinFields('AgentStart'),\n run_id: runId,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runAgentEnd(stopReason: 'complete' | 'aborted' | 'error' | 'suspended'): Promise<HookEventResult> {\n const hooks = this.config.AgentEnd;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinAgentEnd = {\n ...this.baseStdinFields('AgentEnd'),\n run_id: runId,\n stop_reason: stopReason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runPermissionRequest(\n permissionKind: PermissionKind,\n toolCallId: string,\n toolName: string,\n toolInput?: unknown,\n ): Promise<HookEventResult> {\n const hooks = this.config.PermissionRequest;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinPermissionRequest = {\n ...this.baseStdinFields('PermissionRequest'),\n run_id: runId,\n permission_kind: permissionKind,\n tool_call_id: toolCallId,\n tool_name: toolName,\n ...(toolInput !== undefined ? { tool_input: toolInput } : {}),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runPermissionResult(\n permissionKind: PermissionKind,\n toolCallId: string,\n toolName: string,\n decision: PermissionDecision,\n toolInput?: unknown,\n ): Promise<HookEventResult> {\n const hooks = this.config.PermissionResult;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinPermissionResult = {\n ...this.baseStdinFields('PermissionResult'),\n run_id: runId,\n permission_kind: permissionKind,\n tool_call_id: toolCallId,\n tool_name: toolName,\n decision,\n ...(toolInput !== undefined ? { tool_input: toolInput } : {}),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runInterrupt(reason: InterruptReason): Promise<HookEventResult> {\n const hooks = this.config.Interrupt;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinInterrupt = {\n ...this.baseStdinFields('Interrupt'),\n run_id: runId,\n reason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSubagentStart(\n toolCallId: string,\n agentType: string,\n task: string,\n modelId?: string,\n forked?: boolean,\n ): Promise<HookEventResult> {\n const hooks = this.config.SubagentStart;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinSubagentStart = {\n ...this.baseStdinFields('SubagentStart'),\n run_id: runId,\n tool_call_id: toolCallId,\n agent_type: agentType,\n task,\n ...(modelId !== undefined ? { model_id: modelId } : {}),\n ...(forked !== undefined ? { forked } : {}),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSubagentEnd(\n toolCallId: string,\n agentType: string,\n result: unknown,\n isError: boolean,\n durationMs: number,\n ): Promise<HookEventResult> {\n const hooks = this.config.SubagentEnd;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinSubagentEnd = {\n ...this.baseStdinFields('SubagentEnd'),\n run_id: runId,\n tool_call_id: toolCallId,\n agent_type: agentType,\n result,\n is_error: isError,\n duration_ms: durationMs,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n}\n"],"mappings":"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","names":[]}
|