@prestyj/cli 5.11.0 → 5.13.0
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/README.md +46 -36
- package/assets/skills/bulletproof/SKILL.md +158 -0
- package/assets/skills/bulletproof/references/agent-surface.md +82 -0
- package/assets/skills/bulletproof/references/audit-protocol.md +147 -0
- package/assets/skills/bulletproof/references/platform-playbooks.md +176 -0
- package/assets/skills/bulletproof/references/provenance.md +45 -0
- package/assets/skills/bulletproof/references/secure-defaults.md +108 -0
- package/assets/skills/bulletproof/references/supply-chain.md +76 -0
- package/assets/skills/bulletproof/references/threat-landscape.md +74 -0
- package/assets/skills/bulletproof/references/verification.md +65 -0
- package/assets/skills/compliance-guard/SKILL.md +251 -0
- package/assets/skills/compliance-guard/references/artifacts.md +186 -0
- package/assets/skills/compliance-guard/references/eu-uk.md +151 -0
- package/assets/skills/compliance-guard/references/exposure-triage.md +161 -0
- package/assets/skills/compliance-guard/references/lawsuit-vectors.md +141 -0
- package/assets/skills/compliance-guard/references/provenance.md +42 -0
- package/assets/skills/compliance-guard/references/sector-gates.md +173 -0
- package/assets/skills/compliance-guard/references/security-baseline.md +130 -0
- package/assets/skills/compliance-guard/references/trigger-map.md +163 -0
- package/assets/skills/compliance-guard/references/us.md +164 -0
- package/assets/skills/durable/SKILL.md +111 -0
- package/assets/skills/durable/references/backups-and-runtime.md +86 -0
- package/assets/skills/durable/references/migrations-and-schema.md +79 -0
- package/assets/skills/lean/SKILL.md +110 -0
- package/assets/skills/lean/references/memory-and-processes.md +98 -0
- package/assets/skills/lean/references/playbooks.md +107 -0
- package/dist/app-sidecar-auth-broadcast.test.js +111 -10
- package/dist/app-sidecar-auth-broadcast.test.js.map +1 -1
- package/dist/app-sidecar-sessions.test.js +1 -1
- package/dist/app-sidecar.js +210 -72
- package/dist/app-sidecar.js.map +1 -1
- package/dist/chat-agents/jiwa.test.js +1 -1
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +33 -36
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/mcp.js +30 -10
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +18 -5
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +28 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +50 -76
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +56 -13
- package/dist/config.test.js.map +1 -1
- package/dist/core/agent-session-checkpoint-flush.test.js +2 -2
- package/dist/core/agent-session-compaction.test.js +60 -0
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session-crash-durability.test.js +3 -3
- package/dist/core/agent-session-model-switch.test.js +1 -1
- package/dist/core/agent-session-process-gate.test.js +7 -1
- package/dist/core/agent-session-process-gate.test.js.map +1 -1
- package/dist/core/agent-session-review-coverage.test.js +52 -1
- package/dist/core/agent-session-review-coverage.test.js.map +1 -1
- package/dist/core/agent-session-tool-tiers.test.d.ts +2 -0
- package/dist/core/agent-session-tool-tiers.test.d.ts.map +1 -0
- package/dist/core/agent-session-tool-tiers.test.js +138 -0
- package/dist/core/agent-session-tool-tiers.test.js.map +1 -0
- package/dist/core/agent-session-verification-gate.test.d.ts +2 -0
- package/dist/core/agent-session-verification-gate.test.d.ts.map +1 -0
- package/dist/core/agent-session-verification-gate.test.js +135 -0
- package/dist/core/agent-session-verification-gate.test.js.map +1 -0
- package/dist/core/agent-session.d.ts +77 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +268 -33
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.d.ts +29 -1
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +47 -97
- package/dist/core/agents.js.map +1 -1
- package/dist/core/agents.test.js +87 -7
- package/dist/core/agents.test.js.map +1 -1
- package/dist/core/api-benchmark.d.ts +3 -3
- package/dist/core/api-benchmark.js +7 -7
- package/dist/core/auth-providers.d.ts +37 -1
- package/dist/core/auth-providers.d.ts.map +1 -1
- package/dist/core/auth-providers.js +84 -4
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/auto-update.test.js +1 -1
- package/dist/core/autopilot-gate.d.ts +2 -2
- package/dist/core/autopilot-gate.js +1 -1
- package/dist/core/autopilot-gate.test.js +7 -4
- package/dist/core/autopilot-gate.test.js.map +1 -1
- package/dist/core/bash-spawn-benchmark.js +6 -6
- package/dist/core/bundled-agents.d.ts +3 -0
- package/dist/core/bundled-agents.d.ts.map +1 -0
- package/dist/core/bundled-agents.js +255 -0
- package/dist/core/bundled-agents.js.map +1 -0
- package/dist/core/cache-warm-benchmark.d.ts +2 -2
- package/dist/core/cache-warm-benchmark.js +5 -5
- package/dist/core/code-retrieval-chunkers.d.ts +27 -0
- package/dist/core/code-retrieval-chunkers.d.ts.map +1 -0
- package/dist/core/code-retrieval-chunkers.js +264 -0
- package/dist/core/code-retrieval-chunkers.js.map +1 -0
- package/dist/core/code-retrieval-chunkers.test.d.ts +2 -0
- package/dist/core/code-retrieval-chunkers.test.d.ts.map +1 -0
- package/dist/core/code-retrieval-chunkers.test.js +203 -0
- package/dist/core/code-retrieval-chunkers.test.js.map +1 -0
- package/dist/core/code-retrieval.d.ts +6 -0
- package/dist/core/code-retrieval.d.ts.map +1 -1
- package/dist/core/code-retrieval.js +38 -1
- package/dist/core/code-retrieval.js.map +1 -1
- package/dist/core/compaction/token-estimator.test.js +1 -1
- package/dist/core/encode-cwd.test.js +1 -1
- package/dist/core/event-bus.d.ts +11 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +1 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/event-bus.test.d.ts +2 -0
- package/dist/core/event-bus.test.d.ts.map +1 -0
- package/dist/core/event-bus.test.js +33 -0
- package/dist/core/event-bus.test.js.map +1 -0
- package/dist/core/extensions/plugin-bundles.js +2 -2
- package/dist/core/extensions/plugin-bundles.js.map +1 -1
- package/dist/core/extensions/plugin-bundles.test.js +2 -2
- package/dist/core/extensions/plugin-bundles.test.js.map +1 -1
- package/dist/core/fast-apply-benchmark.d.ts +2 -2
- package/dist/core/fast-apply-benchmark.js +6 -6
- package/dist/core/foreign-session-import.test.js +1 -1
- package/dist/core/goal-lifecycle-smoke.test.js +2 -2
- package/dist/core/goal-store.js +1 -1
- package/dist/core/goal-store.test.js +2 -2
- package/dist/core/goal-verifier.test.js +2 -2
- package/dist/core/goal-worker-dev-server-lifecycle.test.js +1 -1
- package/dist/core/goal-worker.test.js +2 -2
- package/dist/core/hashline-edit-benchmark.d.ts +2 -2
- package/dist/core/hashline-edit-benchmark.js +7 -7
- package/dist/core/local-endpoint-store.test.js +1 -1
- package/dist/core/logger.d.ts +1 -1
- package/dist/core/logger.js +2 -2
- package/dist/core/logger.js.map +1 -1
- package/dist/core/lsp/client-navigation.test.d.ts +2 -0
- package/dist/core/lsp/client-navigation.test.d.ts.map +1 -0
- package/dist/core/lsp/client-navigation.test.js +135 -0
- package/dist/core/lsp/client-navigation.test.js.map +1 -0
- package/dist/core/lsp/client.d.ts +69 -0
- package/dist/core/lsp/client.d.ts.map +1 -1
- package/dist/core/lsp/client.js +151 -2
- package/dist/core/lsp/client.js.map +1 -1
- package/dist/core/lsp/integration.test.js +2 -2
- package/dist/core/lsp/manager-navigation.test.d.ts +2 -0
- package/dist/core/lsp/manager-navigation.test.d.ts.map +1 -0
- package/dist/core/lsp/manager-navigation.test.js +121 -0
- package/dist/core/lsp/manager-navigation.test.js.map +1 -0
- package/dist/core/lsp/manager.d.ts +35 -1
- package/dist/core/lsp/manager.d.ts.map +1 -1
- package/dist/core/lsp/manager.js +92 -0
- package/dist/core/lsp/manager.js.map +1 -1
- package/dist/core/lsp/servers.test.js +1 -1
- package/dist/core/lsp/windows.test.js +4 -4
- package/dist/core/mcp/catalog-cache.test.js +1 -1
- package/dist/core/mcp/client-session-recovery.test.js +1 -1
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +2 -10
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/content.d.ts +19 -0
- package/dist/core/mcp/content.d.ts.map +1 -0
- package/dist/core/mcp/content.js +172 -0
- package/dist/core/mcp/content.js.map +1 -0
- package/dist/core/mcp/content.test.d.ts +2 -0
- package/dist/core/mcp/content.test.d.ts.map +1 -0
- package/dist/core/mcp/content.test.js +135 -0
- package/dist/core/mcp/content.test.js.map +1 -0
- package/dist/core/mcp/defaults.d.ts +3 -1
- package/dist/core/mcp/defaults.d.ts.map +1 -1
- package/dist/core/mcp/defaults.js +9 -2
- package/dist/core/mcp/defaults.js.map +1 -1
- package/dist/core/mcp/defaults.test.d.ts +2 -0
- package/dist/core/mcp/defaults.test.d.ts.map +1 -0
- package/dist/core/mcp/defaults.test.js +60 -0
- package/dist/core/mcp/defaults.test.js.map +1 -0
- package/dist/core/mcp/deferred-catalog.d.ts +1 -1
- package/dist/core/mcp/deferred-catalog.js +1 -1
- package/dist/core/mcp/elicitation.test.js +1 -1
- package/dist/core/mcp/legacy-negotiation.test.js +2 -2
- package/dist/core/mcp/oauth-store.test.js +2 -2
- package/dist/core/mcp/resolve-stdio.test.js +5 -5
- package/dist/core/mcp/shared-pool.test.js +5 -5
- package/dist/core/mcp/store.test.js +5 -5
- package/dist/core/mcp/when-connected.test.js +2 -2
- package/dist/core/nolan-model.test.js +1 -1
- package/dist/core/nolan-prompt.js +5 -5
- package/dist/core/oauth/xai.d.ts +2 -0
- package/dist/core/oauth/xai.d.ts.map +1 -0
- package/dist/core/oauth/xai.js +4 -0
- package/dist/core/oauth/xai.js.map +1 -0
- package/dist/core/persistent-shell.js +1 -1
- package/dist/core/persistent-shell.test.js +6 -6
- package/dist/core/process-manager-dev-server-repro.test.js +51 -12
- package/dist/core/process-manager-dev-server-repro.test.js.map +1 -1
- package/dist/core/process-manager-notifications.test.js +24 -14
- package/dist/core/process-manager-notifications.test.js.map +1 -1
- package/dist/core/process-manager-wake.test.d.ts +2 -0
- package/dist/core/process-manager-wake.test.d.ts.map +1 -0
- package/dist/core/process-manager-wake.test.js +96 -0
- package/dist/core/process-manager-wake.test.js.map +1 -0
- package/dist/core/process-manager.d.ts +61 -1
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +204 -4
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/progress/git-xp.test.js +2 -2
- package/dist/core/progress/ranks.d.ts +14 -3
- package/dist/core/progress/ranks.d.ts.map +1 -1
- package/dist/core/progress/ranks.js +181 -12
- package/dist/core/progress/ranks.js.map +1 -1
- package/dist/core/progress/ranks.test.js +48 -7
- package/dist/core/progress/ranks.test.js.map +1 -1
- package/dist/core/progress/rebuild.test.js +1 -1
- package/dist/core/progress/store.test.js +1 -1
- package/dist/core/progress/types.d.ts +2 -1
- package/dist/core/progress/types.d.ts.map +1 -1
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +62 -48
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/project-discovery.test.js +10 -10
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +3 -3
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/provider-cache.e2e.test.d.ts +2 -0
- package/dist/core/provider-cache.e2e.test.d.ts.map +1 -0
- package/dist/core/provider-cache.e2e.test.js +125 -0
- package/dist/core/provider-cache.e2e.test.js.map +1 -0
- package/dist/core/radio.d.ts +1 -1
- package/dist/core/radio.d.ts.map +1 -1
- package/dist/core/radio.js +90 -6
- package/dist/core/radio.js.map +1 -1
- package/dist/core/radio.test.js +15 -2
- package/dist/core/radio.test.js.map +1 -1
- package/dist/core/run-journal.test.js +2 -2
- package/dist/core/sandbox.test.js +6 -6
- package/dist/core/semantic-search-benchmark.d.ts +2 -2
- package/dist/core/semantic-search-benchmark.js +5 -5
- package/dist/core/session-compaction.test.js +1 -1
- package/dist/core/session-injections.test.d.ts +2 -0
- package/dist/core/session-injections.test.d.ts.map +1 -0
- package/dist/core/session-injections.test.js +117 -0
- package/dist/core/session-injections.test.js.map +1 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +83 -67
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-manager.test.js +7 -7
- package/dist/core/session-reconstructability.test.d.ts +2 -0
- package/dist/core/session-reconstructability.test.d.ts.map +1 -0
- package/dist/core/session-reconstructability.test.js +105 -0
- package/dist/core/session-reconstructability.test.js.map +1 -0
- package/dist/core/session-storage-fd-leak.test.d.ts +2 -0
- package/dist/core/session-storage-fd-leak.test.d.ts.map +1 -0
- package/dist/core/session-storage-fd-leak.test.js +116 -0
- package/dist/core/session-storage-fd-leak.test.js.map +1 -0
- package/dist/core/session-storage.d.ts +22 -2
- package/dist/core/session-storage.d.ts.map +1 -1
- package/dist/core/session-storage.js +33 -6
- package/dist/core/session-storage.js.map +1 -1
- package/dist/core/session-storage.test.js +2 -2
- package/dist/core/settings-manager.d.ts +12 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +46 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shell-path.js +1 -1
- package/dist/core/shell.d.ts +1 -1
- package/dist/core/shell.js +2 -2
- package/dist/core/shell.test.js +2 -2
- package/dist/core/shutdown.d.ts +71 -0
- package/dist/core/shutdown.d.ts.map +1 -0
- package/dist/core/shutdown.js +144 -0
- package/dist/core/shutdown.js.map +1 -0
- package/dist/core/shutdown.test.d.ts +2 -0
- package/dist/core/shutdown.test.d.ts.map +1 -0
- package/dist/core/shutdown.test.js +160 -0
- package/dist/core/shutdown.test.js.map +1 -0
- package/dist/core/sidecar-error-reporter.js +1 -1
- package/dist/core/sidecar-error-reporter.test.js +2 -2
- package/dist/core/skills-routing.test.js +142 -0
- package/dist/core/skills-routing.test.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +4 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +9 -0
- package/dist/core/subagent-manager.d.ts.map +1 -1
- package/dist/core/subagent-manager.js +45 -12
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-manager.test.js +14 -8
- package/dist/core/subagent-manager.test.js.map +1 -1
- package/dist/core/subagent-store.test.js +3 -3
- package/dist/core/task-store.js +1 -1
- package/dist/core/verification-gate.d.ts +55 -0
- package/dist/core/verification-gate.d.ts.map +1 -0
- package/dist/core/verification-gate.js +188 -0
- package/dist/core/verification-gate.js.map +1 -0
- package/dist/core/verification-gate.test.d.ts +2 -0
- package/dist/core/verification-gate.test.d.ts.map +1 -0
- package/dist/core/verification-gate.test.js +102 -0
- package/dist/core/verification-gate.test.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/acp-mode.js +2 -2
- package/dist/modes/acp-mode.test.js +10 -8
- package/dist/modes/acp-mode.test.js.map +1 -1
- package/dist/modes/agent-home-mode.d.ts.map +1 -1
- package/dist/modes/agent-home-mode.js +15 -11
- package/dist/modes/agent-home-mode.js.map +1 -1
- package/dist/modes/json-mode.d.ts +9 -1
- package/dist/modes/json-mode.d.ts.map +1 -1
- package/dist/modes/json-mode.js +3 -1
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/modes/serve-mode.d.ts +1 -1
- package/dist/modes/serve-mode.d.ts.map +1 -1
- package/dist/modes/serve-mode.js +14 -9
- package/dist/modes/serve-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts +5 -0
- package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/session.test.js +1 -1
- package/dist/system-prompt.d.ts +37 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +170 -12
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +170 -11
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/system-prompt.tiering.test.d.ts +2 -0
- package/dist/system-prompt.tiering.test.d.ts.map +1 -0
- package/dist/system-prompt.tiering.test.js +108 -0
- package/dist/system-prompt.tiering.test.js.map +1 -0
- package/dist/tools/bash.d.ts +4 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +57 -3
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/bash.test.js +37 -0
- package/dist/tools/bash.test.js.map +1 -1
- package/dist/tools/code-nav.d.ts +30 -0
- package/dist/tools/code-nav.d.ts.map +1 -0
- package/dist/tools/code-nav.js +320 -0
- package/dist/tools/code-nav.js.map +1 -0
- package/dist/tools/code-nav.test.d.ts +2 -0
- package/dist/tools/code-nav.test.d.ts.map +1 -0
- package/dist/tools/code-nav.test.js +136 -0
- package/dist/tools/code-nav.test.js.map +1 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +37 -4
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +45 -1
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/generate-image.d.ts +1 -1
- package/dist/tools/goals.d.ts +2 -2
- package/dist/tools/goals.test.js +2 -2
- package/dist/tools/grep-parity.test.d.ts +2 -0
- package/dist/tools/grep-parity.test.d.ts.map +1 -0
- package/dist/tools/grep-parity.test.js +92 -0
- package/dist/tools/grep-parity.test.js.map +1 -0
- package/dist/tools/grep-recall.test.d.ts +2 -0
- package/dist/tools/grep-recall.test.d.ts.map +1 -0
- package/dist/tools/grep-recall.test.js +114 -0
- package/dist/tools/grep-recall.test.js.map +1 -0
- package/dist/tools/grep-spawn.test.d.ts +2 -0
- package/dist/tools/grep-spawn.test.d.ts.map +1 -0
- package/dist/tools/grep-spawn.test.js +66 -0
- package/dist/tools/grep-spawn.test.js.map +1 -0
- package/dist/tools/grep.d.ts +13 -3
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +340 -40
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/grep.test.js +17 -14
- package/dist/tools/grep.test.js.map +1 -1
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/plan-mode.test.js +1 -1
- package/dist/tools/prompt-hints.d.ts +9 -0
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +62 -8
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/read-only-bash.d.ts +6 -0
- package/dist/tools/read-only-bash.d.ts.map +1 -1
- package/dist/tools/read-only-bash.js +168 -9
- package/dist/tools/read-only-bash.js.map +1 -1
- package/dist/tools/read-only-bash.test.js +49 -0
- package/dist/tools/read-only-bash.test.js.map +1 -1
- package/dist/tools/safe-env.js +1 -1
- package/dist/tools/search-code.d.ts.map +1 -1
- package/dist/tools/search-code.js +7 -6
- package/dist/tools/search-code.js.map +1 -1
- package/dist/tools/search-code.test.js +8 -2
- package/dist/tools/search-code.test.js.map +1 -1
- package/dist/tools/skill.js +3 -1
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/subagent-control.d.ts.map +1 -1
- package/dist/tools/subagent-control.js +20 -5
- package/dist/tools/subagent-control.js.map +1 -1
- package/dist/tools/subagent-control.test.js +34 -1
- package/dist/tools/subagent-control.test.js.map +1 -1
- package/dist/tools/subagent-shared.d.ts +20 -1
- package/dist/tools/subagent-shared.d.ts.map +1 -1
- package/dist/tools/subagent-shared.js +34 -7
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/subagent-shared.test.js +43 -9
- package/dist/tools/subagent-shared.test.js.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +11 -8
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/subagent.test.js +3 -0
- package/dist/tools/subagent.test.js.map +1 -1
- package/dist/tools/task-send.test.js +19 -10
- package/dist/tools/task-send.test.js.map +1 -1
- package/dist/tools/tool-catalog.test.d.ts +2 -0
- package/dist/tools/tool-catalog.test.d.ts.map +1 -0
- package/dist/tools/tool-catalog.test.js +124 -0
- package/dist/tools/tool-catalog.test.js.map +1 -0
- package/dist/tools/tool-search.d.ts.map +1 -1
- package/dist/tools/tool-search.js +2 -1
- package/dist/tools/tool-search.js.map +1 -1
- package/dist/tools/tool-tiers.d.ts +42 -0
- package/dist/tools/tool-tiers.d.ts.map +1 -0
- package/dist/tools/tool-tiers.js +78 -0
- package/dist/tools/tool-tiers.js.map +1 -0
- package/dist/tools/tool-tiers.test.d.ts +2 -0
- package/dist/tools/tool-tiers.test.d.ts.map +1 -0
- package/dist/tools/tool-tiers.test.js +48 -0
- package/dist/tools/tool-tiers.test.js.map +1 -0
- package/dist/tools/write.test.js +1 -1
- package/dist/ui/App.d.ts +3 -0
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +39 -3
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +2 -0
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +2 -0
- package/dist/ui/app-items.js.map +1 -1
- package/dist/ui/components/Banner.d.ts.map +1 -1
- package/dist/ui/components/Banner.js +24 -16
- package/dist/ui/components/Banner.js.map +1 -1
- package/dist/ui/components/ToolExecution.js +42 -34
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/components/force-color.d.ts +2 -0
- package/dist/ui/components/force-color.d.ts.map +1 -0
- package/dist/ui/components/force-color.js +11 -0
- package/dist/ui/components/force-color.js.map +1 -0
- package/dist/ui/components/themed-output.test.d.ts +2 -0
- package/dist/ui/components/themed-output.test.d.ts.map +1 -0
- package/dist/ui/components/themed-output.test.js +111 -0
- package/dist/ui/components/themed-output.test.js.map +1 -0
- package/dist/ui/error-item.d.ts +1 -1
- package/dist/ui/error-item.js +3 -3
- package/dist/ui/error-item.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +4 -1
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +27 -2
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/login.js +2 -2
- package/dist/ui/login.js.map +1 -1
- package/dist/ui/render.d.ts +1 -1
- package/dist/ui/render.js +6 -6
- package/dist/ui/theme/dark-ansi.json +6 -0
- package/dist/ui/theme/dark-daltonized.json +6 -0
- package/dist/ui/theme/dark.json +6 -0
- package/dist/ui/theme/light-ansi.json +6 -0
- package/dist/ui/theme/light-daltonized.json +6 -0
- package/dist/ui/theme/light.json +6 -0
- package/dist/ui/theme/theme.d.ts +6 -0
- package/dist/ui/theme/theme.d.ts.map +1 -1
- package/dist/ui/tui-terminal-recorder.test.js +1 -1
- package/dist/utils/git.test.js +3 -3
- package/dist/utils/image.d.ts.map +1 -1
- package/dist/utils/image.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded process shutdown.
|
|
3
|
+
*
|
|
4
|
+
* Teardown reaches third-party code we do not control — MCP servers over stdio,
|
|
5
|
+
* LSP servers, extension `deactivate()` hooks, Telegram long-polls. Any one of
|
|
6
|
+
* them can hang forever, and an `await`-everything shutdown then never reaches
|
|
7
|
+
* `process.exit`: the app appears to quit but the daemon keeps its port, or the
|
|
8
|
+
* CLI keeps polling with nobody attached. Every long-running entry point arms a
|
|
9
|
+
* deadline instead, so a wedged dependency costs a few seconds, not the process.
|
|
10
|
+
*
|
|
11
|
+
* `SIGHUP` matters as much as `SIGINT`: closing a terminal delivers exactly one
|
|
12
|
+
* hangup and never a second key press, so a process that only force-exits on the
|
|
13
|
+
* *second* Ctrl+C survives as an orphan.
|
|
14
|
+
*/
|
|
15
|
+
/** Signals that must terminate a long-running EZ process. */
|
|
16
|
+
export declare const TERMINATION_SIGNALS: readonly ["SIGINT", "SIGTERM", "SIGHUP"];
|
|
17
|
+
export type TerminationSignal = (typeof TERMINATION_SIGNALS)[number];
|
|
18
|
+
/** How long teardown gets before the process exits anyway. */
|
|
19
|
+
export declare const DEFAULT_EXIT_TIMEOUT_MS = 5000;
|
|
20
|
+
/** Env override, in seconds. `0` disables the deadline (debugging teardown). */
|
|
21
|
+
export declare const EXIT_TIMEOUT_ENV = "EZ_EXIT_TIMEOUT_SECS";
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the teardown deadline from the environment.
|
|
24
|
+
*
|
|
25
|
+
* Anything unparseable, negative or absurd falls back to the default rather
|
|
26
|
+
* than disabling the guard, because a typo in a launcher script must not be
|
|
27
|
+
* able to reintroduce an unbounded hang.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveExitTimeoutMs(env?: NodeJS.ProcessEnv): number;
|
|
30
|
+
/** Conventional exit code for a signal-initiated exit (`128 + signal number`). */
|
|
31
|
+
export declare function exitCodeForSignal(signal: TerminationSignal): number;
|
|
32
|
+
export interface ShutdownOptions {
|
|
33
|
+
/** Releases resources. May hang — that is the entire point of the deadline. */
|
|
34
|
+
teardown: () => Promise<void> | void;
|
|
35
|
+
/** Deadline override, mainly for tests. Defaults to {@link resolveExitTimeoutMs}. */
|
|
36
|
+
timeoutMs?: number;
|
|
37
|
+
/** Logging/reporting scope, e.g. `"app-sidecar"`. */
|
|
38
|
+
scope?: string;
|
|
39
|
+
/** Runs when teardown misses the deadline, just before the forced exit. */
|
|
40
|
+
onTimeout?: (timeoutMs: number) => void;
|
|
41
|
+
/** Runs when teardown throws. Shutdown continues regardless. */
|
|
42
|
+
onError?: (error: unknown) => void;
|
|
43
|
+
/** Terminates the process. Injectable so tests do not exit the runner. */
|
|
44
|
+
exit?: (code: number) => never;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Run `teardown`, then exit — but exit on the deadline even if teardown never
|
|
48
|
+
* settles.
|
|
49
|
+
*
|
|
50
|
+
* The timer is deliberately **not** unref'd: an unref'd timer lets Node exit on
|
|
51
|
+
* its own the moment the loop empties, which would race teardown and produce a
|
|
52
|
+
* nondeterministic exit code. Held ref + explicit exit on both paths means the
|
|
53
|
+
* code is always the one we chose.
|
|
54
|
+
*/
|
|
55
|
+
export declare function shutdownWithDeadline(code: number, options: ShutdownOptions): Promise<never>;
|
|
56
|
+
export interface TerminationHandlerOptions extends ShutdownOptions {
|
|
57
|
+
/** Runs once per shutdown request, before teardown (e.g. print a banner). */
|
|
58
|
+
onShutdownStart?: (signal: TerminationSignal | null) => void;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Wire `SIGINT`/`SIGTERM`/`SIGHUP` to a bounded shutdown.
|
|
62
|
+
*
|
|
63
|
+
* A second signal while teardown is still running exits immediately rather than
|
|
64
|
+
* waiting out the deadline — a user hitting Ctrl+C twice is telling us they are
|
|
65
|
+
* done being patient.
|
|
66
|
+
*
|
|
67
|
+
* @returns `requestShutdown`, for non-signal exits (a dead parent process, a
|
|
68
|
+
* quit menu item) so they share the same guard and re-entrancy rules.
|
|
69
|
+
*/
|
|
70
|
+
export declare function installTerminationHandlers(options: TerminationHandlerOptions): (code?: number) => void;
|
|
71
|
+
//# sourceMappingURL=shutdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../src/core/shutdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,6DAA6D;AAC7D,eAAO,MAAM,mBAAmB,0CAA2C,CAAC;AAE5E,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AASrE,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAE7C,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AAKvD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAOjF;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAEnE;AAED,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,0EAA0E;IAC1E,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,CAsCjG;AAED,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,6EAA6E;IAC7E,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;CAC9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,yBAAyB,GACjC,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CA+BzB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded process shutdown.
|
|
3
|
+
*
|
|
4
|
+
* Teardown reaches third-party code we do not control — MCP servers over stdio,
|
|
5
|
+
* LSP servers, extension `deactivate()` hooks, Telegram long-polls. Any one of
|
|
6
|
+
* them can hang forever, and an `await`-everything shutdown then never reaches
|
|
7
|
+
* `process.exit`: the app appears to quit but the daemon keeps its port, or the
|
|
8
|
+
* CLI keeps polling with nobody attached. Every long-running entry point arms a
|
|
9
|
+
* deadline instead, so a wedged dependency costs a few seconds, not the process.
|
|
10
|
+
*
|
|
11
|
+
* `SIGHUP` matters as much as `SIGINT`: closing a terminal delivers exactly one
|
|
12
|
+
* hangup and never a second key press, so a process that only force-exits on the
|
|
13
|
+
* *second* Ctrl+C survives as an orphan.
|
|
14
|
+
*/
|
|
15
|
+
import { log } from "./logger.js";
|
|
16
|
+
/** Signals that must terminate a long-running EZ process. */
|
|
17
|
+
export const TERMINATION_SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"];
|
|
18
|
+
/** POSIX signal numbers, for the conventional `128 + n` exit code. */
|
|
19
|
+
const SIGNAL_NUMBERS = {
|
|
20
|
+
SIGHUP: 1,
|
|
21
|
+
SIGINT: 2,
|
|
22
|
+
SIGTERM: 15,
|
|
23
|
+
};
|
|
24
|
+
/** How long teardown gets before the process exits anyway. */
|
|
25
|
+
export const DEFAULT_EXIT_TIMEOUT_MS = 5_000;
|
|
26
|
+
/** Env override, in seconds. `0` disables the deadline (debugging teardown). */
|
|
27
|
+
export const EXIT_TIMEOUT_ENV = "EZ_EXIT_TIMEOUT_SECS";
|
|
28
|
+
/** Upper bound on the override — a deadline nobody will wait for is no deadline. */
|
|
29
|
+
const MAX_EXIT_TIMEOUT_MS = 120_000;
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the teardown deadline from the environment.
|
|
32
|
+
*
|
|
33
|
+
* Anything unparseable, negative or absurd falls back to the default rather
|
|
34
|
+
* than disabling the guard, because a typo in a launcher script must not be
|
|
35
|
+
* able to reintroduce an unbounded hang.
|
|
36
|
+
*/
|
|
37
|
+
export function resolveExitTimeoutMs(env = process.env) {
|
|
38
|
+
const raw = env[EXIT_TIMEOUT_ENV];
|
|
39
|
+
if (raw === undefined || raw.trim() === "")
|
|
40
|
+
return DEFAULT_EXIT_TIMEOUT_MS;
|
|
41
|
+
const seconds = Number(raw);
|
|
42
|
+
if (!Number.isFinite(seconds) || seconds < 0)
|
|
43
|
+
return DEFAULT_EXIT_TIMEOUT_MS;
|
|
44
|
+
if (seconds === 0)
|
|
45
|
+
return 0;
|
|
46
|
+
return Math.min(Math.round(seconds * 1000), MAX_EXIT_TIMEOUT_MS);
|
|
47
|
+
}
|
|
48
|
+
/** Conventional exit code for a signal-initiated exit (`128 + signal number`). */
|
|
49
|
+
export function exitCodeForSignal(signal) {
|
|
50
|
+
return 128 + SIGNAL_NUMBERS[signal];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Run `teardown`, then exit — but exit on the deadline even if teardown never
|
|
54
|
+
* settles.
|
|
55
|
+
*
|
|
56
|
+
* The timer is deliberately **not** unref'd: an unref'd timer lets Node exit on
|
|
57
|
+
* its own the moment the loop empties, which would race teardown and produce a
|
|
58
|
+
* nondeterministic exit code. Held ref + explicit exit on both paths means the
|
|
59
|
+
* code is always the one we chose.
|
|
60
|
+
*/
|
|
61
|
+
export async function shutdownWithDeadline(code, options) {
|
|
62
|
+
const exit = options.exit ?? ((c) => process.exit(c));
|
|
63
|
+
const scope = options.scope ?? "shutdown";
|
|
64
|
+
const timeoutMs = options.timeoutMs ?? resolveExitTimeoutMs();
|
|
65
|
+
const timer = timeoutMs > 0
|
|
66
|
+
? setTimeout(() => {
|
|
67
|
+
// Teardown is wedged; anything here must be best-effort and never
|
|
68
|
+
// able to stop the exit itself.
|
|
69
|
+
try {
|
|
70
|
+
options.onTimeout?.(timeoutMs);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// ignored — we are leaving either way
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
log("WARN", scope, "teardown exceeded the exit deadline; forcing exit", {
|
|
77
|
+
timeoutMs: String(timeoutMs),
|
|
78
|
+
code: String(code),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// ignored — the logger may already be closed
|
|
83
|
+
}
|
|
84
|
+
exit(code);
|
|
85
|
+
}, timeoutMs)
|
|
86
|
+
: undefined;
|
|
87
|
+
try {
|
|
88
|
+
await options.teardown();
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
try {
|
|
92
|
+
options.onError?.(error);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// ignored — a reporting failure must not block the exit
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (timer)
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
return exit(code);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Wire `SIGINT`/`SIGTERM`/`SIGHUP` to a bounded shutdown.
|
|
104
|
+
*
|
|
105
|
+
* A second signal while teardown is still running exits immediately rather than
|
|
106
|
+
* waiting out the deadline — a user hitting Ctrl+C twice is telling us they are
|
|
107
|
+
* done being patient.
|
|
108
|
+
*
|
|
109
|
+
* @returns `requestShutdown`, for non-signal exits (a dead parent process, a
|
|
110
|
+
* quit menu item) so they share the same guard and re-entrancy rules.
|
|
111
|
+
*/
|
|
112
|
+
export function installTerminationHandlers(options) {
|
|
113
|
+
const exit = options.exit ?? ((c) => process.exit(c));
|
|
114
|
+
let shuttingDown = false;
|
|
115
|
+
const requestShutdown = (code = 0, signal = null) => {
|
|
116
|
+
if (shuttingDown) {
|
|
117
|
+
// Impatient second signal: skip the remaining deadline.
|
|
118
|
+
if (signal)
|
|
119
|
+
exit(code);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
shuttingDown = true;
|
|
123
|
+
try {
|
|
124
|
+
options.onShutdownStart?.(signal);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// ignored — a banner must not block teardown
|
|
128
|
+
}
|
|
129
|
+
// `exit` never returns in production, so this promise normally never
|
|
130
|
+
// settles. It only rejects when an injected exit throws (tests), and an
|
|
131
|
+
// unhandled rejection there would crash the runner.
|
|
132
|
+
void shutdownWithDeadline(code, options).catch(() => { });
|
|
133
|
+
};
|
|
134
|
+
for (const signal of TERMINATION_SIGNALS) {
|
|
135
|
+
try {
|
|
136
|
+
process.on(signal, () => requestShutdown(exitCodeForSignal(signal), signal));
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Windows does not deliver every POSIX signal; the others still install.
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return (code = 0) => requestShutdown(code, null);
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=shutdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../src/core/shutdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.test.d.ts","sourceRoot":"","sources":["../../src/core/shutdown.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { DEFAULT_EXIT_TIMEOUT_MS, EXIT_TIMEOUT_ENV, exitCodeForSignal, installTerminationHandlers, resolveExitTimeoutMs, shutdownWithDeadline, } from "./shutdown.js";
|
|
3
|
+
/** Stands in for `process.exit`: records the code and stops execution the way
|
|
4
|
+
* the real thing does, so code after it never runs in the test either. */
|
|
5
|
+
function fakeExit() {
|
|
6
|
+
const codes = [];
|
|
7
|
+
return {
|
|
8
|
+
codes,
|
|
9
|
+
exit: ((code) => {
|
|
10
|
+
codes.push(code);
|
|
11
|
+
throw new ExitSignal(code);
|
|
12
|
+
}),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
class ExitSignal extends Error {
|
|
16
|
+
code;
|
|
17
|
+
constructor(code) {
|
|
18
|
+
super(`exit ${code}`);
|
|
19
|
+
this.code = code;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function swallowExit(promise) {
|
|
23
|
+
await promise.catch((error) => {
|
|
24
|
+
if (!(error instanceof ExitSignal))
|
|
25
|
+
throw error;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
describe("resolveExitTimeoutMs", () => {
|
|
29
|
+
it("defaults when unset", () => {
|
|
30
|
+
expect(resolveExitTimeoutMs({})).toBe(DEFAULT_EXIT_TIMEOUT_MS);
|
|
31
|
+
});
|
|
32
|
+
it("reads seconds from the environment", () => {
|
|
33
|
+
expect(resolveExitTimeoutMs({ [EXIT_TIMEOUT_ENV]: "2" })).toBe(2000);
|
|
34
|
+
expect(resolveExitTimeoutMs({ [EXIT_TIMEOUT_ENV]: "0.5" })).toBe(500);
|
|
35
|
+
});
|
|
36
|
+
it("treats an explicit zero as 'no deadline'", () => {
|
|
37
|
+
expect(resolveExitTimeoutMs({ [EXIT_TIMEOUT_ENV]: "0" })).toBe(0);
|
|
38
|
+
});
|
|
39
|
+
it("falls back to the default on garbage rather than disabling the guard", () => {
|
|
40
|
+
// A typo in a launcher script must not reintroduce an unbounded hang.
|
|
41
|
+
expect(resolveExitTimeoutMs({ [EXIT_TIMEOUT_ENV]: "soon" })).toBe(DEFAULT_EXIT_TIMEOUT_MS);
|
|
42
|
+
expect(resolveExitTimeoutMs({ [EXIT_TIMEOUT_ENV]: "-3" })).toBe(DEFAULT_EXIT_TIMEOUT_MS);
|
|
43
|
+
expect(resolveExitTimeoutMs({ [EXIT_TIMEOUT_ENV]: "" })).toBe(DEFAULT_EXIT_TIMEOUT_MS);
|
|
44
|
+
});
|
|
45
|
+
it("clamps absurd overrides", () => {
|
|
46
|
+
expect(resolveExitTimeoutMs({ [EXIT_TIMEOUT_ENV]: "99999" })).toBe(120_000);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe("exitCodeForSignal", () => {
|
|
50
|
+
it("uses the conventional 128 + signal number", () => {
|
|
51
|
+
expect(exitCodeForSignal("SIGHUP")).toBe(129);
|
|
52
|
+
expect(exitCodeForSignal("SIGINT")).toBe(130);
|
|
53
|
+
expect(exitCodeForSignal("SIGTERM")).toBe(143);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe("shutdownWithDeadline", () => {
|
|
57
|
+
it("exits as soon as teardown finishes", async () => {
|
|
58
|
+
const { codes, exit } = fakeExit();
|
|
59
|
+
await swallowExit(shutdownWithDeadline(0, { teardown: async () => { }, timeoutMs: 10_000, exit }));
|
|
60
|
+
expect(codes).toEqual([0]);
|
|
61
|
+
});
|
|
62
|
+
it("exits on the deadline when teardown never settles", async () => {
|
|
63
|
+
vi.useFakeTimers();
|
|
64
|
+
try {
|
|
65
|
+
const { codes, exit } = fakeExit();
|
|
66
|
+
const onTimeout = vi.fn();
|
|
67
|
+
// A hung MCP server: the promise simply never resolves.
|
|
68
|
+
void shutdownWithDeadline(129, {
|
|
69
|
+
teardown: () => new Promise(() => { }),
|
|
70
|
+
timeoutMs: 2000,
|
|
71
|
+
onTimeout,
|
|
72
|
+
exit,
|
|
73
|
+
}).catch(() => { });
|
|
74
|
+
expect(codes).toEqual([]);
|
|
75
|
+
vi.advanceTimersByTime(1999);
|
|
76
|
+
expect(codes).toEqual([]);
|
|
77
|
+
// The fake exit throws from inside the timer callback; the real one just
|
|
78
|
+
// never returns.
|
|
79
|
+
expect(() => vi.advanceTimersByTime(1)).toThrow(ExitSignal);
|
|
80
|
+
expect(codes).toEqual([129]);
|
|
81
|
+
expect(onTimeout).toHaveBeenCalledWith(2000);
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
vi.useRealTimers();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
it("still exits when teardown throws", async () => {
|
|
88
|
+
const { codes, exit } = fakeExit();
|
|
89
|
+
const onError = vi.fn();
|
|
90
|
+
await swallowExit(shutdownWithDeadline(0, {
|
|
91
|
+
teardown: () => {
|
|
92
|
+
throw new Error("extension deactivate blew up");
|
|
93
|
+
},
|
|
94
|
+
timeoutMs: 10_000,
|
|
95
|
+
onError,
|
|
96
|
+
exit,
|
|
97
|
+
}));
|
|
98
|
+
expect(codes).toEqual([0]);
|
|
99
|
+
expect(onError).toHaveBeenCalledOnce();
|
|
100
|
+
});
|
|
101
|
+
it("does not arm a timer when the deadline is disabled", async () => {
|
|
102
|
+
vi.useFakeTimers();
|
|
103
|
+
try {
|
|
104
|
+
const { codes, exit } = fakeExit();
|
|
105
|
+
void shutdownWithDeadline(0, {
|
|
106
|
+
teardown: () => new Promise(() => { }),
|
|
107
|
+
timeoutMs: 0,
|
|
108
|
+
exit,
|
|
109
|
+
}).catch(() => { });
|
|
110
|
+
vi.advanceTimersByTime(600_000);
|
|
111
|
+
expect(codes).toEqual([]);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
vi.useRealTimers();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe("installTerminationHandlers", () => {
|
|
119
|
+
it("tears down once no matter how many requests arrive", async () => {
|
|
120
|
+
const { codes, exit } = fakeExit();
|
|
121
|
+
const teardown = vi.fn(async () => { });
|
|
122
|
+
const requestShutdown = installTerminationHandlers({ teardown, timeoutMs: 10_000, exit });
|
|
123
|
+
requestShutdown(0);
|
|
124
|
+
requestShutdown(0);
|
|
125
|
+
await vi.waitFor(() => expect(codes).toEqual([0]));
|
|
126
|
+
expect(teardown).toHaveBeenCalledOnce();
|
|
127
|
+
removeInstalledHandlers();
|
|
128
|
+
});
|
|
129
|
+
it("exits immediately on a second signal instead of waiting out the deadline", async () => {
|
|
130
|
+
const { codes, exit } = fakeExit();
|
|
131
|
+
installTerminationHandlers({
|
|
132
|
+
teardown: () => new Promise(() => { }),
|
|
133
|
+
timeoutMs: 10_000,
|
|
134
|
+
exit,
|
|
135
|
+
});
|
|
136
|
+
// First Ctrl+C starts bounded teardown; the second says "stop waiting".
|
|
137
|
+
expect(() => process.emit("SIGINT")).not.toThrow();
|
|
138
|
+
expect(codes).toEqual([]);
|
|
139
|
+
expect(() => process.emit("SIGINT")).toThrow(ExitSignal);
|
|
140
|
+
expect(codes).toEqual([130]);
|
|
141
|
+
removeInstalledHandlers();
|
|
142
|
+
});
|
|
143
|
+
it("handles SIGHUP, the signal a closed terminal sends exactly once", () => {
|
|
144
|
+
const { codes, exit } = fakeExit();
|
|
145
|
+
const teardown = vi.fn(() => new Promise(() => { }));
|
|
146
|
+
installTerminationHandlers({ teardown, timeoutMs: 10_000, exit });
|
|
147
|
+
process.emit("SIGHUP");
|
|
148
|
+
expect(teardown).toHaveBeenCalledOnce();
|
|
149
|
+
expect(codes).toEqual([]);
|
|
150
|
+
removeInstalledHandlers();
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
/** Signal listeners are process-global; leaving them installed leaks across
|
|
154
|
+
* tests and eventually trips Node's max-listeners warning. */
|
|
155
|
+
function removeInstalledHandlers() {
|
|
156
|
+
process.removeAllListeners("SIGINT");
|
|
157
|
+
process.removeAllListeners("SIGTERM");
|
|
158
|
+
process.removeAllListeners("SIGHUP");
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=shutdown.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.test.js","sourceRoot":"","sources":["../../src/core/shutdown.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB;2EAC2E;AAC3E,SAAS,QAAQ;IACf,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,OAAO;QACL,KAAK;QACL,IAAI,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE;YACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAA4B;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAW,SAAQ,KAAK;IACP;IAArB,YAAqB,IAAY;QAC/B,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QADH,SAAI,GAAJ,IAAI,CAAQ;IAEjC,CAAC;CACF;AAED,KAAK,UAAU,WAAW,CAAC,OAAyB;IAClD,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;YAAE,MAAM,KAAK,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,sEAAsE;QACtE,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC3F,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACzF,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;QACnC,MAAM,WAAW,CACf,oBAAoB,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAC/E,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1B,wDAAwD;YACxD,KAAK,oBAAoB,CAAC,GAAG,EAAE;gBAC7B,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC;gBAC3C,SAAS,EAAE,IAAI;gBACf,SAAS;gBACT,IAAI;aACL,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1B,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1B,yEAAyE;YACzE,iBAAiB;YACjB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACxB,MAAM,WAAW,CACf,oBAAoB,CAAC,CAAC,EAAE;YACtB,QAAQ,EAAE,GAAG,EAAE;gBACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,CAAC;YACD,SAAS,EAAE,MAAM;YACjB,OAAO;YACP,IAAI;SACL,CAAC,CACH,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;YACnC,KAAK,oBAAoB,CAAC,CAAC,EAAE;gBAC3B,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC;gBAC3C,SAAS,EAAE,CAAC;gBACZ,IAAI;aACL,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnB,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;QACvC,MAAM,eAAe,GAAG,0BAA0B,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,eAAe,CAAC,CAAC,CAAC,CAAC;QACnB,eAAe,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACxC,uBAAuB,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;QACnC,0BAA0B,CAAC;YACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC;YAC3C,SAAS,EAAE,MAAM;YACjB,IAAI;SACL,CAAC,CAAC;QACH,wEAAwE;QACxE,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,uBAAuB,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,0BAA0B,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,uBAAuB,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH;+DAC+D;AAC/D,SAAS,uBAAuB;IAC9B,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { captureSidecarError, flushSidecarErrors, shouldCaptureToolFailure, shou
|
|
|
3
3
|
const trackedGlobal = globalThis;
|
|
4
4
|
const originalArgv = [...process.argv];
|
|
5
5
|
afterEach(() => {
|
|
6
|
-
delete trackedGlobal.
|
|
6
|
+
delete trackedGlobal.__EZ_ERROR_MOM__;
|
|
7
7
|
process.argv.splice(0, process.argv.length, ...originalArgv);
|
|
8
8
|
});
|
|
9
9
|
function installReporter() {
|
|
@@ -12,7 +12,7 @@ function installReporter() {
|
|
|
12
12
|
wrap: vi.fn((fn) => fn),
|
|
13
13
|
flush: vi.fn(async () => { }),
|
|
14
14
|
};
|
|
15
|
-
trackedGlobal.
|
|
15
|
+
trackedGlobal.__EZ_ERROR_MOM__ = reporter;
|
|
16
16
|
return reporter;
|
|
17
17
|
}
|
|
18
18
|
describe("sidecar error reporter bridge", () => {
|
|
@@ -26,6 +26,37 @@ describe("skill routing prompts", () => {
|
|
|
26
26
|
expect(tool.description).toContain("matches its scope");
|
|
27
27
|
expect(tool.description).toContain("respect explicit exclusions");
|
|
28
28
|
});
|
|
29
|
+
it("counterbalances invocation pressure in both routing surfaces", () => {
|
|
30
|
+
// Every pro-invocation instruction needs a brake, or topic overlap alone
|
|
31
|
+
// pulls a skill in and burns context on work it would not change. The
|
|
32
|
+
// brake lives here rather than in each skill's description, so it also
|
|
33
|
+
// covers third-party skills written to maximize their own invocation.
|
|
34
|
+
const prompt = formatSkillsForPrompt([skill]);
|
|
35
|
+
expect(prompt).toContain("Match the work, not the topic");
|
|
36
|
+
expect(prompt).toContain("Skip the skill when the task is routine");
|
|
37
|
+
expect(prompt).toContain("Invoke at most one skill");
|
|
38
|
+
expect(prompt).toContain("do not re-invoke a skill");
|
|
39
|
+
const tool = createSkillTool([skill]);
|
|
40
|
+
expect(tool.description).toContain("Match the work rather than the topic");
|
|
41
|
+
expect(tool.description).toContain("skip it for routine or narrow changes");
|
|
42
|
+
expect(tool.description).toContain("do not re-invoke a skill already loaded");
|
|
43
|
+
});
|
|
44
|
+
it("gives every bundled skill an explicit exclusion clause", async () => {
|
|
45
|
+
const root = await fs.mkdtemp(path.join(os.tmpdir(), "bundled-skills-"));
|
|
46
|
+
try {
|
|
47
|
+
const skills = await discoverSkills({ globalSkillsDir: path.join(root, "global") });
|
|
48
|
+
const bundled = skills.filter((candidate) => candidate.source === "bundled");
|
|
49
|
+
expect(bundled.length).toBeGreaterThan(0);
|
|
50
|
+
for (const candidate of bundled) {
|
|
51
|
+
// A description that only says when to fire has no off switch, and the
|
|
52
|
+
// model resolves ambiguity by invoking.
|
|
53
|
+
expect(candidate.description, `${candidate.name} lacks an exclusion`).toMatch(/Do NOT use|Exclude|excluding/i);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
29
60
|
it("keeps loaded skill instructions below project and file/module rules", async () => {
|
|
30
61
|
const tool = createSkillTool([skill]);
|
|
31
62
|
const result = await tool.execute({ skill: skill.name }, { signal: new AbortController().signal, toolCallId: "test" });
|
|
@@ -48,6 +79,117 @@ describe("skill routing prompts", () => {
|
|
|
48
79
|
await fs.rm(root, { recursive: true, force: true });
|
|
49
80
|
}
|
|
50
81
|
});
|
|
82
|
+
it("discovers compliance-guard for a fresh user from bundled assets", async () => {
|
|
83
|
+
const root = await fs.mkdtemp(path.join(os.tmpdir(), "bundled-skills-"));
|
|
84
|
+
try {
|
|
85
|
+
const skills = await discoverSkills({ globalSkillsDir: path.join(root, "global") });
|
|
86
|
+
const complianceSkill = skills.find((candidate) => candidate.name === "compliance-guard");
|
|
87
|
+
expect(complianceSkill?.source).toBe("bundled");
|
|
88
|
+
expect(complianceSkill?.root).toContain(path.join("assets", "skills", "compliance-guard"));
|
|
89
|
+
expect(complianceSkill?.content).toContain("# Compliance Guard");
|
|
90
|
+
// The skill must never present itself as legal advice or certification.
|
|
91
|
+
expect(complianceSkill?.content).toContain("Never certify");
|
|
92
|
+
// A beginner will half-answer or ignore the intake questions, so the
|
|
93
|
+
// defaults ARE the analysis. Promising defaults without stating them
|
|
94
|
+
// lets the model invent a quieter reading than the user deserves.
|
|
95
|
+
expect(complianceSkill?.content).toContain("Default if unanswered");
|
|
96
|
+
expect(complianceSkill?.content).toContain("the cautious reading");
|
|
97
|
+
// Findings a novice cannot act on produce no fixes.
|
|
98
|
+
expect(complianceSkill?.content).toContain("never read a statute");
|
|
99
|
+
// Reading code shows intent; running it shows what ships. A review that
|
|
100
|
+
// asserts from grep alone misses runtime-injected tags entirely, and a
|
|
101
|
+
// fix reported without verification is worse than the original finding.
|
|
102
|
+
// Two-state "observed/inferred" was read as visible-in-code vs deduced,
|
|
103
|
+
// not ran vs read, so a static review reported itself as verified.
|
|
104
|
+
expect(complianceSkill?.content).toContain("RUNTIME");
|
|
105
|
+
expect(complianceSkill?.content).toContain("DEDUCED");
|
|
106
|
+
expect(complianceSkill?.content).toContain("Never relabel upward");
|
|
107
|
+
expect(complianceSkill?.content).toContain("Never report a fix you did not verify");
|
|
108
|
+
// Narrative review silently drops the boring blockers; the sweep is what
|
|
109
|
+
// turns "did I notice it" into "did I check it".
|
|
110
|
+
expect(complianceSkill?.content).toContain("coverage ledger");
|
|
111
|
+
// An item never written down is an item never checked: evaluation showed
|
|
112
|
+
// blockers 1 and 2 dropped while dramatic findings were reported.
|
|
113
|
+
expect(complianceSkill?.content).toContain("one row per numbered item");
|
|
114
|
+
// Audience and product claims live in prose, not in the schema.
|
|
115
|
+
expect(complianceSkill?.content).toContain("Read the prose, not only the code");
|
|
116
|
+
// Held-out evaluation: the code sweep reliably missed obligations that
|
|
117
|
+
// arise from the product model or from two facts combined, and it
|
|
118
|
+
// downgraded unlicensed-activity gates to BLOCKER.
|
|
119
|
+
expect(complianceSkill?.content).toContain("second pass on the product model");
|
|
120
|
+
expect(complianceSkill?.content).toContain("Severity rule for licensed activities");
|
|
121
|
+
// Held-out evaluation: the review named the first instantiation of a duty
|
|
122
|
+
// it thought of (DMCA, auto-renewal) and never reached the EU equivalent
|
|
123
|
+
// (DSA, withdrawal rights) for an EU-established company.
|
|
124
|
+
expect(complianceSkill?.content).toContain("Name every jurisdiction's version");
|
|
125
|
+
// Mandatory coverage lived only in the ledger, so a findings-only output
|
|
126
|
+
// format silently dropped it. Coverage must belong to the findings.
|
|
127
|
+
expect(complianceSkill?.content).toContain("coverage survives the output format");
|
|
128
|
+
// A prohibition reported as a disclosure duty authorises the banned
|
|
129
|
+
// feature; and leading with the wrong jurisdiction sends the user to the
|
|
130
|
+
// wrong kind of lawyer. Both were observed in evaluation runs.
|
|
131
|
+
expect(complianceSkill?.content).toContain("Check for an outright ban");
|
|
132
|
+
expect(complianceSkill?.content).toContain("Lead with the jurisdiction");
|
|
133
|
+
// A point-in-time register rots; a failing test does not.
|
|
134
|
+
expect(complianceSkill?.content).toContain("leave the check behind");
|
|
135
|
+
// Every referenced file must exist, since the skill routes the model to them by path.
|
|
136
|
+
const referenced = [...complianceSkill.content.matchAll(/`(references\/[\w.-]+\.md)`/g)].map((match) => match[1]);
|
|
137
|
+
expect(referenced.length).toBeGreaterThan(0);
|
|
138
|
+
const skillRoot = complianceSkill?.root ?? "";
|
|
139
|
+
for (const relative of new Set(referenced)) {
|
|
140
|
+
await expect(fs.access(path.join(skillRoot, ...relative.split("/")))).resolves.toBeUndefined();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
it("discovers bulletproof for a fresh user from bundled assets", async () => {
|
|
148
|
+
const root = await fs.mkdtemp(path.join(os.tmpdir(), "bundled-skills-"));
|
|
149
|
+
try {
|
|
150
|
+
const skills = await discoverSkills({ globalSkillsDir: path.join(root, "global") });
|
|
151
|
+
const bulletproof = skills.find((candidate) => candidate.name === "bulletproof");
|
|
152
|
+
expect(bulletproof?.source).toBe("bundled");
|
|
153
|
+
expect(bulletproof?.root).toContain(path.join("assets", "skills", "bulletproof"));
|
|
154
|
+
expect(bulletproof?.content).toContain("# Bulletproof");
|
|
155
|
+
// Security work is worthless if the model declares victory: absence of
|
|
156
|
+
// findings is not evidence of safety, and users read "hardened" as a
|
|
157
|
+
// guarantee.
|
|
158
|
+
expect(bulletproof?.content).toContain("Never certify");
|
|
159
|
+
// The skill ships defensive guidance. A model that writes exploits to
|
|
160
|
+
// "prove" a finding has produced attack tooling on the user's machine.
|
|
161
|
+
expect(bulletproof?.content).toContain("Defensive output only");
|
|
162
|
+
expect(bulletproof?.content).toContain("Hard stops");
|
|
163
|
+
// Most users never ask for a security review, so the value is in the
|
|
164
|
+
// inline path writing the safe version during normal feature work.
|
|
165
|
+
expect(bulletproof?.content).toContain("Inline gate");
|
|
166
|
+
expect(bulletproof?.content).toContain("Write the safe version the first time");
|
|
167
|
+
// A grep-driven checklist produces noise; reachability is what separates
|
|
168
|
+
// a finding from a pattern match.
|
|
169
|
+
expect(bulletproof?.content).toContain("Reachability decides everything");
|
|
170
|
+
// The intake must work for someone who cannot answer security questions.
|
|
171
|
+
expect(bulletproof?.content).toContain("Default if unanswered");
|
|
172
|
+
// Claiming a fix was verified when it was only read is the failure mode
|
|
173
|
+
// that makes a security report actively harmful.
|
|
174
|
+
expect(bulletproof?.content).toContain("RUNTIME");
|
|
175
|
+
expect(bulletproof?.content).toContain("DEDUCED");
|
|
176
|
+
// Silent scope gaps read as full coverage.
|
|
177
|
+
expect(bulletproof?.content).toContain("what was not checked");
|
|
178
|
+
// Threat data decays faster than anything else in the bundle; the model
|
|
179
|
+
// must not assert a stale CVE or version as current.
|
|
180
|
+
expect(bulletproof?.content).toContain("Date-check before asserting");
|
|
181
|
+
// Every referenced file must exist, since the skill routes the model to them by path.
|
|
182
|
+
const referenced = [...bulletproof.content.matchAll(/`(references\/[\w.-]+\.md)`/g)].map((match) => match[1]);
|
|
183
|
+
expect(referenced.length).toBeGreaterThan(0);
|
|
184
|
+
const skillRoot = bulletproof?.root ?? "";
|
|
185
|
+
for (const relative of new Set(referenced)) {
|
|
186
|
+
await expect(fs.access(path.join(skillRoot, ...relative.split("/")))).resolves.toBeUndefined();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
191
|
+
}
|
|
192
|
+
});
|
|
51
193
|
it("lets project skills override global and bundled definitions by name", async () => {
|
|
52
194
|
const root = await fs.mkdtemp(path.join(os.tmpdir(), "skill-precedence-"));
|
|
53
195
|
const globalSkillsDir = path.join(root, "global");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-routing.test.js","sourceRoot":"","sources":["../../src/core/skills-routing.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skills-routing.test.js","sourceRoot":"","sources":["../../src/core/skills-routing.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAiBnB;AAuDD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CA0BtE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAiBnB;AAuDD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CA0BtE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAiB7D"}
|