gsd-pi 2.77.0-dev.eaa4973bc → 2.78.0
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 +1 -1
- package/dist/claude-cli-check.js +5 -1
- package/dist/headless.js +49 -4
- package/dist/loader.js +0 -0
- package/dist/resource-loader.d.ts +40 -0
- package/dist/resource-loader.js +32 -13
- package/dist/resources/extensions/browser-tools/capture.js +9 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
- package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +5 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +481 -17
- package/dist/resources/extensions/github-sync/templates.js +103 -0
- package/dist/resources/extensions/google-search/index.js +3 -2
- package/dist/resources/extensions/gsd/auto/loop.js +124 -2
- package/dist/resources/extensions/gsd/auto/phases.js +57 -39
- package/dist/resources/extensions/gsd/auto/session.js +6 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +142 -29
- package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
- package/dist/resources/extensions/gsd/auto-post-unit.js +150 -64
- package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
- package/dist/resources/extensions/gsd/auto-recovery.js +197 -48
- package/dist/resources/extensions/gsd/auto-start.js +107 -29
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +122 -26
- package/dist/resources/extensions/gsd/auto.js +76 -21
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +3 -6
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
- package/dist/resources/extensions/gsd/component-loader.js +447 -0
- package/dist/resources/extensions/gsd/component-types.js +69 -0
- package/dist/resources/extensions/gsd/context-store.js +23 -7
- package/dist/resources/extensions/gsd/detection.js +49 -1
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -17
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/forensics.js +106 -0
- package/dist/resources/extensions/gsd/gate-registry.js +2 -2
- package/dist/resources/extensions/gsd/git-constants.js +28 -1
- package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
- package/dist/resources/extensions/gsd/git-service.js +126 -2
- package/dist/resources/extensions/gsd/gsd-db.js +6 -3
- package/dist/resources/extensions/gsd/guided-flow.js +39 -13
- package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
- package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
- package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
- package/dist/resources/extensions/gsd/model-router.js +6 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
- package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
- package/dist/resources/extensions/gsd/service-tier.js +5 -2
- package/dist/resources/extensions/gsd/session-lock.js +19 -10
- package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
- package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
- package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
- package/dist/resources/extensions/gsd/state.js +69 -58
- package/dist/resources/extensions/gsd/sync-lock.js +98 -42
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
- package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
- package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
- package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
- package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
- package/dist/resources/extensions/gsd/uok/writer.js +82 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +85 -8
- package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
- package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
- package/dist/resources/extensions/mcp-client/index.js +3 -1
- package/dist/resources/extensions/ollama/index.js +5 -1
- package/dist/resources/extensions/remote-questions/manager.js +11 -5
- 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 +12 -12
- 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/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -1
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- 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/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +2 -3
- package/packages/daemon/package.json +2 -2
- package/packages/daemon/src/logger.ts +4 -3
- package/packages/mcp-server/dist/server.d.ts +24 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +88 -87
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +15 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/mcp-server.test.ts +25 -3
- package/packages/mcp-server/src/readers/graph.test.ts +87 -15
- package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
- package/packages/mcp-server/src/server.ts +131 -105
- package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
- package/packages/mcp-server/src/workflow-tools.ts +19 -6
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +2 -2
- package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
- package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
- package/packages/native/src/__tests__/ps.test.mjs +14 -8
- package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
- package/packages/native/src/__tests__/truncate.test.mjs +17 -2
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +5 -15
- package/packages/pi-agent-core/src/agent.test.ts +96 -102
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +9 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +43 -70
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +36 -11
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +44 -0
- package/packages/pi-ai/src/models/capability-patches.ts +10 -2
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openai.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +46 -73
- package/packages/pi-ai/src/models.test.ts +48 -11
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
- 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-model-switch.test.js +75 -12
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -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 +61 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +30 -4
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +17 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -2
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
- 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/dynamic-border.test.js +20 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
- 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 +30 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +125 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -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 +105 -13
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
- package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +58 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +35 -4
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +20 -0
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
- package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +35 -1
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
- package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +37 -11
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
- package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
- package/packages/pi-tui/dist/components/editor.d.ts +14 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +19 -0
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/dist/components/image.test.js +6 -5
- package/packages/pi-tui/dist/components/image.test.js.map +1 -1
- package/packages/pi-tui/dist/editor-component.d.ts +2 -0
- package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
- package/packages/pi-tui/dist/editor-component.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +24 -8
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
- package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +42 -11
- package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
- package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
- package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
- package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
- package/packages/pi-tui/src/components/editor.ts +22 -0
- package/packages/pi-tui/src/components/image.test.ts +10 -5
- package/packages/pi-tui/src/editor-component.ts +3 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/dist/rpc-client.test.js +101 -51
- package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/src/rpc-client.test.ts +109 -52
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/scripts/install.js +15 -1
- package/src/resources/extensions/browser-tools/capture.ts +12 -0
- package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
- package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +5 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +518 -19
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +919 -75
- package/src/resources/extensions/github-sync/templates.ts +151 -0
- package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
- package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
- package/src/resources/extensions/google-search/index.ts +3 -2
- package/src/resources/extensions/gsd/auto/loop.ts +142 -2
- package/src/resources/extensions/gsd/auto/phases.ts +62 -38
- package/src/resources/extensions/gsd/auto/session.ts +7 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +156 -29
- package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
- package/src/resources/extensions/gsd/auto-post-unit.ts +163 -73
- package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
- package/src/resources/extensions/gsd/auto-recovery.ts +230 -51
- package/src/resources/extensions/gsd/auto-start.ts +127 -9
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +130 -26
- package/src/resources/extensions/gsd/auto.ts +90 -23
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +3 -7
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
- package/src/resources/extensions/gsd/component-loader.ts +598 -0
- package/src/resources/extensions/gsd/component-types.ts +362 -0
- package/src/resources/extensions/gsd/context-store.ts +25 -8
- package/src/resources/extensions/gsd/detection.ts +58 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -20
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/forensics.ts +118 -1
- package/src/resources/extensions/gsd/gate-registry.ts +2 -2
- package/src/resources/extensions/gsd/git-constants.ts +30 -1
- package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
- package/src/resources/extensions/gsd/git-service.ts +149 -2
- package/src/resources/extensions/gsd/gsd-db.ts +6 -3
- package/src/resources/extensions/gsd/guided-flow.ts +57 -14
- package/src/resources/extensions/gsd/journal.ts +11 -1
- package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
- package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
- package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
- package/src/resources/extensions/gsd/model-router.ts +6 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
- package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
- package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
- package/src/resources/extensions/gsd/service-tier.ts +5 -2
- package/src/resources/extensions/gsd/session-lock.ts +20 -10
- package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
- package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
- package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
- package/src/resources/extensions/gsd/state.ts +76 -66
- package/src/resources/extensions/gsd/sync-lock.ts +97 -39
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +133 -292
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
- package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
- package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
- package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +8 -37
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
- package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
- package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +23 -24
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
- package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
- package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
- package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
- package/src/resources/extensions/gsd/types.ts +3 -3
- package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
- package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
- package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
- package/src/resources/extensions/gsd/uok/writer.ts +113 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +108 -7
- package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
- package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
- package/src/resources/extensions/mcp-client/index.ts +3 -1
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
- package/src/resources/extensions/ollama/index.ts +5 -1
- package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
- package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
- package/src/resources/extensions/remote-questions/manager.ts +36 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
- package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
- package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
- package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
- package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
- /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → C1zT2kEfoLhDdbWPWKrXd}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → C1zT2kEfoLhDdbWPWKrXd}/_ssgManifest.js +0 -0
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import test, { mock } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { resolve } from "node:path";
|
|
5
3
|
|
|
6
4
|
import {
|
|
7
5
|
resolveAgentEnd,
|
|
@@ -17,6 +15,7 @@ import {
|
|
|
17
15
|
type AgentEndEvent,
|
|
18
16
|
type LoopDeps,
|
|
19
17
|
} from "../auto-loop.js";
|
|
18
|
+
import { ModelPolicyDispatchBlockedError } from "../auto-model-selection.js";
|
|
20
19
|
import type { SessionLockStatus } from "../session-lock.js";
|
|
21
20
|
|
|
22
21
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
@@ -556,65 +555,15 @@ test("auto-loop.ts exports autoLoop, runUnit, resolveAgentEnd", async () => {
|
|
|
556
555
|
);
|
|
557
556
|
});
|
|
558
557
|
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
});
|
|
569
|
-
|
|
570
|
-
test("auto/resolve.ts one-shot pattern: _currentResolve is nulled before calling resolver", () => {
|
|
571
|
-
const src = readFileSync(
|
|
572
|
-
resolve(import.meta.dirname, "..", "auto", "resolve.ts"),
|
|
573
|
-
"utf-8",
|
|
574
|
-
);
|
|
575
|
-
// The one-shot pattern requires: save ref, null the variable, then call
|
|
576
|
-
const resolveBlock = src.slice(
|
|
577
|
-
src.indexOf("export function resolveAgentEnd"),
|
|
578
|
-
src.indexOf("export function resolveAgentEnd") + 600,
|
|
579
|
-
);
|
|
580
|
-
const nullIdx = resolveBlock.indexOf("_currentResolve = null");
|
|
581
|
-
const callIdx = resolveBlock.indexOf("r({");
|
|
582
|
-
assert.ok(nullIdx > 0, "should null _currentResolve in resolveAgentEnd");
|
|
583
|
-
assert.ok(callIdx > 0, "should call resolver in resolveAgentEnd");
|
|
584
|
-
assert.ok(
|
|
585
|
-
nullIdx < callIdx,
|
|
586
|
-
"_currentResolve should be nulled before calling the resolver (one-shot)",
|
|
587
|
-
);
|
|
588
|
-
});
|
|
589
|
-
|
|
590
|
-
test("auto/phases.ts: selectAndApplyModel called exactly once and before updateProgressWidget (#2907)", () => {
|
|
591
|
-
const src = readFileSync(
|
|
592
|
-
resolve(import.meta.dirname, "..", "auto", "phases.ts"),
|
|
593
|
-
"utf-8",
|
|
594
|
-
);
|
|
595
|
-
// Extract the runUnitPhase function body
|
|
596
|
-
const fnStart = src.indexOf("export async function runUnitPhase");
|
|
597
|
-
assert.ok(fnStart > 0, "runUnitPhase should exist in phases.ts");
|
|
598
|
-
const fnBody = src.slice(fnStart, fnStart + 16000);
|
|
599
|
-
|
|
600
|
-
// selectAndApplyModel must appear exactly once
|
|
601
|
-
const allOccurrences = [...fnBody.matchAll(/selectAndApplyModel\(/g)];
|
|
602
|
-
assert.equal(
|
|
603
|
-
allOccurrences.length,
|
|
604
|
-
1,
|
|
605
|
-
`selectAndApplyModel should be called exactly once in runUnitPhase, found ${allOccurrences.length} calls`,
|
|
606
|
-
);
|
|
607
|
-
|
|
608
|
-
// selectAndApplyModel must appear BEFORE updateProgressWidget
|
|
609
|
-
const modelIdx = fnBody.indexOf("selectAndApplyModel(");
|
|
610
|
-
const widgetIdx = fnBody.indexOf("updateProgressWidget(");
|
|
611
|
-
assert.ok(modelIdx > 0, "selectAndApplyModel should exist in runUnitPhase");
|
|
612
|
-
assert.ok(widgetIdx > 0, "updateProgressWidget should exist in runUnitPhase");
|
|
613
|
-
assert.ok(
|
|
614
|
-
modelIdx < widgetIdx,
|
|
615
|
-
"selectAndApplyModel must be called BEFORE updateProgressWidget (#2899/#2907)",
|
|
616
|
-
);
|
|
617
|
-
});
|
|
558
|
+
// NOTE: the "while keyword", "one-shot null-before-resolve", and
|
|
559
|
+
// "selectAndApplyModel before updateProgressWidget" source-grep tests
|
|
560
|
+
// previously here were deleted as tautological (readFileSync + substring
|
|
561
|
+
// match). The one-shot pattern is already covered behaviourally by the
|
|
562
|
+
// "double resolveAgentEnd only resolves once" test above, which drives the
|
|
563
|
+
// real resolveAgentEnd/runUnit flow and asserts on the observable promise
|
|
564
|
+
// outcome. The phases.ts ordering contract is tracked via a follow-up
|
|
565
|
+
// issue proposing extraction of a pure `dispatchOrder` helper (per the
|
|
566
|
+
// #4832/PR #4859 precedent) so it can be tested behaviourally.
|
|
618
567
|
|
|
619
568
|
// ─── autoLoop tests (T02) ─────────────────────────────────────────────────
|
|
620
569
|
|
|
@@ -851,6 +800,45 @@ test("autoLoop exits on terminal complete state", async (t) => {
|
|
|
851
800
|
);
|
|
852
801
|
});
|
|
853
802
|
|
|
803
|
+
test("autoLoop pauses when provider readiness cancels before dispatch", async () => {
|
|
804
|
+
_resetPendingResolve();
|
|
805
|
+
|
|
806
|
+
const notifications: Array<{ message: string; level?: string }> = [];
|
|
807
|
+
const ctx = makeMockCtx();
|
|
808
|
+
ctx.ui.setStatus = () => {};
|
|
809
|
+
ctx.ui.notify = (message: string, level?: string) => {
|
|
810
|
+
notifications.push({ message, level });
|
|
811
|
+
};
|
|
812
|
+
ctx.model = { provider: "anthropic", id: "claude-opus-4-6" };
|
|
813
|
+
ctx.modelRegistry = {
|
|
814
|
+
getProviderAuthMode: () => "api-key",
|
|
815
|
+
isProviderRequestReady: () => false,
|
|
816
|
+
};
|
|
817
|
+
|
|
818
|
+
const pi = makeMockPi();
|
|
819
|
+
const s = makeLoopSession();
|
|
820
|
+
const deps = makeMockDeps({
|
|
821
|
+
selectAndApplyModel: async () => ({
|
|
822
|
+
routing: null,
|
|
823
|
+
appliedModel: { provider: "anthropic", id: "claude-opus-4-6" },
|
|
824
|
+
}),
|
|
825
|
+
});
|
|
826
|
+
|
|
827
|
+
await autoLoop(ctx, pi, s, deps);
|
|
828
|
+
|
|
829
|
+
assert.equal(pi.calls.length, 0, "provider readiness cancellation must not dispatch a message");
|
|
830
|
+
assert.ok(deps.callLog.includes("pauseAuto"), "provider readiness cancellation should pause auto-mode");
|
|
831
|
+
assert.ok(!deps.callLog.includes("stopAuto"), "provider readiness cancellation should not hard-stop auto-mode");
|
|
832
|
+
assert.ok(
|
|
833
|
+
!deps.callLog.includes("postUnitPreVerification"),
|
|
834
|
+
"post-unit verification must not run after pre-dispatch provider cancellation",
|
|
835
|
+
);
|
|
836
|
+
assert.ok(
|
|
837
|
+
notifications.some(n => /Provider anthropic is not request-ready/.test(n.message)),
|
|
838
|
+
"provider pause should notify with the readiness failure",
|
|
839
|
+
);
|
|
840
|
+
});
|
|
841
|
+
|
|
854
842
|
test("autoLoop passes structured session-lock failure details to the handler", async () => {
|
|
855
843
|
_resetPendingResolve();
|
|
856
844
|
|
|
@@ -1412,217 +1400,18 @@ test("autoLoop exits when no active milestone found", async (t) => {
|
|
|
1412
1400
|
);
|
|
1413
1401
|
});
|
|
1414
1402
|
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
const src = readFileSync(
|
|
1428
|
-
resolve(import.meta.dirname, "..", "auto", "loop.ts"),
|
|
1429
|
-
"utf-8",
|
|
1430
|
-
);
|
|
1431
|
-
assert.ok(
|
|
1432
|
-
src.includes("deps: LoopDeps"),
|
|
1433
|
-
"autoLoop should accept a deps: LoopDeps parameter",
|
|
1434
|
-
);
|
|
1435
|
-
});
|
|
1436
|
-
|
|
1437
|
-
test("autoLoop contains while (s.active) loop", () => {
|
|
1438
|
-
const src = readFileSync(
|
|
1439
|
-
resolve(import.meta.dirname, "..", "auto", "loop.ts"),
|
|
1440
|
-
"utf-8",
|
|
1441
|
-
);
|
|
1442
|
-
assert.ok(
|
|
1443
|
-
src.includes("while (s.active)"),
|
|
1444
|
-
"autoLoop should contain a while (s.active) loop",
|
|
1445
|
-
);
|
|
1446
|
-
});
|
|
1447
|
-
|
|
1448
|
-
// ── T03: End-to-end wiring structural assertions ─────────────────────────────
|
|
1449
|
-
|
|
1450
|
-
test("auto-loop.ts barrel re-exports autoLoop, runUnit, and resolveAgentEnd", () => {
|
|
1451
|
-
const barrel = readFileSync(
|
|
1452
|
-
resolve(import.meta.dirname, "..", "auto-loop.ts"),
|
|
1453
|
-
"utf-8",
|
|
1454
|
-
);
|
|
1455
|
-
assert.ok(
|
|
1456
|
-
barrel.includes("autoLoop"),
|
|
1457
|
-
"barrel must re-export autoLoop",
|
|
1458
|
-
);
|
|
1459
|
-
assert.ok(
|
|
1460
|
-
barrel.includes("runUnit"),
|
|
1461
|
-
"barrel must re-export runUnit",
|
|
1462
|
-
);
|
|
1463
|
-
assert.ok(
|
|
1464
|
-
barrel.includes("resolveAgentEnd"),
|
|
1465
|
-
"barrel must re-export resolveAgentEnd",
|
|
1466
|
-
);
|
|
1467
|
-
// Verify the actual function declarations exist in the submodules
|
|
1468
|
-
const loopSrc = readFileSync(
|
|
1469
|
-
resolve(import.meta.dirname, "..", "auto", "loop.ts"),
|
|
1470
|
-
"utf-8",
|
|
1471
|
-
);
|
|
1472
|
-
assert.ok(
|
|
1473
|
-
loopSrc.includes("export async function autoLoop"),
|
|
1474
|
-
"auto/loop.ts must define autoLoop",
|
|
1475
|
-
);
|
|
1476
|
-
const runUnitSrc = readFileSync(
|
|
1477
|
-
resolve(import.meta.dirname, "..", "auto", "run-unit.ts"),
|
|
1478
|
-
"utf-8",
|
|
1479
|
-
);
|
|
1480
|
-
assert.ok(
|
|
1481
|
-
runUnitSrc.includes("export async function runUnit"),
|
|
1482
|
-
"auto/run-unit.ts must define runUnit",
|
|
1483
|
-
);
|
|
1484
|
-
const resolveSrc = readFileSync(
|
|
1485
|
-
resolve(import.meta.dirname, "..", "auto", "resolve.ts"),
|
|
1486
|
-
"utf-8",
|
|
1487
|
-
);
|
|
1488
|
-
assert.ok(
|
|
1489
|
-
resolveSrc.includes("export function resolveAgentEnd"),
|
|
1490
|
-
"auto/resolve.ts must define resolveAgentEnd",
|
|
1491
|
-
);
|
|
1492
|
-
});
|
|
1493
|
-
|
|
1494
|
-
test("auto.ts startAuto dispatches through the UOK kernel wrapper with explicit kernel and legacy paths", () => {
|
|
1495
|
-
const src = readFileSync(
|
|
1496
|
-
resolve(import.meta.dirname, "..", "auto.ts"),
|
|
1497
|
-
"utf-8",
|
|
1498
|
-
);
|
|
1499
|
-
// Find the startAuto function body
|
|
1500
|
-
const fnIdx = src.indexOf("export async function startAuto");
|
|
1501
|
-
assert.ok(fnIdx > -1, "startAuto must exist in auto.ts");
|
|
1502
|
-
const fnEnd = src.indexOf("\n// ─── ", fnIdx + 100);
|
|
1503
|
-
const fnBlock =
|
|
1504
|
-
fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 5000);
|
|
1505
|
-
assert.ok(
|
|
1506
|
-
fnBlock.includes("runAutoLoopWithUok("),
|
|
1507
|
-
"startAuto must dispatch through runAutoLoopWithUok()",
|
|
1508
|
-
);
|
|
1509
|
-
assert.ok(
|
|
1510
|
-
fnBlock.includes("runKernelLoop: runUokKernelLoop"),
|
|
1511
|
-
"startAuto must wire the explicit UOK kernel loop path",
|
|
1512
|
-
);
|
|
1513
|
-
assert.ok(
|
|
1514
|
-
fnBlock.includes("runLegacyLoop: runLegacyAutoLoop"),
|
|
1515
|
-
"startAuto must preserve explicit legacy fallback dispatch",
|
|
1516
|
-
);
|
|
1517
|
-
});
|
|
1518
|
-
|
|
1519
|
-
test("startAuto calls selfHealRuntimeRecords before autoLoop (#1727)", { skip: "selfHealRuntimeRecords moved to crash-recovery pipeline in v3" }, () => {
|
|
1520
|
-
const src = readFileSync(
|
|
1521
|
-
resolve(import.meta.dirname, "..", "auto.ts"),
|
|
1522
|
-
"utf-8",
|
|
1523
|
-
);
|
|
1524
|
-
const fnIdx = src.indexOf("export async function startAuto");
|
|
1525
|
-
assert.ok(fnIdx > -1, "startAuto must exist in auto.ts");
|
|
1526
|
-
const fnEnd = src.indexOf("\n// ─── ", fnIdx + 100);
|
|
1527
|
-
const fnBlock =
|
|
1528
|
-
fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 5000);
|
|
1529
|
-
|
|
1530
|
-
// Both autoLoop call sites must be preceded by selfHealRuntimeRecords
|
|
1531
|
-
const healIdx = fnBlock.indexOf("selfHealRuntimeRecords");
|
|
1532
|
-
const loopIdx = fnBlock.indexOf("autoLoop(");
|
|
1533
|
-
assert.ok(healIdx > -1, "startAuto must call selfHealRuntimeRecords");
|
|
1534
|
-
assert.ok(healIdx < loopIdx, "selfHealRuntimeRecords must be called before autoLoop");
|
|
1535
|
-
|
|
1536
|
-
// Verify the second autoLoop call site also has selfHeal before it (if present)
|
|
1537
|
-
const secondLoopIdx = fnBlock.indexOf("autoLoop(", loopIdx + 1);
|
|
1538
|
-
const secondHealIdx = fnBlock.indexOf("selfHealRuntimeRecords", healIdx + 1);
|
|
1539
|
-
assert.ok(
|
|
1540
|
-
secondLoopIdx === -1 || (secondHealIdx > -1 && secondHealIdx < secondLoopIdx),
|
|
1541
|
-
"if a second autoLoop call exists, it must also be preceded by selfHealRuntimeRecords",
|
|
1542
|
-
);
|
|
1543
|
-
});
|
|
1544
|
-
|
|
1545
|
-
test("startAuto guards against concurrent invocation (#2923)", () => {
|
|
1546
|
-
const src = readFileSync(
|
|
1547
|
-
resolve(import.meta.dirname, "..", "auto.ts"),
|
|
1548
|
-
"utf-8",
|
|
1549
|
-
);
|
|
1550
|
-
const fnIdx = src.indexOf("export async function startAuto");
|
|
1551
|
-
assert.ok(fnIdx > -1, "startAuto must exist in auto.ts");
|
|
1552
|
-
// The guard must appear before any other logic in the function body
|
|
1553
|
-
const fnBody = src.slice(fnIdx, fnIdx + 500);
|
|
1554
|
-
const activeGuard = fnBody.indexOf("if (s.active)");
|
|
1555
|
-
assert.ok(activeGuard > -1, "startAuto must check s.active to prevent concurrent auto-loops");
|
|
1556
|
-
const returnIdx = fnBody.indexOf("return;", activeGuard);
|
|
1557
|
-
assert.ok(
|
|
1558
|
-
returnIdx > -1 && returnIdx < activeGuard + 120,
|
|
1559
|
-
"s.active guard must early-return to prevent a second concurrent loop",
|
|
1560
|
-
);
|
|
1561
|
-
});
|
|
1562
|
-
|
|
1563
|
-
test("agent_end handler calls resolveAgentEnd (not the legacy auto.ts path)", () => {
|
|
1564
|
-
const hooksSrc = readFileSync(
|
|
1565
|
-
resolve(import.meta.dirname, "..", "bootstrap", "register-hooks.ts"),
|
|
1566
|
-
"utf-8",
|
|
1567
|
-
);
|
|
1568
|
-
// Verify the agent_end hook is registered
|
|
1569
|
-
const handlerIdx = hooksSrc.indexOf('pi.on("agent_end"');
|
|
1570
|
-
assert.ok(handlerIdx > -1, "register-hooks.ts must have an agent_end handler");
|
|
1571
|
-
|
|
1572
|
-
const recoverySrc = readFileSync(
|
|
1573
|
-
resolve(import.meta.dirname, "..", "bootstrap", "agent-end-recovery.ts"),
|
|
1574
|
-
"utf-8",
|
|
1575
|
-
);
|
|
1576
|
-
assert.ok(
|
|
1577
|
-
recoverySrc.includes("resolveAgentEnd(event)"),
|
|
1578
|
-
"agent_end success path must call resolveAgentEnd(event) instead of legacy wrappers",
|
|
1579
|
-
);
|
|
1580
|
-
assert.ok(
|
|
1581
|
-
recoverySrc.includes("isSessionSwitchInFlight()"),
|
|
1582
|
-
"agent_end handler must ignore session-switch agent_end events from cmdCtx.newSession()",
|
|
1583
|
-
);
|
|
1584
|
-
});
|
|
1585
|
-
|
|
1586
|
-
test("auto-verification.ts runPostUnitVerification does not take dispatchNextUnit callback", () => {
|
|
1587
|
-
const src = readFileSync(
|
|
1588
|
-
resolve(import.meta.dirname, "..", "auto-verification.ts"),
|
|
1589
|
-
"utf-8",
|
|
1590
|
-
);
|
|
1591
|
-
const fnIdx = src.indexOf("export async function runPostUnitVerification");
|
|
1592
|
-
assert.ok(fnIdx > -1, "runPostUnitVerification must exist");
|
|
1593
|
-
const sigEnd = src.indexOf("): Promise<VerificationResult>", fnIdx);
|
|
1594
|
-
const signature = src.slice(fnIdx, sigEnd);
|
|
1595
|
-
assert.ok(
|
|
1596
|
-
!signature.includes("dispatchNextUnit"),
|
|
1597
|
-
"runPostUnitVerification must not take a dispatchNextUnit callback parameter",
|
|
1598
|
-
);
|
|
1599
|
-
assert.ok(
|
|
1600
|
-
!signature.includes("startDispatchGapWatchdog"),
|
|
1601
|
-
"runPostUnitVerification must not take a startDispatchGapWatchdog callback parameter",
|
|
1602
|
-
);
|
|
1603
|
-
});
|
|
1604
|
-
|
|
1605
|
-
test("auto-timeout-recovery.ts calls resolveAgentEnd instead of dispatchNextUnit", () => {
|
|
1606
|
-
const src = readFileSync(
|
|
1607
|
-
resolve(import.meta.dirname, "..", "auto-timeout-recovery.ts"),
|
|
1608
|
-
"utf-8",
|
|
1609
|
-
);
|
|
1610
|
-
assert.ok(
|
|
1611
|
-
!src.includes("await dispatchNextUnit"),
|
|
1612
|
-
"auto-timeout-recovery.ts must not call dispatchNextUnit",
|
|
1613
|
-
);
|
|
1614
|
-
// After PR #4716, advance branches go through bumpAndResolveSynthetic()
|
|
1615
|
-
// (which bumps the turn epoch and calls resolveAgentEnd atomically).
|
|
1616
|
-
// Either direct resolveAgentEnd() or the helper satisfies the invariant:
|
|
1617
|
-
// the loop must be re-iterated on timeout recovery.
|
|
1618
|
-
const reIteratesLoop =
|
|
1619
|
-
src.includes("resolveAgentEnd(") ||
|
|
1620
|
-
src.includes("bumpAndResolveSynthetic(");
|
|
1621
|
-
assert.ok(
|
|
1622
|
-
reIteratesLoop,
|
|
1623
|
-
"auto-timeout-recovery.ts must call resolveAgentEnd (directly or via bumpAndResolveSynthetic) to re-iterate the loop on timeout recovery",
|
|
1624
|
-
);
|
|
1625
|
-
});
|
|
1403
|
+
// NOTE: The T03 "wiring structural assertions" block (barrel re-exports,
|
|
1404
|
+
// LoopDeps-interface-declared, while-loop keyword, UOK kernel wrapper,
|
|
1405
|
+
// selfHeal ordering, s.active concurrent guard, agent_end handler call
|
|
1406
|
+
// shape, runPostUnitVerification signature, auto-timeout-recovery call
|
|
1407
|
+
// shape) was a pure source-grep chain — readFileSync + includes/indexOf —
|
|
1408
|
+
// so it asserted on code shape rather than runtime behaviour. The symbols
|
|
1409
|
+
// named in those assertions are ALREADY imported at the top of this file;
|
|
1410
|
+
// if the production barrel drops any of them, this file fails to import
|
|
1411
|
+
// and every test here fails cold. That import-time check is the real
|
|
1412
|
+
// behavioural contract. The ordering/signature contracts (UOK dispatch,
|
|
1413
|
+
// concurrent guard, agent_end wiring) are tracked as follow-up issues for
|
|
1414
|
+
// pure-helper extraction per the #4832/PR #4859 precedent.
|
|
1626
1415
|
|
|
1627
1416
|
// ── Stuck counter tests ──────────────────────────────────────────────────────
|
|
1628
1417
|
|
|
@@ -1921,26 +1710,10 @@ test("detectStuck: truncates long error strings", () => {
|
|
|
1921
1710
|
assert.ok(result!.reason.length < 300, "reason should be truncated");
|
|
1922
1711
|
});
|
|
1923
1712
|
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
resolve(import.meta.dirname, "..", "auto", "phases.ts"),
|
|
1929
|
-
"utf-8",
|
|
1930
|
-
);
|
|
1931
|
-
assert.ok(
|
|
1932
|
-
src.includes('"stuck-detected"'),
|
|
1933
|
-
"auto/phases.ts must log phase: 'stuck-detected' when stuck detection fires",
|
|
1934
|
-
);
|
|
1935
|
-
assert.ok(
|
|
1936
|
-
src.includes('"stuck-counter-reset"'),
|
|
1937
|
-
"auto/phases.ts must log phase: 'stuck-counter-reset' when recovery resets on new unit",
|
|
1938
|
-
);
|
|
1939
|
-
assert.ok(
|
|
1940
|
-
src.includes("detectStuck"),
|
|
1941
|
-
"auto/phases.ts must use detectStuck for sliding window analysis",
|
|
1942
|
-
);
|
|
1943
|
-
});
|
|
1713
|
+
// NOTE: the "stuck-detected" / "stuck-counter-reset" debug-log grep was
|
|
1714
|
+
// removed — that string test never exercised the detector. detectStuck
|
|
1715
|
+
// itself is tested behaviourally above against the real implementation
|
|
1716
|
+
// imported from auto-loop.js.
|
|
1944
1717
|
|
|
1945
1718
|
// ── Lifecycle test (S05/T02) ─────────────────────────────────────────────────
|
|
1946
1719
|
|
|
@@ -2587,3 +2360,71 @@ test("autoLoop warns but proceeds for greenfield project (no project files) (#18
|
|
|
2587
2360
|
"should warn about greenfield project (no project files)",
|
|
2588
2361
|
);
|
|
2589
2362
|
});
|
|
2363
|
+
|
|
2364
|
+
// ─── #4850: pre-send model-policy block is non-retryable ────────────────────
|
|
2365
|
+
test("autoLoop classifies ModelPolicyDispatchBlockedError as blocked, not a retryable error", async () => {
|
|
2366
|
+
_resetPendingResolve();
|
|
2367
|
+
|
|
2368
|
+
const ctx = makeMockCtx();
|
|
2369
|
+
ctx.ui.setStatus = () => {};
|
|
2370
|
+
const notifications: Array<{ message: string; level?: string }> = [];
|
|
2371
|
+
ctx.ui.notify = (m: string, l?: string) => { notifications.push({ message: m, level: l }); };
|
|
2372
|
+
|
|
2373
|
+
const pi = makeMockPi();
|
|
2374
|
+
const s = makeLoopSession();
|
|
2375
|
+
|
|
2376
|
+
const journalEvents: Array<{ eventType: string; data?: any }> = [];
|
|
2377
|
+
let pauseAutoCalls = 0;
|
|
2378
|
+
let stopAutoCalls = 0;
|
|
2379
|
+
// Capture onTurnResult to assert blocked-unit identity is propagated to
|
|
2380
|
+
// the uokObserver. Without the fix, observedUnitType/Id are unset because
|
|
2381
|
+
// the throw happens inside dispatch before the success-path assignments
|
|
2382
|
+
// at loop.ts:453/631/647 (#4959 / CodeRabbit Minor).
|
|
2383
|
+
const turnResults: Array<{ unitType?: string; unitId?: string; status: string }> = [];
|
|
2384
|
+
|
|
2385
|
+
const deps = makeMockDeps({
|
|
2386
|
+
selectAndApplyModel: async () => {
|
|
2387
|
+
throw new ModelPolicyDispatchBlockedError(
|
|
2388
|
+
"research-slice",
|
|
2389
|
+
"M001/S01",
|
|
2390
|
+
[{ provider: "openai", modelId: "gpt-4o", reason: "tool policy denied (web_search) for openai-completions" }],
|
|
2391
|
+
);
|
|
2392
|
+
},
|
|
2393
|
+
pauseAuto: async () => { pauseAutoCalls++; },
|
|
2394
|
+
stopAuto: async () => { stopAutoCalls++; },
|
|
2395
|
+
emitJournalEvent: (entry: any) => { journalEvents.push(entry); },
|
|
2396
|
+
uokObserver: {
|
|
2397
|
+
onTurnStart: () => {},
|
|
2398
|
+
onPhaseResult: () => {},
|
|
2399
|
+
onTurnResult: (res: any) => { turnResults.push({ unitType: res.unitType, unitId: res.unitId, status: res.status }); },
|
|
2400
|
+
} as any,
|
|
2401
|
+
});
|
|
2402
|
+
|
|
2403
|
+
await autoLoop(ctx, pi, s, deps);
|
|
2404
|
+
|
|
2405
|
+
// The unit-end event with status: "blocked" must be emitted.
|
|
2406
|
+
const unitEnd = journalEvents.find(
|
|
2407
|
+
e => e.eventType === "unit-end" && e.data?.status === "blocked",
|
|
2408
|
+
);
|
|
2409
|
+
assert.ok(unitEnd, "should emit unit-end with status=blocked");
|
|
2410
|
+
assert.equal(unitEnd!.data.reason, "model-policy-dispatch-blocked");
|
|
2411
|
+
|
|
2412
|
+
// Loop must pause for manual attention, NOT retry until 3-strike hard stop.
|
|
2413
|
+
assert.equal(pauseAutoCalls, 1, "should pause once on policy block");
|
|
2414
|
+
assert.equal(stopAutoCalls, 0, "should NOT call stopAuto — pre-send block is not a retryable iteration error");
|
|
2415
|
+
|
|
2416
|
+
// The notification should surface the per-model deny reason from the typed error.
|
|
2417
|
+
const blockedNotice = notifications.find(
|
|
2418
|
+
n => n.message.includes("model-policy denied dispatch")
|
|
2419
|
+
&& n.message.includes("tool policy denied (web_search)"),
|
|
2420
|
+
);
|
|
2421
|
+
assert.ok(blockedNotice, "user-facing notification should name the policy block + deny reason");
|
|
2422
|
+
|
|
2423
|
+
// Blocked-unit identity must reach uokObserver.onTurnResult — the typed
|
|
2424
|
+
// error already carries it, the loop must thread it into observedUnitType/Id
|
|
2425
|
+
// before finishTurn is called (#4959 / CodeRabbit Minor).
|
|
2426
|
+
const pausedTurn = turnResults.find(r => r.status === "paused");
|
|
2427
|
+
assert.ok(pausedTurn, "uokObserver should observe a paused turn for the blocked unit");
|
|
2428
|
+
assert.equal(pausedTurn!.unitType, "research-slice", "onTurnResult must receive the blocked unitType from the typed error");
|
|
2429
|
+
assert.equal(pausedTurn!.unitId, "M001/S01", "onTurnResult must receive the blocked unitId from the typed error");
|
|
2430
|
+
});
|