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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: System prompt and hidden context bootstrap for GSD sessions.
|
|
1
3
|
import { existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
2
4
|
import { join } from "node:path";
|
|
3
5
|
|
|
@@ -21,6 +23,11 @@ import { toPosixPath } from "../../shared/mod.js";
|
|
|
21
23
|
import { autoEnableCmuxPreferences } from "../commands-cmux.js";
|
|
22
24
|
import { gsdHome } from "../gsd-home.js";
|
|
23
25
|
|
|
26
|
+
const DEFAULT_CONTEXT_MESSAGE_MAX_CHARS = 4_000;
|
|
27
|
+
const DEFAULT_KNOWLEDGE_MAX_CHARS = 12_000;
|
|
28
|
+
const DEFAULT_CODEBASE_MAX_CHARS = 8_000;
|
|
29
|
+
const MIN_CONTEXT_MESSAGE_MAX_CHARS = 1_000;
|
|
30
|
+
const MIN_KNOWLEDGE_MAX_CHARS = 1_000;
|
|
24
31
|
|
|
25
32
|
/**
|
|
26
33
|
* Bundled skill triggers — resolved dynamically at runtime instead of
|
|
@@ -158,8 +165,6 @@ export async function buildBeforeAgentStartResult(
|
|
|
158
165
|
logWarning("bootstrap", `decisions backfill failed: ${(e as Error).message}`);
|
|
159
166
|
}
|
|
160
167
|
|
|
161
|
-
const memoryBlock = await loadMemoryBlock(event.prompt ?? "");
|
|
162
|
-
|
|
163
168
|
let newSkillsBlock = "";
|
|
164
169
|
if (hasSkillSnapshot()) {
|
|
165
170
|
const newSkills = detectNewSkills();
|
|
@@ -190,11 +195,10 @@ export async function buildBeforeAgentStartResult(
|
|
|
190
195
|
if (rawContent) {
|
|
191
196
|
// Cap injection size to ~2 000 tokens to avoid bloating every request.
|
|
192
197
|
// Full map is always available at .gsd/CODEBASE.md.
|
|
193
|
-
const MAX_CODEBASE_CHARS = 8_000;
|
|
194
198
|
const generatedMatch = rawContent.match(/Generated: (\S+)/);
|
|
195
199
|
const generatedAt = generatedMatch?.[1] ?? "unknown";
|
|
196
|
-
const content = rawContent.length >
|
|
197
|
-
? rawContent.slice(0,
|
|
200
|
+
const content = rawContent.length > DEFAULT_CODEBASE_MAX_CHARS
|
|
201
|
+
? rawContent.slice(0, DEFAULT_CODEBASE_MAX_CHARS) + "\n\n*(truncated — see .gsd/CODEBASE.md for full map)*"
|
|
198
202
|
: rawContent;
|
|
199
203
|
codebaseBlock = `\n\n[PROJECT CODEBASE — File structure and descriptions (generated ${generatedAt}, auto-refreshed when GSD detects tracked file changes; use /gsd codebase stats for status)]\n\n${content}`;
|
|
200
204
|
}
|
|
@@ -206,6 +210,9 @@ export async function buildBeforeAgentStartResult(
|
|
|
206
210
|
warnDeprecatedAgentInstructions();
|
|
207
211
|
|
|
208
212
|
const injection = await buildGuidedExecuteContextInjection(event.prompt, process.cwd());
|
|
213
|
+
const memoryBlock = await loadMemoryBlock(event.prompt ?? "", {
|
|
214
|
+
includePromptRelevant: !(injection && isLowEntropyResumePrompt(event.prompt ?? "")),
|
|
215
|
+
});
|
|
209
216
|
|
|
210
217
|
// Re-inject forensics context on follow-up turns (#2941)
|
|
211
218
|
const forensicsInjection = !injection ? buildForensicsContextInjection(process.cwd(), event.prompt) : null;
|
|
@@ -218,12 +225,9 @@ export async function buildBeforeAgentStartResult(
|
|
|
218
225
|
: "";
|
|
219
226
|
|
|
220
227
|
// memoryBlock is FTS-queried against the user prompt and changes per call.
|
|
221
|
-
//
|
|
222
|
-
//
|
|
223
|
-
//
|
|
224
|
-
// memoryBlock injected via the context message may itself be cached up to
|
|
225
|
-
// that boundary; that's orthogonal and unchanged from prior behavior. The
|
|
226
|
-
// load-bearing win here is preserving the system+tools cache hit. (#5019)
|
|
228
|
+
// Keeping it out of `fullSystem` preserves provider prompt-cache stability
|
|
229
|
+
// for the static system/tool prefix. The dynamic memory block rides the
|
|
230
|
+
// volatile context message instead. (#5019)
|
|
227
231
|
const fullSystem = `${event.systemPrompt}\n\n[SYSTEM CONTEXT — GSD]\n\n${systemContent}${preferenceBlock}${knowledgeBlock}${codebaseBlock}${newSkillsBlock}${worktreeBlock}${subagentModelBlock}`;
|
|
228
232
|
|
|
229
233
|
stopContextTimer({
|
|
@@ -255,21 +259,55 @@ export function buildContextMessage(opts: {
|
|
|
255
259
|
injection: string | null;
|
|
256
260
|
forensicsInjection: string | null;
|
|
257
261
|
}): { customType: string; content: string; display: false } | null {
|
|
258
|
-
const
|
|
262
|
+
const contextCharLimit = getContextMessageCharLimit();
|
|
263
|
+
const memoryContent = markMemoryContextSupplied(opts.memoryBlock.trim());
|
|
259
264
|
if (opts.injection) {
|
|
260
|
-
const content =
|
|
265
|
+
const content = limitContextMessageContent(
|
|
266
|
+
memoryContent ? `${memoryContent}\n\n${opts.injection}` : opts.injection,
|
|
267
|
+
contextCharLimit,
|
|
268
|
+
);
|
|
261
269
|
return { customType: "gsd-guided-context", content, display: false as const };
|
|
262
270
|
}
|
|
263
271
|
if (opts.forensicsInjection) {
|
|
264
|
-
const content =
|
|
272
|
+
const content = limitContextMessageContent(
|
|
273
|
+
memoryContent ? `${memoryContent}\n\n${opts.forensicsInjection}` : opts.forensicsInjection,
|
|
274
|
+
contextCharLimit,
|
|
275
|
+
);
|
|
265
276
|
return { customType: "gsd-forensics", content, display: false as const };
|
|
266
277
|
}
|
|
267
278
|
if (memoryContent) {
|
|
268
|
-
return {
|
|
279
|
+
return {
|
|
280
|
+
customType: "gsd-memory",
|
|
281
|
+
content: limitContextMessageContent(memoryContent, contextCharLimit),
|
|
282
|
+
display: false as const,
|
|
283
|
+
};
|
|
269
284
|
}
|
|
270
285
|
return null;
|
|
271
286
|
}
|
|
272
287
|
|
|
288
|
+
function getContextMessageCharLimit(): number | null {
|
|
289
|
+
const raw = process.env.PI_GSD_CONTEXT_MAX_CHARS;
|
|
290
|
+
if (!raw) return DEFAULT_CONTEXT_MESSAGE_MAX_CHARS;
|
|
291
|
+
if (raw === "0") return null;
|
|
292
|
+
const parsed = Number(raw);
|
|
293
|
+
if (!Number.isFinite(parsed) || parsed < MIN_CONTEXT_MESSAGE_MAX_CHARS) {
|
|
294
|
+
return DEFAULT_CONTEXT_MESSAGE_MAX_CHARS;
|
|
295
|
+
}
|
|
296
|
+
return Math.floor(parsed);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
function limitContextMessageContent(content: string, limit: number | null): string {
|
|
300
|
+
if (!limit || content.length <= limit) return content;
|
|
301
|
+
const suffix = "\n\n[GSD Context Truncated]\nFull context is available from the referenced .gsd files and tools; read on demand only if this excerpt lacks required evidence.";
|
|
302
|
+
const headBudget = Math.max(0, limit - suffix.length);
|
|
303
|
+
return `${content.slice(0, headBudget).trimEnd()}${suffix}`;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function markMemoryContextSupplied(memoryContent: string): string {
|
|
307
|
+
if (!memoryContent) return "";
|
|
308
|
+
return `[GSD Context Metadata]\n- Memory supplied: yes\n\n${memoryContent}`;
|
|
309
|
+
}
|
|
310
|
+
|
|
273
311
|
/**
|
|
274
312
|
* ADR-013 step 4 — auto-injection parity for the memories table.
|
|
275
313
|
*
|
|
@@ -288,7 +326,10 @@ export function buildContextMessage(opts: {
|
|
|
288
326
|
* with a token-budget cap. Failures degrade gracefully — the function never
|
|
289
327
|
* throws and returns "" so the system prompt construction continues.
|
|
290
328
|
*/
|
|
291
|
-
export async function loadMemoryBlock(
|
|
329
|
+
export async function loadMemoryBlock(
|
|
330
|
+
userPrompt: string,
|
|
331
|
+
opts: { includePromptRelevant?: boolean } = {},
|
|
332
|
+
): Promise<string> {
|
|
292
333
|
try {
|
|
293
334
|
const { formatMemoriesForPrompt, getActiveMemoriesRanked, queryMemoriesRanked } = await import("../memory-store.js");
|
|
294
335
|
|
|
@@ -310,7 +351,7 @@ export async function loadMemoryBlock(userPrompt: string): Promise<string> {
|
|
|
310
351
|
|
|
311
352
|
let relevant: typeof allRanked = [];
|
|
312
353
|
const trimmed = userPrompt.trim();
|
|
313
|
-
if (trimmed) {
|
|
354
|
+
if (trimmed && opts.includePromptRelevant !== false) {
|
|
314
355
|
const hits = queryMemoriesRanked({ query: trimmed, k: QUERY_K });
|
|
315
356
|
relevant = hits.map((h) => h.memory).filter((m) => !criticalIds.has(m.id));
|
|
316
357
|
}
|
|
@@ -362,14 +403,37 @@ export function loadKnowledgeBlock(gsdHomeDir: string, cwd: string): { block: st
|
|
|
362
403
|
}
|
|
363
404
|
|
|
364
405
|
const parts: string[] = [];
|
|
365
|
-
if (globalKnowledge)
|
|
366
|
-
|
|
406
|
+
if (globalKnowledge) {
|
|
407
|
+
parts.push(`## Global Knowledge\nSource: \`${globalKnowledgePath}\`\n\n${globalKnowledge}`);
|
|
408
|
+
}
|
|
409
|
+
if (projectKnowledge) {
|
|
410
|
+
parts.push(`## Project Knowledge\nSource: \`${knowledgePath}\`\n\n${projectKnowledge}`);
|
|
411
|
+
}
|
|
412
|
+
const body = limitKnowledgeBlock(parts.join("\n\n"), getKnowledgeCharLimit());
|
|
367
413
|
return {
|
|
368
|
-
block: `\n\n[KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${
|
|
414
|
+
block: `\n\n[KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${body}`,
|
|
369
415
|
globalSizeKb,
|
|
370
416
|
};
|
|
371
417
|
}
|
|
372
418
|
|
|
419
|
+
function getKnowledgeCharLimit(): number | null {
|
|
420
|
+
const raw = process.env.PI_GSD_KNOWLEDGE_MAX_CHARS;
|
|
421
|
+
if (!raw) return DEFAULT_KNOWLEDGE_MAX_CHARS;
|
|
422
|
+
if (raw === "0") return null;
|
|
423
|
+
const parsed = Number(raw);
|
|
424
|
+
if (!Number.isFinite(parsed) || parsed < MIN_KNOWLEDGE_MAX_CHARS) {
|
|
425
|
+
return DEFAULT_KNOWLEDGE_MAX_CHARS;
|
|
426
|
+
}
|
|
427
|
+
return Math.floor(parsed);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
function limitKnowledgeBlock(content: string, limit: number | null): string {
|
|
431
|
+
if (!limit || content.length <= limit) return content;
|
|
432
|
+
const suffix = "\n\n[Knowledge Truncated]\nFull KNOWLEDGE.md content remains available at the source path(s) above; read on demand only if this excerpt lacks a required rule.";
|
|
433
|
+
const headBudget = Math.max(0, limit - suffix.length);
|
|
434
|
+
return `${content.slice(0, headBudget).trimEnd()}${suffix}`;
|
|
435
|
+
}
|
|
436
|
+
|
|
373
437
|
function buildWorktreeContextBlock(): string {
|
|
374
438
|
const worktreeName = getActiveWorktreeName();
|
|
375
439
|
const worktreeMainCwd = getWorktreeOriginalCwd();
|
|
@@ -423,6 +487,11 @@ function buildWorktreeContextBlock(): string {
|
|
|
423
487
|
*/
|
|
424
488
|
const RESUME_INTENT_PATTERNS = /^(continue|resume|ok|go|go ahead|proceed|keep going|carry on|next|yes|yeah|yep|sure|do it|let's go|pick up where you left off)$/;
|
|
425
489
|
|
|
490
|
+
export function isLowEntropyResumePrompt(prompt: string): boolean {
|
|
491
|
+
const trimmed = prompt.trim().toLowerCase().replace(/[.!?,]+$/g, "");
|
|
492
|
+
return RESUME_INTENT_PATTERNS.test(trimmed);
|
|
493
|
+
}
|
|
494
|
+
|
|
426
495
|
async function buildGuidedExecuteContextInjection(prompt: string, basePath: string): Promise<string | null> {
|
|
427
496
|
const ensureStateDbOpen = async () => {
|
|
428
497
|
const { ensureDbOpen } = await import("./dynamic-tools.js");
|
|
@@ -452,8 +521,7 @@ async function buildGuidedExecuteContextInjection(prompt: string, basePath: stri
|
|
|
452
521
|
// control/help/diagnostic prompts with unrelated execution context.
|
|
453
522
|
// Phase-gated: only fire during "executing" to avoid misrouting during
|
|
454
523
|
// replanning, gate evaluation, or other non-execution phases.
|
|
455
|
-
|
|
456
|
-
if (RESUME_INTENT_PATTERNS.test(trimmed)) {
|
|
524
|
+
if (isLowEntropyResumePrompt(prompt)) {
|
|
457
525
|
await ensureStateDbOpen();
|
|
458
526
|
const state = await deriveState(basePath);
|
|
459
527
|
if (state.phase === "executing" && state.activeTask && state.activeMilestone && state.activeSlice) {
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* #2909: Adds a fast-path git status check before milestone completion merges.
|
|
5
5
|
* When the working tree is dirty the user is warned and changes are auto-stashed
|
|
6
|
-
* so the merge can proceed cleanly.
|
|
7
|
-
* restores the stashed changes.
|
|
6
|
+
* so the merge can proceed cleanly. After the merge completes, postflightPopStash
|
|
7
|
+
* restores the stashed changes and reports whether manual recovery is needed.
|
|
8
8
|
*
|
|
9
9
|
* Design constraints (from Trek-e approval):
|
|
10
10
|
* - Warn the user before stashing (no silent surprises)
|
|
11
11
|
* - git stash push / git stash pop only — no custom stash management layer
|
|
12
|
-
* - Stash/pop errors are logged but MUST NOT block the merge
|
|
12
|
+
* - Stash/pop errors are logged but MUST NOT block the merge itself
|
|
13
13
|
* - Fast-path status check — clean trees pay no extra cost
|
|
14
14
|
*/
|
|
15
15
|
|
|
@@ -27,6 +27,13 @@ export interface PreflightResult {
|
|
|
27
27
|
summary: string;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
export interface PostflightResult {
|
|
31
|
+
restored: boolean;
|
|
32
|
+
needsManualRecovery: boolean;
|
|
33
|
+
message: string;
|
|
34
|
+
stashRef?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
30
37
|
function findPreflightStashRef(basePath: string, milestoneId: string, stashMarker?: string): string | null {
|
|
31
38
|
const markerPrefix = `gsd-preflight-stash:${milestoneId}:`;
|
|
32
39
|
let fallbackRef: string | null = null;
|
|
@@ -112,14 +119,15 @@ export function preflightCleanRoot(
|
|
|
112
119
|
*
|
|
113
120
|
* Only called when preflightCleanRoot returned stashPushed=true.
|
|
114
121
|
* Any pop error (e.g. conflict) is logged and notified but does NOT throw —
|
|
115
|
-
* the merge already completed successfully.
|
|
122
|
+
* the merge already completed successfully. Callers must treat
|
|
123
|
+
* needsManualRecovery=true as a dirty workspace stop, not a clean completion.
|
|
116
124
|
*/
|
|
117
125
|
export function postflightPopStash(
|
|
118
126
|
basePath: string,
|
|
119
127
|
milestoneId: string,
|
|
120
128
|
stashMarker: string | undefined,
|
|
121
129
|
notify: (message: string, level: "info" | "warning" | "error") => void,
|
|
122
|
-
):
|
|
130
|
+
): PostflightResult {
|
|
123
131
|
let stashRef: string | null = null;
|
|
124
132
|
try {
|
|
125
133
|
stashRef = findPreflightStashRef(basePath, milestoneId, stashMarker);
|
|
@@ -127,7 +135,11 @@ export function postflightPopStash(
|
|
|
127
135
|
const msg = `No matching GSD preflight stash found for milestone ${milestoneId}; leaving stash list untouched.`;
|
|
128
136
|
logWarning("preflight", msg);
|
|
129
137
|
notify(msg, "warning");
|
|
130
|
-
return
|
|
138
|
+
return {
|
|
139
|
+
restored: false,
|
|
140
|
+
needsManualRecovery: true,
|
|
141
|
+
message: msg,
|
|
142
|
+
};
|
|
131
143
|
}
|
|
132
144
|
execFileSync("git", ["stash", "pop", stashRef], {
|
|
133
145
|
cwd: basePath,
|
|
@@ -135,7 +147,14 @@ export function postflightPopStash(
|
|
|
135
147
|
encoding: "utf-8",
|
|
136
148
|
env: GIT_NO_PROMPT_ENV,
|
|
137
149
|
});
|
|
138
|
-
|
|
150
|
+
const msg = `Restored stashed changes after milestone ${milestoneId} merge.`;
|
|
151
|
+
notify(msg, "info");
|
|
152
|
+
return {
|
|
153
|
+
restored: true,
|
|
154
|
+
needsManualRecovery: false,
|
|
155
|
+
message: msg,
|
|
156
|
+
stashRef,
|
|
157
|
+
};
|
|
139
158
|
} catch (err) {
|
|
140
159
|
// Pop conflicts mean the merged code collides with the stashed changes.
|
|
141
160
|
// Log a warning — the user needs to resolve manually, but the merge succeeded.
|
|
@@ -145,5 +164,11 @@ export function postflightPopStash(
|
|
|
145
164
|
const msg = `git stash pop ${stashRef ?? ""}`.trim() + ` failed after merge of milestone ${milestoneId}: ${err instanceof Error ? err.message : String(err)}. ${restoreHint}`;
|
|
146
165
|
logWarning("preflight", msg);
|
|
147
166
|
notify(msg, "warning");
|
|
167
|
+
return {
|
|
168
|
+
restored: false,
|
|
169
|
+
needsManualRecovery: true,
|
|
170
|
+
message: msg,
|
|
171
|
+
...(stashRef ? { stashRef } : {}),
|
|
172
|
+
};
|
|
148
173
|
}
|
|
149
174
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Handles operational /gsd subcommands.
|
|
1
3
|
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
2
4
|
|
|
3
5
|
import { enableDebug } from "../../debug-logger.js";
|
|
@@ -15,7 +17,7 @@ import { handleRemote } from "../../../remote-questions/mod.js";
|
|
|
15
17
|
import { handleShip } from "../../commands-ship.js";
|
|
16
18
|
import { handleSessionReport } from "../../commands-session-report.js";
|
|
17
19
|
import { handlePrBranch } from "../../commands-pr-branch.js";
|
|
18
|
-
import { projectRoot } from "../context.js";
|
|
20
|
+
import { currentDirectoryRoot, projectRoot } from "../context.js";
|
|
19
21
|
|
|
20
22
|
export async function handleOpsCommand(trimmed: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<boolean> {
|
|
21
23
|
if (trimmed === "init") {
|
|
@@ -117,7 +119,7 @@ export async function handleOpsCommand(trimmed: string, ctx: ExtensionCommandCon
|
|
|
117
119
|
return true;
|
|
118
120
|
}
|
|
119
121
|
if (trimmed === "triage") {
|
|
120
|
-
await handleTriage(ctx, pi,
|
|
122
|
+
await handleTriage(ctx, pi, currentDirectoryRoot());
|
|
121
123
|
return true;
|
|
122
124
|
}
|
|
123
125
|
if (trimmed === "config") {
|
|
@@ -23,7 +23,7 @@ export const TOOL_KEYS = [
|
|
|
23
23
|
{ id: "groq", env: "GROQ_API_KEY", label: "Groq Voice", hint: "console.groq.com" },
|
|
24
24
|
] as const;
|
|
25
25
|
|
|
26
|
-
function getStoredToolKey(auth: AuthStorage, providerId: string): string | undefined {
|
|
26
|
+
export function getStoredToolKey(auth: AuthStorage, providerId: string): string | undefined {
|
|
27
27
|
const creds = auth.getCredentialsForProvider(providerId);
|
|
28
28
|
const cred = creds.find((c) => c.type === "api_key" && c.key);
|
|
29
29
|
return cred?.type === "api_key" ? cred.key : undefined;
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
28
28
|
|
|
29
|
-
import { existsSync } from "node:fs";
|
|
29
|
+
import { existsSync, realpathSync } from "node:fs";
|
|
30
30
|
import { open, readFile } from "node:fs/promises";
|
|
31
31
|
import { join, relative } from "node:path";
|
|
32
32
|
|
|
@@ -304,7 +304,7 @@ export async function buildEvalReviewContext(
|
|
|
304
304
|
}
|
|
305
305
|
|
|
306
306
|
const truncated = summaryRead.truncated || specTruncated;
|
|
307
|
-
const outputPath = evalReviewWritePath(state.sliceDir, state.sliceId);
|
|
307
|
+
const outputPath = evalReviewWritePath(realpathSync(state.sliceDir), state.sliceId);
|
|
308
308
|
const basePath = projectRoot();
|
|
309
309
|
const relativeOutputPath = relative(basePath, outputPath);
|
|
310
310
|
|
|
@@ -26,6 +26,15 @@ import { isAutoActive, checkRemoteAutoSession } from "./auto.js";
|
|
|
26
26
|
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
27
27
|
import { currentDirectoryRoot, projectRoot } from "./commands/context.js";
|
|
28
28
|
import { loadPrompt } from "./prompt-loader.js";
|
|
29
|
+
import {
|
|
30
|
+
buildDoctorHealIssuePayload,
|
|
31
|
+
buildDoctorHealSummary,
|
|
32
|
+
buildWorkflowDispatchContent,
|
|
33
|
+
} from "./workflow-protocol.js";
|
|
34
|
+
import {
|
|
35
|
+
restoreGsdWorkflowTools,
|
|
36
|
+
scopeGsdWorkflowToolsForDispatch,
|
|
37
|
+
} from "./bootstrap/register-hooks.js";
|
|
29
38
|
|
|
30
39
|
const UPDATE_REGISTRY_URL = "https://registry.npmjs.org/gsd-pi/latest";
|
|
31
40
|
const UPDATE_FETCH_TIMEOUT_MS = 5000;
|
|
@@ -72,18 +81,23 @@ export function dispatchDoctorHeal(pi: ExtensionAPI, scope: string | undefined,
|
|
|
72
81
|
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(gsdHome(), "agent", "GSD-WORKFLOW.md");
|
|
73
82
|
const workflow = readFileSync(workflowPath, "utf-8");
|
|
74
83
|
const prompt = loadPrompt("doctor-heal", {
|
|
75
|
-
doctorSummary: reportText,
|
|
76
|
-
structuredIssues,
|
|
84
|
+
doctorSummary: buildDoctorHealSummary(reportText),
|
|
85
|
+
structuredIssues: buildDoctorHealIssuePayload(structuredIssues),
|
|
77
86
|
scopeLabel: scope ?? "active milestone / blocking scope",
|
|
78
87
|
doctorCommandSuffix: scope ? ` ${scope}` : "",
|
|
79
88
|
});
|
|
80
89
|
|
|
81
|
-
const content =
|
|
90
|
+
const content = buildWorkflowDispatchContent({ workflow, workflowPath, task: prompt });
|
|
91
|
+
const savedTools = scopeGsdWorkflowToolsForDispatch(pi);
|
|
82
92
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
93
|
+
try {
|
|
94
|
+
pi.sendMessage(
|
|
95
|
+
{ customType: "gsd-doctor-heal", content, display: false },
|
|
96
|
+
{ triggerTurn: true },
|
|
97
|
+
);
|
|
98
|
+
} finally {
|
|
99
|
+
restoreGsdWorkflowTools(pi, savedTools);
|
|
100
|
+
}
|
|
87
101
|
}
|
|
88
102
|
|
|
89
103
|
/** Parse doctor command args into structured flags and positionals (pure, no I/O). */
|
|
@@ -258,15 +272,20 @@ export async function handleTriage(ctx: ExtensionCommandContext, pi: ExtensionAP
|
|
|
258
272
|
|
|
259
273
|
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(gsdHome(), "agent", "GSD-WORKFLOW.md");
|
|
260
274
|
const workflow = readFileSync(workflowPath, "utf-8");
|
|
275
|
+
const savedTools = scopeGsdWorkflowToolsForDispatch(pi);
|
|
261
276
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
277
|
+
try {
|
|
278
|
+
pi.sendMessage(
|
|
279
|
+
{
|
|
280
|
+
customType: "gsd-triage",
|
|
281
|
+
content: buildWorkflowDispatchContent({ workflow, workflowPath, task: prompt }),
|
|
282
|
+
display: false,
|
|
283
|
+
},
|
|
284
|
+
{ triggerTurn: true },
|
|
285
|
+
);
|
|
286
|
+
} finally {
|
|
287
|
+
restoreGsdWorkflowTools(pi, savedTools);
|
|
288
|
+
}
|
|
270
289
|
}
|
|
271
290
|
|
|
272
291
|
export async function handleSteer(change: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<void> {
|
|
@@ -29,7 +29,7 @@ import { computeProgressScore, formatProgressLine } from "./progress-score.js";
|
|
|
29
29
|
import { runEnvironmentChecks, type EnvironmentCheckResult } from "./doctor-environment.js";
|
|
30
30
|
import { formattedShortcutPair } from "./shortcut-defs.js";
|
|
31
31
|
|
|
32
|
-
function unitLabel(type: string): string {
|
|
32
|
+
export function unitLabel(type: string): string {
|
|
33
33
|
switch (type) {
|
|
34
34
|
case "discuss-milestone":
|
|
35
35
|
case "discuss-slice": return "Discuss";
|
|
@@ -98,6 +98,70 @@ function isAlreadyActiveConstraintError(err: unknown): boolean {
|
|
|
98
98
|
return /\bUNIQUE\b|\bconstraint failed\b/i.test(msg);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
+
function settleStaleActiveDispatchForUnit(input: RecordClaimInput, now: string): void {
|
|
102
|
+
const db = _getAdapter()!;
|
|
103
|
+
const active = db.prepare(
|
|
104
|
+
`SELECT id, status, worker_id, milestone_lease_token
|
|
105
|
+
FROM unit_dispatches
|
|
106
|
+
WHERE unit_id = :unit_id
|
|
107
|
+
AND status IN ('claimed','running')
|
|
108
|
+
ORDER BY id DESC
|
|
109
|
+
LIMIT 1`,
|
|
110
|
+
).get({ ":unit_id": input.unitId }) as
|
|
111
|
+
| { id: number; status: DispatchStatus; worker_id: string; milestone_lease_token: number }
|
|
112
|
+
| undefined;
|
|
113
|
+
|
|
114
|
+
if (!active) return;
|
|
115
|
+
if (
|
|
116
|
+
active.worker_id === input.workerId &&
|
|
117
|
+
active.milestone_lease_token === input.milestoneLeaseToken
|
|
118
|
+
) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const reason = "stale-dispatch-lease-takeover";
|
|
123
|
+
const result = db.prepare(
|
|
124
|
+
`UPDATE unit_dispatches
|
|
125
|
+
SET status = 'canceled',
|
|
126
|
+
ended_at = :ended_at,
|
|
127
|
+
exit_reason = :reason
|
|
128
|
+
WHERE id = :id
|
|
129
|
+
AND status IN ('claimed','running')
|
|
130
|
+
AND (worker_id != :worker_id OR milestone_lease_token != :token)`,
|
|
131
|
+
).run({
|
|
132
|
+
":id": active.id,
|
|
133
|
+
":ended_at": now,
|
|
134
|
+
":reason": reason,
|
|
135
|
+
":worker_id": input.workerId,
|
|
136
|
+
":token": input.milestoneLeaseToken,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
const changes =
|
|
140
|
+
typeof (result as { changes?: unknown }).changes === "number"
|
|
141
|
+
? (result as { changes: number }).changes
|
|
142
|
+
: 0;
|
|
143
|
+
if (changes < 1) return;
|
|
144
|
+
|
|
145
|
+
insertAuditEvent({
|
|
146
|
+
eventId: randomUUID(),
|
|
147
|
+
traceId: input.traceId,
|
|
148
|
+
turnId: input.turnId ?? undefined,
|
|
149
|
+
category: "orchestration",
|
|
150
|
+
type: "dispatch-stale-canceled",
|
|
151
|
+
ts: now,
|
|
152
|
+
payload: {
|
|
153
|
+
dispatchId: active.id,
|
|
154
|
+
unitId: input.unitId,
|
|
155
|
+
priorStatus: active.status,
|
|
156
|
+
priorWorkerId: active.worker_id,
|
|
157
|
+
priorMilestoneLeaseToken: active.milestone_lease_token,
|
|
158
|
+
takeoverWorkerId: input.workerId,
|
|
159
|
+
takeoverMilestoneLeaseToken: input.milestoneLeaseToken,
|
|
160
|
+
reason,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
101
165
|
/**
|
|
102
166
|
* Insert a new dispatch row in `claimed` state. Atomic guard against
|
|
103
167
|
* double-claim (B2): the partial unique index
|
|
@@ -135,6 +199,8 @@ export function recordDispatchClaim(input: RecordClaimInput): RecordClaimResult
|
|
|
135
199
|
};
|
|
136
200
|
}
|
|
137
201
|
|
|
202
|
+
settleStaleActiveDispatchForUnit(input, now);
|
|
203
|
+
|
|
138
204
|
try {
|
|
139
205
|
const result = db.prepare(
|
|
140
206
|
`INSERT INTO unit_dispatches (
|
|
@@ -204,6 +204,9 @@ export function createGSDExtensionAPI(
|
|
|
204
204
|
getAllTools: () => pi.getAllTools(),
|
|
205
205
|
setActiveTools: (...args: Parameters<ExtensionAPI["setActiveTools"]>) =>
|
|
206
206
|
pi.setActiveTools(...args),
|
|
207
|
+
getVisibleSkills: () => pi.getVisibleSkills(),
|
|
208
|
+
setVisibleSkills: (...args: Parameters<ExtensionAPI["setVisibleSkills"]>) =>
|
|
209
|
+
pi.setVisibleSkills(...args),
|
|
207
210
|
getCommands: () => pi.getCommands(),
|
|
208
211
|
|
|
209
212
|
// ── Model & thinking ───────────────────────────────────────────────
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Git operations, commit-message formatting, and turn git actions.
|
|
1
3
|
/**
|
|
2
4
|
* GSD Git Service
|
|
3
5
|
*
|
|
@@ -129,6 +131,11 @@ export interface TurnGitActionResult {
|
|
|
129
131
|
export interface TaskCommitContext {
|
|
130
132
|
taskId: string;
|
|
131
133
|
taskTitle: string;
|
|
134
|
+
milestoneId?: string;
|
|
135
|
+
milestoneTitle?: string;
|
|
136
|
+
sliceId?: string;
|
|
137
|
+
sliceTitle?: string;
|
|
138
|
+
taskDisplayId?: string;
|
|
132
139
|
/** The one-liner from the task summary (e.g. "Added retry-aware worker status logging") */
|
|
133
140
|
oneLiner?: string;
|
|
134
141
|
/** Files modified by this task (from task summary frontmatter) */
|
|
@@ -170,6 +177,11 @@ export function buildTaskCommitMessage(ctx: TaskCommitContext): string {
|
|
|
170
177
|
bodyParts.push(fileLines);
|
|
171
178
|
}
|
|
172
179
|
|
|
180
|
+
const contextLines = buildTaskCommitContextLines(ctx);
|
|
181
|
+
if (contextLines.length > 0) {
|
|
182
|
+
bodyParts.push(`GSD context:\n${contextLines.join("\n")}`);
|
|
183
|
+
}
|
|
184
|
+
|
|
173
185
|
// Trailers: GSD-Task first, then Resolves
|
|
174
186
|
bodyParts.push(`GSD-Task: ${ctx.taskId}`);
|
|
175
187
|
|
|
@@ -180,6 +192,28 @@ export function buildTaskCommitMessage(ctx: TaskCommitContext): string {
|
|
|
180
192
|
return `${subject}\n\n${bodyParts.join("\n\n")}`;
|
|
181
193
|
}
|
|
182
194
|
|
|
195
|
+
function buildTaskCommitContextLines(ctx: TaskCommitContext): string[] {
|
|
196
|
+
const lines: string[] = [];
|
|
197
|
+
const milestone = formatNamedContext(ctx.milestoneId, ctx.milestoneTitle);
|
|
198
|
+
const slice = formatNamedContext(ctx.sliceId, ctx.sliceTitle);
|
|
199
|
+
const taskId = ctx.taskDisplayId ?? ctx.taskId.split("/").pop();
|
|
200
|
+
const task = formatNamedContext(taskId, ctx.taskTitle);
|
|
201
|
+
|
|
202
|
+
if (milestone) lines.push(`- Milestone: ${milestone}`);
|
|
203
|
+
if (slice) lines.push(`- Slice: ${slice}`);
|
|
204
|
+
if (task) lines.push(`- Task: ${task}`);
|
|
205
|
+
return lines;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function formatNamedContext(id: string | undefined, title: string | undefined): string | null {
|
|
209
|
+
const cleanId = id?.trim();
|
|
210
|
+
const cleanTitle = title?.trim();
|
|
211
|
+
if (!cleanId && !cleanTitle) return null;
|
|
212
|
+
if (!cleanId) return cleanTitle ?? null;
|
|
213
|
+
if (!cleanTitle || cleanTitle === cleanId) return cleanId;
|
|
214
|
+
return `${cleanId} - ${cleanTitle}`;
|
|
215
|
+
}
|
|
216
|
+
|
|
183
217
|
function sanitizeCommitSubjectDescription(value: string): string {
|
|
184
218
|
const cleaned = value
|
|
185
219
|
.replace(/[\x00-\x1F\x7F]+/g, " ")
|
|
@@ -1073,7 +1107,7 @@ export function createDraftPR(
|
|
|
1073
1107
|
milestoneId: string,
|
|
1074
1108
|
title: string,
|
|
1075
1109
|
body: string,
|
|
1076
|
-
opts?: { head?: string; base?: string },
|
|
1110
|
+
opts?: { head?: string; base?: string; env?: NodeJS.ProcessEnv },
|
|
1077
1111
|
): string | null {
|
|
1078
1112
|
try {
|
|
1079
1113
|
const args = [
|
|
@@ -1083,7 +1117,12 @@ export function createDraftPR(
|
|
|
1083
1117
|
];
|
|
1084
1118
|
if (opts?.head) args.push("--head", opts.head);
|
|
1085
1119
|
if (opts?.base) args.push("--base", opts.base);
|
|
1086
|
-
const result = execFileSync("gh", args, {
|
|
1120
|
+
const result = execFileSync("gh", args, {
|
|
1121
|
+
cwd: basePath,
|
|
1122
|
+
encoding: "utf8",
|
|
1123
|
+
timeout: 30000,
|
|
1124
|
+
env: opts?.env ?? GIT_NO_PROMPT_ENV,
|
|
1125
|
+
});
|
|
1087
1126
|
return result.trim();
|
|
1088
1127
|
} catch {
|
|
1089
1128
|
return null;
|