@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,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool-catalog pin: the schemas this repo ships are the schemas we think we ship.
|
|
3
|
+
*
|
|
4
|
+
* Builds the REAL default tool array via `createTools()` — the same factory every
|
|
5
|
+
* session entry point (agent-session, CLI, interactive) uses — serializes each
|
|
6
|
+
* tool with `resolveToolSchema` (the exact encoding provider requests carry),
|
|
7
|
+
* and pins the canonicalized catalog against a committed snapshot.
|
|
8
|
+
*
|
|
9
|
+
* Why: an accidental schema/description edit is silent. It changes what every
|
|
10
|
+
* model sees on every request, and invalidates the cached prompt prefix, without
|
|
11
|
+
* failing any test that isn't explicitly looking. This test is the test that is
|
|
12
|
+
* explicitly looking (deepseek-harness takeaway: CI-verified tool catalog).
|
|
13
|
+
*
|
|
14
|
+
* Regenerate after an INTENTIONAL schema change:
|
|
15
|
+
* UPDATE_TOOL_CATALOG=1 pnpm vitest run tools/tool-catalog.test.ts
|
|
16
|
+
* and review the snapshot diff like any code diff.
|
|
17
|
+
*/
|
|
18
|
+
import { describe, it, expect } from "vitest";
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
import fs from "node:fs";
|
|
21
|
+
import os from "node:os";
|
|
22
|
+
import path from "node:path";
|
|
23
|
+
import { resolveToolSchema } from "@prestyj/ai";
|
|
24
|
+
import { createTools } from "./index.js";
|
|
25
|
+
import { BUILTIN_TOOL_NAMES } from "./prompt-hints.js";
|
|
26
|
+
const SNAPSHOT_PATH = path.join(import.meta.dirname, "tool-catalog.snapshot.json");
|
|
27
|
+
/**
|
|
28
|
+
* Tools a bare `createTools()` call cannot register: each needs a session-level
|
|
29
|
+
* option (agent-session supplies it) rather than being a factory default. A name
|
|
30
|
+
* moving between this set and the built catalog is itself a reviewable diff —
|
|
31
|
+
* it changes the default model-visible surface.
|
|
32
|
+
*/
|
|
33
|
+
const OPT_IN_TOOLS = new Set([
|
|
34
|
+
"tool_search", // registered by AgentSession.ensureToolSearchTool()
|
|
35
|
+
"web_search", // provider-gated: non-anthropic providers only
|
|
36
|
+
"subagent", // needs agents[] + provider + model
|
|
37
|
+
"spawn_agent", // subagent control tools (same gate)
|
|
38
|
+
"send_message",
|
|
39
|
+
"followup_task",
|
|
40
|
+
"wait_agent",
|
|
41
|
+
"list_agents",
|
|
42
|
+
"interrupt_agent",
|
|
43
|
+
"skill", // needs configured skills
|
|
44
|
+
"enter_plan", // needs onEnterPlan callback
|
|
45
|
+
"exit_plan", // needs onExitPlan callback
|
|
46
|
+
"generate_image", // gated on OpenAI auth
|
|
47
|
+
]);
|
|
48
|
+
/** Deterministic JSON: object keys sorted at every depth, stable stringification. */
|
|
49
|
+
function canonical(value) {
|
|
50
|
+
return JSON.stringify(value, (_key, v) => v && typeof v === "object" && !Array.isArray(v)
|
|
51
|
+
? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : 1)))
|
|
52
|
+
: v);
|
|
53
|
+
}
|
|
54
|
+
async function buildCatalog() {
|
|
55
|
+
// Fixed temp cwd so no tool state leaks between runs; descriptions do not
|
|
56
|
+
// embed cwd (verified — factories use static description text).
|
|
57
|
+
const cwd = fs.mkdtempSync(path.join(os.tmpdir(), "ez-tool-catalog-"));
|
|
58
|
+
try {
|
|
59
|
+
const { tools } = await createTools(cwd);
|
|
60
|
+
return tools.map((tool) => {
|
|
61
|
+
const entry = {
|
|
62
|
+
name: tool.name,
|
|
63
|
+
description: tool.description,
|
|
64
|
+
schema: resolveToolSchema(tool),
|
|
65
|
+
};
|
|
66
|
+
return { ...entry, hash: createHash("sha256").update(canonical(entry)).digest("hex") };
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
fs.rmSync(cwd, { recursive: true, force: true });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
describe("tool catalog snapshot", () => {
|
|
74
|
+
it("pins the default tool catalog (schemas the model actually receives)", async () => {
|
|
75
|
+
const catalog = await buildCatalog();
|
|
76
|
+
// Duplicate names would mean a registry bug, not a schema change.
|
|
77
|
+
const names = catalog.map((t) => t.name);
|
|
78
|
+
expect(new Set(names).size, `duplicate tool names: ${names.join(", ")}`).toBe(names.length);
|
|
79
|
+
const snapshot = {
|
|
80
|
+
version: 1,
|
|
81
|
+
// Sorted for a stable, reviewable diff (order in the array is append-only
|
|
82
|
+
// and guarded separately by system-prompt.tiering.test.ts).
|
|
83
|
+
tools: [...catalog].sort((a, b) => (a.name < b.name ? -1 : 1)),
|
|
84
|
+
};
|
|
85
|
+
const serialized = `${JSON.stringify(snapshot, null, 2)}\n`;
|
|
86
|
+
if (process.env.UPDATE_TOOL_CATALOG === "1") {
|
|
87
|
+
fs.writeFileSync(SNAPSHOT_PATH, serialized);
|
|
88
|
+
console.log(`[tool-catalog] wrote ${catalog.length} tools to ${SNAPSHOT_PATH}`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
expect(fs.existsSync(SNAPSHOT_PATH), "snapshot missing — run with UPDATE_TOOL_CATALOG=1").toBe(true);
|
|
92
|
+
const pinned = fs.readFileSync(SNAPSHOT_PATH, "utf8");
|
|
93
|
+
// Compare per-tool hashes first: on mismatch the diff shows exactly WHICH
|
|
94
|
+
// tool changed, not a wall of JSON.
|
|
95
|
+
const pinnedNames = JSON.parse(pinned).tools.map((t) => t.name);
|
|
96
|
+
expect(names.sort()).toEqual(pinnedNames);
|
|
97
|
+
if (serialized !== pinned) {
|
|
98
|
+
const changed = snapshot.tools
|
|
99
|
+
.filter((t) => {
|
|
100
|
+
const pinnedTool = JSON.parse(pinned).tools.find((p) => p.name === t.name);
|
|
101
|
+
return !pinnedTool || pinnedTool.hash !== t.hash;
|
|
102
|
+
})
|
|
103
|
+
.map((t) => t.name);
|
|
104
|
+
const subject = changed.length > 0 ? changed.join(", ") : "snapshot formatting/extra keys";
|
|
105
|
+
throw new Error(`Tool catalog drifted: ${subject}. If intentional, regenerate with ` +
|
|
106
|
+
`UPDATE_TOOL_CATALOG=1 pnpm vitest run tools/tool-catalog.test.ts and review the diff. ` +
|
|
107
|
+
`Schema changes alter every request and invalidate cached prefixes — they deserve eyes.`);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
it("keeps the default surface complete: every built-in is either live or documented opt-in", async () => {
|
|
111
|
+
const catalog = await buildCatalog();
|
|
112
|
+
const live = new Set(catalog.map((t) => t.name));
|
|
113
|
+
for (const name of BUILTIN_TOOL_NAMES) {
|
|
114
|
+
expect(live.has(name) || OPT_IN_TOOLS.has(name), `${name} is neither in the default catalog nor the OPT_IN_TOOLS set — ` +
|
|
115
|
+
`the completeness guard can no longer account for it`).toBe(true);
|
|
116
|
+
}
|
|
117
|
+
// And the inverse: nothing rides along that the registry doesn't know.
|
|
118
|
+
const known = new Set([...BUILTIN_TOOL_NAMES, ...OPT_IN_TOOLS]);
|
|
119
|
+
for (const name of live) {
|
|
120
|
+
expect(known.has(name), `unregistered tool ${name} reached the default catalog`).toBe(true);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=tool-catalog.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-catalog.test.js","sourceRoot":"","sources":["../../src/tools/tool-catalog.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../../src/tools/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,QAAA,MAAM,gBAAgB;;iBAMpB,CAAC;AAEH,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,EACvC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,GAC9E,SAAS,CAAC,OAAO,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../../src/tools/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,QAAA,MAAM,gBAAgB;;iBAMpB,CAAC;AAEH,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,EACvC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,GAC9E,SAAS,CAAC,OAAO,gBAAgB,CAAC,CA8CpC"}
|
|
@@ -18,7 +18,8 @@ const ToolSearchParams = z.object({
|
|
|
18
18
|
export function createToolSearchTool(catalog, onPromote, resolveCached) {
|
|
19
19
|
return {
|
|
20
20
|
name: "tool_search",
|
|
21
|
-
description: "
|
|
21
|
+
description: "Load a tool that is listed as available on demand. Searches the catalog of " +
|
|
22
|
+
"built-in capabilities and connected integrations (MCP servers) by capability. " +
|
|
22
23
|
"Matching tools become available immediately — call them on your next step. " +
|
|
23
24
|
"Use this when you need a capability not in your current toolset.",
|
|
24
25
|
parameters: ToolSearchParams,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../../src/tools/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,CACP,qFAAqF,CACtF;CACJ,CAAC,CAAC;AASH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA4B,EAC5B,SAAuC,EACvC,aAA+E;IAE/E,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../../src/tools/tool-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AgentTool } from "@prestyj/agent";
|
|
2
|
+
/**
|
|
3
|
+
* Two-tier split of the built-in toolset.
|
|
4
|
+
*
|
|
5
|
+
* Every tool in `this.tools` ships its full JSON parameter schema on every
|
|
6
|
+
* request, inside the cached prefix. A core tool earns that cost because it is
|
|
7
|
+
* reached in most sessions. A deferred tool does not: it contributes one
|
|
8
|
+
* `- **name**: hint` line to the system prompt's Tools section (~15-25 tokens)
|
|
9
|
+
* instead of a full schema (~300-500 tokens), and `tool_search` promotes it
|
|
10
|
+
* into the live toolset the moment the model asks for that capability.
|
|
11
|
+
*
|
|
12
|
+
* The index line is what makes deferral safe. Dropping a schema WITHOUT
|
|
13
|
+
* advertising the capability trades tokens for capability blindness — the model
|
|
14
|
+
* cannot search for a tool it does not know exists. That is why every deferred
|
|
15
|
+
* name is required to carry a `TOOL_PROMPT_HINTS` entry (enforced by test).
|
|
16
|
+
*
|
|
17
|
+
* Tier membership rule: a tool stays core if it is reached in more than roughly
|
|
18
|
+
* one in five sessions. Deferring a tool is only safe while capability-discovery
|
|
19
|
+
* rates hold: measure that, not just the token saving, before moving a name.
|
|
20
|
+
*/
|
|
21
|
+
export declare const CORE_TOOL_NAMES: readonly string[];
|
|
22
|
+
/**
|
|
23
|
+
* Built-ins that live in the catalog as index lines until `tool_search` is
|
|
24
|
+
* called. Each one is either rare (image generation, screenshots, package
|
|
25
|
+
* source resolution) or only reachable after another tool has already run
|
|
26
|
+
* (the child-agent control cluster follows `spawn_agent`).
|
|
27
|
+
*/
|
|
28
|
+
export declare const DEFERRED_TOOL_NAMES: readonly string[];
|
|
29
|
+
export interface ToolTierPartition {
|
|
30
|
+
/** Tools whose full schema stays in every request. */
|
|
31
|
+
core: AgentTool[];
|
|
32
|
+
/** Tools held in the deferred catalog until `tool_search` promotes them. */
|
|
33
|
+
deferred: AgentTool[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Split a freshly built toolset into its two tiers, preserving input order
|
|
37
|
+
* within each tier. An unrecognised name (a future built-in, an MCP tool that
|
|
38
|
+
* reached this path) defaults to `core`: shipping one extra schema is a token
|
|
39
|
+
* cost, whereas silently hiding an unknown capability is a behaviour loss.
|
|
40
|
+
*/
|
|
41
|
+
export declare function partitionToolsByTier(tools: readonly AgentTool[]): ToolTierPartition;
|
|
42
|
+
//# sourceMappingURL=tool-tiers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-tiers.d.ts","sourceRoot":"","sources":["../../src/tools/tool-tiers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAsB5C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAUhD,CAAC;AAIF,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,4EAA4E;IAC5E,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,iBAAiB,CAQnF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Two-tier split of the built-in toolset.
|
|
3
|
+
*
|
|
4
|
+
* Every tool in `this.tools` ships its full JSON parameter schema on every
|
|
5
|
+
* request, inside the cached prefix. A core tool earns that cost because it is
|
|
6
|
+
* reached in most sessions. A deferred tool does not: it contributes one
|
|
7
|
+
* `- **name**: hint` line to the system prompt's Tools section (~15-25 tokens)
|
|
8
|
+
* instead of a full schema (~300-500 tokens), and `tool_search` promotes it
|
|
9
|
+
* into the live toolset the moment the model asks for that capability.
|
|
10
|
+
*
|
|
11
|
+
* The index line is what makes deferral safe. Dropping a schema WITHOUT
|
|
12
|
+
* advertising the capability trades tokens for capability blindness — the model
|
|
13
|
+
* cannot search for a tool it does not know exists. That is why every deferred
|
|
14
|
+
* name is required to carry a `TOOL_PROMPT_HINTS` entry (enforced by test).
|
|
15
|
+
*
|
|
16
|
+
* Tier membership rule: a tool stays core if it is reached in more than roughly
|
|
17
|
+
* one in five sessions. Deferring a tool is only safe while capability-discovery
|
|
18
|
+
* rates hold: measure that, not just the token saving, before moving a name.
|
|
19
|
+
*/
|
|
20
|
+
export const CORE_TOOL_NAMES = [
|
|
21
|
+
"read",
|
|
22
|
+
"write",
|
|
23
|
+
"edit",
|
|
24
|
+
"bash",
|
|
25
|
+
"grep",
|
|
26
|
+
"find",
|
|
27
|
+
"ls",
|
|
28
|
+
"code_search",
|
|
29
|
+
"code_nav",
|
|
30
|
+
"web_search",
|
|
31
|
+
"web_fetch",
|
|
32
|
+
"task_output",
|
|
33
|
+
"task_send",
|
|
34
|
+
"task_stop",
|
|
35
|
+
"subagent",
|
|
36
|
+
"spawn_agent",
|
|
37
|
+
"skill",
|
|
38
|
+
"enter_plan",
|
|
39
|
+
"exit_plan",
|
|
40
|
+
"tool_search",
|
|
41
|
+
"goals",
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Built-ins that live in the catalog as index lines until `tool_search` is
|
|
45
|
+
* called. Each one is either rare (image generation, screenshots, package
|
|
46
|
+
* source resolution) or only reachable after another tool has already run
|
|
47
|
+
* (the child-agent control cluster follows `spawn_agent`).
|
|
48
|
+
*/
|
|
49
|
+
export const DEFERRED_TOOL_NAMES = [
|
|
50
|
+
"source_path",
|
|
51
|
+
"screenshot",
|
|
52
|
+
"generate_image",
|
|
53
|
+
"tasks",
|
|
54
|
+
"send_message",
|
|
55
|
+
"followup_task",
|
|
56
|
+
"wait_agent",
|
|
57
|
+
"list_agents",
|
|
58
|
+
"interrupt_agent",
|
|
59
|
+
];
|
|
60
|
+
const DEFERRED_SET = new Set(DEFERRED_TOOL_NAMES);
|
|
61
|
+
/**
|
|
62
|
+
* Split a freshly built toolset into its two tiers, preserving input order
|
|
63
|
+
* within each tier. An unrecognised name (a future built-in, an MCP tool that
|
|
64
|
+
* reached this path) defaults to `core`: shipping one extra schema is a token
|
|
65
|
+
* cost, whereas silently hiding an unknown capability is a behaviour loss.
|
|
66
|
+
*/
|
|
67
|
+
export function partitionToolsByTier(tools) {
|
|
68
|
+
const core = [];
|
|
69
|
+
const deferred = [];
|
|
70
|
+
for (const tool of tools) {
|
|
71
|
+
if (DEFERRED_SET.has(tool.name))
|
|
72
|
+
deferred.push(tool);
|
|
73
|
+
else
|
|
74
|
+
core.push(tool);
|
|
75
|
+
}
|
|
76
|
+
return { core, deferred };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=tool-tiers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-tiers.js","sourceRoot":"","sources":["../../src/tools/tool-tiers.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,aAAa;IACb,UAAU;IACV,YAAY;IACZ,WAAW;IACX,aAAa;IACb,WAAW;IACX,WAAW;IACX,UAAU;IACV,aAAa;IACb,OAAO;IACP,YAAY;IACZ,WAAW;IACX,aAAa;IACb,OAAO;CACR,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,OAAO;IACP,cAAc;IACd,eAAe;IACf,YAAY;IACZ,aAAa;IACb,iBAAiB;CAClB,CAAC;AAEF,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,mBAAmB,CAAC,CAAC;AASvE;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA2B;IAC9D,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-tiers.test.d.ts","sourceRoot":"","sources":["../../src/tools/tool-tiers.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { CORE_TOOL_NAMES, DEFERRED_TOOL_NAMES, partitionToolsByTier } from "./tool-tiers.js";
|
|
4
|
+
import { TOOL_PROMPT_HINTS, DEFAULT_TOOL_NAMES, BUILTIN_TOOL_NAMES } from "./prompt-hints.js";
|
|
5
|
+
const stub = (name) => ({
|
|
6
|
+
name,
|
|
7
|
+
description: `${name} description`,
|
|
8
|
+
parameters: z.object({}),
|
|
9
|
+
execute: async () => "",
|
|
10
|
+
});
|
|
11
|
+
describe("tool tiers", () => {
|
|
12
|
+
it("keeps the core and deferred sets disjoint", () => {
|
|
13
|
+
const overlap = CORE_TOOL_NAMES.filter((n) => DEFERRED_TOOL_NAMES.includes(n));
|
|
14
|
+
expect(overlap).toEqual([]);
|
|
15
|
+
});
|
|
16
|
+
it("has no duplicate names within a tier", () => {
|
|
17
|
+
expect(new Set(CORE_TOOL_NAMES).size).toBe(CORE_TOOL_NAMES.length);
|
|
18
|
+
expect(new Set(DEFERRED_TOOL_NAMES).size).toBe(DEFERRED_TOOL_NAMES.length);
|
|
19
|
+
});
|
|
20
|
+
it("covers every built-in name rendered by default", () => {
|
|
21
|
+
const tiered = new Set([...CORE_TOOL_NAMES, ...DEFERRED_TOOL_NAMES]);
|
|
22
|
+
const builtinDefaults = DEFAULT_TOOL_NAMES.filter((n) => !n.startsWith("mcp__"));
|
|
23
|
+
for (const name of builtinDefaults)
|
|
24
|
+
expect(tiered.has(name)).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it("assigns every registrable built-in to a tier", () => {
|
|
27
|
+
const tiered = new Set([...CORE_TOOL_NAMES, ...DEFERRED_TOOL_NAMES]);
|
|
28
|
+
for (const name of BUILTIN_TOOL_NAMES)
|
|
29
|
+
expect(tiered.has(name)).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
it("gives every deferred tool a prompt hint (its only discoverability)", () => {
|
|
32
|
+
for (const name of DEFERRED_TOOL_NAMES) {
|
|
33
|
+
expect(TOOL_PROMPT_HINTS[name], `missing hint for deferred tool ${name}`).toBeTruthy();
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
it("partitions tools by tier, preserving order within each tier", () => {
|
|
37
|
+
const tools = ["read", "source_path", "edit", "screenshot", "bash"].map(stub);
|
|
38
|
+
const { core, deferred } = partitionToolsByTier(tools);
|
|
39
|
+
expect(core.map((t) => t.name)).toEqual(["read", "edit", "bash"]);
|
|
40
|
+
expect(deferred.map((t) => t.name)).toEqual(["source_path", "screenshot"]);
|
|
41
|
+
});
|
|
42
|
+
it("treats an unknown tool as core rather than hiding it", () => {
|
|
43
|
+
const { core, deferred } = partitionToolsByTier([stub("mcp__some__tool")]);
|
|
44
|
+
expect(core.map((t) => t.name)).toEqual(["mcp__some__tool"]);
|
|
45
|
+
expect(deferred).toEqual([]);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=tool-tiers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-tiers.test.js","sourceRoot":"","sources":["../../src/tools/tool-tiers.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/write.test.js
CHANGED
|
@@ -163,7 +163,7 @@ describe("createWriteTool", () => {
|
|
|
163
163
|
describe("workspace write guard", () => {
|
|
164
164
|
it("blocks writes outside the workspace and does not create the file", async () => {
|
|
165
165
|
const tool = createWriteTool(tmpDir);
|
|
166
|
-
const outside = path.join(os.homedir(), "Documents", "
|
|
166
|
+
const outside = path.join(os.homedir(), "Documents", "ez-guard-test-outside.txt");
|
|
167
167
|
const raw = await tool.execute({ file_path: outside, content: "nope\n" }, { signal: new AbortController().signal, toolCallId: "guard-1" });
|
|
168
168
|
expect(resultToString(raw)).toContain("outside the workspace");
|
|
169
169
|
expect(resultToString(raw)).toContain("allowOutsideWorkspaceWrites");
|
package/dist/ui/App.d.ts
CHANGED
|
@@ -49,6 +49,8 @@ export interface AppProps {
|
|
|
49
49
|
showTokenUsage?: boolean;
|
|
50
50
|
idealReviewEnabled?: boolean;
|
|
51
51
|
autoApprovePlans?: boolean;
|
|
52
|
+
/** Kill switch for the pre-stop verification gate (default on). */
|
|
53
|
+
verificationGateEnabled?: boolean;
|
|
52
54
|
onSlashCommand?: (input: string) => Promise<string | null>;
|
|
53
55
|
loggedInProviders?: Provider[];
|
|
54
56
|
credentialsByProvider?: Record<string, {
|
|
@@ -190,6 +192,7 @@ export interface AppProps {
|
|
|
190
192
|
idealReviewEnabled?: boolean;
|
|
191
193
|
autoApprovePlans?: boolean;
|
|
192
194
|
taskRunning?: boolean;
|
|
195
|
+
verificationGateEnabled?: boolean;
|
|
193
196
|
};
|
|
194
197
|
}
|
|
195
198
|
export declare function App(props: AppProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/ui/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAoB,MAAM,aAAa,CAAC;AAEhG,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui/App.js
CHANGED
|
@@ -15,6 +15,7 @@ import {} from "@prestyj/ai";
|
|
|
15
15
|
import { downscaleForPreview, extractMediaPaths } from "../utils/image.js";
|
|
16
16
|
import { buildSubAgentCompletionFollowUp, } from "../core/subagent-manager.js";
|
|
17
17
|
import { buildProcessCompletionFollowUp } from "../core/process-gate.js";
|
|
18
|
+
import { VerificationGate, isCodeFilePath, isVerificationCommand, } from "../core/verification-gate.js";
|
|
18
19
|
import { useAgentLoop } from "./hooks/useAgentLoop.js";
|
|
19
20
|
import { useTranscriptHistory } from "./hooks/useTranscriptHistory.js";
|
|
20
21
|
import { createWebSearchTool } from "../tools/web-search.js";
|
|
@@ -67,7 +68,7 @@ import { formatGoalVerifierCompletionEvent, formatGoalWorkerCompletionEvent, } f
|
|
|
67
68
|
import { buildGoalFinalSummarySections, buildGoalSummaryRows, goalPassedDetail, } from "./goal-summary.js";
|
|
68
69
|
import { addLinesChanged, buildSessionSummary, createSessionStats, recordServerToolCall, recordToolEnd, recordTurnEnd, } from "./session-summary.js";
|
|
69
70
|
import { compactHistory, getNextGeneratedItemId, isActiveItem, isSameAssistantText, normalizeAssistantText, partitionCompleted, pinStreamingTextBeforeToolBoundary, removeItemsWithIds, uniqueItemsById, } from "./item-helpers.js";
|
|
70
|
-
import { IDEAL_HOOK_NOTICE_TEXT, LOOP_BREAK_NOTICE_TEXT, REGROUNDING_NOTICE_TEXT, TRUNCATED_CONTINUING_NOTICE_TEXT, TRUNCATED_INCOMPLETE_NOTICE_TEXT, TRUNCATED_PROVIDER_ERROR_NOTICE_TEXT, TRUNCATED_REFUSAL_NOTICE_TEXT, lastVisibleTranscriptItem, } from "./app-items.js";
|
|
71
|
+
import { IDEAL_HOOK_NOTICE_TEXT, LOOP_BREAK_NOTICE_TEXT, REGROUNDING_NOTICE_TEXT, TRUNCATED_CONTINUING_NOTICE_TEXT, TRUNCATED_INCOMPLETE_NOTICE_TEXT, TRUNCATED_EMPTY_RESPONSE_NOTICE_TEXT, TRUNCATED_PROVIDER_ERROR_NOTICE_TEXT, TRUNCATED_REFUSAL_NOTICE_TEXT, lastVisibleTranscriptItem, } from "./app-items.js";
|
|
71
72
|
export { buildUserContentWithAttachments, routePromptCommandInput } from "./prompt-routing.js";
|
|
72
73
|
export { getNextThinkingLevel } from "./thinking-level.js";
|
|
73
74
|
export { getChatControlsLayoutDecision, getDoneFlushDecision, getScrollStabilizationDecision, getStaticHistoryKey, hasParagraphBreakLiveUserMessage, isTallLiveUserMessage, shouldHideHistoryForOverlayView, shouldHideStaticItemsForOverlayView, shouldStabilizeOverlayPaneRerender, shouldTopSpaceAfterPrintedAgentBoundary, shouldTopSpaceAssistantAfterToolBoundary, shouldTopSpaceStreamingAssistant, } from "./layout-decisions.js";
|
|
@@ -403,6 +404,9 @@ export function App(props) {
|
|
|
403
404
|
const idealReviewEnabledRef = useRef(idealReviewEnabled);
|
|
404
405
|
const [autoApprovePlansEnabled, setAutoApprovePlansEnabled] = useState(props.sessionStore?.autoApprovePlans ?? props.autoApprovePlans ?? true);
|
|
405
406
|
const autoApprovePlansEnabledRef = useRef(autoApprovePlansEnabled);
|
|
407
|
+
/** Pre-stop verification gate: code edited this run, nothing proved it since. */
|
|
408
|
+
const verificationGateRef = useRef(new VerificationGate());
|
|
409
|
+
const verificationGateEnabledRef = useRef(props.sessionStore?.verificationGateEnabled ?? props.verificationGateEnabled ?? true);
|
|
406
410
|
/**
|
|
407
411
|
* Languages whose style packs are currently injected into the system prompt.
|
|
408
412
|
* Grown by `maybeInjectLanguagePacks` after `write`/`bash` tool results when
|
|
@@ -1176,7 +1180,28 @@ export function App(props) {
|
|
|
1176
1180
|
return next;
|
|
1177
1181
|
});
|
|
1178
1182
|
}, []),
|
|
1179
|
-
onToolEnd: useCallback((toolCallId, name, result, isError, durationMs, details) => {
|
|
1183
|
+
onToolEnd: useCallback((toolCallId, name, result, isError, durationMs, details, args) => {
|
|
1184
|
+
// Verification-gate bookkeeping, mirroring AgentSession.trackHookEvent:
|
|
1185
|
+
// successful code mutations vs completed foreground verification runs.
|
|
1186
|
+
if (!isError && args) {
|
|
1187
|
+
const filePath = String(args.file_path ?? "");
|
|
1188
|
+
if ((name === "edit" || name === "write") && isCodeFilePath(filePath)) {
|
|
1189
|
+
verificationGateRef.current.recordMutation(filePath);
|
|
1190
|
+
}
|
|
1191
|
+
if (name === "bash" &&
|
|
1192
|
+
!args.run_in_background &&
|
|
1193
|
+
isVerificationCommand(String(args.command ?? ""))) {
|
|
1194
|
+
verificationGateRef.current.recordVerification();
|
|
1195
|
+
}
|
|
1196
|
+
// Reading the final output of an EXITED background verification run
|
|
1197
|
+
// counts as verification — mirrors AgentSession.trackHookEvent.
|
|
1198
|
+
if (name === "task_output") {
|
|
1199
|
+
const proc = props.processManager?.list().find((p) => p.id === args.id);
|
|
1200
|
+
if (proc && proc.exitCode !== null && isVerificationCommand(proc.command)) {
|
|
1201
|
+
verificationGateRef.current.recordVerification();
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1180
1205
|
recordToolEnd(sessionStatsRef.current, name, isError, durationMs);
|
|
1181
1206
|
setLiveToolFeed((prev) => prev.map((entry) => entry.id === toolCallId
|
|
1182
1207
|
? { ...entry, status: "done", isError, result, details }
|
|
@@ -1629,12 +1654,21 @@ export function App(props) {
|
|
|
1629
1654
|
if (gate.runStartedAt !== runStartedAt) {
|
|
1630
1655
|
gate.runStartedAt = runStartedAt;
|
|
1631
1656
|
gate.injected = 0;
|
|
1657
|
+
verificationGateRef.current.reset();
|
|
1632
1658
|
}
|
|
1633
1659
|
const processFollowUp = buildProcessCompletionFollowUp(props.processManager?.list() ?? [], runStartedAt, gate.injected);
|
|
1634
1660
|
if (processFollowUp) {
|
|
1635
1661
|
gate.injected += 1;
|
|
1636
1662
|
return processFollowUp;
|
|
1637
1663
|
}
|
|
1664
|
+
// Verification gate: code was edited but no test/typecheck/lint/build
|
|
1665
|
+
// completed since the last edit — block "done" until it runs (or the
|
|
1666
|
+
// budget escalates to an honest unverified statement).
|
|
1667
|
+
if (verificationGateEnabledRef.current) {
|
|
1668
|
+
const verificationFollowUp = verificationGateRef.current.followUp();
|
|
1669
|
+
if (verificationFollowUp)
|
|
1670
|
+
return verificationFollowUp;
|
|
1671
|
+
}
|
|
1638
1672
|
const steps = planStepsRef.current;
|
|
1639
1673
|
if (steps.length === 0 || !approvedPlanPathRef.current)
|
|
1640
1674
|
return null;
|
|
@@ -1673,7 +1707,9 @@ export function App(props) {
|
|
|
1673
1707
|
: TRUNCATED_INCOMPLETE_NOTICE_TEXT
|
|
1674
1708
|
: reason === "refusal"
|
|
1675
1709
|
? TRUNCATED_REFUSAL_NOTICE_TEXT
|
|
1676
|
-
:
|
|
1710
|
+
: reason === "empty_response"
|
|
1711
|
+
? TRUNCATED_EMPTY_RESPONSE_NOTICE_TEXT
|
|
1712
|
+
: TRUNCATED_PROVIDER_ERROR_NOTICE_TEXT;
|
|
1677
1713
|
setLiveItems((prev) => [
|
|
1678
1714
|
...prev,
|
|
1679
1715
|
{ kind: "ideal_hook", text, tone: "warning", id: getId() },
|