gsd-pi 2.80.0-dev.710c06e97 → 2.80.0-dev.7582bf37a
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 +4 -2
- 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/loop.js +103 -9
- package/dist/resources/extensions/gsd/auto/phases.js +240 -139
- 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 +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 +26 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +104 -86
- package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +174 -10
- package/dist/resources/extensions/gsd/auto-start.js +240 -15
- 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 +209 -81
- package/dist/resources/extensions/gsd/auto.js +168 -45
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
- 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 +319 -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/bootstrap/write-gate.js +19 -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 +143 -48
- 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/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/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-manager.js +16 -14
- package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
- 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 +16 -16
- 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 +16 -16
- 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 +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/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 +32 -0
- 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 +17 -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 +52 -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 +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 +41 -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 +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 +22 -0
- 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/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 +36 -0
- 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 +59 -7
- 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 +44 -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 +24 -0
- 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/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/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/loop-deps.ts +3 -2
- package/src/resources/extensions/gsd/auto/loop.ts +134 -16
- package/src/resources/extensions/gsd/auto/phases.ts +328 -200
- 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 +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 +33 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +117 -88
- package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +185 -7
- package/src/resources/extensions/gsd/auto-start.ts +293 -21
- 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 +241 -72
- package/src/resources/extensions/gsd/auto.ts +220 -40
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
- 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 +369 -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/bootstrap/write-gate.ts +19 -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 +169 -55
- 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/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/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 +433 -11
- 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 +160 -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 +139 -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 +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 +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 +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/db-schema-metadata.test.ts +2 -2
- 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/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 +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/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 +239 -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-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 +1 -0
- 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 +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/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/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 +166 -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 +1 -0
- 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/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 +1 -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 +203 -4
- 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/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-manager.ts +15 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
- 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/{CaMwumvGbBPZrJicfsCzV → Y9yOOsO4ZA5BPTOS8ixvP}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{CaMwumvGbBPZrJicfsCzV → Y9yOOsO4ZA5BPTOS8ixvP}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Auto-mode orchestration, session lifecycle, and stop handling.
|
|
1
3
|
/**
|
|
2
4
|
* GSD Auto Mode — Fresh Session Per Unit
|
|
3
5
|
*
|
|
@@ -59,6 +61,7 @@ import {
|
|
|
59
61
|
isLockProcessAlive,
|
|
60
62
|
formatCrashInfo,
|
|
61
63
|
emitCrashRecoveredUnitEnd,
|
|
64
|
+
emitOpenUnitEndForUnit,
|
|
62
65
|
} from "./crash-recovery.js";
|
|
63
66
|
import {
|
|
64
67
|
acquireSessionLock,
|
|
@@ -150,6 +153,7 @@ import {
|
|
|
150
153
|
resolveProjectRoot,
|
|
151
154
|
} from "./worktree.js";
|
|
152
155
|
import { GitServiceImpl } from "./git-service.js";
|
|
156
|
+
import { nativeCheckoutBranch } from "./native-git-bridge.js";
|
|
153
157
|
import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
|
|
154
158
|
import {
|
|
155
159
|
createAutoWorktree,
|
|
@@ -200,6 +204,8 @@ import {
|
|
|
200
204
|
detectWorkingTreeActivity,
|
|
201
205
|
} from "./auto-supervisor.js";
|
|
202
206
|
import { isDbAvailable, getMilestone } from "./gsd-db.js";
|
|
207
|
+
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
208
|
+
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
203
209
|
import { countPendingCaptures } from "./captures.js";
|
|
204
210
|
import { CMUX_CHANNELS, type CmuxLogLevel } from "../shared/cmux-events.js";
|
|
205
211
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
@@ -242,6 +248,20 @@ import {
|
|
|
242
248
|
type WorktreeResolverDeps,
|
|
243
249
|
} from "./worktree-resolver.js";
|
|
244
250
|
import { reorderForCaching } from "./prompt-ordering.js";
|
|
251
|
+
import { initTokenCounter } from "./token-counter.js";
|
|
252
|
+
|
|
253
|
+
// Warm the tiktoken encoder at extension startup so context-budget computations
|
|
254
|
+
// can use accurate token counts via countTokensSync without paying the load
|
|
255
|
+
// cost mid-prompt-build. Fire-and-forget — failure falls back to the
|
|
256
|
+
// provider-aware char-ratio estimator already used by getCharsPerToken().
|
|
257
|
+
// Catch rejections explicitly: an unhandled rejection at module-import time
|
|
258
|
+
// can destabilize startup before the engine logger is configured.
|
|
259
|
+
void initTokenCounter().catch((err) => {
|
|
260
|
+
logWarning(
|
|
261
|
+
"engine",
|
|
262
|
+
`token counter warm-up failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
263
|
+
);
|
|
264
|
+
});
|
|
245
265
|
|
|
246
266
|
// ─── Session State ─────────────────────────────────────────────────────────
|
|
247
267
|
|
|
@@ -293,11 +313,15 @@ const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
|
293
313
|
* the DB is unavailable (e.g. fresh project before init) we skip registration
|
|
294
314
|
* silently rather than blocking session start.
|
|
295
315
|
*/
|
|
296
|
-
function registerAutoWorkerForSession(
|
|
316
|
+
function registerAutoWorkerForSession(
|
|
317
|
+
session: AutoSession,
|
|
318
|
+
projectRootOverride?: string,
|
|
319
|
+
): void {
|
|
297
320
|
if (session.workerId) return; // already registered (e.g. resume re-runs)
|
|
298
321
|
try {
|
|
299
322
|
const projectRootRealpath = normalizeRealPath(
|
|
300
|
-
|
|
323
|
+
projectRootOverride
|
|
324
|
+
?? session.scope?.workspace.projectRoot
|
|
301
325
|
?? (session.originalBasePath || session.basePath),
|
|
302
326
|
);
|
|
303
327
|
session.workerId = registerAutoWorker({ projectRootRealpath });
|
|
@@ -332,6 +356,14 @@ function restoreProjectRootEnv(): void {
|
|
|
332
356
|
s.projectRootEnvCaptured = false;
|
|
333
357
|
}
|
|
334
358
|
|
|
359
|
+
export function _captureProjectRootEnvForTest(projectRoot: string): void {
|
|
360
|
+
captureProjectRootEnv(projectRoot);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export function _restoreProjectRootEnvForTest(): void {
|
|
364
|
+
restoreProjectRootEnv();
|
|
365
|
+
}
|
|
366
|
+
|
|
335
367
|
function captureMilestoneLockEnv(milestoneId: string | null): void {
|
|
336
368
|
if (!s.milestoneLockEnvCaptured) {
|
|
337
369
|
s.hadMilestoneLockEnv = Object.prototype.hasOwnProperty.call(process.env, "GSD_MILESTONE_LOCK");
|
|
@@ -420,6 +452,27 @@ export function _synthesizePausedSessionRecoveryForTest(
|
|
|
420
452
|
return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
|
|
421
453
|
}
|
|
422
454
|
|
|
455
|
+
export function _resolvePausedResumeBasePathForTest(
|
|
456
|
+
basePath: string,
|
|
457
|
+
pausedWorktreePath: string | null | undefined,
|
|
458
|
+
pathExists: (path: string) => boolean = existsSync,
|
|
459
|
+
): string {
|
|
460
|
+
return pausedWorktreePath && pathExists(pausedWorktreePath)
|
|
461
|
+
? pausedWorktreePath
|
|
462
|
+
: basePath;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
|
|
466
|
+
|
|
467
|
+
function withDetachedAutoKeepalive<T>(run: Promise<T>): Promise<T> {
|
|
468
|
+
const keepAlive = setInterval(() => {}, DETACHED_AUTO_KEEPALIVE_INTERVAL_MS);
|
|
469
|
+
return run.finally(() => {
|
|
470
|
+
clearInterval(keepAlive);
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export const _withDetachedAutoKeepaliveForTest = withDetachedAutoKeepalive;
|
|
475
|
+
|
|
423
476
|
export function startAutoDetached(
|
|
424
477
|
ctx: ExtensionCommandContext,
|
|
425
478
|
pi: ExtensionAPI,
|
|
@@ -431,7 +484,7 @@ export function startAutoDetached(
|
|
|
431
484
|
milestoneLock?: string | null;
|
|
432
485
|
},
|
|
433
486
|
): void {
|
|
434
|
-
void startAuto(ctx, pi, base, verboseMode, options).catch((err) => {
|
|
487
|
+
void withDetachedAutoKeepalive(startAuto(ctx, pi, base, verboseMode, options)).catch((err) => {
|
|
435
488
|
const message = getErrorMessage(err);
|
|
436
489
|
ctx.ui.notify(`Auto-start failed: ${message}`, "error");
|
|
437
490
|
logWarning("engine", `auto start error: ${message}`, { file: "auto.ts" });
|
|
@@ -490,9 +543,54 @@ export {
|
|
|
490
543
|
getBudgetEnforcementAction,
|
|
491
544
|
} from "./auto-budget.js";
|
|
492
545
|
|
|
546
|
+
function closeOutSignalInterruptedUnit(currentBasePath: string): void {
|
|
547
|
+
const currentUnit = s.currentUnit;
|
|
548
|
+
if (!currentUnit) return;
|
|
549
|
+
|
|
550
|
+
const reason = "Auto-mode process received a termination signal";
|
|
551
|
+
const errorContext: ErrorContext = {
|
|
552
|
+
message: reason,
|
|
553
|
+
category: "aborted",
|
|
554
|
+
isTransient: false,
|
|
555
|
+
};
|
|
556
|
+
const basePath = s.basePath || currentBasePath;
|
|
557
|
+
|
|
558
|
+
try {
|
|
559
|
+
emitOpenUnitEndForUnit(basePath, currentUnit.type, currentUnit.id, "cancelled", errorContext);
|
|
560
|
+
} catch (err) {
|
|
561
|
+
logWarning("engine", `signal unit-end cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
try {
|
|
565
|
+
writeUnitRuntimeRecord(basePath, currentUnit.type, currentUnit.id, currentUnit.startedAt, {
|
|
566
|
+
phase: "crashed",
|
|
567
|
+
lastProgressAt: Date.now(),
|
|
568
|
+
lastProgressKind: "signal",
|
|
569
|
+
});
|
|
570
|
+
} catch (err) {
|
|
571
|
+
logWarning("engine", `signal runtime cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
try {
|
|
575
|
+
if (s.workerId) markLatestActiveForWorkerCanceled(s.workerId, "signal-exit");
|
|
576
|
+
} catch (err) {
|
|
577
|
+
logWarning("engine", `signal dispatch cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
try {
|
|
581
|
+
resolveAgentEndCancelled(errorContext);
|
|
582
|
+
} catch (err) {
|
|
583
|
+
logWarning("engine", `signal resolve cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
493
587
|
/** Wrapper: register SIGTERM handler and store reference. */
|
|
494
588
|
function registerSigtermHandler(currentBasePath: string): void {
|
|
495
|
-
s.sigtermHandler = _registerSigtermHandler(
|
|
589
|
+
s.sigtermHandler = _registerSigtermHandler(
|
|
590
|
+
currentBasePath,
|
|
591
|
+
s.sigtermHandler,
|
|
592
|
+
() => closeOutSignalInterruptedUnit(currentBasePath),
|
|
593
|
+
);
|
|
496
594
|
}
|
|
497
595
|
|
|
498
596
|
/** Wrapper: deregister SIGTERM handler and clear reference. */
|
|
@@ -595,6 +693,30 @@ export function isAutoPaused(): boolean {
|
|
|
595
693
|
return s.paused;
|
|
596
694
|
}
|
|
597
695
|
|
|
696
|
+
export interface ResumeResourceRefreshDeps {
|
|
697
|
+
env?: NodeJS.ProcessEnv;
|
|
698
|
+
importModule?: (specifier: string) => Promise<any>;
|
|
699
|
+
openProjectDb?: (basePath: string) => Promise<void>;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
export async function refreshResumeResourcesAndDb(
|
|
703
|
+
basePath: string,
|
|
704
|
+
deps: ResumeResourceRefreshDeps = {},
|
|
705
|
+
): Promise<void> {
|
|
706
|
+
const env = deps.env ?? process.env;
|
|
707
|
+
const importModule = deps.importModule ?? ((specifier: string) => import(specifier));
|
|
708
|
+
const agentDir = env.GSD_CODING_AGENT_DIR || join(gsdHome(), "agent");
|
|
709
|
+
const pkgRoot = env.GSD_PKG_ROOT;
|
|
710
|
+
const resourceLoaderPath = pkgRoot
|
|
711
|
+
? pathToFileURL(join(pkgRoot, "dist", "resource-loader.js")).href
|
|
712
|
+
: new URL("../../../resource-loader.js", import.meta.url).href;
|
|
713
|
+
const { initResources } = await importModule(resourceLoaderPath);
|
|
714
|
+
initResources(agentDir);
|
|
715
|
+
const { primeCache } = await importModule("./prompt-loader.js");
|
|
716
|
+
primeCache();
|
|
717
|
+
await (deps.openProjectDb ?? openProjectDbIfPresent)(basePath);
|
|
718
|
+
}
|
|
719
|
+
|
|
598
720
|
export function setActiveEngineId(id: string | null): void {
|
|
599
721
|
s.activeEngineId = id;
|
|
600
722
|
}
|
|
@@ -849,7 +971,23 @@ function handleLostSessionLock(
|
|
|
849
971
|
* the stale unit state, progress widget, status badge, and restores CWD so
|
|
850
972
|
* the dashboard does not show an orphaned timer and the shell is usable.
|
|
851
973
|
*/
|
|
852
|
-
function
|
|
974
|
+
export async function rerootCommandSession(
|
|
975
|
+
cmdCtx: Pick<ExtensionCommandContext, "newSession"> | null | undefined,
|
|
976
|
+
workspaceRoot: string,
|
|
977
|
+
): Promise<{ status: "skipped" | "ok" | "cancelled" | "failed"; error?: string }> {
|
|
978
|
+
if (!cmdCtx || !workspaceRoot) return { status: "skipped" };
|
|
979
|
+
try {
|
|
980
|
+
const result = await cmdCtx.newSession({ workspaceRoot });
|
|
981
|
+
return result.cancelled ? { status: "cancelled" } : { status: "ok" };
|
|
982
|
+
} catch (err) {
|
|
983
|
+
return {
|
|
984
|
+
status: "failed",
|
|
985
|
+
error: err instanceof Error ? err.message : String(err),
|
|
986
|
+
};
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void> {
|
|
853
991
|
s.currentUnit = null;
|
|
854
992
|
s.active = false;
|
|
855
993
|
deactivateGSD();
|
|
@@ -887,6 +1025,34 @@ function cleanupAfterLoopExit(ctx: ExtensionContext): void {
|
|
|
887
1025
|
logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
888
1026
|
}
|
|
889
1027
|
}
|
|
1028
|
+
|
|
1029
|
+
if (s.originalBasePath && s.cmdCtx) {
|
|
1030
|
+
const result = await rerootCommandSession(s.cmdCtx, s.basePath);
|
|
1031
|
+
if (result.status === "cancelled") {
|
|
1032
|
+
logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
|
|
1033
|
+
} else if (result.status === "failed") {
|
|
1034
|
+
logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
export function _cleanupAfterLoopExitForTest(ctx: ExtensionContext): Promise<void> {
|
|
1040
|
+
return cleanupAfterLoopExit(ctx);
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
export type AutoWorktreeExitAction = "skip" | "merge" | "preserve";
|
|
1044
|
+
|
|
1045
|
+
export function _resolveAutoWorktreeExitActionForTest(
|
|
1046
|
+
currentMilestoneId: string | null | undefined,
|
|
1047
|
+
milestoneMergedInPhases: boolean,
|
|
1048
|
+
milestoneComplete: boolean,
|
|
1049
|
+
): AutoWorktreeExitAction {
|
|
1050
|
+
const action = _selectStopAutoWorktreeExit({
|
|
1051
|
+
currentMilestoneId: currentMilestoneId ?? null,
|
|
1052
|
+
milestoneComplete,
|
|
1053
|
+
milestoneMergedInPhases,
|
|
1054
|
+
});
|
|
1055
|
+
return action === "none" ? "skip" : action;
|
|
890
1056
|
}
|
|
891
1057
|
|
|
892
1058
|
export async function stopAuto(
|
|
@@ -957,6 +1123,8 @@ export async function stopAuto(
|
|
|
957
1123
|
if (s.workerId) {
|
|
958
1124
|
markWorkerStopping(s.workerId);
|
|
959
1125
|
}
|
|
1126
|
+
s.workerId = null;
|
|
1127
|
+
s.milestoneLeaseToken = null;
|
|
960
1128
|
} catch (e) {
|
|
961
1129
|
debugLog("stop-cleanup-coordination", { error: e instanceof Error ? e.message : String(e) });
|
|
962
1130
|
}
|
|
@@ -1038,10 +1206,16 @@ export async function stopAuto(
|
|
|
1038
1206
|
logWarning("engine", `milestone summary check failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1039
1207
|
}
|
|
1040
1208
|
|
|
1041
|
-
|
|
1209
|
+
const exitAction = _selectStopAutoWorktreeExit({
|
|
1210
|
+
currentMilestoneId: s.currentMilestoneId,
|
|
1211
|
+
milestoneComplete,
|
|
1212
|
+
milestoneMergedInPhases: s.milestoneMergedInPhases,
|
|
1213
|
+
});
|
|
1214
|
+
|
|
1215
|
+
if (exitAction === "merge") {
|
|
1042
1216
|
// Milestone is complete — merge worktree branch back to main
|
|
1043
1217
|
resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
|
|
1044
|
-
} else {
|
|
1218
|
+
} else if (exitAction === "preserve") {
|
|
1045
1219
|
// Milestone still in progress — preserve branch for later resumption
|
|
1046
1220
|
resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
|
|
1047
1221
|
preserveBranch: true,
|
|
@@ -1049,6 +1223,10 @@ export async function stopAuto(
|
|
|
1049
1223
|
}
|
|
1050
1224
|
}
|
|
1051
1225
|
} catch (e) {
|
|
1226
|
+
ctx?.ui.notify(
|
|
1227
|
+
`Worktree cleanup failed for ${s.currentMilestoneId ?? "current milestone"}: ${e instanceof Error ? e.message : String(e)}. Resolve the preserved branch/worktree and run /gsd auto to resume.`,
|
|
1228
|
+
"warning",
|
|
1229
|
+
);
|
|
1052
1230
|
debugLog("stop-cleanup-worktree", { error: e instanceof Error ? e.message : String(e) });
|
|
1053
1231
|
}
|
|
1054
1232
|
|
|
@@ -1094,6 +1272,19 @@ export async function stopAuto(
|
|
|
1094
1272
|
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
1095
1273
|
}
|
|
1096
1274
|
|
|
1275
|
+
// Re-root the active command session/tool runtime after worktree teardown.
|
|
1276
|
+
// mergeAndExit restores process.cwd(), but AgentSession has already captured
|
|
1277
|
+
// its own cwd for tools and system prompt; refresh it before returning to the
|
|
1278
|
+
// user so follow-up commands do not target a removed milestone worktree.
|
|
1279
|
+
if (s.originalBasePath && ctx && s.cmdCtx) {
|
|
1280
|
+
const result = await rerootCommandSession(s.cmdCtx, s.basePath);
|
|
1281
|
+
if (result.status === "cancelled") {
|
|
1282
|
+
logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
|
|
1283
|
+
} else if (result.status === "failed") {
|
|
1284
|
+
logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1097
1288
|
// ── Step 8: Ledger notification ──
|
|
1098
1289
|
try {
|
|
1099
1290
|
const ledger = getLedger();
|
|
@@ -1222,6 +1413,17 @@ export async function stopAuto(
|
|
|
1222
1413
|
}
|
|
1223
1414
|
}
|
|
1224
1415
|
|
|
1416
|
+
export type StopAutoWorktreeExitAction = "none" | "merge" | "preserve";
|
|
1417
|
+
|
|
1418
|
+
export function _selectStopAutoWorktreeExit(args: {
|
|
1419
|
+
currentMilestoneId: string | null;
|
|
1420
|
+
milestoneComplete: boolean;
|
|
1421
|
+
milestoneMergedInPhases: boolean;
|
|
1422
|
+
}): StopAutoWorktreeExitAction {
|
|
1423
|
+
if (!args.currentMilestoneId || args.milestoneMergedInPhases) return "none";
|
|
1424
|
+
return args.milestoneComplete ? "merge" : "preserve";
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1225
1427
|
/**
|
|
1226
1428
|
* Pause auto-mode without destroying state. Context is preserved.
|
|
1227
1429
|
* The user can interact with the agent, then `/gsd auto` resumes
|
|
@@ -1357,6 +1559,7 @@ function buildResolverDeps(): WorktreeResolverDeps {
|
|
|
1357
1559
|
getAutoWorktreePath,
|
|
1358
1560
|
autoCommitCurrentBranch,
|
|
1359
1561
|
getCurrentBranch,
|
|
1562
|
+
checkoutBranch: nativeCheckoutBranch,
|
|
1360
1563
|
autoWorktreeBranch,
|
|
1361
1564
|
resolveMilestoneFile,
|
|
1362
1565
|
readFileSync: (path: string, encoding: string) =>
|
|
@@ -1899,9 +2102,7 @@ export async function startAuto(
|
|
|
1899
2102
|
{ file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" },
|
|
1900
2103
|
);
|
|
1901
2104
|
}
|
|
1902
|
-
|
|
1903
|
-
s.basePath = resumeWorktreePath;
|
|
1904
|
-
}
|
|
2105
|
+
s.basePath = _resolvePausedResumeBasePathForTest(base, resumeWorktreePath);
|
|
1905
2106
|
// Rebuild scope now that s.basePath reflects the actual worktree (or project root).
|
|
1906
2107
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
1907
2108
|
// Ensure the workflow-logger audit log is pinned to the project root
|
|
@@ -1953,16 +2154,7 @@ export async function startAuto(
|
|
|
1953
2154
|
// tree; deployed extensions live at ~/.gsd/agent/extensions/gsd/ where the
|
|
1954
2155
|
// relative path resolves to ~/.gsd/agent/resource-loader.js which doesn't exist.
|
|
1955
2156
|
// Using GSD_PKG_ROOT constructs a correct absolute path in both contexts (#3949).
|
|
1956
|
-
|
|
1957
|
-
const pkgRoot = process.env.GSD_PKG_ROOT;
|
|
1958
|
-
const resourceLoaderPath = pkgRoot
|
|
1959
|
-
? pathToFileURL(join(pkgRoot, "dist", "resource-loader.js")).href
|
|
1960
|
-
: new URL("../../../resource-loader.js", import.meta.url).href;
|
|
1961
|
-
const { initResources } = await import(resourceLoaderPath);
|
|
1962
|
-
initResources(agentDir);
|
|
1963
|
-
// Open the project DB before rebuild/derive so resume uses DB-backed
|
|
1964
|
-
// state instead of falling back to stale markdown parsing (#2940).
|
|
1965
|
-
await openProjectDbIfPresent(s.basePath);
|
|
2157
|
+
await refreshResumeResourcesAndDb(s.basePath);
|
|
1966
2158
|
try {
|
|
1967
2159
|
await rebuildState(s.basePath);
|
|
1968
2160
|
pi.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "sync" as const, preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, state: await deriveState(s.basePath) });
|
|
@@ -2034,7 +2226,7 @@ export async function startAuto(
|
|
|
2034
2226
|
runKernelLoop: runUokKernelLoop,
|
|
2035
2227
|
runLegacyLoop: runLegacyAutoLoop,
|
|
2036
2228
|
});
|
|
2037
|
-
cleanupAfterLoopExit(ctx);
|
|
2229
|
+
await cleanupAfterLoopExit(ctx);
|
|
2038
2230
|
return;
|
|
2039
2231
|
}
|
|
2040
2232
|
|
|
@@ -2046,6 +2238,11 @@ export async function startAuto(
|
|
|
2046
2238
|
buildResolver,
|
|
2047
2239
|
};
|
|
2048
2240
|
|
|
2241
|
+
// Register the worker before bootstrap enters a milestone worktree.
|
|
2242
|
+
// This ensures enterMilestone can claim a lease and seed dispatch claims
|
|
2243
|
+
// for crash-recovery fidelity (#5405).
|
|
2244
|
+
registerAutoWorkerForSession(s, base);
|
|
2245
|
+
|
|
2049
2246
|
const ready = await bootstrapAutoSession(
|
|
2050
2247
|
s,
|
|
2051
2248
|
ctx,
|
|
@@ -2089,7 +2286,7 @@ export async function startAuto(
|
|
|
2089
2286
|
runKernelLoop: runUokKernelLoop,
|
|
2090
2287
|
runLegacyLoop: runLegacyAutoLoop,
|
|
2091
2288
|
});
|
|
2092
|
-
cleanupAfterLoopExit(ctx);
|
|
2289
|
+
await cleanupAfterLoopExit(ctx);
|
|
2093
2290
|
}
|
|
2094
2291
|
|
|
2095
2292
|
// describeNextUnit is imported from auto-dashboard.ts and re-exported
|
|
@@ -2213,24 +2410,7 @@ export async function dispatchHookUnit(
|
|
|
2213
2410
|
startedAt: hookStartedAt,
|
|
2214
2411
|
};
|
|
2215
2412
|
|
|
2216
|
-
|
|
2217
|
-
// newSession() snapshots process.cwd() during construction; chdir-ing
|
|
2218
|
-
// afterward leaves the session rooted to whatever cwd was when the call
|
|
2219
|
-
// was made. Must be synchronous — no awaits between chdir and newSession.
|
|
2220
|
-
try { if (process.cwd() !== s.basePath) process.chdir(s.basePath); } catch (err) {
|
|
2221
|
-
const msg = `Failed to chdir before hook newSession (basePath: ${s.basePath}): ${err instanceof Error ? err.message : String(err)}`;
|
|
2222
|
-
logWarning("engine", msg, { file: "auto.ts", basePath: s.basePath, error: err instanceof Error ? err.message : String(err) });
|
|
2223
|
-
ctx.ui.notify(`${msg}. Cancelling hook dispatch to avoid running in the wrong directory.`, "error");
|
|
2224
|
-
if (wasActive) {
|
|
2225
|
-
s.basePath = previousBasePath;
|
|
2226
|
-
s.currentUnit = previousCurrentUnit;
|
|
2227
|
-
} else {
|
|
2228
|
-
s.reset();
|
|
2229
|
-
}
|
|
2230
|
-
return false;
|
|
2231
|
-
}
|
|
2232
|
-
|
|
2233
|
-
const result = await s.cmdCtx!.newSession();
|
|
2413
|
+
const result = await s.cmdCtx!.newSession({ workspaceRoot: s.basePath });
|
|
2234
2414
|
if (result.cancelled) {
|
|
2235
2415
|
await stopAuto(ctx, pi);
|
|
2236
2416
|
return false;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
4
4
|
|
|
5
|
+
import type { ErrorContext } from "../auto/types.js";
|
|
5
6
|
import { logWarning } from "../workflow-logger.js";
|
|
6
7
|
import {
|
|
7
8
|
checkDeepProjectSetupAfterTurn,
|
|
@@ -14,7 +15,12 @@ import { clearPathCache } from "../paths.js";
|
|
|
14
15
|
import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
|
|
15
16
|
import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
|
|
16
17
|
import { pauseAutoForProviderError } from "../provider-error-pause.js";
|
|
17
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
isSessionSwitchAbortGraceActive,
|
|
20
|
+
isSessionSwitchInFlight,
|
|
21
|
+
resolveAgentEnd,
|
|
22
|
+
resolveAgentEndCancelled,
|
|
23
|
+
} from "../auto/resolve.js";
|
|
18
24
|
import { resolveModelId } from "../auto-model-selection.js";
|
|
19
25
|
import { resolveProjectRoot } from "../worktree.js";
|
|
20
26
|
import { clearDiscussionFlowState } from "./write-gate.js";
|
|
@@ -76,6 +82,103 @@ export function isUserInitiatedAbortMessage(message: string | undefined | null):
|
|
|
76
82
|
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
|
|
77
83
|
}
|
|
78
84
|
|
|
85
|
+
function isBareClaudeCodeSessionSwitchAbortMarker(message: string | undefined | null): boolean {
|
|
86
|
+
if (!message) return false;
|
|
87
|
+
const normalized = message.trim().replace(/\s+/g, " ").toLowerCase();
|
|
88
|
+
return normalized === "claude code process aborted by user"
|
|
89
|
+
|| normalized === "request aborted by user"
|
|
90
|
+
|| normalized === "process aborted by user"
|
|
91
|
+
|| normalized === "claude code stream aborted by caller";
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function readAssistantTextContent(content: unknown): string {
|
|
95
|
+
if (!Array.isArray(content)) return "";
|
|
96
|
+
return content
|
|
97
|
+
.map((block) => {
|
|
98
|
+
if (!block || typeof block !== "object") return "";
|
|
99
|
+
const text = (block as { text?: unknown }).text;
|
|
100
|
+
return typeof text === "string" ? text : "";
|
|
101
|
+
})
|
|
102
|
+
.filter(Boolean)
|
|
103
|
+
.join("\n");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function isClaudeCodeSessionSwitchAbortMessage(lastMsg: unknown): boolean {
|
|
107
|
+
if (!lastMsg || typeof lastMsg !== "object") return false;
|
|
108
|
+
const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
|
|
109
|
+
const carriers = [
|
|
110
|
+
m.errorMessage ? String(m.errorMessage) : "",
|
|
111
|
+
readAssistantTextContent(m.content),
|
|
112
|
+
].filter((value) => value.trim().length > 0);
|
|
113
|
+
|
|
114
|
+
if ((m.stopReason === "error" || m.stopReason === "aborted") && carriers.length > 0) {
|
|
115
|
+
return carriers.every(isBareClaudeCodeSessionSwitchAbortMarker);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Resolve an agent_end event observed while a session switch is in flight.
|
|
123
|
+
*
|
|
124
|
+
* #5538-followup: When `newSession()` aborts an in-flight stream as part of a
|
|
125
|
+
* session transition (run-unit.ts:63 → _settleCurrentTurnForSessionTransition
|
|
126
|
+
* → agent.abort()), the SDK emits "Claude Code process aborted by user" or
|
|
127
|
+
* "Request aborted by user" against the previous unit's turn. The previous
|
|
128
|
+
* code path treated that as a user cancellation and propagated it to the next
|
|
129
|
+
* unit via the pending-switch-cancellation queue, killing auto-mode with
|
|
130
|
+
* "Auto-mode stopped — Unit aborted: Claude Code process aborted by user"
|
|
131
|
+
* even though no user input occurred.
|
|
132
|
+
*
|
|
133
|
+
* Claude Code abort markers are intentionally ignored when the abort fires
|
|
134
|
+
* while the session-switch is in flight: the abort is the expected side-effect
|
|
135
|
+
* of the transition, not a user signal. Other branches (genuine `stopReason
|
|
136
|
+
* === "aborted"` with diagnostic content/errorMessage) preserve the prior
|
|
137
|
+
* behavior.
|
|
138
|
+
*/
|
|
139
|
+
export function _handleSessionSwitchAgentEnd(
|
|
140
|
+
lastMsg: unknown,
|
|
141
|
+
resolveCancelled: (ctx: ErrorContext) => boolean,
|
|
142
|
+
): void {
|
|
143
|
+
if (!lastMsg || typeof lastMsg !== "object") return;
|
|
144
|
+
const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
|
|
145
|
+
|
|
146
|
+
if (isClaudeCodeSessionSwitchAbortMessage(m)) {
|
|
147
|
+
// Internal abort from in-flight session transition — drop on the floor.
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (m.stopReason === "error") {
|
|
152
|
+
const rawErrorMsg = m.errorMessage ? String(m.errorMessage) : "";
|
|
153
|
+
if (isBareClaudeCodeSessionSwitchAbortMarker(rawErrorMsg)) {
|
|
154
|
+
// Internal abort from in-flight session transition — drop on the floor.
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (m.stopReason === "aborted") {
|
|
161
|
+
const content = m.content;
|
|
162
|
+
const hasEmptyContent = Array.isArray(content) && content.length === 0;
|
|
163
|
+
const hasErrorMessage = !!m.errorMessage;
|
|
164
|
+
if (!hasEmptyContent || hasErrorMessage) {
|
|
165
|
+
resolveCancelled(_buildAbortedPauseContext(m as { errorMessage?: unknown }));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function resolveAgentEndErrorDisplay(
|
|
171
|
+
rawErrorMsg: string,
|
|
172
|
+
content: unknown,
|
|
173
|
+
): string {
|
|
174
|
+
const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
|
|
175
|
+
if (isUseless && Array.isArray(content)) {
|
|
176
|
+
const textBlock = content.find((b: any) => b.type === "text" && b.text);
|
|
177
|
+
if (textBlock) return (textBlock as any).text.slice(0, 300);
|
|
178
|
+
}
|
|
179
|
+
return rawErrorMsg;
|
|
180
|
+
}
|
|
181
|
+
|
|
79
182
|
async function pauseTransientWithBackoff(
|
|
80
183
|
cls: ErrorClass,
|
|
81
184
|
pi: ExtensionAPI,
|
|
@@ -153,9 +256,20 @@ export async function handleAgentEnd(
|
|
|
153
256
|
if (maybeHandleEmptyIntentTurn(event, isAutoActive())) return;
|
|
154
257
|
|
|
155
258
|
if (!isAutoActive()) return;
|
|
156
|
-
if (isSessionSwitchInFlight()) return;
|
|
157
259
|
|
|
158
260
|
const lastMsg = event.messages[event.messages.length - 1];
|
|
261
|
+
if (isSessionSwitchInFlight()) {
|
|
262
|
+
_handleSessionSwitchAgentEnd(lastMsg, resolveAgentEndCancelled);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (isSessionSwitchAbortGraceActive() && isClaudeCodeSessionSwitchAbortMessage(lastMsg)) {
|
|
267
|
+
// Claude Code can report the abort from `newSession()` a few hundred ms
|
|
268
|
+
// after the guard drops. That event belongs to the old turn; do not let it
|
|
269
|
+
// cancel the freshly-dispatched unit.
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
|
|
159
273
|
if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "aborted") {
|
|
160
274
|
// Empty content with aborted stopReason is a non-fatal agent stop (the LLM
|
|
161
275
|
// chose to end without producing output). Only pause on genuine fatal aborts
|
|
@@ -195,15 +309,13 @@ export async function handleAgentEnd(
|
|
|
195
309
|
});
|
|
196
310
|
return;
|
|
197
311
|
}
|
|
198
|
-
const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
|
|
199
312
|
// #3588: When errorMessage is uninformative, extract the real error from
|
|
200
313
|
// the assistant message text content for display purposes only.
|
|
201
314
|
// Classification still uses rawErrorMsg to avoid false positives from prose.
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
315
|
+
const displayMsg = resolveAgentEndErrorDisplay(
|
|
316
|
+
rawErrorMsg,
|
|
317
|
+
"content" in lastMsg ? lastMsg.content : undefined,
|
|
318
|
+
);
|
|
207
319
|
const errorDetail = displayMsg ? `: ${displayMsg}` : "";
|
|
208
320
|
const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
|
|
209
321
|
|