gsd-pi 2.80.0-dev.3065f7bfa → 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 +32 -8
- package/dist/resources/extensions/gsd/auto/resolve.js +12 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +3 -1
- 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-post-unit.js +81 -76
- package/dist/resources/extensions/gsd/auto-start.js +41 -6
- package/dist/resources/extensions/gsd/auto-worktree.js +98 -80
- package/dist/resources/extensions/gsd/auto.js +84 -29
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +62 -13
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +20 -26
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +29 -12
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +6 -9
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -7
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -10
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -9
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +60 -26
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -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/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +53 -0
- package/dist/resources/extensions/gsd/git-service.js +37 -1
- package/dist/resources/extensions/gsd/guided-flow.js +14 -4
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -4
- 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/worktree-resolver.js +22 -1
- 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 +17 -17
- 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/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 +17 -17
- 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/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +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/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/types.d.ts +2 -2
- 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/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/chat-controller-ordering.test.ts +3 -1
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
- 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.ts +84 -8
- package/src/resources/extensions/gsd/auto/phases.ts +43 -8
- package/src/resources/extensions/gsd/auto/resolve.ts +19 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +3 -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-post-unit.ts +93 -78
- package/src/resources/extensions/gsd/auto-start.ts +56 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +118 -72
- package/src/resources/extensions/gsd/auto.ts +121 -29
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +76 -12
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +20 -26
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +27 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +7 -9
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +4 -7
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +6 -10
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +5 -9
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +64 -26
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -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/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +66 -0
- package/src/resources/extensions/gsd/git-service.ts +41 -2
- package/src/resources/extensions/gsd/guided-flow.ts +19 -4
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -4
- 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 +15 -0
- 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 +1 -217
- 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/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.test.ts +140 -0
- 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/crash-handler-secondary.test.ts +35 -31
- 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/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 -59
- 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/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/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/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 +113 -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-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-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 -90
- 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/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 +61 -1
- 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/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/token-profile.test.ts +84 -309
- 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 +6 -101
- 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-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-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +36 -0
- 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/worktree-resolver.ts +34 -1
- 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/{O2WvnXROue6l7nAp_4dhC → G68KoLv5claox_Dyd4pZn}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{O2WvnXROue6l7nAp_4dhC → G68KoLv5claox_Dyd4pZn}/_ssgManifest.js +0 -0
|
@@ -1,146 +1,91 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Regression
|
|
2
|
+
* Regression tests for #3696 — prompt step ordering and compact hook behavior.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 2. complete-slice.md: uses gsd_requirement_update
|
|
7
|
-
* 3. register-extension.ts: _gsdEpipeGuard logs instead of re-throwing
|
|
8
|
-
* 4. register-hooks.ts: session_before_compact only checks isAutoActive
|
|
4
|
+
* These tests assert rendered prompts and registered hook behavior instead of
|
|
5
|
+
* reading source files as text.
|
|
9
6
|
*/
|
|
10
7
|
|
|
11
8
|
import { describe, test } from 'node:test';
|
|
12
9
|
import assert from 'node:assert/strict';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { extractSourceRegion } from "./test-helpers.ts";
|
|
10
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
17
13
|
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
import { _setAutoActiveForTest } from '../auto.ts';
|
|
15
|
+
import { buildCompleteMilestonePrompt, buildCompleteSlicePrompt } from '../auto-prompts.ts';
|
|
16
|
+
import { registerHooks } from '../bootstrap/register-hooks.ts';
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
join(
|
|
23
|
-
'
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
join(
|
|
31
|
-
'
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
join(__dirname, '..', 'bootstrap', 'register-hooks.ts'),
|
|
35
|
-
'utf-8',
|
|
36
|
-
);
|
|
18
|
+
function makePromptBase(): string {
|
|
19
|
+
const base = mkdtempSync(join(tmpdir(), 'gsd-prompt-order-'));
|
|
20
|
+
const msDir = join(base, '.gsd', 'milestones', 'M001');
|
|
21
|
+
const sliceDir = join(msDir, 'slices', 'S01');
|
|
22
|
+
mkdirSync(sliceDir, { recursive: true });
|
|
23
|
+
writeFileSync(
|
|
24
|
+
join(msDir, 'M001-ROADMAP.md'),
|
|
25
|
+
'# Roadmap\n\n## Slices\n\n- [x] **S01: Done** `risk:low` `depends:[]`\n',
|
|
26
|
+
);
|
|
27
|
+
writeFileSync(join(sliceDir, 'S01-PLAN.md'), '# S01 Plan\n\n## Tasks\n\n- T01\n');
|
|
28
|
+
writeFileSync(join(sliceDir, 'S01-SUMMARY.md'), '# S01 Summary\n\nDone.\n');
|
|
29
|
+
return base;
|
|
30
|
+
}
|
|
37
31
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
assert.ok(completeMilestoneMatch, 'gsd_complete_milestone should appear in a numbered step');
|
|
45
|
-
const reqUpdateIdx = completeMilestoneMd.indexOf(reqUpdateMatch![0]);
|
|
46
|
-
const completeMilestoneIdx = completeMilestoneMd.indexOf(completeMilestoneMatch![0]);
|
|
47
|
-
assert.ok(
|
|
48
|
-
reqUpdateIdx < completeMilestoneIdx,
|
|
49
|
-
'gsd_requirement_update step must come before gsd_complete_milestone step',
|
|
50
|
-
);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
test('project and learnings writes appear before gsd_complete_milestone', () => {
|
|
54
|
-
const projectMatch = completeMilestoneMd.match(/^\d+\.\s.*PROJECT\.md/m);
|
|
55
|
-
const learningsMatch = completeMilestoneMd.match(/^\d+\.\s.*Extract structured learnings/m);
|
|
56
|
-
const completeMilestoneMatch = completeMilestoneMd.match(/^\d+\.\s.*gsd_complete_milestone/m);
|
|
57
|
-
assert.ok(projectMatch, 'PROJECT.md update should appear in a numbered step');
|
|
58
|
-
assert.ok(learningsMatch, 'learnings extraction should appear in a numbered step');
|
|
59
|
-
assert.ok(completeMilestoneMatch, 'gsd_complete_milestone should appear in a numbered step');
|
|
60
|
-
|
|
61
|
-
const projectIdx = completeMilestoneMd.indexOf(projectMatch![0]);
|
|
62
|
-
const learningsIdx = completeMilestoneMd.indexOf(learningsMatch![0]);
|
|
63
|
-
const completeMilestoneIdx = completeMilestoneMd.indexOf(completeMilestoneMatch![0]);
|
|
64
|
-
assert.ok(projectIdx < completeMilestoneIdx, 'PROJECT.md update must happen before gsd_complete_milestone');
|
|
65
|
-
assert.ok(learningsIdx < completeMilestoneIdx, 'learnings extraction must happen before gsd_complete_milestone');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test('complete-milestone duplicate guard checks milestone status before durable writes', () => {
|
|
69
|
-
const guardMatch = completeMilestoneMd.match(/^\d+\.\s.*gsd_milestone_status/m);
|
|
70
|
-
const reqUpdateMatch = completeMilestoneMd.match(/^\d+\.\s.*gsd_requirement_update/m);
|
|
71
|
-
assert.ok(guardMatch, 'complete-milestone must start with a gsd_milestone_status duplicate guard');
|
|
72
|
-
assert.ok(reqUpdateMatch, 'gsd_requirement_update should appear in a numbered step');
|
|
32
|
+
function numberedStepIndex(prompt: string, needle: RegExp): number {
|
|
33
|
+
const lines = prompt.split('\n');
|
|
34
|
+
const idx = lines.findIndex((line) => /^\d+\.\s/.test(line) && needle.test(line));
|
|
35
|
+
assert.notEqual(idx, -1, `missing numbered step matching ${needle}`);
|
|
36
|
+
return idx;
|
|
37
|
+
}
|
|
73
38
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
/
|
|
83
|
-
|
|
84
|
-
);
|
|
85
|
-
});
|
|
39
|
+
describe('prompt step ordering (#3696)', () => {
|
|
40
|
+
test('complete-milestone prompt orders durable writes before gsd_complete_milestone', async () => {
|
|
41
|
+
const base = makePromptBase();
|
|
42
|
+
try {
|
|
43
|
+
const prompt = await buildCompleteMilestonePrompt('M001', 'Milestone', base, 'minimal');
|
|
44
|
+
const guardIdx = numberedStepIndex(prompt, /gsd_milestone_status/);
|
|
45
|
+
const requirementIdx = numberedStepIndex(prompt, /gsd_requirement_update/);
|
|
46
|
+
const projectIdx = numberedStepIndex(prompt, /PROJECT\.md/);
|
|
47
|
+
const learningsIdx = numberedStepIndex(prompt, /Extract structured learnings/);
|
|
48
|
+
const completeIdx = numberedStepIndex(prompt, /gsd_complete_milestone/);
|
|
86
49
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
50
|
+
assert.ok(guardIdx < requirementIdx);
|
|
51
|
+
assert.ok(requirementIdx < completeIdx);
|
|
52
|
+
assert.ok(projectIdx < completeIdx);
|
|
53
|
+
assert.ok(learningsIdx < completeIdx);
|
|
54
|
+
assert.match(prompt, /status(?:`|\*\*)?\s+(?:is\s+)?(?:`complete`|"complete")/i);
|
|
55
|
+
} finally {
|
|
56
|
+
rmSync(base, { recursive: true, force: true });
|
|
57
|
+
}
|
|
90
58
|
});
|
|
91
|
-
});
|
|
92
59
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
'
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
);
|
|
60
|
+
test('complete-slice prompt exposes gsd_requirement_update', async () => {
|
|
61
|
+
const base = makePromptBase();
|
|
62
|
+
try {
|
|
63
|
+
const prompt = await buildCompleteSlicePrompt('M001', 'Milestone', 'S01', 'Done', base, 'minimal');
|
|
64
|
+
assert.match(prompt, /gsd_requirement_update/);
|
|
65
|
+
} finally {
|
|
66
|
+
rmSync(base, { recursive: true, force: true });
|
|
67
|
+
}
|
|
102
68
|
});
|
|
103
69
|
});
|
|
104
70
|
|
|
105
71
|
describe('register-hooks session_before_compact (#3696)', () => {
|
|
106
|
-
test('
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
// multiple pi.on("session_before_compact") handlers and a later handler
|
|
114
|
-
// legitimately references isAutoPaused.
|
|
115
|
-
const afterCompact = extractSourceRegion(
|
|
116
|
-
registerHooksSrc,
|
|
117
|
-
'pi.on("session_before_compact"',
|
|
118
|
-
'pi.on("',
|
|
119
|
-
// NB: endAnchor search starts AFTER the startAnchor, so the next
|
|
120
|
-
// pi.on("... matches the subsequent handler rather than this one.
|
|
121
|
-
);
|
|
122
|
-
assert.match(afterCompact, /isAutoActive\(\)/,
|
|
123
|
-
'session_before_compact should check isAutoActive()');
|
|
124
|
-
// Should NOT block compaction when paused
|
|
125
|
-
assert.ok(
|
|
126
|
-
!afterCompact.includes('isAutoPaused()'),
|
|
127
|
-
'session_before_compact should not check isAutoPaused',
|
|
128
|
-
);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
test('session_before_compact does not gate checkpointing to executing phase (#4258)', () => {
|
|
132
|
-
const compactIdx = registerHooksSrc.indexOf('session_before_compact');
|
|
133
|
-
assert.ok(compactIdx > -1, 'session_before_compact hook should exist');
|
|
72
|
+
test('registered hook cancels compaction only while auto-mode is active', async () => {
|
|
73
|
+
const handlers = new Map<string, Function>();
|
|
74
|
+
registerHooks({
|
|
75
|
+
on(event: string, handler: Function) {
|
|
76
|
+
handlers.set(event, handler);
|
|
77
|
+
},
|
|
78
|
+
} as any, []);
|
|
134
79
|
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
registerHooksSrc.indexOf('const sliceDir', compactIdx),
|
|
138
|
-
);
|
|
80
|
+
const compact = handlers.get('session_before_compact');
|
|
81
|
+
assert.ok(compact, 'session_before_compact hook should be registered');
|
|
139
82
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
83
|
+
_setAutoActiveForTest(true);
|
|
84
|
+
try {
|
|
85
|
+
const result = await compact({}, { cwd: mkdtempSync(join(tmpdir(), 'gsd-compact-active-')), ui: { notify() {}, setWidget() {} } });
|
|
86
|
+
assert.deepEqual(result, { cancel: true });
|
|
87
|
+
} finally {
|
|
88
|
+
_setAutoActiveForTest(false);
|
|
89
|
+
}
|
|
145
90
|
});
|
|
146
91
|
});
|
|
@@ -7,20 +7,17 @@
|
|
|
7
7
|
|
|
8
8
|
import test from "node:test";
|
|
9
9
|
import assert from "node:assert/strict";
|
|
10
|
-
import { readFileSync } from "node:fs";
|
|
11
|
-
import { join, dirname } from "node:path";
|
|
12
|
-
import { fileURLToPath } from "node:url";
|
|
13
10
|
import { classifyError, isTransient, isTransientNetworkError } from "../error-classifier.ts";
|
|
14
11
|
import { pauseAutoForProviderError } from "../provider-error-pause.ts";
|
|
15
12
|
import { resumeAutoAfterProviderDelay } from "../bootstrap/provider-error-resume.ts";
|
|
16
|
-
import { MAX_TRANSIENT_AUTO_RESUMES } from "../bootstrap/agent-end-recovery.ts";
|
|
13
|
+
import { MAX_TRANSIENT_AUTO_RESUMES, resetTransientRetryState } from "../bootstrap/agent-end-recovery.ts";
|
|
14
|
+
import { _buildCancelledUnitStopReason } from "../auto/phases.ts";
|
|
17
15
|
import { getNextFallbackModel } from "../preferences.ts";
|
|
18
16
|
// Zero-import module — imported by path rather than through the package
|
|
19
17
|
// barrel to avoid pulling the full AgentSession / @gsd/pi-ai dep graph into
|
|
20
18
|
// this unit test (see #4837).
|
|
21
19
|
import { RETRYABLE_ERROR_RE } from "../../../../../packages/pi-coding-agent/src/core/retryable-error-regex.ts";
|
|
22
|
-
|
|
23
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
import { streamOpenAICodexResponses } from "../../../../../packages/pi-ai/src/providers/openai-codex-responses.ts";
|
|
24
21
|
|
|
25
22
|
// ── classifyError ────────────────────────────────────────────────────────────
|
|
26
23
|
|
|
@@ -518,172 +515,73 @@ test("resumeAutoAfterProviderDelay resets provider retry state without clearing
|
|
|
518
515
|
]);
|
|
519
516
|
});
|
|
520
517
|
|
|
521
|
-
// ──
|
|
522
|
-
|
|
523
|
-
test("agent-end-recovery.ts tracks consecutive transient errors for escalating backoff", () => {
|
|
524
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
525
|
-
|
|
526
|
-
assert.ok(
|
|
527
|
-
src.includes("consecutiveTransientCount"),
|
|
528
|
-
"agent-end-recovery.ts must track consecutiveTransientCount for escalating backoff (#1166)",
|
|
529
|
-
);
|
|
530
|
-
assert.ok(
|
|
531
|
-
src.includes("MAX_TRANSIENT_AUTO_RESUMES"),
|
|
532
|
-
"agent-end-recovery.ts must define MAX_TRANSIENT_AUTO_RESUMES to cap infinite retries (#1166)",
|
|
533
|
-
);
|
|
534
|
-
});
|
|
535
|
-
|
|
536
|
-
test("agent-end-recovery.ts resets retry state before resolveAgentEnd on success", () => {
|
|
537
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
538
|
-
|
|
539
|
-
// After successful agent_end, resetRetryState must be called before resolveAgentEnd.
|
|
540
|
-
assert.ok(
|
|
541
|
-
/resetRetryState[\s\S]{0,250}resolveAgentEnd/.test(src),
|
|
542
|
-
"resetRetryState must be called before resolveAgentEnd on the success path (#1166)",
|
|
543
|
-
);
|
|
544
|
-
});
|
|
545
|
-
|
|
546
|
-
test("agent-end-recovery.ts applies escalating delay for repeated transient errors", () => {
|
|
547
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
518
|
+
// ── Provider recovery behavior (#1166 / #2813 / #4373) ─────────────────────
|
|
548
519
|
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
"agent-end-recovery.ts must escalate retryAfterMs exponentially for consecutive transient errors (#1166)",
|
|
553
|
-
);
|
|
520
|
+
test("resetTransientRetryState is callable by resume recovery", () => {
|
|
521
|
+
resetTransientRetryState();
|
|
522
|
+
assert.equal(classifyError("stream_exhausted_without_result").kind, "connection");
|
|
554
523
|
});
|
|
555
524
|
|
|
556
|
-
test("
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
});
|
|
568
|
-
|
|
569
|
-
test("agent-end-recovery.ts does not defer rate-limit errors to core retry handler before fallback (#4373)", () => {
|
|
570
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
571
|
-
assert.ok(
|
|
572
|
-
src.includes('if (isTransient(cls) && cls.kind !== "rate-limit")'),
|
|
573
|
-
"rate-limit errors must bypass transient core-retry deferral so fallback can execute (#4373)",
|
|
574
|
-
);
|
|
575
|
-
});
|
|
576
|
-
|
|
577
|
-
test("agent-end-recovery.ts updates dashboard dispatched model after fallback switch", () => {
|
|
578
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
579
|
-
assert.ok(
|
|
580
|
-
src.includes("setCurrentDispatchedModelId"),
|
|
581
|
-
"agent-end-recovery.ts should update currentDispatchedModelId when recovery switches model",
|
|
582
|
-
);
|
|
583
|
-
});
|
|
584
|
-
|
|
585
|
-
// ── Codex error extraction (#1166) ──────────────────────────────────────────
|
|
586
|
-
|
|
587
|
-
test("openai-codex-responses.ts extracts nested error fields", () => {
|
|
588
|
-
const codexSource = readFileSync(
|
|
589
|
-
join(__dirname, "../../../../../packages/pi-ai/src/providers/openai-codex-responses.ts"),
|
|
590
|
-
"utf-8",
|
|
591
|
-
);
|
|
592
|
-
|
|
593
|
-
// Must access event.error.message (nested), not just event.message (top-level)
|
|
594
|
-
assert.ok(
|
|
595
|
-
codexSource.includes("errorObj?.message"),
|
|
596
|
-
"mapCodexEvents must extract message from nested event.error object (#1166)",
|
|
597
|
-
);
|
|
598
|
-
assert.ok(
|
|
599
|
-
codexSource.includes("errorObj?.type"),
|
|
600
|
-
"mapCodexEvents must extract type from nested event.error object (#1166)",
|
|
601
|
-
);
|
|
602
|
-
});
|
|
603
|
-
|
|
604
|
-
// ── Fix 1: resetTransientRetryState resets module-level singleton ────────────
|
|
605
|
-
|
|
606
|
-
test("resetTransientRetryState is exported from agent-end-recovery.ts", () => {
|
|
607
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
608
|
-
assert.ok(
|
|
609
|
-
src.includes("export function resetTransientRetryState"),
|
|
610
|
-
"agent-end-recovery.ts must export resetTransientRetryState for provider-error-resume.ts",
|
|
525
|
+
test("cancelled unit stop reason differentiates session startup failures", () => {
|
|
526
|
+
assert.deepEqual(
|
|
527
|
+
_buildCancelledUnitStopReason("plan-slice", "S01", {
|
|
528
|
+
category: "session-failed",
|
|
529
|
+
message: "Session creation timed out",
|
|
530
|
+
}),
|
|
531
|
+
{
|
|
532
|
+
notifyMessage: "Session creation failed for plan-slice S01: Session creation timed out. Stopping auto-mode.",
|
|
533
|
+
stopReason: "Session creation failed: Session creation timed out",
|
|
534
|
+
loopReason: "session-failed",
|
|
535
|
+
},
|
|
611
536
|
);
|
|
612
|
-
});
|
|
613
|
-
|
|
614
|
-
// ── Fix 2: Session creation timeout treated as transient in phases.ts ───────
|
|
615
|
-
|
|
616
|
-
test("phases.ts handles timeout session-creation failures with pause instead of stopAuto", () => {
|
|
617
|
-
const src = readFileSync(join(__dirname, "..", "auto", "phases.ts"), "utf-8");
|
|
618
537
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
assert.ok(
|
|
630
|
-
/errorCategory === "timeout"[\s\S]{0,1800}pauseAuto/.test(src),
|
|
631
|
-
"phases.ts must call pauseAuto for session-timeout failures (not stopAuto or continue)",
|
|
632
|
-
);
|
|
633
|
-
assert.ok(
|
|
634
|
-
/errorCategory === "session-failed"[\s\S]{0,700}pauseAuto/.test(src),
|
|
635
|
-
"phases.ts must call pauseAuto for transient session-start failures (not stopAuto or continue)",
|
|
636
|
-
);
|
|
637
|
-
// Must NOT use action: "continue" for transient cancellations (causes infinite loops)
|
|
638
|
-
assert.ok(
|
|
639
|
-
!/isTransient[\s\S]{0,500}action:\s*"continue"/.test(src),
|
|
640
|
-
"phases.ts must NOT return action:continue for cancelled units — use break+pause instead",
|
|
538
|
+
assert.deepEqual(
|
|
539
|
+
_buildCancelledUnitStopReason("execute-task", "T01", {
|
|
540
|
+
category: "aborted",
|
|
541
|
+
message: "Request aborted by user",
|
|
542
|
+
}),
|
|
543
|
+
{
|
|
544
|
+
notifyMessage: "Unit execute-task T01 aborted after dispatch: Request aborted by user. Stopping auto-mode.",
|
|
545
|
+
stopReason: "Unit aborted: Request aborted by user",
|
|
546
|
+
loopReason: "unit-aborted",
|
|
547
|
+
},
|
|
641
548
|
);
|
|
642
549
|
});
|
|
643
550
|
|
|
644
|
-
|
|
551
|
+
test("openai-codex response stream surfaces nested error type and message", async () => {
|
|
552
|
+
const originalFetch = globalThis.fetch;
|
|
553
|
+
const tokenPayload = Buffer.from(JSON.stringify({
|
|
554
|
+
"https://api.openai.com/auth": { chatgpt_account_id: "acct-test" },
|
|
555
|
+
})).toString("base64");
|
|
556
|
+
const apiKey = `header.${tokenPayload}.signature`;
|
|
557
|
+
globalThis.fetch = (async () => new Response(
|
|
558
|
+
'data: {"type":"error","error":{"type":"server_error","code":"server_error","message":"upstream failed"}}\n\n',
|
|
559
|
+
{ status: 200, headers: { "content-type": "text/event-stream" } },
|
|
560
|
+
)) as typeof fetch;
|
|
645
561
|
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
src.includes("resumeAutoAfterProviderDelay"),
|
|
657
|
-
"phases.ts must schedule resume via resumeAutoAfterProviderDelay",
|
|
658
|
-
);
|
|
659
|
-
// Must track consecutive session timeouts
|
|
660
|
-
assert.ok(
|
|
661
|
-
src.includes("consecutiveSessionTimeouts"),
|
|
662
|
-
"phases.ts must track consecutive session timeouts for escalating backoff",
|
|
663
|
-
);
|
|
664
|
-
// Must cap session timeout auto-resumes
|
|
665
|
-
assert.ok(
|
|
666
|
-
/MAX_SESSION_TIMEOUT_AUTO_RESUMES\s*=\s*\d+/.test(src),
|
|
667
|
-
"phases.ts must cap session timeout auto-resumes",
|
|
668
|
-
);
|
|
669
|
-
});
|
|
562
|
+
try {
|
|
563
|
+
const stream = streamOpenAICodexResponses(
|
|
564
|
+
{
|
|
565
|
+
provider: "openai-codex-responses",
|
|
566
|
+
id: "gpt-5.1-codex",
|
|
567
|
+
baseUrl: "https://codex.example.test",
|
|
568
|
+
} as any,
|
|
569
|
+
{ messages: [], systemPrompt: "", tools: [] } as any,
|
|
570
|
+
{ apiKey } as any,
|
|
571
|
+
);
|
|
670
572
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
"phases.ts must check for 'Session creation timed out' message to differentiate from unit hard timeout",
|
|
676
|
-
);
|
|
677
|
-
});
|
|
573
|
+
const events = [];
|
|
574
|
+
for await (const event of stream) {
|
|
575
|
+
events.push(event);
|
|
576
|
+
}
|
|
678
577
|
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
);
|
|
578
|
+
const errorEvent = events.find((event) => event.type === "error");
|
|
579
|
+
assert.ok(errorEvent, "stream should emit an error event");
|
|
580
|
+
assert.equal(errorEvent.error.errorMessage, "Codex server_error: upstream failed");
|
|
581
|
+
assert.equal(classifyError(errorEvent.error.errorMessage).kind, "server");
|
|
582
|
+
} finally {
|
|
583
|
+
globalThis.fetch = originalFetch;
|
|
584
|
+
}
|
|
687
585
|
});
|
|
688
586
|
|
|
689
587
|
// ── Fix 3: MAX_TRANSIENT_AUTO_RESUMES raised to 8 ───────────────────────────
|
|
@@ -6,42 +6,46 @@
|
|
|
6
6
|
* The fix imports ensureDbOpen from dynamic-tools and calls it before
|
|
7
7
|
* querying the DB.
|
|
8
8
|
*
|
|
9
|
-
* This
|
|
10
|
-
*
|
|
9
|
+
* This behavior test registers the query tool and executes it against a
|
|
10
|
+
* temp workspace where the DB must be opened on demand.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { describe, test } from 'node:test';
|
|
14
14
|
import assert from 'node:assert/strict';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const __dirname = dirname(__filename);
|
|
21
|
-
|
|
22
|
-
const source = readFileSync(join(__dirname, '..', 'bootstrap', 'query-tools.ts'), 'utf-8');
|
|
15
|
+
import { mkdirSync, mkdtempSync, rmSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { tmpdir } from 'node:os';
|
|
18
|
+
import { closeDatabase, insertMilestone, openDatabase } from '../gsd-db.ts';
|
|
19
|
+
import { registerQueryTools } from '../bootstrap/query-tools.ts';
|
|
23
20
|
|
|
24
21
|
describe('query-tools ensureDbOpen usage (#3672)', () => {
|
|
25
|
-
test('
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
test('gsd_milestone_status opens the workspace DB before querying', async () => {
|
|
23
|
+
const base = mkdtempSync(join(tmpdir(), 'gsd-query-tools-'));
|
|
24
|
+
const dbPath = join(base, '.gsd', 'gsd.db');
|
|
25
|
+
const tools: Record<string, any> = {};
|
|
26
|
+
const originalCwd = process.cwd();
|
|
27
|
+
try {
|
|
28
|
+
mkdirSync(join(base, '.gsd'), { recursive: true });
|
|
29
|
+
openDatabase(dbPath);
|
|
30
|
+
insertMilestone({ id: 'M001', title: 'Query me', status: 'active' });
|
|
31
|
+
closeDatabase();
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
assert.doesNotMatch(executeBlock, /isDbAvailable,/,
|
|
40
|
-
'execute path should not destructure isDbAvailable (replaced by ensureDbOpen)');
|
|
41
|
-
});
|
|
33
|
+
registerQueryTools({ registerTool(tool: any) { tools[tool.name] = tool; } } as any);
|
|
34
|
+
process.chdir(base);
|
|
35
|
+
const result = await tools.gsd_milestone_status.execute(
|
|
36
|
+
'call-1',
|
|
37
|
+
{ milestoneId: 'M001' },
|
|
38
|
+
undefined,
|
|
39
|
+
undefined,
|
|
40
|
+
undefined,
|
|
41
|
+
);
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
assert.notEqual(result.details?.error, 'db_unavailable');
|
|
44
|
+
assert.equal(result.details?.milestoneId ?? result.details?.milestone?.id, 'M001');
|
|
45
|
+
} finally {
|
|
46
|
+
process.chdir(originalCwd);
|
|
47
|
+
closeDatabase();
|
|
48
|
+
rmSync(base, { recursive: true, force: true });
|
|
49
|
+
}
|
|
46
50
|
});
|
|
47
51
|
});
|