gsd-pi 2.74.0-dev.2b524c3 → 2.74.0-dev.703eabc
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/cli.js +85 -0
- package/dist/headless-query.js +4 -1
- package/dist/help-text.js +23 -0
- package/dist/resources/extensions/gsd/activity-log.js +16 -0
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
- package/dist/resources/extensions/gsd/auto/loop.js +147 -10
- package/dist/resources/extensions/gsd/auto/phases.js +158 -4
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +220 -17
- package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
- package/dist/resources/extensions/gsd/auto-verification.js +100 -2
- package/dist/resources/extensions/gsd/auto.js +36 -4
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +45 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +26 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
- package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
- package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
- package/dist/resources/extensions/gsd/commands-do.js +79 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
- package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
- package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
- package/dist/resources/extensions/gsd/commands-ship.js +187 -0
- package/dist/resources/extensions/gsd/db-writer.js +3 -5
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
- package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
- package/dist/resources/extensions/gsd/git-service.js +49 -1
- package/dist/resources/extensions/gsd/graph-context.js +157 -0
- package/dist/resources/extensions/gsd/gsd-db.js +581 -2
- package/dist/resources/extensions/gsd/guided-flow.js +23 -0
- package/dist/resources/extensions/gsd/index.js +15 -2
- package/dist/resources/extensions/gsd/init-wizard.js +1 -0
- package/dist/resources/extensions/gsd/journal.js +27 -0
- package/dist/resources/extensions/gsd/md-importer.js +3 -4
- package/dist/resources/extensions/gsd/memory-store.js +19 -51
- package/dist/resources/extensions/gsd/metrics.js +19 -0
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
- package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
- package/dist/resources/extensions/gsd/preferences-models.js +20 -3
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
- package/dist/resources/extensions/gsd/preferences.js +26 -0
- package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
- package/dist/resources/extensions/gsd/state.js +5 -1
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
- package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
- package/dist/resources/extensions/gsd/uok/audit.js +40 -0
- package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
- package/dist/resources/extensions/gsd/uok/flags.js +29 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
- package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
- package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
- package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
- package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
- package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
- package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- 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 +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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.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/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- 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/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/package.json +3 -2
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/index.d.ts +3 -0
- package/packages/mcp-server/dist/index.d.ts.map +1 -1
- package/packages/mcp-server/dist/index.js +3 -0
- package/packages/mcp-server/dist/index.js.map +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
- package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/graph.js +655 -0
- package/packages/mcp-server/dist/readers/graph.js.map +1 -0
- package/packages/mcp-server/dist/readers/index.d.ts +2 -0
- package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
- package/packages/mcp-server/dist/readers/index.js +1 -0
- package/packages/mcp-server/dist/readers/index.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +65 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/index.ts +15 -0
- package/packages/mcp-server/src/readers/graph.test.ts +604 -0
- package/packages/mcp-server/src/readers/graph.ts +855 -0
- package/packages/mcp-server/src/readers/index.ts +12 -0
- package/packages/mcp-server/src/server.ts +83 -0
- package/packages/mcp-server/tsconfig.json +1 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
- package/packages/native/package.json +2 -2
- package/packages/native/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.json +1 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-ai/dist/index.d.ts +1 -9
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -9
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/capability-patches.js +36 -0
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
- package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
- package/packages/pi-ai/dist/models/custom.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.js +464 -0
- package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.js +311 -0
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
- package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
- package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
- package/packages/pi-ai/dist/models/generated/index.js +51 -0
- package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
- package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.js +702 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
- package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.js +413 -0
- package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.js +239 -0
- package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts +27 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/index.js +80 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts +1 -36
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +1 -2
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.js +3 -112
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +6 -5
- 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 +74 -40
- package/packages/pi-ai/src/index.ts +1 -9
- package/packages/pi-ai/src/models/capability-patches.ts +40 -0
- package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
- package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
- package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
- package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
- package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
- package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
- package/packages/pi-ai/src/models/generated/google.ts +466 -0
- package/packages/pi-ai/src/models/generated/groq.ts +313 -0
- package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
- package/packages/pi-ai/src/models/generated/index.ts +52 -0
- package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
- package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
- package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
- package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
- package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
- package/packages/pi-ai/src/models/generated/openai.ts +704 -0
- package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
- package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
- package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
- package/packages/pi-ai/src/models/generated/xai.ts +415 -0
- package/packages/pi-ai/src/models/generated/zai.ts +241 -0
- package/packages/pi-ai/src/models/index.ts +106 -0
- package/packages/pi-ai/src/models.generated.test.ts +1 -2
- package/packages/pi-ai/src/models.test.ts +6 -5
- package/packages/pi-ai/src/models.ts +3 -153
- package/packages/pi-ai/tsconfig.json +1 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
- 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/assistant-message.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -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 +51 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.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 +232 -18
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +13 -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 +53 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
- package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +66 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +73 -6
- package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
- package/packages/pi-coding-agent/tsconfig.json +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/tsconfig.json +1 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.json +1 -0
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
- package/src/resources/extensions/gsd/activity-log.ts +21 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
- package/src/resources/extensions/gsd/auto/loop.ts +159 -10
- package/src/resources/extensions/gsd/auto/phases.ts +191 -4
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
- package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +238 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
- package/src/resources/extensions/gsd/auto-verification.ts +129 -2
- package/src/resources/extensions/gsd/auto.ts +41 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +56 -3
- package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
- package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
- package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
- package/src/resources/extensions/gsd/commands-do.ts +109 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
- package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
- package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
- package/src/resources/extensions/gsd/commands-ship.ts +219 -0
- package/src/resources/extensions/gsd/db-writer.ts +3 -5
- package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
- package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
- package/src/resources/extensions/gsd/git-service.ts +68 -0
- package/src/resources/extensions/gsd/graph-context.ts +212 -0
- package/src/resources/extensions/gsd/gsd-db.ts +788 -3
- package/src/resources/extensions/gsd/guided-flow.ts +32 -0
- package/src/resources/extensions/gsd/index.ts +18 -2
- package/src/resources/extensions/gsd/init-wizard.ts +3 -2
- package/src/resources/extensions/gsd/journal.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -5
- package/src/resources/extensions/gsd/memory-store.ts +31 -62
- package/src/resources/extensions/gsd/metrics.ts +26 -0
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
- package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
- package/src/resources/extensions/gsd/preferences-models.ts +20 -3
- package/src/resources/extensions/gsd/preferences-types.ts +32 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
- package/src/resources/extensions/gsd/preferences.ts +28 -0
- package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
- package/src/resources/extensions/gsd/session-lock.ts +14 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
- package/src/resources/extensions/gsd/state.ts +9 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
- package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
- package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
- package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
- package/src/resources/extensions/gsd/types.ts +14 -1
- package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
- package/src/resources/extensions/gsd/uok/audit.ts +51 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
- package/src/resources/extensions/gsd/uok/flags.ts +45 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
- package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
- package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
- package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
- package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
- package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
- package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
- package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
- package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
- package/packages/pi-ai/dist/models.custom.js.map +0 -1
- package/packages/pi-ai/dist/models.generated.js +0 -14343
- package/packages/pi-ai/dist/models.generated.js.map +0 -1
- package/packages/pi-ai/src/models.generated.ts +0 -14345
- /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_ssgManifest.js +0 -0
|
@@ -31,6 +31,8 @@ import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterM
|
|
|
31
31
|
import { resolveEngine } from "../engine-resolver.js";
|
|
32
32
|
import { logWarning } from "../workflow-logger.js";
|
|
33
33
|
import { gsdRoot } from "../paths.js";
|
|
34
|
+
import { resolveUokFlags } from "../uok/flags.js";
|
|
35
|
+
import { scheduleSidecarQueue } from "../uok/execution-graph.js";
|
|
34
36
|
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
35
37
|
import { join } from "node:path";
|
|
36
38
|
|
|
@@ -128,6 +130,43 @@ export async function autoLoop(
|
|
|
128
130
|
const flowId = randomUUID();
|
|
129
131
|
let seqCounter = 0;
|
|
130
132
|
const nextSeq = () => ++seqCounter;
|
|
133
|
+
const turnId = randomUUID();
|
|
134
|
+
s.currentTraceId = flowId;
|
|
135
|
+
s.currentTurnId = turnId;
|
|
136
|
+
const turnStartedAt = new Date().toISOString();
|
|
137
|
+
let observedUnitType: string | undefined;
|
|
138
|
+
let observedUnitId: string | undefined;
|
|
139
|
+
let turnFinished = false;
|
|
140
|
+
const finishTurn = (
|
|
141
|
+
status: "completed" | "failed" | "paused" | "stopped" | "skipped" | "retry",
|
|
142
|
+
failureClass: "none" | "unknown" | "manual-attention" | "timeout" | "execution" | "closeout" | "git" = "none",
|
|
143
|
+
error?: string,
|
|
144
|
+
): void => {
|
|
145
|
+
if (turnFinished) return;
|
|
146
|
+
turnFinished = true;
|
|
147
|
+
deps.uokObserver?.onTurnResult({
|
|
148
|
+
traceId: flowId,
|
|
149
|
+
turnId,
|
|
150
|
+
iteration,
|
|
151
|
+
unitType: observedUnitType,
|
|
152
|
+
unitId: observedUnitId,
|
|
153
|
+
status,
|
|
154
|
+
failureClass,
|
|
155
|
+
phaseResults: [],
|
|
156
|
+
error,
|
|
157
|
+
startedAt: turnStartedAt,
|
|
158
|
+
finishedAt: new Date().toISOString(),
|
|
159
|
+
});
|
|
160
|
+
s.currentTraceId = null;
|
|
161
|
+
s.currentTurnId = null;
|
|
162
|
+
};
|
|
163
|
+
deps.uokObserver?.onTurnStart({
|
|
164
|
+
traceId: flowId,
|
|
165
|
+
turnId,
|
|
166
|
+
iteration,
|
|
167
|
+
basePath: s.basePath,
|
|
168
|
+
startedAt: turnStartedAt,
|
|
169
|
+
});
|
|
131
170
|
|
|
132
171
|
if (iteration > MAX_LOOP_ITERATIONS) {
|
|
133
172
|
debugLog("autoLoop", {
|
|
@@ -140,6 +179,7 @@ export async function autoLoop(
|
|
|
140
179
|
pi,
|
|
141
180
|
`Safety: loop exceeded ${MAX_LOOP_ITERATIONS} iterations — possible runaway`,
|
|
142
181
|
);
|
|
182
|
+
finishTurn("stopped", "manual-attention", "max-iterations");
|
|
143
183
|
break;
|
|
144
184
|
}
|
|
145
185
|
|
|
@@ -157,22 +197,32 @@ export async function autoLoop(
|
|
|
157
197
|
`Stopping gracefully to prevent OOM kill after ${iteration} iterations. ` +
|
|
158
198
|
`Resume with /gsd auto to continue from where you left off.`,
|
|
159
199
|
);
|
|
200
|
+
finishTurn("stopped", "timeout", "memory-pressure");
|
|
160
201
|
break;
|
|
161
202
|
}
|
|
162
203
|
}
|
|
163
204
|
|
|
164
205
|
if (!s.cmdCtx) {
|
|
165
206
|
debugLog("autoLoop", { phase: "exit", reason: "no-cmdCtx" });
|
|
207
|
+
finishTurn("stopped", "manual-attention", "missing-command-context");
|
|
166
208
|
break;
|
|
167
209
|
}
|
|
168
210
|
|
|
169
211
|
try {
|
|
170
212
|
// ── Blanket try/catch: one bad iteration must not kill the session
|
|
171
213
|
const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
|
|
214
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
172
215
|
|
|
173
216
|
// ── Check sidecar queue before deriveState ──
|
|
174
217
|
let sidecarItem: SidecarItem | undefined;
|
|
175
218
|
if (s.sidecarQueue.length > 0) {
|
|
219
|
+
if (uokFlags.executionGraph && s.sidecarQueue.length > 1) {
|
|
220
|
+
try {
|
|
221
|
+
s.sidecarQueue = await scheduleSidecarQueue(s.sidecarQueue);
|
|
222
|
+
} catch (err) {
|
|
223
|
+
logWarning("dispatch", `sidecar queue scheduling failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
176
226
|
sidecarItem = s.sidecarQueue.shift()!;
|
|
177
227
|
debugLog("autoLoop", {
|
|
178
228
|
phase: "sidecar-dequeue",
|
|
@@ -256,27 +306,53 @@ export async function autoLoop(
|
|
|
256
306
|
isRetry: false,
|
|
257
307
|
previousTier: undefined,
|
|
258
308
|
};
|
|
309
|
+
observedUnitType = iterData.unitType;
|
|
310
|
+
observedUnitId = iterData.unitId;
|
|
259
311
|
|
|
260
312
|
// ── Progress widget (mirrors dev path in runDispatch) ──
|
|
261
313
|
deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state);
|
|
262
314
|
|
|
263
315
|
// ── Guards (shared with dev path) ──
|
|
264
316
|
const guardsResult = await runGuards(ic, s.currentMilestoneId ?? "workflow");
|
|
265
|
-
|
|
317
|
+
deps.uokObserver?.onPhaseResult("guard", guardsResult.action, {
|
|
318
|
+
unitType: iterData.unitType,
|
|
319
|
+
unitId: iterData.unitId,
|
|
320
|
+
});
|
|
321
|
+
if (guardsResult.action === "break") {
|
|
322
|
+
finishTurn("stopped", "manual-attention", "guard-break");
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
266
325
|
|
|
267
326
|
// ── Unit execution (shared with dev path) ──
|
|
268
327
|
const unitPhaseResult = await runUnitPhase(ic, iterData, loopState);
|
|
269
|
-
|
|
328
|
+
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
329
|
+
unitType: iterData.unitType,
|
|
330
|
+
unitId: iterData.unitId,
|
|
331
|
+
});
|
|
332
|
+
if (unitPhaseResult.action === "break") {
|
|
333
|
+
finishTurn("stopped", "execution", "unit-break");
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
270
336
|
|
|
271
337
|
// ── Verify first, then reconcile (only mark complete on pass) ──
|
|
272
338
|
debugLog("autoLoop", { phase: "custom-engine-verify", iteration, unitId: iterData.unitId });
|
|
273
339
|
const verifyResult = await policy.verify(iterData.unitType, iterData.unitId, { basePath: s.basePath });
|
|
274
340
|
if (verifyResult === "pause") {
|
|
275
341
|
await deps.pauseAuto(ctx, pi);
|
|
342
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
|
|
343
|
+
unitType: iterData.unitType,
|
|
344
|
+
unitId: iterData.unitId,
|
|
345
|
+
});
|
|
346
|
+
finishTurn("paused", "manual-attention", "custom-engine-verify-pause");
|
|
276
347
|
break;
|
|
277
348
|
}
|
|
278
349
|
if (verifyResult === "retry") {
|
|
279
350
|
debugLog("autoLoop", { phase: "custom-engine-verify-retry", iteration, unitId: iterData.unitId });
|
|
351
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "retry", {
|
|
352
|
+
unitType: iterData.unitType,
|
|
353
|
+
unitId: iterData.unitId,
|
|
354
|
+
});
|
|
355
|
+
finishTurn("retry");
|
|
280
356
|
continue;
|
|
281
357
|
}
|
|
282
358
|
|
|
@@ -299,36 +375,77 @@ export async function autoLoop(
|
|
|
299
375
|
|
|
300
376
|
if (reconcileResult.outcome === "milestone-complete") {
|
|
301
377
|
await deps.stopAuto(ctx, pi, "Workflow complete");
|
|
378
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "milestone-complete", {
|
|
379
|
+
unitType: iterData.unitType,
|
|
380
|
+
unitId: iterData.unitId,
|
|
381
|
+
});
|
|
382
|
+
finishTurn("completed");
|
|
302
383
|
break;
|
|
303
384
|
}
|
|
304
385
|
if (reconcileResult.outcome === "pause") {
|
|
305
386
|
await deps.pauseAuto(ctx, pi);
|
|
387
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
|
|
388
|
+
unitType: iterData.unitType,
|
|
389
|
+
unitId: iterData.unitId,
|
|
390
|
+
});
|
|
391
|
+
finishTurn("paused", "manual-attention");
|
|
306
392
|
break;
|
|
307
393
|
}
|
|
308
394
|
if (reconcileResult.outcome === "stop") {
|
|
309
395
|
await deps.stopAuto(ctx, pi, reconcileResult.reason ?? "Engine stopped");
|
|
396
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "stop", {
|
|
397
|
+
unitType: iterData.unitType,
|
|
398
|
+
unitId: iterData.unitId,
|
|
399
|
+
reason: reconcileResult.reason,
|
|
400
|
+
});
|
|
401
|
+
finishTurn("stopped", "manual-attention", reconcileResult.reason);
|
|
310
402
|
break;
|
|
311
403
|
}
|
|
404
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "continue", {
|
|
405
|
+
unitType: iterData.unitType,
|
|
406
|
+
unitId: iterData.unitId,
|
|
407
|
+
});
|
|
408
|
+
finishTurn("completed");
|
|
312
409
|
continue;
|
|
313
410
|
}
|
|
314
411
|
|
|
315
412
|
if (!sidecarItem) {
|
|
316
413
|
// ── Phase 1: Pre-dispatch ─────────────────────────────────────────
|
|
317
414
|
const preDispatchResult = await runPreDispatch(ic, loopState);
|
|
318
|
-
|
|
319
|
-
if (preDispatchResult.action === "
|
|
415
|
+
deps.uokObserver?.onPhaseResult("pre-dispatch", preDispatchResult.action);
|
|
416
|
+
if (preDispatchResult.action === "break") {
|
|
417
|
+
finishTurn("stopped", "manual-attention", "pre-dispatch-break");
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
if (preDispatchResult.action === "continue") {
|
|
421
|
+
finishTurn("skipped");
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
320
424
|
|
|
321
425
|
const preData = preDispatchResult.data;
|
|
322
426
|
|
|
323
427
|
// ── Phase 2: Guards ───────────────────────────────────────────────
|
|
324
428
|
const guardsResult = await runGuards(ic, preData.mid);
|
|
325
|
-
|
|
429
|
+
deps.uokObserver?.onPhaseResult("guard", guardsResult.action);
|
|
430
|
+
if (guardsResult.action === "break") {
|
|
431
|
+
finishTurn("stopped", "manual-attention", "guard-break");
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
326
434
|
|
|
327
435
|
// ── Phase 3: Dispatch ─────────────────────────────────────────────
|
|
328
436
|
const dispatchResult = await runDispatch(ic, preData, loopState);
|
|
329
|
-
|
|
330
|
-
if (dispatchResult.action === "
|
|
437
|
+
deps.uokObserver?.onPhaseResult("dispatch", dispatchResult.action);
|
|
438
|
+
if (dispatchResult.action === "break") {
|
|
439
|
+
finishTurn("stopped", "manual-attention", "dispatch-break");
|
|
440
|
+
break;
|
|
441
|
+
}
|
|
442
|
+
if (dispatchResult.action === "continue") {
|
|
443
|
+
finishTurn("skipped");
|
|
444
|
+
continue;
|
|
445
|
+
}
|
|
331
446
|
iterData = dispatchResult.data;
|
|
447
|
+
observedUnitType = iterData.unitType;
|
|
448
|
+
observedUnitId = iterData.unitId;
|
|
332
449
|
} else {
|
|
333
450
|
// ── Sidecar path: use values from the sidecar item directly ──
|
|
334
451
|
const sidecarState = await deps.deriveState(s.basePath);
|
|
@@ -343,22 +460,50 @@ export async function autoLoop(
|
|
|
343
460
|
midTitle: sidecarState.activeMilestone?.title,
|
|
344
461
|
isRetry: false, previousTier: undefined,
|
|
345
462
|
};
|
|
463
|
+
observedUnitType = iterData.unitType;
|
|
464
|
+
observedUnitId = iterData.unitId;
|
|
465
|
+
deps.uokObserver?.onPhaseResult("dispatch", "sidecar", {
|
|
466
|
+
unitType: iterData.unitType,
|
|
467
|
+
unitId: iterData.unitId,
|
|
468
|
+
sidecarKind: sidecarItem.kind,
|
|
469
|
+
});
|
|
346
470
|
}
|
|
347
471
|
|
|
348
472
|
const unitPhaseResult = await runUnitPhase(ic, iterData, loopState, sidecarItem);
|
|
349
|
-
|
|
473
|
+
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
474
|
+
unitType: iterData.unitType,
|
|
475
|
+
unitId: iterData.unitId,
|
|
476
|
+
});
|
|
477
|
+
if (unitPhaseResult.action === "break") {
|
|
478
|
+
finishTurn("stopped", "execution", "unit-break");
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
350
481
|
|
|
351
482
|
// ── Phase 5: Finalize ───────────────────────────────────────────────
|
|
352
483
|
|
|
353
484
|
const finalizeResult = await runFinalize(ic, iterData, loopState, sidecarItem);
|
|
354
|
-
|
|
355
|
-
|
|
485
|
+
deps.uokObserver?.onPhaseResult("finalize", finalizeResult.action, {
|
|
486
|
+
unitType: iterData.unitType,
|
|
487
|
+
unitId: iterData.unitId,
|
|
488
|
+
});
|
|
489
|
+
if (finalizeResult.action === "break") {
|
|
490
|
+
const finalizeFailureClass = finalizeResult.reason === "git-closeout-failure"
|
|
491
|
+
? "git"
|
|
492
|
+
: "closeout";
|
|
493
|
+
finishTurn("stopped", finalizeFailureClass, "finalize-break");
|
|
494
|
+
break;
|
|
495
|
+
}
|
|
496
|
+
if (finalizeResult.action === "continue") {
|
|
497
|
+
finishTurn("retry");
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
356
500
|
|
|
357
501
|
consecutiveErrors = 0; // Iteration completed successfully
|
|
358
502
|
consecutiveCooldowns = 0;
|
|
359
503
|
recentErrorMessages.length = 0;
|
|
360
504
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId, seq: nextSeq(), eventType: "iteration-end", data: { iteration } });
|
|
361
505
|
debugLog("autoLoop", { phase: "iteration-complete", iteration });
|
|
506
|
+
finishTurn("completed");
|
|
362
507
|
} catch (loopErr) {
|
|
363
508
|
// ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
|
|
364
509
|
const msg = loopErr instanceof Error ? loopErr.message : String(loopErr);
|
|
@@ -388,6 +533,7 @@ export async function autoLoop(
|
|
|
388
533
|
pi,
|
|
389
534
|
`Infrastructure error (${infraCode}): not recoverable by retry`,
|
|
390
535
|
);
|
|
536
|
+
finishTurn("failed", "execution", msg);
|
|
391
537
|
break;
|
|
392
538
|
}
|
|
393
539
|
|
|
@@ -429,6 +575,7 @@ export async function autoLoop(
|
|
|
429
575
|
"warning",
|
|
430
576
|
);
|
|
431
577
|
await new Promise(resolve => setTimeout(resolve, waitMs));
|
|
578
|
+
finishTurn("retry", "timeout", msg);
|
|
432
579
|
continue; // Retry iteration without incrementing consecutiveErrors
|
|
433
580
|
}
|
|
434
581
|
|
|
@@ -455,6 +602,7 @@ export async function autoLoop(
|
|
|
455
602
|
pi,
|
|
456
603
|
`${consecutiveErrors} consecutive iteration failures`,
|
|
457
604
|
);
|
|
605
|
+
finishTurn("failed", "execution", msg);
|
|
458
606
|
break;
|
|
459
607
|
} else if (consecutiveErrors === 2) {
|
|
460
608
|
// 2nd consecutive: try invalidating caches + re-deriving state
|
|
@@ -467,6 +615,7 @@ export async function autoLoop(
|
|
|
467
615
|
// 1st error: log and retry — transient failures happen
|
|
468
616
|
ctx.ui.notify(`Iteration error: ${msg}. Retrying.`, "warning");
|
|
469
617
|
}
|
|
618
|
+
finishTurn("retry", "execution", msg);
|
|
470
619
|
}
|
|
471
620
|
}
|
|
472
621
|
|
|
@@ -12,6 +12,7 @@ import { importExtensionModule, type ExtensionAPI, type ExtensionContext } from
|
|
|
12
12
|
import type { AutoSession, SidecarItem } from "./session.js";
|
|
13
13
|
import type { LoopDeps } from "./loop-deps.js";
|
|
14
14
|
import type { PostUnitContext, PreVerificationOpts } from "../auto-post-unit.js";
|
|
15
|
+
import type { Phase } from "../types.js";
|
|
15
16
|
import {
|
|
16
17
|
MAX_RECOVERY_CHARS,
|
|
17
18
|
BUDGET_THRESHOLDS,
|
|
@@ -30,7 +31,15 @@ import { MergeConflictError } from "../git-service.js";
|
|
|
30
31
|
import { setCurrentPhase, clearCurrentPhase } from "../../shared/gsd-phase-state.js";
|
|
31
32
|
import { join, basename, dirname, parse as parsePath } from "node:path";
|
|
32
33
|
import { existsSync, cpSync, readdirSync } from "node:fs";
|
|
33
|
-
import {
|
|
34
|
+
import {
|
|
35
|
+
logWarning,
|
|
36
|
+
logError,
|
|
37
|
+
_resetLogs,
|
|
38
|
+
drainLogs,
|
|
39
|
+
drainAndSummarize,
|
|
40
|
+
formatForNotification,
|
|
41
|
+
hasAnyIssues,
|
|
42
|
+
} from "../workflow-logger.js";
|
|
34
43
|
import { gsdRoot } from "../paths.js";
|
|
35
44
|
import { atomicWriteSync } from "../atomic-write.js";
|
|
36
45
|
import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.js";
|
|
@@ -39,6 +48,9 @@ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "
|
|
|
39
48
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
40
49
|
import { startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
41
50
|
import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
|
|
51
|
+
import { ensurePlanV2Graph } from "../uok/plan-v2.js";
|
|
52
|
+
import { resolveUokFlags } from "../uok/flags.js";
|
|
53
|
+
import { UokGateRunner } from "../uok/gate-runner.js";
|
|
42
54
|
import { resetEvidence } from "../safety/evidence-collector.js";
|
|
43
55
|
import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
|
|
44
56
|
import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
|
|
@@ -69,6 +81,17 @@ export function _resolveDispatchGuardBasePath(
|
|
|
69
81
|
return s.originalBasePath || s.basePath;
|
|
70
82
|
}
|
|
71
83
|
|
|
84
|
+
const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
|
|
85
|
+
"executing",
|
|
86
|
+
"summarizing",
|
|
87
|
+
"validating-milestone",
|
|
88
|
+
"completing-milestone",
|
|
89
|
+
]);
|
|
90
|
+
|
|
91
|
+
function shouldRunPlanV2Gate(phase: Phase): boolean {
|
|
92
|
+
return PLAN_V2_GATE_PHASES.has(phase);
|
|
93
|
+
}
|
|
94
|
+
|
|
72
95
|
/**
|
|
73
96
|
* Generate and write an HTML milestone report snapshot.
|
|
74
97
|
* Extracted from the milestone-transition block in autoLoop.
|
|
@@ -159,6 +182,29 @@ async function closeoutAndStop(
|
|
|
159
182
|
await deps.stopAuto(ctx, pi, reason);
|
|
160
183
|
}
|
|
161
184
|
|
|
185
|
+
async function emitCancelledUnitEnd(
|
|
186
|
+
ic: IterationContext,
|
|
187
|
+
unitType: string,
|
|
188
|
+
unitId: string,
|
|
189
|
+
unitStartSeq: number,
|
|
190
|
+
errorContext?: { message: string; category: string; stopReason?: string; isTransient?: boolean; retryAfterMs?: number },
|
|
191
|
+
): Promise<void> {
|
|
192
|
+
ic.deps.emitJournalEvent({
|
|
193
|
+
ts: new Date().toISOString(),
|
|
194
|
+
flowId: ic.flowId,
|
|
195
|
+
seq: ic.nextSeq(),
|
|
196
|
+
eventType: "unit-end",
|
|
197
|
+
data: {
|
|
198
|
+
unitType,
|
|
199
|
+
unitId,
|
|
200
|
+
status: "cancelled",
|
|
201
|
+
artifactVerified: false,
|
|
202
|
+
...(errorContext ? { errorContext } : {}),
|
|
203
|
+
},
|
|
204
|
+
causedBy: { flowId: ic.flowId, seq: unitStartSeq },
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
162
208
|
// ─── runPreDispatch ───────────────────────────────────────────────────────────
|
|
163
209
|
|
|
164
210
|
/**
|
|
@@ -171,14 +217,60 @@ export async function runPreDispatch(
|
|
|
171
217
|
loopState: LoopState,
|
|
172
218
|
): Promise<PhaseResult<PreDispatchData>> {
|
|
173
219
|
const { ctx, pi, s, deps, prefs } = ic;
|
|
220
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
221
|
+
const runPreDispatchGate = async (input: {
|
|
222
|
+
gateId: string;
|
|
223
|
+
gateType: string;
|
|
224
|
+
outcome: "pass" | "fail" | "retry" | "manual-attention";
|
|
225
|
+
failureClass: "none" | "policy" | "input" | "execution" | "artifact" | "verification" | "closeout" | "git" | "timeout" | "manual-attention" | "unknown";
|
|
226
|
+
rationale: string;
|
|
227
|
+
findings?: string;
|
|
228
|
+
milestoneId?: string;
|
|
229
|
+
}): Promise<void> => {
|
|
230
|
+
if (!uokFlags.gates) return;
|
|
231
|
+
const gateRunner = new UokGateRunner();
|
|
232
|
+
gateRunner.register({
|
|
233
|
+
id: input.gateId,
|
|
234
|
+
type: input.gateType,
|
|
235
|
+
execute: async () => ({
|
|
236
|
+
outcome: input.outcome,
|
|
237
|
+
failureClass: input.failureClass,
|
|
238
|
+
rationale: input.rationale,
|
|
239
|
+
findings: input.findings ?? "",
|
|
240
|
+
}),
|
|
241
|
+
});
|
|
242
|
+
await gateRunner.run(input.gateId, {
|
|
243
|
+
basePath: s.basePath,
|
|
244
|
+
traceId: `pre-dispatch:${ic.flowId}`,
|
|
245
|
+
turnId: `iter-${ic.iteration}`,
|
|
246
|
+
milestoneId: input.milestoneId ?? s.currentMilestoneId ?? undefined,
|
|
247
|
+
unitType: "pre-dispatch",
|
|
248
|
+
unitId: `iter-${ic.iteration}`,
|
|
249
|
+
});
|
|
250
|
+
};
|
|
174
251
|
|
|
175
252
|
// Resource version guard
|
|
176
253
|
const staleMsg = deps.checkResourcesStale(s.resourceVersionOnStart);
|
|
177
254
|
if (staleMsg) {
|
|
255
|
+
await runPreDispatchGate({
|
|
256
|
+
gateId: "resource-version-guard",
|
|
257
|
+
gateType: "policy",
|
|
258
|
+
outcome: "fail",
|
|
259
|
+
failureClass: "policy",
|
|
260
|
+
rationale: "resource version guard blocked dispatch",
|
|
261
|
+
findings: staleMsg,
|
|
262
|
+
});
|
|
178
263
|
await deps.stopAuto(ctx, pi, staleMsg);
|
|
179
264
|
debugLog("autoLoop", { phase: "exit", reason: "resources-stale" });
|
|
180
265
|
return { action: "break", reason: "resources-stale" };
|
|
181
266
|
}
|
|
267
|
+
await runPreDispatchGate({
|
|
268
|
+
gateId: "resource-version-guard",
|
|
269
|
+
gateType: "policy",
|
|
270
|
+
outcome: "pass",
|
|
271
|
+
failureClass: "none",
|
|
272
|
+
rationale: "resource version guard passed",
|
|
273
|
+
});
|
|
182
274
|
|
|
183
275
|
deps.invalidateAllCaches();
|
|
184
276
|
s.lastPromptCharCount = undefined;
|
|
@@ -194,6 +286,14 @@ export async function runPreDispatch(
|
|
|
194
286
|
);
|
|
195
287
|
}
|
|
196
288
|
if (!healthGate.proceed) {
|
|
289
|
+
await runPreDispatchGate({
|
|
290
|
+
gateId: "pre-dispatch-health-gate",
|
|
291
|
+
gateType: "execution",
|
|
292
|
+
outcome: "manual-attention",
|
|
293
|
+
failureClass: "manual-attention",
|
|
294
|
+
rationale: "pre-dispatch health gate blocked dispatch",
|
|
295
|
+
findings: healthGate.reason,
|
|
296
|
+
});
|
|
197
297
|
ctx.ui.notify(
|
|
198
298
|
healthGate.reason || "Pre-dispatch health check failed — run /gsd doctor for details.",
|
|
199
299
|
"error",
|
|
@@ -202,7 +302,23 @@ export async function runPreDispatch(
|
|
|
202
302
|
debugLog("autoLoop", { phase: "exit", reason: "health-gate-failed" });
|
|
203
303
|
return { action: "break", reason: "health-gate-failed" };
|
|
204
304
|
}
|
|
305
|
+
await runPreDispatchGate({
|
|
306
|
+
gateId: "pre-dispatch-health-gate",
|
|
307
|
+
gateType: "execution",
|
|
308
|
+
outcome: "pass",
|
|
309
|
+
failureClass: "none",
|
|
310
|
+
rationale: "pre-dispatch health gate passed",
|
|
311
|
+
findings: healthGate.fixesApplied.length > 0 ? healthGate.fixesApplied.join(", ") : "",
|
|
312
|
+
});
|
|
205
313
|
} catch (e) {
|
|
314
|
+
await runPreDispatchGate({
|
|
315
|
+
gateId: "pre-dispatch-health-gate",
|
|
316
|
+
gateType: "execution",
|
|
317
|
+
outcome: "manual-attention",
|
|
318
|
+
failureClass: "manual-attention",
|
|
319
|
+
rationale: "pre-dispatch health gate threw unexpectedly",
|
|
320
|
+
findings: String(e),
|
|
321
|
+
});
|
|
206
322
|
logWarning("engine", "Pre-dispatch health gate threw unexpectedly", { error: String(e) });
|
|
207
323
|
}
|
|
208
324
|
|
|
@@ -221,6 +337,32 @@ export async function runPreDispatch(
|
|
|
221
337
|
|
|
222
338
|
// Derive state
|
|
223
339
|
let state = await deps.deriveState(s.basePath);
|
|
340
|
+
if (prefs?.uok?.plan_v2?.enabled && shouldRunPlanV2Gate(state.phase)) {
|
|
341
|
+
const compiled = ensurePlanV2Graph(s.basePath, state);
|
|
342
|
+
if (!compiled.ok) {
|
|
343
|
+
const reason = compiled.reason ?? "Plan v2 compilation failed";
|
|
344
|
+
await runPreDispatchGate({
|
|
345
|
+
gateId: "plan-v2-gate",
|
|
346
|
+
gateType: "policy",
|
|
347
|
+
outcome: "manual-attention",
|
|
348
|
+
failureClass: "manual-attention",
|
|
349
|
+
rationale: "plan v2 compile gate failed",
|
|
350
|
+
findings: reason,
|
|
351
|
+
milestoneId: state.activeMilestone?.id ?? undefined,
|
|
352
|
+
});
|
|
353
|
+
ctx.ui.notify(`Plan gate failed-closed: ${reason}`, "error");
|
|
354
|
+
await deps.pauseAuto(ctx, pi);
|
|
355
|
+
return { action: "break", reason: "plan-v2-gate-failed" };
|
|
356
|
+
}
|
|
357
|
+
await runPreDispatchGate({
|
|
358
|
+
gateId: "plan-v2-gate",
|
|
359
|
+
gateType: "policy",
|
|
360
|
+
outcome: "pass",
|
|
361
|
+
failureClass: "none",
|
|
362
|
+
rationale: "plan v2 compile gate passed",
|
|
363
|
+
milestoneId: state.activeMilestone?.id ?? undefined,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
224
366
|
deps.syncCmuxSidebar(prefs, state);
|
|
225
367
|
let mid = state.activeMilestone?.id;
|
|
226
368
|
let midTitle = state.activeMilestone?.title;
|
|
@@ -266,7 +408,10 @@ export async function runPreDispatch(
|
|
|
266
408
|
s.basePath,
|
|
267
409
|
mid,
|
|
268
410
|
eligible,
|
|
269
|
-
{
|
|
411
|
+
{
|
|
412
|
+
maxWorkers: prefs.slice_parallel.max_workers ?? 2,
|
|
413
|
+
useExecutionGraph: uokFlags.executionGraph,
|
|
414
|
+
},
|
|
270
415
|
);
|
|
271
416
|
if (result.started.length > 0) {
|
|
272
417
|
ctx.ui.notify(
|
|
@@ -1081,7 +1226,13 @@ export async function runUnitPhase(
|
|
|
1081
1226
|
);
|
|
1082
1227
|
const previousTier = s.currentUnitRouting?.tier;
|
|
1083
1228
|
|
|
1229
|
+
// Scope workflow-logger buffer to this unit so post-finalize drains are
|
|
1230
|
+
// per-unit. Without this, the module-level _buffer accumulates across every
|
|
1231
|
+
// unit in the same Node process (see workflow-logger.ts module header).
|
|
1232
|
+
_resetLogs();
|
|
1084
1233
|
s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
|
|
1234
|
+
s.lastGitActionFailure = null;
|
|
1235
|
+
s.lastGitActionStatus = null;
|
|
1085
1236
|
setCurrentPhase(unitType);
|
|
1086
1237
|
s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
|
|
1087
1238
|
const unitStartSeq = ic.nextSeq();
|
|
@@ -1347,6 +1498,7 @@ export async function runUnitPhase(
|
|
|
1347
1498
|
// Provider-error pause: pauseAuto already handled cleanup and scheduled
|
|
1348
1499
|
// recovery. Don't hard-stop — just break out of the loop (#2762).
|
|
1349
1500
|
if (unitResult.errorContext?.category === "provider") {
|
|
1501
|
+
await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
|
|
1350
1502
|
debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext.isTransient });
|
|
1351
1503
|
return { action: "break", reason: "provider-pause" };
|
|
1352
1504
|
}
|
|
@@ -1365,9 +1517,23 @@ export async function runUnitPhase(
|
|
|
1365
1517
|
);
|
|
1366
1518
|
debugLog("autoLoop", { phase: "session-timeout-pause", unitType, unitId });
|
|
1367
1519
|
await deps.pauseAuto(ctx, pi);
|
|
1520
|
+
await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
|
|
1521
|
+
await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
|
|
1368
1522
|
return { action: "break", reason: "session-timeout" };
|
|
1369
1523
|
}
|
|
1370
1524
|
// All other cancelled states (structural errors, non-transient failures): hard stop
|
|
1525
|
+
if (s.currentUnit) {
|
|
1526
|
+
await deps.closeoutUnit(
|
|
1527
|
+
ctx,
|
|
1528
|
+
s.basePath,
|
|
1529
|
+
unitType,
|
|
1530
|
+
unitId,
|
|
1531
|
+
s.currentUnit.startedAt,
|
|
1532
|
+
deps.buildSnapshotOpts(unitType, unitId),
|
|
1533
|
+
);
|
|
1534
|
+
}
|
|
1535
|
+
await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
|
|
1536
|
+
await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
|
|
1371
1537
|
ctx.ui.notify(
|
|
1372
1538
|
`Session creation failed for ${unitType} ${unitId}: ${unitResult.errorContext?.message ?? "unknown"}. Stopping auto-mode.`,
|
|
1373
1539
|
"warning",
|
|
@@ -1545,6 +1711,9 @@ export async function runFinalize(
|
|
|
1545
1711
|
// cannot mutate state for the next unit (#3757).
|
|
1546
1712
|
s.currentUnit = null;
|
|
1547
1713
|
clearCurrentPhase();
|
|
1714
|
+
// Drop any logger entries from the timed-out unit so they don't bleed
|
|
1715
|
+
// into the next iteration's drain.
|
|
1716
|
+
drainLogs();
|
|
1548
1717
|
loopState.consecutiveFinalizeTimeouts++;
|
|
1549
1718
|
debugLog("autoLoop", {
|
|
1550
1719
|
phase: "pre-verification-timeout",
|
|
@@ -1572,11 +1741,15 @@ export async function runFinalize(
|
|
|
1572
1741
|
|
|
1573
1742
|
const preResult = preResultGuard.value;
|
|
1574
1743
|
if (preResult === "dispatched") {
|
|
1744
|
+
const dispatchedReason = s.lastGitActionFailure
|
|
1745
|
+
? "git-closeout-failure"
|
|
1746
|
+
: "pre-verification-dispatched";
|
|
1575
1747
|
debugLog("autoLoop", {
|
|
1576
1748
|
phase: "exit",
|
|
1577
|
-
reason:
|
|
1749
|
+
reason: dispatchedReason,
|
|
1750
|
+
gitError: s.lastGitActionFailure ?? undefined,
|
|
1578
1751
|
});
|
|
1579
|
-
return { action: "break", reason:
|
|
1752
|
+
return { action: "break", reason: dispatchedReason };
|
|
1580
1753
|
}
|
|
1581
1754
|
if (preResult === "retry") {
|
|
1582
1755
|
if (sidecarItem) {
|
|
@@ -1643,6 +1816,9 @@ export async function runFinalize(
|
|
|
1643
1816
|
// cannot mutate state for the next unit (#3757).
|
|
1644
1817
|
s.currentUnit = null;
|
|
1645
1818
|
clearCurrentPhase();
|
|
1819
|
+
// Drop any logger entries from the timed-out unit so they don't bleed
|
|
1820
|
+
// into the next iteration's drain.
|
|
1821
|
+
drainLogs();
|
|
1646
1822
|
loopState.consecutiveFinalizeTimeouts++;
|
|
1647
1823
|
debugLog("autoLoop", {
|
|
1648
1824
|
phase: "post-verification-timeout",
|
|
@@ -1687,5 +1863,16 @@ export async function runFinalize(
|
|
|
1687
1863
|
// Both pre and post verification completed without timeout — reset counter
|
|
1688
1864
|
loopState.consecutiveFinalizeTimeouts = 0;
|
|
1689
1865
|
|
|
1866
|
+
// Surface accumulated workflow-logger issues for this unit to the user.
|
|
1867
|
+
// Warnings/errors logged during the unit are buffered in the logger and
|
|
1868
|
+
// drained here so the user sees a single consolidated post-unit alert.
|
|
1869
|
+
if (hasAnyIssues()) {
|
|
1870
|
+
const { logs } = drainAndSummarize();
|
|
1871
|
+
if (logs.length > 0) {
|
|
1872
|
+
const severity = logs.some((e) => e.severity === "error") ? "error" : "warning";
|
|
1873
|
+
ctx.ui.notify(formatForNotification(logs), severity);
|
|
1874
|
+
}
|
|
1875
|
+
}
|
|
1876
|
+
|
|
1690
1877
|
return { action: "next", data: undefined as void };
|
|
1691
1878
|
}
|
|
@@ -106,6 +106,8 @@ export class AutoSession {
|
|
|
106
106
|
|
|
107
107
|
// ── Current unit ─────────────────────────────────────────────────────────
|
|
108
108
|
currentUnit: CurrentUnit | null = null;
|
|
109
|
+
currentTraceId: string | null = null;
|
|
110
|
+
currentTurnId: string | null = null;
|
|
109
111
|
currentUnitRouting: UnitRouting | null = null;
|
|
110
112
|
currentMilestoneId: string | null = null;
|
|
111
113
|
|
|
@@ -137,6 +139,10 @@ export class AutoSession {
|
|
|
137
139
|
/** Set when a GSD tool execution ends with isError due to malformed/truncated
|
|
138
140
|
* JSON arguments. Checked by postUnitPreVerification to break retry loops. */
|
|
139
141
|
lastToolInvocationError: string | null = null;
|
|
142
|
+
/** Set when turn-level git action fails during closeout. */
|
|
143
|
+
lastGitActionFailure: string | null = null;
|
|
144
|
+
/** Last turn-level git action status captured during finalize. */
|
|
145
|
+
lastGitActionStatus: "ok" | "failed" | null = null;
|
|
140
146
|
|
|
141
147
|
// ── Isolation degradation ────────────────────────────────────────────
|
|
142
148
|
/** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
|
|
@@ -219,6 +225,8 @@ export class AutoSession {
|
|
|
219
225
|
|
|
220
226
|
// Unit
|
|
221
227
|
this.currentUnit = null;
|
|
228
|
+
this.currentTraceId = null;
|
|
229
|
+
this.currentTurnId = null;
|
|
222
230
|
this.currentUnitRouting = null;
|
|
223
231
|
this.currentMilestoneId = null;
|
|
224
232
|
|
|
@@ -250,6 +258,8 @@ export class AutoSession {
|
|
|
250
258
|
this.rewriteAttemptCount = 0;
|
|
251
259
|
this.consecutiveCompleteBootstraps = 0;
|
|
252
260
|
this.lastToolInvocationError = null;
|
|
261
|
+
this.lastGitActionFailure = null;
|
|
262
|
+
this.lastGitActionStatus = null;
|
|
253
263
|
this.isolationDegraded = false;
|
|
254
264
|
this.milestoneMergedInPhases = false;
|
|
255
265
|
this.checkpointSha = null;
|