gsd-pi 2.80.0-dev.42bd34838 → 2.80.0-dev.488219eb6
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/dist/claude-cli-check.d.ts +30 -0
- package/dist/claude-cli-check.js +18 -7
- package/dist/cli.js +0 -19
- package/dist/headless-query.d.ts +10 -0
- package/dist/headless-query.js +6 -4
- package/dist/loader-entrypoint.d.ts +8 -0
- package/dist/loader-entrypoint.js +27 -0
- package/dist/loader.js +2 -11
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +6 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/loop.js +71 -8
- package/dist/resources/extensions/gsd/auto/phases.js +179 -99
- package/dist/resources/extensions/gsd/auto/resolve.js +12 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -30
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +94 -76
- package/dist/resources/extensions/gsd/auto-prompts.js +90 -15
- package/dist/resources/extensions/gsd/auto-start.js +238 -12
- package/dist/resources/extensions/gsd/auto-worktree.js +209 -81
- package/dist/resources/extensions/gsd/auto.js +95 -44
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +96 -26
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +6 -3
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +298 -54
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-config.js +1 -1
- package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +53 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +37 -1
- package/dist/resources/extensions/gsd/guided-flow.js +61 -32
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +57 -5
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +9 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +8 -0
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +14 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +36 -7
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +3 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -6
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +3 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +34 -3
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
- package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +153 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +23 -5
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +19 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +23 -5
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +40 -7
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +3 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +3 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +5 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +37 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
- package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
- package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
- package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +177 -8
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +24 -5
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +21 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +25 -8
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -2
- package/src/resources/extensions/gsd/auto/loop.ts +84 -8
- package/src/resources/extensions/gsd/auto/phases.ts +258 -159
- package/src/resources/extensions/gsd/auto/resolve.ts +19 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -29
- package/src/resources/extensions/gsd/auto/session.ts +8 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +107 -78
- package/src/resources/extensions/gsd/auto-prompts.ts +95 -14
- package/src/resources/extensions/gsd/auto-start.ts +286 -15
- package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
- package/src/resources/extensions/gsd/auto.ts +132 -40
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +116 -24
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -3
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +347 -54
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
- package/src/resources/extensions/gsd/commands-config.ts +1 -1
- package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +66 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +41 -2
- package/src/resources/extensions/gsd/guided-flow.ts +71 -39
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +361 -10
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
- package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +35 -31
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -125
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -97
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +33 -47
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +140 -3
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +83 -5
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_ssgManifest.js +0 -0
package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js
CHANGED
|
@@ -1,10 +1,28 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
2
|
+
import { lstatSync, mkdtempSync, readFileSync, rmSync, symlinkSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
3
4
|
import { join } from "node:path";
|
|
4
5
|
import test from "node:test";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import { MemoryStorage } from "./storage.js";
|
|
7
|
+
test("MemoryStorage replaces a symlinked DB path instead of overwriting the symlink target", async (t) => {
|
|
8
|
+
const dir = mkdtempSync(join(tmpdir(), "memory-storage-atomic-"));
|
|
9
|
+
t.after(() => rmSync(dir, { recursive: true, force: true }));
|
|
10
|
+
const canaryPath = join(dir, "canary.txt");
|
|
11
|
+
const dbPath = join(dir, "memory.db");
|
|
12
|
+
const canaryStorage = await MemoryStorage.create(canaryPath);
|
|
13
|
+
canaryStorage.close();
|
|
14
|
+
const originalCanary = readFileSync(canaryPath);
|
|
15
|
+
symlinkSync(canaryPath, dbPath);
|
|
16
|
+
const storage = await MemoryStorage.create(dbPath);
|
|
17
|
+
storage.upsertThreads([{
|
|
18
|
+
threadId: "thread-1",
|
|
19
|
+
filePath: join(dir, "thread.jsonl"),
|
|
20
|
+
fileSize: 1,
|
|
21
|
+
fileMtime: 1,
|
|
22
|
+
cwd: dir,
|
|
23
|
+
}]);
|
|
24
|
+
storage.close();
|
|
25
|
+
assert.deepEqual(readFileSync(canaryPath), originalCanary);
|
|
26
|
+
assert.equal(lstatSync(dbPath).isSymbolicLink(), false, "atomic snapshot write should replace the symlink");
|
|
9
27
|
});
|
|
10
28
|
//# sourceMappingURL=storage-safety-guard.test.js.map
|
package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-safety-guard.test.js","sourceRoot":"","sources":["../../../../src/resources/extensions/memory/storage-safety-guard.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"storage-safety-guard.test.js","sourceRoot":"","sources":["../../../../src/resources/extensions/memory/storage-safety-guard.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,IAAI,CAAC,sFAAsF,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACxG,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE7D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7D,aAAa,CAAC,KAAK,EAAE,CAAC;IACtB,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAChD,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,CAAC,aAAa,CAAC,CAAC;YACtB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC;YACnC,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,CAAC;YACZ,GAAG,EAAE,GAAG;SACR,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,kDAAkD,CAAC,CAAC;AAC7G,CAAC,CAAC,CAAC","sourcesContent":["import assert from \"node:assert/strict\";\nimport { lstatSync, mkdtempSync, readFileSync, rmSync, symlinkSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport test from \"node:test\";\nimport { MemoryStorage } from \"./storage.js\";\n\ntest(\"MemoryStorage replaces a symlinked DB path instead of overwriting the symlink target\", async (t) => {\n\tconst dir = mkdtempSync(join(tmpdir(), \"memory-storage-atomic-\"));\n\tt.after(() => rmSync(dir, { recursive: true, force: true }));\n\n\tconst canaryPath = join(dir, \"canary.txt\");\n\tconst dbPath = join(dir, \"memory.db\");\n\tconst canaryStorage = await MemoryStorage.create(canaryPath);\n\tcanaryStorage.close();\n\tconst originalCanary = readFileSync(canaryPath);\n\tsymlinkSync(canaryPath, dbPath);\n\n\tconst storage = await MemoryStorage.create(dbPath);\n\tstorage.upsertThreads([{\n\t\tthreadId: \"thread-1\",\n\t\tfilePath: join(dir, \"thread.jsonl\"),\n\t\tfileSize: 1,\n\t\tfileMtime: 1,\n\t\tcwd: dir,\n\t}]);\n\tstorage.close();\n\n\tassert.deepEqual(readFileSync(canaryPath), originalCanary);\n\tassert.equal(lstatSync(dbPath).isSymbolicLink(), false, \"atomic snapshot write should replace the symlink\");\n});\n"]}
|
|
@@ -130,4 +130,29 @@ describe("#3616 — newSession() restores narrowed tool set when cwd unchanged",
|
|
|
130
130
|
"cwd-changed branch must rebuild with includeAllExtensionTools: true",
|
|
131
131
|
);
|
|
132
132
|
});
|
|
133
|
+
|
|
134
|
+
it("uses explicit workspaceRoot option instead of process.cwd() when rebuilding runtime", async () => {
|
|
135
|
+
const session = await createSession();
|
|
136
|
+
const explicitWorkspaceRoot = mkdtempSync(join(testDir, "explicit-workspace-"));
|
|
137
|
+
(session as any)._cwd = process.cwd();
|
|
138
|
+
|
|
139
|
+
let buildRuntimeCalled = false;
|
|
140
|
+
let capturedBuildOptions: { includeAllExtensionTools?: boolean } | undefined;
|
|
141
|
+
const originalBuild = (session as any)._buildRuntime.bind(session);
|
|
142
|
+
(session as any)._buildRuntime = (options?: { includeAllExtensionTools?: boolean }) => {
|
|
143
|
+
buildRuntimeCalled = true;
|
|
144
|
+
capturedBuildOptions = options;
|
|
145
|
+
return originalBuild(options);
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const ok = await session.newSession({ workspaceRoot: explicitWorkspaceRoot });
|
|
149
|
+
assert.equal(ok, true);
|
|
150
|
+
assert.equal((session as any)._cwd, explicitWorkspaceRoot);
|
|
151
|
+
assert.ok(buildRuntimeCalled, "explicit workspace root differing from prior root must rebuild runtime");
|
|
152
|
+
assert.strictEqual(
|
|
153
|
+
capturedBuildOptions?.includeAllExtensionTools,
|
|
154
|
+
true,
|
|
155
|
+
"explicit workspaceRoot rebuild must pass includeAllExtensionTools: true",
|
|
156
|
+
);
|
|
157
|
+
});
|
|
133
158
|
});
|
|
@@ -305,6 +305,8 @@ export class AgentSession {
|
|
|
305
305
|
|
|
306
306
|
// Base system prompt (without extension appends) - used to apply fresh appends each turn
|
|
307
307
|
private _baseSystemPrompt = "";
|
|
308
|
+
// Optional prompt-only skill catalog filter. Skills remain loaded and invocable by name.
|
|
309
|
+
private _visibleSkillNames: Set<string> | undefined = undefined;
|
|
308
310
|
|
|
309
311
|
constructor(config: AgentSessionConfig) {
|
|
310
312
|
this.agent = config.agent;
|
|
@@ -867,6 +869,25 @@ export class AgentSession {
|
|
|
867
869
|
this.agent.setSystemPrompt(this._baseSystemPrompt);
|
|
868
870
|
}
|
|
869
871
|
|
|
872
|
+
/**
|
|
873
|
+
* Set or clear a prompt-only filter for the <available_skills> catalog.
|
|
874
|
+
*
|
|
875
|
+
* This does not unload skills or disable the Skill tool. It only controls
|
|
876
|
+
* which loaded skills are advertised in the system prompt on rebuild.
|
|
877
|
+
*/
|
|
878
|
+
setVisibleSkillsByName(skillNames: string[] | undefined): void {
|
|
879
|
+
this._visibleSkillNames = skillNames === undefined
|
|
880
|
+
? undefined
|
|
881
|
+
: new Set(skillNames.map((name) => name.trim().toLowerCase()).filter(Boolean));
|
|
882
|
+
this._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());
|
|
883
|
+
this.agent.setSystemPrompt(this._baseSystemPrompt);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/** Get the current prompt-only skill catalog filter, if one is active. */
|
|
887
|
+
getVisibleSkillNames(): string[] | undefined {
|
|
888
|
+
return this._visibleSkillNames ? [...this._visibleSkillNames] : undefined;
|
|
889
|
+
}
|
|
890
|
+
|
|
870
891
|
/** Whether compaction or branch summarization is currently running */
|
|
871
892
|
get isCompacting(): boolean {
|
|
872
893
|
return this._compactionOrchestrator.isCompacting;
|
|
@@ -1045,6 +1066,9 @@ export class AgentSession {
|
|
|
1045
1066
|
return buildSystemPrompt({
|
|
1046
1067
|
cwd: this._cwd,
|
|
1047
1068
|
skills: loadedSkills,
|
|
1069
|
+
skillFilter: this._visibleSkillNames
|
|
1070
|
+
? (skill) => this._visibleSkillNames!.has(skill.name.trim().toLowerCase())
|
|
1071
|
+
: undefined,
|
|
1048
1072
|
contextFiles: loadedContextFiles,
|
|
1049
1073
|
customPrompt: loaderSystemPrompt,
|
|
1050
1074
|
appendSystemPrompt,
|
|
@@ -1645,6 +1669,8 @@ export class AgentSession {
|
|
|
1645
1669
|
async newSession(options?: {
|
|
1646
1670
|
parentSession?: string;
|
|
1647
1671
|
setup?: (sessionManager: SessionManager) => Promise<void>;
|
|
1672
|
+
/** Explicit workspace root for the new session/tool runtime. */
|
|
1673
|
+
workspaceRoot?: string;
|
|
1648
1674
|
/** See ExtensionCommandContext.newSession for docs (#3731). */
|
|
1649
1675
|
abortSignal?: AbortSignal;
|
|
1650
1676
|
}): Promise<boolean> {
|
|
@@ -1666,10 +1692,10 @@ export class AgentSession {
|
|
|
1666
1692
|
try {
|
|
1667
1693
|
await this._settleCurrentTurnForSessionTransition();
|
|
1668
1694
|
|
|
1669
|
-
// #3731: If the caller aborted (e.g. runUnit() timed out
|
|
1670
|
-
//
|
|
1671
|
-
//
|
|
1672
|
-
//
|
|
1695
|
+
// #3731: If the caller aborted (e.g. runUnit() timed out while the
|
|
1696
|
+
// worktree was being torn down), discard this session before rebuilding
|
|
1697
|
+
// the tool runtime. Without this check, the late newSession() could
|
|
1698
|
+
// rebuild tools with a stale workspace root.
|
|
1673
1699
|
if (options?.abortSignal?.aborted) {
|
|
1674
1700
|
return false;
|
|
1675
1701
|
}
|
|
@@ -1679,15 +1705,18 @@ export class AgentSession {
|
|
|
1679
1705
|
} finally {
|
|
1680
1706
|
this._sessionSwitchPending = false;
|
|
1681
1707
|
}
|
|
1682
|
-
// Update
|
|
1683
|
-
//
|
|
1708
|
+
// Update the workspace root for the new tool runtime. Auto-mode passes
|
|
1709
|
+
// this explicitly so session routing does not depend on global
|
|
1710
|
+
// process.cwd() after worktree merge/teardown. Other callers keep the
|
|
1711
|
+
// historical default.
|
|
1684
1712
|
const previousCwd = this._cwd;
|
|
1685
|
-
this._cwd = process.cwd();
|
|
1713
|
+
this._cwd = options?.workspaceRoot ?? process.cwd();
|
|
1686
1714
|
this.sessionManager.newSession({ parentSession: options?.parentSession });
|
|
1687
1715
|
this.agent.sessionId = this.sessionManager.getSessionId();
|
|
1688
1716
|
this._steeringMessages = [];
|
|
1689
1717
|
this._followUpMessages = [];
|
|
1690
1718
|
this._pendingNextTurnMessages = [];
|
|
1719
|
+
this._visibleSkillNames = undefined;
|
|
1691
1720
|
|
|
1692
1721
|
this.sessionManager.appendThinkingLevelChange(this.thinkingLevel);
|
|
1693
1722
|
|
|
@@ -2185,6 +2214,8 @@ export class AgentSession {
|
|
|
2185
2214
|
getActiveTools: () => this.getActiveToolNames(),
|
|
2186
2215
|
getAllTools: () => this.getAllTools(),
|
|
2187
2216
|
setActiveTools: (toolNames) => this.setActiveToolsByName(toolNames),
|
|
2217
|
+
getVisibleSkills: () => this.getVisibleSkillNames(),
|
|
2218
|
+
setVisibleSkills: (skillNames) => this.setVisibleSkillsByName(skillNames),
|
|
2188
2219
|
refreshTools: () => this._refreshToolRegistry(),
|
|
2189
2220
|
getCommands,
|
|
2190
2221
|
setModel: async (model, options) => {
|
|
@@ -2353,6 +2384,7 @@ export class AgentSession {
|
|
|
2353
2384
|
this.settingsManager.reload();
|
|
2354
2385
|
resetApiProviders();
|
|
2355
2386
|
await this._resourceLoader.reload();
|
|
2387
|
+
this._visibleSkillNames = undefined;
|
|
2356
2388
|
this._buildRuntime({
|
|
2357
2389
|
activeToolNames: this.getActiveToolNames(),
|
|
2358
2390
|
flagValues: previousFlagValues,
|
|
@@ -2542,6 +2574,7 @@ export class AgentSession {
|
|
|
2542
2574
|
this._steeringMessages = [];
|
|
2543
2575
|
this._followUpMessages = [];
|
|
2544
2576
|
this._pendingNextTurnMessages = [];
|
|
2577
|
+
this._visibleSkillNames = undefined;
|
|
2545
2578
|
|
|
2546
2579
|
// Set new session
|
|
2547
2580
|
this.sessionManager.setSessionFile(sessionPath);
|
|
@@ -1049,7 +1049,9 @@ test("chat-controller rolls up only contiguous low-signal tool runs on message_e
|
|
|
1049
1049
|
assert.equal(host.chatContainer.children[1]?.constructor?.name, "AssistantMessageComponent");
|
|
1050
1050
|
assert.equal(host.chatContainer.children[2]?.constructor?.name, "ToolPhaseSummaryComponent");
|
|
1051
1051
|
assert.match(host.chatContainer.children[0].render(120).join("\n"), /Setup \/ shell 2 actions/);
|
|
1052
|
-
|
|
1052
|
+
const readSummary = host.chatContainer.children[2].render(120).join("\n");
|
|
1053
|
+
assert.match(readSummary, /Context reads · 2 files/);
|
|
1054
|
+
assert.match(readSummary, /\/tmp\/a · \/tmp\/b/);
|
|
1053
1055
|
assert.equal(host.chatContainer._prevRender, null, "summary reposition must invalidate the chat container render cache");
|
|
1054
1056
|
});
|
|
1055
1057
|
|
|
@@ -415,6 +415,8 @@ export function createExtensionRuntime(): ExtensionRuntime {
|
|
|
415
415
|
getActiveTools: notInitialized,
|
|
416
416
|
getAllTools: notInitialized,
|
|
417
417
|
setActiveTools: notInitialized,
|
|
418
|
+
getVisibleSkills: notInitialized,
|
|
419
|
+
setVisibleSkills: notInitialized,
|
|
418
420
|
// registerTool() is valid during extension load; refresh is only needed post-bind.
|
|
419
421
|
refreshTools: () => {},
|
|
420
422
|
getCommands: notInitialized,
|
|
@@ -566,6 +568,14 @@ function createExtensionAPI(
|
|
|
566
568
|
runtime.setActiveTools(toolNames);
|
|
567
569
|
},
|
|
568
570
|
|
|
571
|
+
getVisibleSkills(): string[] | undefined {
|
|
572
|
+
return runtime.getVisibleSkills();
|
|
573
|
+
},
|
|
574
|
+
|
|
575
|
+
setVisibleSkills(skillNames: string[] | undefined): void {
|
|
576
|
+
runtime.setVisibleSkills(skillNames);
|
|
577
|
+
},
|
|
578
|
+
|
|
569
579
|
getCommands() {
|
|
570
580
|
return runtime.getCommands();
|
|
571
581
|
},
|
|
@@ -160,7 +160,7 @@ describe("ExtensionRunner.emitToolCall", () => {
|
|
|
160
160
|
});
|
|
161
161
|
|
|
162
162
|
describe("ExtensionRunner.createContext", () => {
|
|
163
|
-
it("uses the
|
|
163
|
+
it("uses the constructor workspace root instead of ambient process cwd", (t) => {
|
|
164
164
|
const originalCwd = process.cwd();
|
|
165
165
|
const dir = mkdtempSync(join(tmpdir(), "runner-test-"));
|
|
166
166
|
const projectDir = join(dir, "project");
|
|
@@ -179,8 +179,8 @@ describe("ExtensionRunner.createContext", () => {
|
|
|
179
179
|
const realProjectDir = realpathSync(projectDir);
|
|
180
180
|
process.chdir(realProjectDir);
|
|
181
181
|
|
|
182
|
-
assert.equal(runner.createContext().cwd,
|
|
183
|
-
assert.equal(runner.createCommandContext().cwd,
|
|
182
|
+
assert.equal(runner.createContext().cwd, originalCwd);
|
|
183
|
+
assert.equal(runner.createCommandContext().cwd, originalCwd);
|
|
184
184
|
});
|
|
185
185
|
|
|
186
186
|
it("does not let lifecycle event handlers close the TUI", async (t) => {
|
|
@@ -173,6 +173,8 @@ export type ExtensionErrorListener = (error: ExtensionError) => void;
|
|
|
173
173
|
export type NewSessionHandler = (options?: {
|
|
174
174
|
parentSession?: string;
|
|
175
175
|
setup?: (sessionManager: SessionManager) => Promise<void>;
|
|
176
|
+
/** Explicit workspace root for the new session/tool runtime. */
|
|
177
|
+
workspaceRoot?: string;
|
|
176
178
|
/** See ExtensionCommandContext.newSession for docs (#3731). */
|
|
177
179
|
abortSignal?: AbortSignal;
|
|
178
180
|
}) => Promise<{ cancelled: boolean }>;
|
|
@@ -275,11 +277,7 @@ export class ExtensionRunner {
|
|
|
275
277
|
}
|
|
276
278
|
|
|
277
279
|
private currentCwd(): string {
|
|
278
|
-
|
|
279
|
-
return process.cwd();
|
|
280
|
-
} catch {
|
|
281
|
-
return this.cwd;
|
|
282
|
-
}
|
|
280
|
+
return this.cwd;
|
|
283
281
|
}
|
|
284
282
|
|
|
285
283
|
/**
|
|
@@ -414,6 +412,8 @@ export class ExtensionRunner {
|
|
|
414
412
|
this.runtime.getActiveTools = actions.getActiveTools;
|
|
415
413
|
this.runtime.getAllTools = actions.getAllTools;
|
|
416
414
|
this.runtime.setActiveTools = actions.setActiveTools;
|
|
415
|
+
this.runtime.getVisibleSkills = actions.getVisibleSkills;
|
|
416
|
+
this.runtime.setVisibleSkills = actions.setVisibleSkills;
|
|
417
417
|
this.runtime.refreshTools = actions.refreshTools;
|
|
418
418
|
this.runtime.getCommands = actions.getCommands;
|
|
419
419
|
this.runtime.setModel = actions.setModel;
|
|
@@ -69,6 +69,7 @@ import type {
|
|
|
69
69
|
LsToolInput,
|
|
70
70
|
ReadToolDetails,
|
|
71
71
|
ReadToolInput,
|
|
72
|
+
WriteToolDetails,
|
|
72
73
|
WriteToolInput,
|
|
73
74
|
} from "../tools/index.js";
|
|
74
75
|
|
|
@@ -309,10 +310,13 @@ export interface ExtensionCommandContext extends ExtensionContext {
|
|
|
309
310
|
newSession(options?: {
|
|
310
311
|
parentSession?: string;
|
|
311
312
|
setup?: (sessionManager: SessionManager) => Promise<void>;
|
|
313
|
+
/** Explicit workspace root for the new session/tool runtime.
|
|
314
|
+
* When omitted, newSession() captures process.cwd() for backwards compatibility. */
|
|
315
|
+
workspaceRoot?: string;
|
|
312
316
|
/** When aborted before the session is fully configured, newSession() returns
|
|
313
317
|
* early without rebuilding the tool runtime. Used by runUnit() to discard
|
|
314
318
|
* a late-resolving newSession() after the session-creation timeout fires,
|
|
315
|
-
* preventing the tool runtime from being rebuilt with
|
|
319
|
+
* preventing the tool runtime from being rebuilt with a stale workspace root (#3731). */
|
|
316
320
|
abortSignal?: AbortSignal;
|
|
317
321
|
}): Promise<{ cancelled: boolean }>;
|
|
318
322
|
|
|
@@ -848,6 +852,13 @@ export interface BeforeModelSelectResult {
|
|
|
848
852
|
modelId: string;
|
|
849
853
|
}
|
|
850
854
|
|
|
855
|
+
export interface AdjustToolSetRequestCustomMessage {
|
|
856
|
+
/** Index in the post-transform AgentMessage context. */
|
|
857
|
+
index: number;
|
|
858
|
+
/** Custom message type only; prompt/content text is intentionally omitted. */
|
|
859
|
+
customType: string;
|
|
860
|
+
}
|
|
861
|
+
|
|
851
862
|
/**
|
|
852
863
|
* Fired after model selection to allow extensions to adjust the active tool set (ADR-005 Phase 4).
|
|
853
864
|
* Extensions can add, remove, or reorder tools based on the selected model's provider capabilities.
|
|
@@ -864,6 +875,12 @@ export interface AdjustToolSetEvent {
|
|
|
864
875
|
activeToolNames: string[];
|
|
865
876
|
/** Tools already filtered by provider compatibility */
|
|
866
877
|
filteredTools: string[];
|
|
878
|
+
/**
|
|
879
|
+
* Custom message metadata in the current request tail, measured from the
|
|
880
|
+
* latest assistant message. This is metadata-only so extensions can scope
|
|
881
|
+
* queued custom-message turns without seeing raw prompt content.
|
|
882
|
+
*/
|
|
883
|
+
requestCustomMessages?: AdjustToolSetRequestCustomMessage[];
|
|
867
884
|
}
|
|
868
885
|
|
|
869
886
|
/** Result from adjust_tool_set event handler. Return { toolNames } to override tool set. */
|
|
@@ -1015,7 +1032,7 @@ export interface EditToolResultEvent extends ToolResultEventBase {
|
|
|
1015
1032
|
|
|
1016
1033
|
export interface WriteToolResultEvent extends ToolResultEventBase {
|
|
1017
1034
|
toolName: "write";
|
|
1018
|
-
details: undefined;
|
|
1035
|
+
details: WriteToolDetails | undefined;
|
|
1019
1036
|
}
|
|
1020
1037
|
|
|
1021
1038
|
export interface GrepToolResultEvent extends ToolResultEventBase {
|
|
@@ -1486,6 +1503,20 @@ export interface ExtensionAPI {
|
|
|
1486
1503
|
/** Set the active tools by name. */
|
|
1487
1504
|
setActiveTools(toolNames: string[]): void;
|
|
1488
1505
|
|
|
1506
|
+
/**
|
|
1507
|
+
* Get the prompt-only skill catalog filter, if one is active.
|
|
1508
|
+
* Undefined means all loaded skills remain visible in <available_skills>.
|
|
1509
|
+
*/
|
|
1510
|
+
getVisibleSkills(): string[] | undefined;
|
|
1511
|
+
|
|
1512
|
+
/**
|
|
1513
|
+
* Set or clear the prompt-only skill catalog filter.
|
|
1514
|
+
*
|
|
1515
|
+
* This changes which loaded skills are advertised in <available_skills>;
|
|
1516
|
+
* it does not unload skills or disable the Skill tool.
|
|
1517
|
+
*/
|
|
1518
|
+
setVisibleSkills(skillNames: string[] | undefined): void;
|
|
1519
|
+
|
|
1489
1520
|
/** Get available slash commands in the current session. */
|
|
1490
1521
|
getCommands(): SlashCommandInfo[];
|
|
1491
1522
|
|
|
@@ -1727,6 +1758,8 @@ export interface ExtensionActions {
|
|
|
1727
1758
|
getActiveTools: () => string[];
|
|
1728
1759
|
getAllTools: () => ToolInfo[];
|
|
1729
1760
|
setActiveTools: (toolNames: string[]) => void;
|
|
1761
|
+
getVisibleSkills: () => string[] | undefined;
|
|
1762
|
+
setVisibleSkills: (skillNames: string[] | undefined) => void;
|
|
1730
1763
|
refreshTools: () => void;
|
|
1731
1764
|
getCommands: () => SlashCommandInfo[];
|
|
1732
1765
|
setModel: (model: Model<any>, options?: { persist?: boolean }) => Promise<boolean>;
|
|
@@ -1759,6 +1792,8 @@ export interface ExtensionCommandContextActions {
|
|
|
1759
1792
|
newSession: (options?: {
|
|
1760
1793
|
parentSession?: string;
|
|
1761
1794
|
setup?: (sessionManager: SessionManager) => Promise<void>;
|
|
1795
|
+
/** See ExtensionCommandContext.newSession for docs. */
|
|
1796
|
+
workspaceRoot?: string;
|
|
1762
1797
|
/** See ExtensionCommandContext.newSession for docs (#3731). */
|
|
1763
1798
|
abortSignal?: AbortSignal;
|
|
1764
1799
|
}) => Promise<{ cancelled: boolean }>;
|
|
@@ -38,6 +38,8 @@ function stubRuntime(): ExtensionRuntime {
|
|
|
38
38
|
getActiveTools: () => [],
|
|
39
39
|
getAllTools: () => [],
|
|
40
40
|
setActiveTools: () => {},
|
|
41
|
+
getVisibleSkills: () => undefined,
|
|
42
|
+
setVisibleSkills: () => {},
|
|
41
43
|
refreshTools: () => {},
|
|
42
44
|
getCommands: () => [],
|
|
43
45
|
setModel: async () => false,
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Tests final provider request-time tool compatibility filtering.
|
|
3
|
+
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
import { Type } from "@sinclair/typebox";
|
|
7
|
+
import type { AgentTool } from "@gsd/pi-agent-core";
|
|
8
|
+
import { filterToolsForProviderRequest, getAdjustToolSetRequestCustomMessages } from "./sdk.js";
|
|
9
|
+
import { registerToolCompatibility, resetToolCompatibilityRegistry } from "./tools/tool-compatibility-registry.js";
|
|
10
|
+
|
|
11
|
+
function tool(name: string): AgentTool {
|
|
12
|
+
return {
|
|
13
|
+
name,
|
|
14
|
+
label: name,
|
|
15
|
+
description: name,
|
|
16
|
+
parameters: Type.Object({}),
|
|
17
|
+
execute: async () => ({ content: [], details: undefined }),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
test("filterToolsForProviderRequest removes provider-incompatible tools", () => {
|
|
22
|
+
resetToolCompatibilityRegistry();
|
|
23
|
+
try {
|
|
24
|
+
registerToolCompatibility("image_result_tool", { producesImages: true });
|
|
25
|
+
registerToolCompatibility("complex_schema_tool", { schemaFeatures: ["patternProperties"] });
|
|
26
|
+
|
|
27
|
+
const result = filterToolsForProviderRequest(
|
|
28
|
+
[tool("bash"), tool("image_result_tool"), tool("complex_schema_tool")],
|
|
29
|
+
{ api: "google-generative-ai", provider: "google" },
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
assert.deepEqual(result.compatible.map((entry) => entry.name), ["bash", "image_result_tool"]);
|
|
33
|
+
assert.deepEqual(result.filtered.map((entry) => entry.name), ["complex_schema_tool"]);
|
|
34
|
+
} finally {
|
|
35
|
+
resetToolCompatibilityRegistry();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("filterToolsForProviderRequest enforces provider-specific hard caps at send time", () => {
|
|
40
|
+
const result = filterToolsForProviderRequest(
|
|
41
|
+
Array.from({ length: 130 }, (_, index) => tool(`tool_${index}`)),
|
|
42
|
+
{ api: "openai-completions", provider: "groq" },
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
assert.equal(result.compatible.length, 128);
|
|
46
|
+
assert.deepEqual(result.filtered.map((entry) => entry.name), ["tool_128", "tool_129"]);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("getAdjustToolSetRequestCustomMessages only reports custom messages in the current request tail", () => {
|
|
50
|
+
const messages = [
|
|
51
|
+
{ role: "custom", customType: "gsd-run", content: "old workflow", display: false, timestamp: 1 },
|
|
52
|
+
{ role: "assistant", content: [{ type: "text", text: "done" }], timestamp: 2 },
|
|
53
|
+
{ role: "user", content: [{ type: "text", text: "normal prompt" }], timestamp: 3 },
|
|
54
|
+
{ role: "custom", customType: "gsd-doctor-heal", content: "current workflow", display: false, timestamp: 4 },
|
|
55
|
+
] as any[];
|
|
56
|
+
|
|
57
|
+
assert.deepEqual(getAdjustToolSetRequestCustomMessages(messages), [
|
|
58
|
+
{ index: 3, customType: "gsd-doctor-heal" },
|
|
59
|
+
]);
|
|
60
|
+
});
|
|
@@ -38,8 +38,53 @@ export function canRestoreSessionModel(
|
|
|
38
38
|
): boolean {
|
|
39
39
|
return modelRegistry.isProviderRequestReady(model.provider);
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
|
|
42
|
+
const PROVIDER_TOOL_LIMITS: Record<string, number> = {
|
|
43
|
+
groq: 128,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
function resolveProviderToolLimit(
|
|
47
|
+
providerCaps: ReturnType<typeof getProviderCapabilities>,
|
|
48
|
+
provider: string | undefined,
|
|
49
|
+
): number {
|
|
50
|
+
if (provider && PROVIDER_TOOL_LIMITS[provider]) {
|
|
51
|
+
return PROVIDER_TOOL_LIMITS[provider];
|
|
52
|
+
}
|
|
53
|
+
return providerCaps.maxTools > 0 ? providerCaps.maxTools : 0;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function filterToolsForProviderRequest(
|
|
57
|
+
tools: AgentTool[],
|
|
58
|
+
model: Pick<Model<any>, "api" | "provider">,
|
|
59
|
+
): { compatible: AgentTool[]; filtered: AgentTool[] } {
|
|
60
|
+
const providerCaps = getProviderCapabilities(model.api);
|
|
61
|
+
if (!providerCaps.toolCalling) {
|
|
62
|
+
return { compatible: [], filtered: tools };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const compatible: AgentTool[] = [];
|
|
66
|
+
const filtered: AgentTool[] = [];
|
|
67
|
+
for (const tool of tools) {
|
|
68
|
+
const compat = getToolCompatibility(tool.name);
|
|
69
|
+
if (
|
|
70
|
+
(compat?.producesImages && !providerCaps.imageToolResults) ||
|
|
71
|
+
compat?.schemaFeatures?.some((feature) => providerCaps.unsupportedSchemaFeatures.includes(feature))
|
|
72
|
+
) {
|
|
73
|
+
filtered.push(tool);
|
|
74
|
+
} else {
|
|
75
|
+
compatible.push(tool);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const toolLimit = resolveProviderToolLimit(providerCaps, model.provider);
|
|
80
|
+
if (toolLimit > 0 && compatible.length > toolLimit) {
|
|
81
|
+
filtered.push(...compatible.splice(toolLimit));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return { compatible, filtered };
|
|
85
|
+
}
|
|
86
|
+
import { Agent, maybeLogProviderPayloadAudit, type AgentMessage, type AgentTool, type ThinkingLevel } from "@gsd/pi-agent-core";
|
|
87
|
+
import { getProviderCapabilities, type Message, type Model } from "@gsd/pi-ai";
|
|
43
88
|
import { getAgentDir, getDocsPath } from "../config.js";
|
|
44
89
|
import { AgentSession } from "./agent-session.js";
|
|
45
90
|
import { AuthStorage } from "./auth-storage.js";
|
|
@@ -82,6 +127,22 @@ import {
|
|
|
82
127
|
type ToolName,
|
|
83
128
|
writeTool,
|
|
84
129
|
} from "./tools/index.js";
|
|
130
|
+
import { getToolCompatibility } from "./tools/tool-compatibility-registry.js";
|
|
131
|
+
|
|
132
|
+
export function getAdjustToolSetRequestCustomMessages(
|
|
133
|
+
messages: readonly AgentMessage[] | undefined,
|
|
134
|
+
): Array<{ index: number; customType: string }> {
|
|
135
|
+
if (!messages) return [];
|
|
136
|
+
const requestMessages: Array<{ index: number; customType: string }> = [];
|
|
137
|
+
for (let index = messages.length - 1; index >= 0; index--) {
|
|
138
|
+
const message = messages[index] as { role?: unknown; customType?: unknown };
|
|
139
|
+
if (message?.role === "assistant") break;
|
|
140
|
+
if (message?.role === "custom" && typeof message.customType === "string") {
|
|
141
|
+
requestMessages.push({ index, customType: message.customType });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return requestMessages.reverse();
|
|
145
|
+
}
|
|
85
146
|
|
|
86
147
|
export interface CreateAgentSessionOptions {
|
|
87
148
|
/** Working directory for project-local discovery. Default: process.cwd() */
|
|
@@ -390,9 +451,12 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
390
451
|
onPayload: async (payload, currentModel) => {
|
|
391
452
|
const runner = extensionRunnerRef.current;
|
|
392
453
|
if (!runner?.hasHandlers("before_provider_request")) {
|
|
454
|
+
maybeLogProviderPayloadAudit(payload, "before_provider_request:unchanged");
|
|
393
455
|
return payload;
|
|
394
456
|
}
|
|
395
|
-
|
|
457
|
+
const nextPayload = await runner.emitBeforeProviderRequest(payload, currentModel);
|
|
458
|
+
maybeLogProviderPayloadAudit(nextPayload, "before_provider_request:after");
|
|
459
|
+
return nextPayload;
|
|
396
460
|
},
|
|
397
461
|
sessionId: sessionManager.getSessionId(),
|
|
398
462
|
transformContext: async (messages) => {
|
|
@@ -400,6 +464,24 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
400
464
|
if (!runner) return messages;
|
|
401
465
|
return runner.emitContext(messages);
|
|
402
466
|
},
|
|
467
|
+
filterTools: async (tools, _signal, messages) => {
|
|
468
|
+
const currentModel = agent.state.activeInferenceModel ?? agent.state.model ?? model;
|
|
469
|
+
if (!currentModel) return tools;
|
|
470
|
+
const providerFiltered = filterToolsForProviderRequest(tools, currentModel);
|
|
471
|
+
const runner = extensionRunnerRef.current;
|
|
472
|
+
if (!runner?.hasHandlers("adjust_tool_set")) return providerFiltered.compatible;
|
|
473
|
+
const result = await runner.emitAdjustToolSet({
|
|
474
|
+
selectedModelApi: currentModel.api,
|
|
475
|
+
selectedModelProvider: currentModel.provider,
|
|
476
|
+
selectedModelId: currentModel.id,
|
|
477
|
+
activeToolNames: providerFiltered.compatible.map((tool) => tool.name),
|
|
478
|
+
filteredTools: providerFiltered.filtered.map((tool) => tool.name),
|
|
479
|
+
requestCustomMessages: getAdjustToolSetRequestCustomMessages(messages),
|
|
480
|
+
});
|
|
481
|
+
if (!result?.toolNames) return providerFiltered.compatible;
|
|
482
|
+
const allowedNames = new Set(result.toolNames);
|
|
483
|
+
return providerFiltered.compatible.filter((tool) => allowedNames.has(tool.name));
|
|
484
|
+
},
|
|
403
485
|
steeringMode: settingsManager.getSteeringMode(),
|
|
404
486
|
followUpMode: settingsManager.getFollowUpMode(),
|
|
405
487
|
transport: settingsManager.getTransport(),
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Tests skill invocation and prompt-only skill visibility behavior.
|
|
3
|
+
|
|
1
4
|
import assert from "node:assert/strict";
|
|
2
5
|
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
6
|
import { tmpdir } from "node:os";
|
|
@@ -86,4 +89,29 @@ describe("Skill tool", () => {
|
|
|
86
89
|
assert.match(message, /^Skill "nonexistent" not found\. Available skills: /);
|
|
87
90
|
assert.match(message, /swift-testing/);
|
|
88
91
|
});
|
|
92
|
+
|
|
93
|
+
it("filters skill catalog without unloading skills or disabling Skill tool", async () => {
|
|
94
|
+
writeSkill(testDir, "alpha", "Use alpha.");
|
|
95
|
+
writeSkill(testDir, "beta", "Use beta.");
|
|
96
|
+
const session = await createSession();
|
|
97
|
+
|
|
98
|
+
assert.match(session.systemPrompt, /<name>alpha<\/name>/);
|
|
99
|
+
assert.match(session.systemPrompt, /<name>beta<\/name>/);
|
|
100
|
+
|
|
101
|
+
session.setVisibleSkillsByName(["alpha"]);
|
|
102
|
+
assert.deepEqual(session.getVisibleSkillNames(), ["alpha"]);
|
|
103
|
+
assert.match(session.systemPrompt, /<name>alpha<\/name>/);
|
|
104
|
+
assert.doesNotMatch(session.systemPrompt, /<name>beta<\/name>/);
|
|
105
|
+
|
|
106
|
+
const tool = session.state.tools.find((entry) => entry.name === "Skill");
|
|
107
|
+
assert.ok(tool, "Skill tool should remain active");
|
|
108
|
+
const result = await tool.execute("call-3", { skill: "beta" });
|
|
109
|
+
const text = result.content[0]?.type === "text" ? result.content[0].text : "";
|
|
110
|
+
assert.match(text, /<skill name="beta"/);
|
|
111
|
+
|
|
112
|
+
session.setVisibleSkillsByName(undefined);
|
|
113
|
+
assert.equal(session.getVisibleSkillNames(), undefined);
|
|
114
|
+
assert.match(session.systemPrompt, /<name>alpha<\/name>/);
|
|
115
|
+
assert.match(session.systemPrompt, /<name>beta<\/name>/);
|
|
116
|
+
});
|
|
89
117
|
});
|
|
@@ -59,13 +59,12 @@ export interface BuildSystemPromptOptions {
|
|
|
59
59
|
* Append a `Current date and time: <toLocaleString>` line to the system
|
|
60
60
|
* prompt. Default: `false`.
|
|
61
61
|
*
|
|
62
|
-
*
|
|
63
|
-
* Embedding a per-call timestamp in the system prompt invalidates
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* and inject it via a non-cached channel (user message) when possible.
|
|
62
|
+
* Provider prompt caches generally depend on stable prompt prefixes.
|
|
63
|
+
* Embedding a per-call timestamp in the system prompt invalidates that
|
|
64
|
+
* stability on every request, often forcing full prompt reprocessing.
|
|
65
|
+
* Most agentic flows do not need wall-clock awareness in the system
|
|
66
|
+
* prompt — opt in only when the consumer genuinely needs it, and inject
|
|
67
|
+
* it via a non-cached channel (user message) when possible.
|
|
69
68
|
*/
|
|
70
69
|
includeDateTime?: boolean;
|
|
71
70
|
}
|
|
@@ -86,9 +85,8 @@ export function buildSystemPrompt(options: BuildSystemPromptOptions = {}): strin
|
|
|
86
85
|
} = options;
|
|
87
86
|
const resolvedCwd = toPosixPath(cwd ?? process.cwd());
|
|
88
87
|
|
|
89
|
-
// Per-call timestamps invalidate
|
|
90
|
-
//
|
|
91
|
-
// when explicitly opted in via `includeDateTime`.
|
|
88
|
+
// Per-call timestamps invalidate provider prompt cache stability. Compute
|
|
89
|
+
// lazily and only when explicitly opted in via `includeDateTime`.
|
|
92
90
|
const dateTimeLine = includeDateTime
|
|
93
91
|
? `\nCurrent date and time: ${new Date().toLocaleString("en-US", {
|
|
94
92
|
weekday: "long",
|