gsd-pi 2.80.0-dev.96f4d89d5 → 2.80.0-dev.a947d025c
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 +35 -59
- 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/GSD-WORKFLOW.md +2 -2
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
- package/dist/resources/extensions/gsd/auto/loop.js +103 -9
- package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
- package/dist/resources/extensions/gsd/auto/phases.js +311 -154
- package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
- package/dist/resources/extensions/gsd/auto/session.js +9 -1
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -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-dashboard.js +18 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +122 -88
- package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
- package/dist/resources/extensions/gsd/auto-start.js +254 -17
- package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
- package/dist/resources/extensions/gsd/auto.js +273 -87
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
- 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 +30 -20
- 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 +341 -55
- 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/bootstrap/write-gate.js +147 -2
- package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
- package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
- 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-extract-learnings.js +17 -12
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/context-budget.js +37 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
- package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
- package/dist/resources/extensions/gsd/detection.js +106 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +73 -5
- package/dist/resources/extensions/gsd/gsd-db.js +146 -13
- package/dist/resources/extensions/gsd/guided-flow.js +149 -48
- package/dist/resources/extensions/gsd/health-widget.js +3 -0
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/memory-store.js +69 -12
- package/dist/resources/extensions/gsd/migrate/command.js +40 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
- 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/planning-path-scope.js +26 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
- 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/parallel-research-slices.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/quick.js +34 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -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/state-reconciliation.js +27 -0
- package/dist/resources/extensions/gsd/tool-contract.js +50 -0
- 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/tools/context-mode-tool-result.js +15 -0
- package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
- package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
- 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 +14 -14
- 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 +14 -14
- 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 +6 -4
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -17
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
- package/packages/mcp-server/src/workflow-tools.ts +30 -16
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/tsconfig.tsbuildinfo +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 +9 -2
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +43 -11
- 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 +31 -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 +52 -11
- 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 +26 -10
- 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/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.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/types.ts +3 -0
- 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-abort-order.test.js +36 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
- 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 +21 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
- 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 +78 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
- 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 +5 -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 +20 -7
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -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 +60 -4
- 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 +81 -4
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.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__/chat-frame-compaction-tone.test.js +6 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
- 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/adaptive-layout.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
- 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 +18 -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 +225 -16
- 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 +85 -2
- 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 +71 -0
- 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 +25 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
- package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
- package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -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 +92 -4
- package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
- 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__/chat-frame-compaction-tone.test.ts +7 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +18 -8
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/tui.ts +20 -8
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +7 -0
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +36 -27
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/src/resources/GSD-WORKFLOW.md +2 -2
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -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/contracts.ts +19 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -11
- package/src/resources/extensions/gsd/auto/loop.ts +134 -16
- package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
- package/src/resources/extensions/gsd/auto/phases.ts +427 -220
- package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
- package/src/resources/extensions/gsd/auto/session.ts +9 -1
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -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-dashboard.ts +20 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +134 -90
- package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
- package/src/resources/extensions/gsd/auto-start.ts +326 -25
- package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
- package/src/resources/extensions/gsd/auto.ts +336 -89
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
- 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 +32 -19
- 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 +396 -55
- 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/bootstrap/write-gate.ts +153 -2
- package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
- package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
- 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-extract-learnings.ts +17 -12
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/context-budget.ts +44 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
- package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
- package/src/resources/extensions/gsd/detection.ts +128 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +87 -10
- package/src/resources/extensions/gsd/gsd-db.ts +168 -13
- package/src/resources/extensions/gsd/guided-flow.ts +175 -55
- package/src/resources/extensions/gsd/health-widget.ts +3 -0
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/memory-store.ts +77 -12
- package/src/resources/extensions/gsd/migrate/command.ts +47 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
- 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/planning-path-scope.ts +35 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
- 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/parallel-research-slices.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/quick.ts +37 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -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/state-reconciliation.ts +57 -0
- 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 +544 -41
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
- 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 +175 -11
- 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-recovery.test.ts +184 -2
- 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 +142 -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 +97 -2
- 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/commands-extract-learnings.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
- 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-budget.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
- 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/db-schema-metadata.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
- 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/dispatch-rule-coverage.test.ts +313 -0
- 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/exec-history.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
- 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 +151 -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/gsd-db.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
- 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 +66 -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 +248 -10
- 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-decay-factor.test.ts +90 -0
- 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 +37 -7
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -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 +44 -9
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -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 +95 -75
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
- 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-path-audit.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
- 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-external-gsd.test.ts +40 -0
- 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/right-sized-workflow-prompts.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
- 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 +222 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
- 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 -59
- 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/stalled-tool-recovery.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
- 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/tui-header-lifecycle.test.ts +210 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
- 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-tool-executors.test.ts +3 -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 +38 -6
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
- 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 +373 -76
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tool-contract.ts +82 -0
- 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/tools/context-mode-tool-result.ts +25 -0
- package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
- package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
- package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
- package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
- 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/resources/extensions/gsd/worktree-resolver.js +0 -733
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
- /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_ssgManifest.js +0 -0
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type {
|
|
12
|
+
AgentAbortOrigin,
|
|
12
13
|
AgentMessage,
|
|
13
14
|
AgentToolResult,
|
|
14
15
|
AgentToolUpdateCallback,
|
|
@@ -69,6 +70,7 @@ import type {
|
|
|
69
70
|
LsToolInput,
|
|
70
71
|
ReadToolDetails,
|
|
71
72
|
ReadToolInput,
|
|
73
|
+
WriteToolDetails,
|
|
72
74
|
WriteToolInput,
|
|
73
75
|
} from "../tools/index.js";
|
|
74
76
|
|
|
@@ -289,6 +291,12 @@ export interface ExtensionContext {
|
|
|
289
291
|
compact(options?: CompactOptions): void;
|
|
290
292
|
/** Get the current effective system prompt. */
|
|
291
293
|
getSystemPrompt(): string;
|
|
294
|
+
/**
|
|
295
|
+
* Set or clear an in-memory compaction threshold-percent override (0 < value < 1).
|
|
296
|
+
* Pass `undefined` to clear. The override is not persisted; host integrations
|
|
297
|
+
* are expected to re-apply on each session_start.
|
|
298
|
+
*/
|
|
299
|
+
setCompactionThresholdOverride(percent: number | undefined): void;
|
|
292
300
|
}
|
|
293
301
|
|
|
294
302
|
/**
|
|
@@ -303,10 +311,13 @@ export interface ExtensionCommandContext extends ExtensionContext {
|
|
|
303
311
|
newSession(options?: {
|
|
304
312
|
parentSession?: string;
|
|
305
313
|
setup?: (sessionManager: SessionManager) => Promise<void>;
|
|
314
|
+
/** Explicit workspace root for the new session/tool runtime.
|
|
315
|
+
* When omitted, newSession() captures process.cwd() for backwards compatibility. */
|
|
316
|
+
workspaceRoot?: string;
|
|
306
317
|
/** When aborted before the session is fully configured, newSession() returns
|
|
307
318
|
* early without rebuilding the tool runtime. Used by runUnit() to discard
|
|
308
319
|
* a late-resolving newSession() after the session-creation timeout fires,
|
|
309
|
-
* preventing the tool runtime from being rebuilt with
|
|
320
|
+
* preventing the tool runtime from being rebuilt with a stale workspace root (#3731). */
|
|
310
321
|
abortSignal?: AbortSignal;
|
|
311
322
|
}): Promise<{ cancelled: boolean }>;
|
|
312
323
|
|
|
@@ -551,12 +562,17 @@ export interface BeforeAgentStartEvent {
|
|
|
551
562
|
/** Fired when an agent loop starts */
|
|
552
563
|
export interface AgentStartEvent {
|
|
553
564
|
type: "agent_start";
|
|
565
|
+
sessionId?: string;
|
|
566
|
+
turnId?: string;
|
|
554
567
|
}
|
|
555
568
|
|
|
556
569
|
/** Fired when an agent loop ends */
|
|
557
570
|
export interface AgentEndEvent {
|
|
558
571
|
type: "agent_end";
|
|
559
572
|
messages: AgentMessage[];
|
|
573
|
+
sessionId?: string;
|
|
574
|
+
turnId?: string;
|
|
575
|
+
abortOrigin?: AgentAbortOrigin;
|
|
560
576
|
}
|
|
561
577
|
|
|
562
578
|
/**
|
|
@@ -568,6 +584,9 @@ export interface StopEvent {
|
|
|
568
584
|
type: "stop";
|
|
569
585
|
reason: "completed" | "cancelled" | "error" | "blocked";
|
|
570
586
|
lastMessage?: AgentMessage;
|
|
587
|
+
sessionId?: string;
|
|
588
|
+
turnId?: string;
|
|
589
|
+
abortOrigin?: AgentAbortOrigin;
|
|
571
590
|
}
|
|
572
591
|
|
|
573
592
|
/**
|
|
@@ -757,6 +776,8 @@ export interface TurnStartEvent {
|
|
|
757
776
|
type: "turn_start";
|
|
758
777
|
turnIndex: number;
|
|
759
778
|
timestamp: number;
|
|
779
|
+
sessionId?: string;
|
|
780
|
+
turnId?: string;
|
|
760
781
|
}
|
|
761
782
|
|
|
762
783
|
/** Fired at the end of each turn */
|
|
@@ -765,12 +786,16 @@ export interface TurnEndEvent {
|
|
|
765
786
|
turnIndex: number;
|
|
766
787
|
message: AgentMessage;
|
|
767
788
|
toolResults: ToolResultMessage[];
|
|
789
|
+
sessionId?: string;
|
|
790
|
+
turnId?: string;
|
|
768
791
|
}
|
|
769
792
|
|
|
770
793
|
/** Fired when a message starts (user, assistant, or toolResult) */
|
|
771
794
|
export interface MessageStartEvent {
|
|
772
795
|
type: "message_start";
|
|
773
796
|
message: AgentMessage;
|
|
797
|
+
sessionId?: string;
|
|
798
|
+
turnId?: string;
|
|
774
799
|
}
|
|
775
800
|
|
|
776
801
|
/** Fired during assistant message streaming with token-by-token updates */
|
|
@@ -778,12 +803,16 @@ export interface MessageUpdateEvent {
|
|
|
778
803
|
type: "message_update";
|
|
779
804
|
message: AgentMessage;
|
|
780
805
|
assistantMessageEvent: AssistantMessageEvent;
|
|
806
|
+
sessionId?: string;
|
|
807
|
+
turnId?: string;
|
|
781
808
|
}
|
|
782
809
|
|
|
783
810
|
/** Fired when a message ends */
|
|
784
811
|
export interface MessageEndEvent {
|
|
785
812
|
type: "message_end";
|
|
786
813
|
message: AgentMessage;
|
|
814
|
+
sessionId?: string;
|
|
815
|
+
turnId?: string;
|
|
787
816
|
}
|
|
788
817
|
|
|
789
818
|
/** Fired when a tool starts executing */
|
|
@@ -842,6 +871,13 @@ export interface BeforeModelSelectResult {
|
|
|
842
871
|
modelId: string;
|
|
843
872
|
}
|
|
844
873
|
|
|
874
|
+
export interface AdjustToolSetRequestCustomMessage {
|
|
875
|
+
/** Index in the post-transform AgentMessage context. */
|
|
876
|
+
index: number;
|
|
877
|
+
/** Custom message type only; prompt/content text is intentionally omitted. */
|
|
878
|
+
customType: string;
|
|
879
|
+
}
|
|
880
|
+
|
|
845
881
|
/**
|
|
846
882
|
* Fired after model selection to allow extensions to adjust the active tool set (ADR-005 Phase 4).
|
|
847
883
|
* Extensions can add, remove, or reorder tools based on the selected model's provider capabilities.
|
|
@@ -858,6 +894,12 @@ export interface AdjustToolSetEvent {
|
|
|
858
894
|
activeToolNames: string[];
|
|
859
895
|
/** Tools already filtered by provider compatibility */
|
|
860
896
|
filteredTools: string[];
|
|
897
|
+
/**
|
|
898
|
+
* Custom message metadata in the current request tail, measured from the
|
|
899
|
+
* latest assistant message. This is metadata-only so extensions can scope
|
|
900
|
+
* queued custom-message turns without seeing raw prompt content.
|
|
901
|
+
*/
|
|
902
|
+
requestCustomMessages?: AdjustToolSetRequestCustomMessage[];
|
|
861
903
|
}
|
|
862
904
|
|
|
863
905
|
/** Result from adjust_tool_set event handler. Return { toolNames } to override tool set. */
|
|
@@ -1009,7 +1051,7 @@ export interface EditToolResultEvent extends ToolResultEventBase {
|
|
|
1009
1051
|
|
|
1010
1052
|
export interface WriteToolResultEvent extends ToolResultEventBase {
|
|
1011
1053
|
toolName: "write";
|
|
1012
|
-
details: undefined;
|
|
1054
|
+
details: WriteToolDetails | undefined;
|
|
1013
1055
|
}
|
|
1014
1056
|
|
|
1015
1057
|
export interface GrepToolResultEvent extends ToolResultEventBase {
|
|
@@ -1480,6 +1522,20 @@ export interface ExtensionAPI {
|
|
|
1480
1522
|
/** Set the active tools by name. */
|
|
1481
1523
|
setActiveTools(toolNames: string[]): void;
|
|
1482
1524
|
|
|
1525
|
+
/**
|
|
1526
|
+
* Get the prompt-only skill catalog filter, if one is active.
|
|
1527
|
+
* Undefined means all loaded skills remain visible in <available_skills>.
|
|
1528
|
+
*/
|
|
1529
|
+
getVisibleSkills(): string[] | undefined;
|
|
1530
|
+
|
|
1531
|
+
/**
|
|
1532
|
+
* Set or clear the prompt-only skill catalog filter.
|
|
1533
|
+
*
|
|
1534
|
+
* This changes which loaded skills are advertised in <available_skills>;
|
|
1535
|
+
* it does not unload skills or disable the Skill tool.
|
|
1536
|
+
*/
|
|
1537
|
+
setVisibleSkills(skillNames: string[] | undefined): void;
|
|
1538
|
+
|
|
1483
1539
|
/** Get available slash commands in the current session. */
|
|
1484
1540
|
getCommands(): SlashCommandInfo[];
|
|
1485
1541
|
|
|
@@ -1721,6 +1777,8 @@ export interface ExtensionActions {
|
|
|
1721
1777
|
getActiveTools: () => string[];
|
|
1722
1778
|
getAllTools: () => ToolInfo[];
|
|
1723
1779
|
setActiveTools: (toolNames: string[]) => void;
|
|
1780
|
+
getVisibleSkills: () => string[] | undefined;
|
|
1781
|
+
setVisibleSkills: (skillNames: string[] | undefined) => void;
|
|
1724
1782
|
refreshTools: () => void;
|
|
1725
1783
|
getCommands: () => SlashCommandInfo[];
|
|
1726
1784
|
setModel: (model: Model<any>, options?: { persist?: boolean }) => Promise<boolean>;
|
|
@@ -1741,6 +1799,7 @@ export interface ExtensionContextActions {
|
|
|
1741
1799
|
getContextUsage: () => ContextUsage | undefined;
|
|
1742
1800
|
compact: (options?: CompactOptions) => void;
|
|
1743
1801
|
getSystemPrompt: () => string;
|
|
1802
|
+
setCompactionThresholdOverride: (percent: number | undefined) => void;
|
|
1744
1803
|
}
|
|
1745
1804
|
|
|
1746
1805
|
/**
|
|
@@ -1752,6 +1811,8 @@ export interface ExtensionCommandContextActions {
|
|
|
1752
1811
|
newSession: (options?: {
|
|
1753
1812
|
parentSession?: string;
|
|
1754
1813
|
setup?: (sessionManager: SessionManager) => Promise<void>;
|
|
1814
|
+
/** See ExtensionCommandContext.newSession for docs. */
|
|
1815
|
+
workspaceRoot?: string;
|
|
1755
1816
|
/** See ExtensionCommandContext.newSession for docs (#3731). */
|
|
1756
1817
|
abortSignal?: AbortSignal;
|
|
1757
1818
|
}) => 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
|
+
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// GSD2 - Coding agent session factory and runtime wiring
|
|
1
2
|
import { existsSync } from "node:fs";
|
|
2
3
|
import { join } from "node:path";
|
|
3
4
|
|
|
@@ -38,8 +39,53 @@ export function canRestoreSessionModel(
|
|
|
38
39
|
): boolean {
|
|
39
40
|
return modelRegistry.isProviderRequestReady(model.provider);
|
|
40
41
|
}
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
const PROVIDER_TOOL_LIMITS: Record<string, number> = {
|
|
44
|
+
groq: 128,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
function resolveProviderToolLimit(
|
|
48
|
+
providerCaps: ReturnType<typeof getProviderCapabilities>,
|
|
49
|
+
provider: string | undefined,
|
|
50
|
+
): number {
|
|
51
|
+
if (provider && PROVIDER_TOOL_LIMITS[provider]) {
|
|
52
|
+
return PROVIDER_TOOL_LIMITS[provider];
|
|
53
|
+
}
|
|
54
|
+
return providerCaps.maxTools > 0 ? providerCaps.maxTools : 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function filterToolsForProviderRequest(
|
|
58
|
+
tools: AgentTool[],
|
|
59
|
+
model: Pick<Model<any>, "api" | "provider">,
|
|
60
|
+
): { compatible: AgentTool[]; filtered: AgentTool[] } {
|
|
61
|
+
const providerCaps = getProviderCapabilities(model.api);
|
|
62
|
+
if (!providerCaps.toolCalling) {
|
|
63
|
+
return { compatible: [], filtered: tools };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const compatible: AgentTool[] = [];
|
|
67
|
+
const filtered: AgentTool[] = [];
|
|
68
|
+
for (const tool of tools) {
|
|
69
|
+
const compat = getToolCompatibility(tool.name);
|
|
70
|
+
if (
|
|
71
|
+
(compat?.producesImages && !providerCaps.imageToolResults) ||
|
|
72
|
+
compat?.schemaFeatures?.some((feature) => providerCaps.unsupportedSchemaFeatures.includes(feature))
|
|
73
|
+
) {
|
|
74
|
+
filtered.push(tool);
|
|
75
|
+
} else {
|
|
76
|
+
compatible.push(tool);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const toolLimit = resolveProviderToolLimit(providerCaps, model.provider);
|
|
81
|
+
if (toolLimit > 0 && compatible.length > toolLimit) {
|
|
82
|
+
filtered.push(...compatible.splice(toolLimit));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return { compatible, filtered };
|
|
86
|
+
}
|
|
87
|
+
import { Agent, maybeLogProviderPayloadAudit, type AgentMessage, type AgentTool, type ThinkingLevel } from "@gsd/pi-agent-core";
|
|
88
|
+
import { getProviderCapabilities, type Message, type Model } from "@gsd/pi-ai";
|
|
43
89
|
import { getAgentDir, getDocsPath } from "../config.js";
|
|
44
90
|
import { AgentSession } from "./agent-session.js";
|
|
45
91
|
import { AuthStorage } from "./auth-storage.js";
|
|
@@ -82,6 +128,22 @@ import {
|
|
|
82
128
|
type ToolName,
|
|
83
129
|
writeTool,
|
|
84
130
|
} from "./tools/index.js";
|
|
131
|
+
import { getToolCompatibility } from "./tools/tool-compatibility-registry.js";
|
|
132
|
+
|
|
133
|
+
export function getAdjustToolSetRequestCustomMessages(
|
|
134
|
+
messages: readonly AgentMessage[] | undefined,
|
|
135
|
+
): Array<{ index: number; customType: string }> {
|
|
136
|
+
if (!messages) return [];
|
|
137
|
+
const requestMessages: Array<{ index: number; customType: string }> = [];
|
|
138
|
+
for (let index = messages.length - 1; index >= 0; index--) {
|
|
139
|
+
const message = messages[index] as { role?: unknown; customType?: unknown };
|
|
140
|
+
if (message?.role === "assistant") break;
|
|
141
|
+
if (message?.role === "custom" && typeof message.customType === "string") {
|
|
142
|
+
requestMessages.push({ index, customType: message.customType });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return requestMessages.reverse();
|
|
146
|
+
}
|
|
85
147
|
|
|
86
148
|
export interface CreateAgentSessionOptions {
|
|
87
149
|
/** Working directory for project-local discovery. Default: process.cwd() */
|
|
@@ -378,6 +440,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
378
440
|
};
|
|
379
441
|
|
|
380
442
|
const extensionRunnerRef: { current?: ExtensionRunner } = {};
|
|
443
|
+
const workspaceRootRef: { current: string } = { current: cwd };
|
|
381
444
|
|
|
382
445
|
agent = new Agent({
|
|
383
446
|
initialState: {
|
|
@@ -390,9 +453,12 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
390
453
|
onPayload: async (payload, currentModel) => {
|
|
391
454
|
const runner = extensionRunnerRef.current;
|
|
392
455
|
if (!runner?.hasHandlers("before_provider_request")) {
|
|
456
|
+
maybeLogProviderPayloadAudit(payload, "before_provider_request:unchanged");
|
|
393
457
|
return payload;
|
|
394
458
|
}
|
|
395
|
-
|
|
459
|
+
const nextPayload = await runner.emitBeforeProviderRequest(payload, currentModel);
|
|
460
|
+
maybeLogProviderPayloadAudit(nextPayload, "before_provider_request:after");
|
|
461
|
+
return nextPayload;
|
|
396
462
|
},
|
|
397
463
|
sessionId: sessionManager.getSessionId(),
|
|
398
464
|
transformContext: async (messages) => {
|
|
@@ -400,6 +466,24 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
400
466
|
if (!runner) return messages;
|
|
401
467
|
return runner.emitContext(messages);
|
|
402
468
|
},
|
|
469
|
+
filterTools: async (tools, _signal, messages) => {
|
|
470
|
+
const currentModel = agent.state.activeInferenceModel ?? agent.state.model ?? model;
|
|
471
|
+
if (!currentModel) return tools;
|
|
472
|
+
const providerFiltered = filterToolsForProviderRequest(tools, currentModel);
|
|
473
|
+
const runner = extensionRunnerRef.current;
|
|
474
|
+
if (!runner?.hasHandlers("adjust_tool_set")) return providerFiltered.compatible;
|
|
475
|
+
const result = await runner.emitAdjustToolSet({
|
|
476
|
+
selectedModelApi: currentModel.api,
|
|
477
|
+
selectedModelProvider: currentModel.provider,
|
|
478
|
+
selectedModelId: currentModel.id,
|
|
479
|
+
activeToolNames: providerFiltered.compatible.map((tool) => tool.name),
|
|
480
|
+
filteredTools: providerFiltered.filtered.map((tool) => tool.name),
|
|
481
|
+
requestCustomMessages: getAdjustToolSetRequestCustomMessages(messages),
|
|
482
|
+
});
|
|
483
|
+
if (!result?.toolNames) return providerFiltered.compatible;
|
|
484
|
+
const allowedNames = new Set(result.toolNames);
|
|
485
|
+
return providerFiltered.compatible.filter((tool) => allowedNames.has(tool.name));
|
|
486
|
+
},
|
|
403
487
|
steeringMode: settingsManager.getSteeringMode(),
|
|
404
488
|
followUpMode: settingsManager.getFollowUpMode(),
|
|
405
489
|
transport: settingsManager.getTransport(),
|
|
@@ -409,8 +493,11 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
409
493
|
getProviderOptions: async (currentModel) => {
|
|
410
494
|
if (currentModel.provider !== "claude-code") return undefined;
|
|
411
495
|
const runner = extensionRunnerRef.current;
|
|
412
|
-
if (!runner?.hasUI())
|
|
496
|
+
if (!runner?.hasUI()) {
|
|
497
|
+
return { cwd: workspaceRootRef.current };
|
|
498
|
+
}
|
|
413
499
|
return {
|
|
500
|
+
cwd: workspaceRootRef.current,
|
|
414
501
|
extensionUIContext: runner.getUIContext(),
|
|
415
502
|
};
|
|
416
503
|
},
|
|
@@ -554,6 +641,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
554
641
|
modelRegistry,
|
|
555
642
|
initialActiveToolNames,
|
|
556
643
|
extensionRunnerRef,
|
|
644
|
+
workspaceRootRef,
|
|
557
645
|
isClaudeCodeReady: options.isClaudeCodeReady,
|
|
558
646
|
});
|
|
559
647
|
const extensionsResult = resourceLoader.getExtensions();
|
|
@@ -15,6 +15,13 @@ export interface CompactionSettings {
|
|
|
15
15
|
enabled?: boolean; // default: true
|
|
16
16
|
reserveTokens?: number; // default: 16384
|
|
17
17
|
keepRecentTokens?: number; // default: 20000
|
|
18
|
+
/**
|
|
19
|
+
* Optional percent-of-context-window trigger (0 < value < 1). When set,
|
|
20
|
+
* compaction fires at `contextWindow * thresholdPercent` and overrides
|
|
21
|
+
* `reserveTokens`. Typically set as a runtime override by host integrations
|
|
22
|
+
* (see `setCompactionThresholdOverride`) and not persisted by users directly.
|
|
23
|
+
*/
|
|
24
|
+
thresholdPercent?: number;
|
|
18
25
|
}
|
|
19
26
|
|
|
20
27
|
export interface BranchSummarySettings {
|
|
@@ -812,11 +819,42 @@ export class SettingsManager {
|
|
|
812
819
|
return this.settings.compaction?.keepRecentTokens ?? COMPACTION_KEEP_RECENT_TOKENS;
|
|
813
820
|
}
|
|
814
821
|
|
|
815
|
-
|
|
822
|
+
getCompactionThresholdPercent(): number | undefined {
|
|
823
|
+
return this.settings.compaction?.thresholdPercent;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* Set or clear an in-memory compaction threshold-percent override.
|
|
828
|
+
*
|
|
829
|
+
* Applied to `this.settings` only; never persisted to disk. Pass `undefined`
|
|
830
|
+
* to clear a previously set override (necessary for idempotent re-sync from
|
|
831
|
+
* host integrations whose preference may have been removed).
|
|
832
|
+
*
|
|
833
|
+
* Direct mutation is used instead of `applyOverrides()` because deep-merge
|
|
834
|
+
* semantics skip `undefined` values, which would prevent clearing.
|
|
835
|
+
*/
|
|
836
|
+
setCompactionThresholdOverride(percent: number | undefined): void {
|
|
837
|
+
if (!this.settings.compaction) {
|
|
838
|
+
this.settings.compaction = {};
|
|
839
|
+
}
|
|
840
|
+
if (percent === undefined) {
|
|
841
|
+
delete this.settings.compaction.thresholdPercent;
|
|
842
|
+
} else {
|
|
843
|
+
this.settings.compaction.thresholdPercent = percent;
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
getCompactionSettings(): {
|
|
848
|
+
enabled: boolean;
|
|
849
|
+
reserveTokens: number;
|
|
850
|
+
keepRecentTokens: number;
|
|
851
|
+
thresholdPercent?: number;
|
|
852
|
+
} {
|
|
816
853
|
return {
|
|
817
854
|
enabled: this.getCompactionEnabled(),
|
|
818
855
|
reserveTokens: this.getCompactionReserveTokens(),
|
|
819
856
|
keepRecentTokens: this.getCompactionKeepRecentTokens(),
|
|
857
|
+
thresholdPercent: this.getCompactionThresholdPercent(),
|
|
820
858
|
};
|
|
821
859
|
}
|
|
822
860
|
|
|
@@ -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",
|
|
@@ -19,76 +19,32 @@
|
|
|
19
19
|
import test from "node:test";
|
|
20
20
|
import assert from "node:assert/strict";
|
|
21
21
|
import { spawn } from "node:child_process";
|
|
22
|
+
import { createBashTool } from "./bash.js";
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"packages/pi-coding-agent/src/core/tools/bash.ts",
|
|
35
|
-
"packages/pi-coding-agent/src/core/bash-executor.ts",
|
|
36
|
-
"packages/pi-coding-agent/src/utils/shell.ts",
|
|
37
|
-
];
|
|
38
|
-
const candidates = [
|
|
39
|
-
resolve(__dirname, "../../../../../"),
|
|
40
|
-
resolve(__dirname, "../../../../../../"),
|
|
41
|
-
];
|
|
42
|
-
for (const candidate of candidates) {
|
|
43
|
-
if (requiredFiles.every((file) => existsSync(join(candidate, file)))) {
|
|
44
|
-
return candidate;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
throw new Error(`Unable to resolve repository root from ${__dirname}`);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const REPO_ROOT = findRepoRoot();
|
|
51
|
-
|
|
52
|
-
const SPAWN_FILES = [
|
|
53
|
-
join(REPO_ROOT, "packages/pi-coding-agent/src/core/tools/bash.ts"),
|
|
54
|
-
join(REPO_ROOT, "packages/pi-coding-agent/src/core/bash-executor.ts"),
|
|
55
|
-
join(REPO_ROOT, "packages/pi-coding-agent/src/utils/shell.ts"),
|
|
56
|
-
];
|
|
57
|
-
|
|
58
|
-
test("spawn calls use platform-guarded detached flag (no unconditional detached: true)", () => {
|
|
59
|
-
for (const file of SPAWN_FILES) {
|
|
60
|
-
const content = readFileSync(file, "utf-8");
|
|
61
|
-
const lines = content.split("\n");
|
|
62
|
-
|
|
63
|
-
for (let i = 0; i < lines.length; i++) {
|
|
64
|
-
const line = lines[i]!;
|
|
65
|
-
// Skip comments
|
|
66
|
-
if (line.trim().startsWith("//") || line.trim().startsWith("*")) continue;
|
|
67
|
-
// Check for unconditional `detached: true`
|
|
68
|
-
if (/detached:\s*true\b/.test(line)) {
|
|
69
|
-
assert.fail(
|
|
70
|
-
`${file}:${i + 1} has unconditional 'detached: true' — ` +
|
|
71
|
-
`must use 'detached: process.platform !== "win32"' ` +
|
|
72
|
-
`to prevent EINVAL on Windows (ConPTY / VSCode terminal)`,
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
});
|
|
24
|
+
test("bash tool delegates command execution through operations without forcing process detachment", async () => {
|
|
25
|
+
const calls: Array<{ command: string; cwd: string; env?: NodeJS.ProcessEnv }> = [];
|
|
26
|
+
const tool = createBashTool(process.cwd(), {
|
|
27
|
+
operations: {
|
|
28
|
+
async exec(command, cwd, options) {
|
|
29
|
+
calls.push({ command, cwd, env: options.env });
|
|
30
|
+
options.onData(Buffer.from("ok\n"));
|
|
31
|
+
return { exitCode: 0 };
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
});
|
|
78
35
|
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
const content = readFileSync(shellFile, "utf-8");
|
|
36
|
+
const result = await tool.execute("tool-call", { command: "echo ok" });
|
|
37
|
+
const firstContent = result.content[0];
|
|
82
38
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
assert.ok(
|
|
87
|
-
!/detached:\s*true/.test(taskkillRegion[0]),
|
|
88
|
-
"taskkill spawn should not use detached: true — " +
|
|
89
|
-
"it can cause EINVAL on Windows and is unnecessary for a utility process",
|
|
90
|
-
);
|
|
39
|
+
assert.ok(firstContent);
|
|
40
|
+
if (firstContent.type !== "text") {
|
|
41
|
+
assert.fail(`Expected text content, got ${firstContent.type}`);
|
|
91
42
|
}
|
|
43
|
+
assert.equal(firstContent.text, "ok\n");
|
|
44
|
+
assert.deepEqual(calls.map((call) => ({ command: call.command, cwd: call.cwd })), [
|
|
45
|
+
{ command: "echo ok", cwd: process.cwd() },
|
|
46
|
+
]);
|
|
47
|
+
assert.ok(calls[0]?.env, "default bash context should provide an execution environment");
|
|
92
48
|
});
|
|
93
49
|
|
|
94
50
|
// Smoke test: spawn with platform-guarded detached flag actually works
|
|
@@ -116,6 +116,7 @@ const bashSchema = Type.Object({
|
|
|
116
116
|
export type BashToolInput = Static<typeof bashSchema>;
|
|
117
117
|
|
|
118
118
|
export interface BashToolDetails {
|
|
119
|
+
cwd?: string;
|
|
119
120
|
truncation?: TruncationResult;
|
|
120
121
|
fullOutputPath?: string;
|
|
121
122
|
artifactId?: string;
|
|
@@ -384,6 +385,7 @@ export function createBashTool(cwd: string, options?: BashToolOptions): AgentToo
|
|
|
384
385
|
onUpdate({
|
|
385
386
|
content: [{ type: "text", text: truncation.content || "" }],
|
|
386
387
|
details: {
|
|
388
|
+
cwd: spawnContext.cwd,
|
|
387
389
|
truncation: truncation.truncated ? truncation : undefined,
|
|
388
390
|
fullOutputPath: spillFilePath,
|
|
389
391
|
},
|
|
@@ -412,10 +414,11 @@ export function createBashTool(cwd: string, options?: BashToolOptions): AgentToo
|
|
|
412
414
|
let outputText = truncation.content || "(no output)";
|
|
413
415
|
|
|
414
416
|
// Build details with truncation info
|
|
415
|
-
let details: BashToolDetails | undefined;
|
|
417
|
+
let details: BashToolDetails | undefined = { cwd: spawnContext.cwd };
|
|
416
418
|
|
|
417
419
|
if (truncation.truncated) {
|
|
418
420
|
details = {
|
|
421
|
+
...details,
|
|
419
422
|
truncation,
|
|
420
423
|
fullOutputPath: spillFilePath,
|
|
421
424
|
...(spillArtifactId ? { artifactId: spillArtifactId } : {}),
|