gsd-pi 2.73.1-dev.d987996 → 2.74.0-dev.0306a2e
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-web-branch.d.ts +4 -3
- package/dist/cli-web-branch.js +10 -7
- package/dist/cli.js +184 -206
- package/dist/headless-query.js +4 -1
- package/dist/help-text.js +23 -0
- package/dist/logo.d.ts +1 -1
- package/dist/logo.js +1 -1
- package/dist/onboarding.js +59 -53
- package/dist/resource-loader.js +2 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +68 -4
- 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 +173 -13
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +22 -4
- package/dist/resources/extensions/gsd/auto-model-selection.js +105 -16
- package/dist/resources/extensions/gsd/auto-post-unit.js +254 -15
- package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
- package/dist/resources/extensions/gsd/auto-start.js +23 -6
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +13 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
- package/dist/resources/extensions/gsd/auto-verification.js +186 -3
- package/dist/resources/extensions/gsd/auto.js +65 -12
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +41 -2
- 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-handlers.js +8 -2
- 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 +15 -2
- 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/notification-widget.js +2 -2
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
- package/dist/resources/extensions/gsd/preferences-models.js +63 -3
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +130 -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 +66 -15
- 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/update-check.d.ts +1 -0
- package/dist/update-check.js +13 -5
- package/dist/update-cmd.js +4 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- 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 +13 -13
- 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 -3
- 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 +2 -9
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -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/dist/utils/overflow.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/overflow.js +12 -0
- package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/tests/overflow.test.js +50 -0
- package/packages/pi-ai/dist/utils/tests/overflow.test.js.map +1 -0
- 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 +5 -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/src/utils/overflow.ts +14 -1
- package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
- package/packages/pi-ai/tsconfig.json +1 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +721 -8
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.js +5 -5
- package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +45 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -0
- 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/assistant-message.d.ts +12 -2
- 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 +65 -28
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +9 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +52 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -0
- 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 +305 -20
- 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 +59 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +884 -8
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +5 -5
- package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +50 -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/assistant-message.ts +78 -32
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +73 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +9 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +381 -39
- 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 +79 -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/dist/__tests__/tui.test.js +60 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +32 -3
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/tui.test.ts +76 -1
- package/packages/pi-tui/src/tui.ts +31 -3
- 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/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +107 -5
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +111 -2
- 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 +213 -13
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +26 -10
- package/src/resources/extensions/gsd/auto-model-selection.ts +151 -16
- package/src/resources/extensions/gsd/auto-post-unit.ts +278 -16
- package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
- package/src/resources/extensions/gsd/auto-start.ts +30 -6
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +17 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
- package/src/resources/extensions/gsd/auto-verification.ts +225 -3
- package/src/resources/extensions/gsd/auto.ts +72 -16
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -2
- 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-handlers.ts +8 -2
- 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 +15 -2
- 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/notification-widget.ts +2 -2
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
- package/src/resources/extensions/gsd/preferences-models.ts +61 -3
- package/src/resources/extensions/gsd/preferences-types.ts +44 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +130 -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 +80 -17
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +9 -5
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +51 -2
- 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-milestone-false-merge.test.ts +142 -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/completed-at-reconcile.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +68 -8
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +3 -3
- 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/flat-rate-routing-guard.test.ts +137 -1
- 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/integration/state-machine-edge-cases.test.ts +4 -2
- 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/model-isolation.test.ts +91 -2
- 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/preferences.test.ts +47 -0
- 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/state-machine-full-walkthrough.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +9 -6
- 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-stuck-guard.test.ts +179 -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/{cGmbVq2su4f9tMpgIkG8u → tqdo0yKKYz6fJXQnIgbdx}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{cGmbVq2su4f9tMpgIkG8u → tqdo0yKKYz6fJXQnIgbdx}/_ssgManifest.js +0 -0
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
|
|
35
35
|
import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
|
|
36
36
|
import { logWarning } from "./workflow-logger.js";
|
|
37
|
+
import { inlineGraphSubgraph } from "./graph-context.js";
|
|
37
38
|
|
|
38
39
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
39
40
|
|
|
@@ -1175,6 +1176,10 @@ export async function buildResearchSlicePrompt(
|
|
|
1175
1176
|
const knowledgeInlineRS = await inlineKnowledgeScoped(base, keywords);
|
|
1176
1177
|
if (knowledgeInlineRS) inlined.push(knowledgeInlineRS);
|
|
1177
1178
|
|
|
1179
|
+
// Knowledge graph: subgraph for this slice (graceful — skipped if no graph.json)
|
|
1180
|
+
const graphBlockRS = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
|
|
1181
|
+
if (graphBlockRS) inlined.push(graphBlockRS);
|
|
1182
|
+
|
|
1178
1183
|
inlined.push(inlineTemplate("research", "Research"));
|
|
1179
1184
|
|
|
1180
1185
|
const depContent = await inlineDependencySummaries(mid, sid, base);
|
|
@@ -1250,6 +1255,10 @@ export async function buildPlanSlicePrompt(
|
|
|
1250
1255
|
const knowledgeInlinePS = await inlineKnowledgeScoped(base, keywordsPS);
|
|
1251
1256
|
if (knowledgeInlinePS) inlined.push(knowledgeInlinePS);
|
|
1252
1257
|
|
|
1258
|
+
// Knowledge graph: subgraph for this slice (graceful — skipped if no graph.json)
|
|
1259
|
+
const graphBlockPS = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
|
|
1260
|
+
if (graphBlockPS) inlined.push(graphBlockPS);
|
|
1261
|
+
|
|
1253
1262
|
inlined.push(inlineTemplate("plan", "Slice Plan"));
|
|
1254
1263
|
if (inlineLevel === "full") {
|
|
1255
1264
|
inlined.push(inlineTemplate("task-plan", "Task Plan"));
|
|
@@ -1366,12 +1375,16 @@ export async function buildExecuteTaskPrompt(
|
|
|
1366
1375
|
// Only include if it has content (not a "not found" result)
|
|
1367
1376
|
const knowledgeContent = knowledgeInlineET && !knowledgeInlineET.includes("not found") ? knowledgeInlineET : null;
|
|
1368
1377
|
|
|
1378
|
+
// Knowledge graph: tight subgraph for this task (graceful — skipped if no graph.json)
|
|
1379
|
+
const graphBlockET = await inlineGraphSubgraph(base, `${tid} ${tTitle}`, { budget: 2000 });
|
|
1380
|
+
|
|
1369
1381
|
const inlinedTemplates = inlineLevel === "minimal"
|
|
1370
1382
|
? inlineTemplate("task-summary", "Task Summary")
|
|
1371
1383
|
: [
|
|
1372
1384
|
inlineTemplate("task-summary", "Task Summary"),
|
|
1373
1385
|
inlineTemplate("decisions", "Decisions"),
|
|
1374
1386
|
...(knowledgeContent ? [knowledgeContent] : []),
|
|
1387
|
+
...(graphBlockET ? [graphBlockET] : []),
|
|
1375
1388
|
].join("\n\n---\n\n");
|
|
1376
1389
|
|
|
1377
1390
|
const taskSummaryPath = join(base, `${relSlicePath(base, mid, sid)}/tasks/${tid}-SUMMARY.md`);
|
|
@@ -83,7 +83,11 @@ import { join } from "node:path";
|
|
|
83
83
|
import { sep as pathSep } from "node:path";
|
|
84
84
|
|
|
85
85
|
import { resolveProjectRootDbPath } from "./bootstrap/dynamic-tools.js";
|
|
86
|
-
import {
|
|
86
|
+
import {
|
|
87
|
+
isCustomProvider,
|
|
88
|
+
resolveDefaultSessionModel,
|
|
89
|
+
resolveDynamicRoutingConfig,
|
|
90
|
+
} from "./preferences-models.js";
|
|
87
91
|
import type { WorktreeResolver } from "./worktree-resolver.js";
|
|
88
92
|
import { getSessionModelOverride } from "./session-model-override.js";
|
|
89
93
|
|
|
@@ -274,8 +278,18 @@ export async function bootstrapAutoSession(
|
|
|
274
278
|
//
|
|
275
279
|
// This preserves #3517 defaults while honoring explicit runtime model
|
|
276
280
|
// selection for subsequent /gsd runs in the same session.
|
|
281
|
+
//
|
|
282
|
+
// Exception (#4122): when the session provider is a custom provider declared
|
|
283
|
+
// in ~/.gsd/agent/models.json (Ollama, vLLM, OpenAI-compatible proxy, etc.),
|
|
284
|
+
// PREFERENCES.md is skipped entirely. PREFERENCES.md cannot reference custom
|
|
285
|
+
// providers, so honoring it would silently reroute auto-mode to a built-in
|
|
286
|
+
// provider the user is not logged into and surface as "Not logged in · Please
|
|
287
|
+
// run /login" before pausing and resetting to claude-code/claude-sonnet-4-6.
|
|
277
288
|
const manualSessionOverride = getSessionModelOverride(ctx.sessionManager.getSessionId());
|
|
278
|
-
const
|
|
289
|
+
const sessionProviderIsCustom = isCustomProvider(ctx.model?.provider);
|
|
290
|
+
const preferredModel = sessionProviderIsCustom
|
|
291
|
+
? null
|
|
292
|
+
: resolveDefaultSessionModel(ctx.model?.provider);
|
|
279
293
|
// Validate the preferred model against the live registry + provider auth so
|
|
280
294
|
// an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
|
|
281
295
|
// start-model snapshot. Without this, every subsequent unit would try to
|
|
@@ -792,6 +806,9 @@ export async function bootstrapAutoSession(
|
|
|
792
806
|
|
|
793
807
|
ctx.ui.setStatus("gsd-auto", s.stepMode ? "next" : "auto");
|
|
794
808
|
ctx.ui.setFooter(hideFooter);
|
|
809
|
+
// Hide gsd-health during AUTO — gsd-progress is the single source of truth
|
|
810
|
+
// for last-commit / cost / health signal while auto is running.
|
|
811
|
+
ctx.ui.setWidget("gsd-health", undefined);
|
|
795
812
|
const modeLabel = s.stepMode ? "Step-mode" : "Auto-mode";
|
|
796
813
|
const pendingCount = (state.registry ?? []).filter(
|
|
797
814
|
(m) => m.status !== "complete" && m.status !== "parked",
|
|
@@ -811,12 +828,19 @@ export async function bootstrapAutoSession(
|
|
|
811
828
|
? `${s.autoModeStartModel.provider}/${s.autoModeStartModel.id}`
|
|
812
829
|
: ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : "default";
|
|
813
830
|
|
|
814
|
-
// Flat-rate providers (e.g. GitHub Copilot, claude-code
|
|
815
|
-
//
|
|
816
|
-
|
|
831
|
+
// Flat-rate providers (e.g. GitHub Copilot, claude-code, user-declared
|
|
832
|
+
// subscription proxies, externalCli CLIs) suppress routing at dispatch
|
|
833
|
+
// time (#3453) — reflect that in the banner. Thread the same
|
|
834
|
+
// FlatRateContext used by selectAndApplyModel so user-declared
|
|
835
|
+
// flat-rate providers and externalCli auto-detection are respected.
|
|
836
|
+
const { isFlatRateProvider, buildFlatRateContext } = await import("./auto-model-selection.js");
|
|
837
|
+
const bannerPrefs = loadEffectiveGSDPreferences()?.preferences;
|
|
817
838
|
const effectiveProvider = s.autoModeStartModel?.provider ?? ctx.model?.provider;
|
|
818
839
|
const effectivelyEnabled = routingConfig.enabled
|
|
819
|
-
&& !(effectiveProvider && isFlatRateProvider(
|
|
840
|
+
&& !(effectiveProvider && isFlatRateProvider(
|
|
841
|
+
effectiveProvider,
|
|
842
|
+
buildFlatRateContext(effectiveProvider, ctx, bannerPrefs),
|
|
843
|
+
));
|
|
820
844
|
|
|
821
845
|
// The actual ceiling may come from tier_models.heavy, not the start model.
|
|
822
846
|
const effectiveCeiling = (routingConfig.enabled && routingConfig.tier_models?.heavy)
|
|
@@ -230,6 +230,23 @@ export async function recoverTimedOutUnit(
|
|
|
230
230
|
return "recovered";
|
|
231
231
|
}
|
|
232
232
|
|
|
233
|
+
// #4175: For complete-milestone, never write a blocker placeholder — a stub
|
|
234
|
+
// SUMMARY has no recovery value (milestone is terminal), it does not update
|
|
235
|
+
// DB status, and downstream merge paths can treat the stub as a legitimate
|
|
236
|
+
// completion signal. Pause instead so the worktree branch is preserved.
|
|
237
|
+
if (unitType === "complete-milestone") {
|
|
238
|
+
writeUnitRuntimeRecord(basePath, unitType, unitId, currentUnitStartedAt, {
|
|
239
|
+
phase: "paused",
|
|
240
|
+
recoveryAttempts: recoveryAttempts + 1,
|
|
241
|
+
lastRecoveryReason: reason,
|
|
242
|
+
});
|
|
243
|
+
ctx.ui.notify(
|
|
244
|
+
`Milestone ${unitId} ${reason}-recovery exhausted ${maxRecoveryAttempts} attempt(s) — worktree branch preserved. Re-run /gsd auto once blockers are resolved.`,
|
|
245
|
+
"error",
|
|
246
|
+
);
|
|
247
|
+
return "paused";
|
|
248
|
+
}
|
|
249
|
+
|
|
233
250
|
// Retries exhausted — write a blocker placeholder and advance the pipeline
|
|
234
251
|
// instead of silently stalling.
|
|
235
252
|
const placeholder = writeBlockerPlaceholder(
|
|
@@ -8,6 +8,7 @@ import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
|
8
8
|
import { snapshotUnitMetrics } from "./metrics.js";
|
|
9
9
|
import { saveActivityLog } from "./activity-log.js";
|
|
10
10
|
import { logWarning } from "./workflow-logger.js";
|
|
11
|
+
import { writeTurnGitTransaction } from "./uok/gitops.js";
|
|
11
12
|
|
|
12
13
|
export interface CloseoutOptions {
|
|
13
14
|
promptCharCount?: number;
|
|
@@ -15,6 +16,12 @@ export interface CloseoutOptions {
|
|
|
15
16
|
tier?: string;
|
|
16
17
|
modelDowngraded?: boolean;
|
|
17
18
|
continueHereFired?: boolean;
|
|
19
|
+
traceId?: string;
|
|
20
|
+
turnId?: string;
|
|
21
|
+
gitAction?: "commit" | "snapshot" | "status-only";
|
|
22
|
+
gitPush?: boolean;
|
|
23
|
+
gitStatus?: "ok" | "failed";
|
|
24
|
+
gitError?: string;
|
|
18
25
|
}
|
|
19
26
|
|
|
20
27
|
/**
|
|
@@ -47,6 +54,23 @@ export async function closeoutUnit(
|
|
|
47
54
|
}
|
|
48
55
|
}
|
|
49
56
|
|
|
57
|
+
if (opts?.traceId && opts.turnId && opts.gitAction && opts.gitStatus) {
|
|
58
|
+
writeTurnGitTransaction({
|
|
59
|
+
basePath,
|
|
60
|
+
traceId: opts.traceId,
|
|
61
|
+
turnId: opts.turnId,
|
|
62
|
+
unitType,
|
|
63
|
+
unitId,
|
|
64
|
+
stage: "record",
|
|
65
|
+
action: opts.gitAction,
|
|
66
|
+
push: opts.gitPush === true,
|
|
67
|
+
status: opts.gitStatus,
|
|
68
|
+
error: opts.gitError,
|
|
69
|
+
metadata: {
|
|
70
|
+
activityFile,
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
50
75
|
return activityFile ?? undefined;
|
|
51
76
|
}
|
|
52
|
-
|
|
@@ -12,10 +12,15 @@
|
|
|
12
12
|
|
|
13
13
|
import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
14
14
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
15
|
-
import { resolveSliceFile, resolveSlicePath } from "./paths.js";
|
|
15
|
+
import { resolveSliceFile, resolveSlicePath, resolveMilestoneFile } from "./paths.js";
|
|
16
16
|
import { parseUnitId } from "./unit-id.js";
|
|
17
|
-
import { isDbAvailable, getTask, getSliceTasks, type TaskRow } from "./gsd-db.js";
|
|
17
|
+
import { isDbAvailable, getTask, getSliceTasks, getMilestoneSlices, type TaskRow } from "./gsd-db.js";
|
|
18
18
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
19
|
+
import { extractVerdict } from "./verdict-parser.js";
|
|
20
|
+
import { isClosedStatus } from "./status-guards.js";
|
|
21
|
+
import { loadFile } from "./files.js";
|
|
22
|
+
import { parseRoadmap } from "./parsers-legacy.js";
|
|
23
|
+
import { isMilestoneComplete } from "./state.js";
|
|
19
24
|
import {
|
|
20
25
|
runVerificationGate,
|
|
21
26
|
formatFailureContext,
|
|
@@ -28,6 +33,8 @@ import { runPostExecutionChecks, type PostExecutionResult } from "./post-executi
|
|
|
28
33
|
import type { AutoSession } from "./auto/session.js";
|
|
29
34
|
import type { VerificationResult as VerificationGateResult } from "./types.js";
|
|
30
35
|
import { join } from "node:path";
|
|
36
|
+
import { resolveUokFlags } from "./uok/flags.js";
|
|
37
|
+
import { UokGateRunner } from "./uok/gate-runner.js";
|
|
31
38
|
|
|
32
39
|
export interface VerificationContext {
|
|
33
40
|
s: AutoSession;
|
|
@@ -43,6 +50,144 @@ function isInfraVerificationFailure(stderr: string): boolean {
|
|
|
43
50
|
);
|
|
44
51
|
}
|
|
45
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Post-unit guard for `validate-milestone` units (#4094).
|
|
55
|
+
*
|
|
56
|
+
* When validate-milestone writes verdict=needs-remediation, the agent is
|
|
57
|
+
* expected to also call gsd_reassess_roadmap in the same turn to add
|
|
58
|
+
* remediation slices. If they don't, the state machine re-derives
|
|
59
|
+
* `phase: validating-milestone` indefinitely (all slices still complete +
|
|
60
|
+
* verdict still needs-remediation), wasting ~3 dispatches before the stuck
|
|
61
|
+
* detector fires.
|
|
62
|
+
*
|
|
63
|
+
* This guard fires immediately on the first occurrence: if VALIDATION.md
|
|
64
|
+
* verdict is needs-remediation and no incomplete slices exist for the
|
|
65
|
+
* milestone, pause the auto-loop with a clear blocker.
|
|
66
|
+
*/
|
|
67
|
+
async function runValidateMilestonePostCheck(
|
|
68
|
+
vctx: VerificationContext,
|
|
69
|
+
pauseAuto: (ctx?: ExtensionContext, pi?: ExtensionAPI) => Promise<void>,
|
|
70
|
+
): Promise<VerificationResult> {
|
|
71
|
+
const { s, ctx, pi } = vctx;
|
|
72
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
73
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
74
|
+
const persistMilestoneValidationGate = async (
|
|
75
|
+
outcome: "pass" | "fail" | "retry" | "manual-attention",
|
|
76
|
+
failureClass: "none" | "verification" | "manual-attention",
|
|
77
|
+
rationale: string,
|
|
78
|
+
findings = "",
|
|
79
|
+
milestoneId?: string,
|
|
80
|
+
): Promise<void> => {
|
|
81
|
+
if (!uokFlags.gates || !s.currentUnit) return;
|
|
82
|
+
const gateRunner = new UokGateRunner();
|
|
83
|
+
gateRunner.register({
|
|
84
|
+
id: "milestone-validation-post-check",
|
|
85
|
+
type: "verification",
|
|
86
|
+
execute: async () => ({
|
|
87
|
+
outcome,
|
|
88
|
+
failureClass,
|
|
89
|
+
rationale,
|
|
90
|
+
findings,
|
|
91
|
+
}),
|
|
92
|
+
});
|
|
93
|
+
await gateRunner.run("milestone-validation-post-check", {
|
|
94
|
+
basePath: s.basePath,
|
|
95
|
+
traceId: `validation-post-check:${s.currentUnit.id}`,
|
|
96
|
+
turnId: s.currentUnit.id,
|
|
97
|
+
milestoneId,
|
|
98
|
+
unitType: s.currentUnit.type,
|
|
99
|
+
unitId: s.currentUnit.id,
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
if (!s.currentUnit) return "continue";
|
|
104
|
+
|
|
105
|
+
const { milestone: mid } = parseUnitId(s.currentUnit.id);
|
|
106
|
+
if (!mid) return "continue";
|
|
107
|
+
|
|
108
|
+
const validationFile = resolveMilestoneFile(s.basePath, mid, "VALIDATION");
|
|
109
|
+
if (!validationFile) return "continue";
|
|
110
|
+
|
|
111
|
+
const validationContent = await loadFile(validationFile);
|
|
112
|
+
if (!validationContent) return "continue";
|
|
113
|
+
|
|
114
|
+
const verdict = extractVerdict(validationContent);
|
|
115
|
+
if (verdict !== "needs-remediation") {
|
|
116
|
+
await persistMilestoneValidationGate(
|
|
117
|
+
"pass",
|
|
118
|
+
"none",
|
|
119
|
+
`milestone validation verdict is ${verdict}; no remediation loop risk`,
|
|
120
|
+
"",
|
|
121
|
+
mid,
|
|
122
|
+
);
|
|
123
|
+
return "continue";
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const incompleteSliceCount = await countIncompleteSlices(s.basePath, mid);
|
|
127
|
+
|
|
128
|
+
// If any non-closed slices exist, the agent successfully queued remediation
|
|
129
|
+
// work — proceed normally. The state machine will execute those slices and
|
|
130
|
+
// re-validate per the #3596/#3670 fix.
|
|
131
|
+
if (incompleteSliceCount > 0) {
|
|
132
|
+
await persistMilestoneValidationGate(
|
|
133
|
+
"pass",
|
|
134
|
+
"none",
|
|
135
|
+
`remediation slices present (${incompleteSliceCount}); validation can continue`,
|
|
136
|
+
"",
|
|
137
|
+
mid,
|
|
138
|
+
);
|
|
139
|
+
return "continue";
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
ctx.ui.notify(
|
|
143
|
+
`Milestone ${mid} validation returned verdict=needs-remediation but no remediation slices were added. Pausing for human review.`,
|
|
144
|
+
"error",
|
|
145
|
+
);
|
|
146
|
+
process.stderr.write(
|
|
147
|
+
`validate-milestone: pausing — verdict=needs-remediation with no incomplete slices for ${mid}. ` +
|
|
148
|
+
`The agent must call gsd_reassess_roadmap to add remediation slices before re-validation.\n`,
|
|
149
|
+
);
|
|
150
|
+
await persistMilestoneValidationGate(
|
|
151
|
+
"manual-attention",
|
|
152
|
+
"manual-attention",
|
|
153
|
+
"needs-remediation verdict without queued remediation slices",
|
|
154
|
+
`No incomplete slices found for ${mid} while verdict=needs-remediation`,
|
|
155
|
+
mid,
|
|
156
|
+
);
|
|
157
|
+
await pauseAuto(ctx, pi);
|
|
158
|
+
return "pause";
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Count slices for a milestone that are not in a closed status.
|
|
163
|
+
* DB-backed projects are authoritative (#4094 peer review); falls back to
|
|
164
|
+
* roadmap parsing only when the DB is unavailable.
|
|
165
|
+
*/
|
|
166
|
+
async function countIncompleteSlices(basePath: string, milestoneId: string): Promise<number> {
|
|
167
|
+
if (isDbAvailable()) {
|
|
168
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
169
|
+
if (slices.length === 0) {
|
|
170
|
+
// No DB rows — treat as "unknown", do not pause.
|
|
171
|
+
return 1;
|
|
172
|
+
}
|
|
173
|
+
return slices.filter((slice) => !isClosedStatus(slice.status)).length;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Filesystem fallback: parse the roadmap markdown.
|
|
177
|
+
try {
|
|
178
|
+
const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
179
|
+
if (!roadmapFile) return 1;
|
|
180
|
+
const roadmapContent = await loadFile(roadmapFile);
|
|
181
|
+
if (!roadmapContent) return 1;
|
|
182
|
+
const roadmap = parseRoadmap(roadmapContent);
|
|
183
|
+
if (roadmap.slices.length === 0) return 1;
|
|
184
|
+
return isMilestoneComplete(roadmap) ? 0 : 1;
|
|
185
|
+
} catch {
|
|
186
|
+
// Parsing failures should not cause false-positive pauses.
|
|
187
|
+
return 1;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
46
191
|
/**
|
|
47
192
|
* Run the verification gate for the current execute-task unit.
|
|
48
193
|
* Returns:
|
|
@@ -56,13 +201,22 @@ export async function runPostUnitVerification(
|
|
|
56
201
|
): Promise<VerificationResult> {
|
|
57
202
|
const { s, ctx, pi } = vctx;
|
|
58
203
|
|
|
59
|
-
if (!s.currentUnit
|
|
204
|
+
if (!s.currentUnit) {
|
|
205
|
+
return "continue";
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (s.currentUnit.type === "validate-milestone") {
|
|
209
|
+
return await runValidateMilestonePostCheck(vctx, pauseAuto);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (s.currentUnit.type !== "execute-task") {
|
|
60
213
|
return "continue";
|
|
61
214
|
}
|
|
62
215
|
|
|
63
216
|
try {
|
|
64
217
|
const effectivePrefs = loadEffectiveGSDPreferences();
|
|
65
218
|
const prefs = effectivePrefs?.preferences;
|
|
219
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
66
220
|
|
|
67
221
|
// Read task plan verify field
|
|
68
222
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
|
|
@@ -101,6 +255,37 @@ export async function runPostUnitVerification(
|
|
|
101
255
|
}
|
|
102
256
|
}
|
|
103
257
|
|
|
258
|
+
if (uokFlags.gates) {
|
|
259
|
+
const gateRunner = new UokGateRunner();
|
|
260
|
+
gateRunner.register({
|
|
261
|
+
id: "verification-gate",
|
|
262
|
+
type: "verification",
|
|
263
|
+
execute: async () => ({
|
|
264
|
+
outcome: result.passed ? "pass" : "fail",
|
|
265
|
+
failureClass: result.runtimeErrors?.some((e) => e.blocking)
|
|
266
|
+
? "execution"
|
|
267
|
+
: "verification",
|
|
268
|
+
rationale: result.passed
|
|
269
|
+
? "verification checks passed"
|
|
270
|
+
: "verification checks failed",
|
|
271
|
+
findings: result.passed
|
|
272
|
+
? ""
|
|
273
|
+
: formatFailureContext(result),
|
|
274
|
+
}),
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
await gateRunner.run("verification-gate", {
|
|
278
|
+
basePath: s.basePath,
|
|
279
|
+
traceId: `verification:${s.currentUnit.id}`,
|
|
280
|
+
turnId: s.currentUnit.id,
|
|
281
|
+
milestoneId: mid ?? undefined,
|
|
282
|
+
sliceId: sid ?? undefined,
|
|
283
|
+
taskId: tid ?? undefined,
|
|
284
|
+
unitType: s.currentUnit.type,
|
|
285
|
+
unitId: s.currentUnit.id,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
|
|
104
289
|
// Auto-fix retry preferences
|
|
105
290
|
const autoFixEnabled = prefs?.verification_auto_fix !== false;
|
|
106
291
|
const maxRetries =
|
|
@@ -243,6 +428,43 @@ export async function runPostUnitVerification(
|
|
|
243
428
|
);
|
|
244
429
|
}
|
|
245
430
|
|
|
431
|
+
if (uokFlags.gates) {
|
|
432
|
+
const strictMode = prefs?.enhanced_verification_strict === true;
|
|
433
|
+
const warnEscalated = postExecResult.status === "warn" && strictMode;
|
|
434
|
+
const blockingFailure = postExecResult.status === "fail" || warnEscalated;
|
|
435
|
+
const findings = postExecResult.checks
|
|
436
|
+
.filter((check) => !check.passed)
|
|
437
|
+
.map((check) => `[${check.category}] ${check.target}: ${check.message}`)
|
|
438
|
+
.join("\n");
|
|
439
|
+
const gateRunner = new UokGateRunner();
|
|
440
|
+
gateRunner.register({
|
|
441
|
+
id: "post-execution-checks",
|
|
442
|
+
type: "artifact",
|
|
443
|
+
execute: async () => ({
|
|
444
|
+
outcome: blockingFailure ? "fail" : "pass",
|
|
445
|
+
failureClass: postExecResult.status === "fail"
|
|
446
|
+
? "artifact"
|
|
447
|
+
: warnEscalated
|
|
448
|
+
? "policy"
|
|
449
|
+
: "none",
|
|
450
|
+
rationale: blockingFailure
|
|
451
|
+
? `post-execution checks ${postExecResult.status}${warnEscalated ? " (strict)" : ""}`
|
|
452
|
+
: "post-execution checks passed",
|
|
453
|
+
findings,
|
|
454
|
+
}),
|
|
455
|
+
});
|
|
456
|
+
await gateRunner.run("post-execution-checks", {
|
|
457
|
+
basePath: s.basePath,
|
|
458
|
+
traceId: `verification:${s.currentUnit.id}`,
|
|
459
|
+
turnId: s.currentUnit.id,
|
|
460
|
+
milestoneId: mid,
|
|
461
|
+
sliceId: sid,
|
|
462
|
+
taskId: tid,
|
|
463
|
+
unitType: s.currentUnit.type,
|
|
464
|
+
unitId: s.currentUnit.id,
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
|
|
246
468
|
// Check for blocking failures
|
|
247
469
|
if (postExecResult.status === "fail") {
|
|
248
470
|
postExecBlockingFailure = true;
|
|
@@ -187,7 +187,7 @@ import {
|
|
|
187
187
|
deregisterSigtermHandler as _deregisterSigtermHandler,
|
|
188
188
|
detectWorkingTreeActivity,
|
|
189
189
|
} from "./auto-supervisor.js";
|
|
190
|
-
import { isDbAvailable } from "./gsd-db.js";
|
|
190
|
+
import { isDbAvailable, getMilestone } from "./gsd-db.js";
|
|
191
191
|
import { countPendingCaptures } from "./captures.js";
|
|
192
192
|
import { clearCmuxSidebar, logCmuxEvent, syncCmuxSidebar } from "../cmux/index.js";
|
|
193
193
|
|
|
@@ -195,11 +195,15 @@ import { clearCmuxSidebar, logCmuxEvent, syncCmuxSidebar } from "../cmux/index.j
|
|
|
195
195
|
import { startUnitSupervision } from "./auto-timers.js";
|
|
196
196
|
import { runPostUnitVerification } from "./auto-verification.js";
|
|
197
197
|
import {
|
|
198
|
+
autoCommitUnit,
|
|
198
199
|
postUnitPreVerification,
|
|
199
200
|
postUnitPostVerification,
|
|
200
201
|
} from "./auto-post-unit.js";
|
|
201
202
|
import { bootstrapAutoSession, openProjectDbIfPresent, type BootstrapDeps } from "./auto-start.js";
|
|
203
|
+
import { initHealthWidget } from "./health-widget.js";
|
|
202
204
|
import { autoLoop, resolveAgentEnd, resolveAgentEndCancelled, _resetPendingResolve, isSessionSwitchInFlight, type LoopDeps, type ErrorContext } from "./auto-loop.js";
|
|
205
|
+
import { runAutoLoopWithUok } from "./uok/kernel.js";
|
|
206
|
+
import { resolveUokFlags } from "./uok/flags.js";
|
|
203
207
|
// Slice-level parallelism (#2340)
|
|
204
208
|
import { getEligibleSlices } from "./slice-parallel-eligibility.js";
|
|
205
209
|
import { startSliceParallel } from "./slice-parallel-orchestrator.js";
|
|
@@ -603,11 +607,29 @@ function buildSnapshotOpts(
|
|
|
603
607
|
continueHereFired?: boolean;
|
|
604
608
|
promptCharCount?: number;
|
|
605
609
|
baselineCharCount?: number;
|
|
610
|
+
traceId?: string;
|
|
611
|
+
turnId?: string;
|
|
612
|
+
gitAction?: "commit" | "snapshot" | "status-only";
|
|
613
|
+
gitPush?: boolean;
|
|
614
|
+
gitStatus?: "ok" | "failed";
|
|
615
|
+
gitError?: string;
|
|
606
616
|
} & Record<string, unknown> {
|
|
617
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
618
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
607
619
|
return {
|
|
608
620
|
...(s.autoStartTime > 0 ? { autoSessionKey: String(s.autoStartTime) } : {}),
|
|
609
621
|
promptCharCount: s.lastPromptCharCount,
|
|
610
622
|
baselineCharCount: s.lastBaselineCharCount,
|
|
623
|
+
traceId: s.currentTraceId ?? undefined,
|
|
624
|
+
turnId: s.currentTurnId ?? undefined,
|
|
625
|
+
...(uokFlags.gitops
|
|
626
|
+
? {
|
|
627
|
+
gitAction: uokFlags.gitopsTurnAction,
|
|
628
|
+
gitPush: uokFlags.gitopsTurnPush,
|
|
629
|
+
gitStatus: s.lastGitActionStatus ?? undefined,
|
|
630
|
+
gitError: s.lastGitActionFailure ?? undefined,
|
|
631
|
+
}
|
|
632
|
+
: {}),
|
|
611
633
|
...(s.currentUnitRouting ?? {}),
|
|
612
634
|
};
|
|
613
635
|
}
|
|
@@ -650,6 +672,7 @@ function handleLostSessionLock(
|
|
|
650
672
|
ctx?.ui.setStatus("gsd-auto", undefined);
|
|
651
673
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
652
674
|
ctx?.ui.setFooter(undefined);
|
|
675
|
+
if (ctx) initHealthWidget(ctx);
|
|
653
676
|
}
|
|
654
677
|
|
|
655
678
|
/**
|
|
@@ -684,6 +707,7 @@ function cleanupAfterLoopExit(ctx: ExtensionContext): void {
|
|
|
684
707
|
ctx.ui.setStatus("gsd-auto", undefined);
|
|
685
708
|
ctx.ui.setWidget("gsd-progress", undefined);
|
|
686
709
|
ctx.ui.setFooter(undefined);
|
|
710
|
+
initHealthWidget(ctx);
|
|
687
711
|
}
|
|
688
712
|
|
|
689
713
|
// Restore CWD out of worktree back to original project root
|
|
@@ -758,24 +782,36 @@ export async function stopAuto(
|
|
|
758
782
|
: { notify: () => {} };
|
|
759
783
|
const resolver = buildResolver();
|
|
760
784
|
|
|
761
|
-
// Check if the milestone is complete
|
|
785
|
+
// Check if the milestone is complete. DB status is the authoritative
|
|
786
|
+
// signal — only a successful gsd_complete_milestone call flips it to
|
|
787
|
+
// "complete" (tools/complete-milestone.ts). SUMMARY file presence is
|
|
788
|
+
// NOT sufficient: a blocker placeholder stub or a partial write can
|
|
789
|
+
// leave a file behind without the milestone actually being done,
|
|
790
|
+
// which previously caused stopAuto to merge a failed milestone and
|
|
791
|
+
// emit a misleading metadata-only merge warning (#4175).
|
|
792
|
+
// DB-unavailable projects fall back to SUMMARY-file presence.
|
|
762
793
|
let milestoneComplete = false;
|
|
763
794
|
try {
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
// Also check in the worktree path (SUMMARY may not be synced yet)
|
|
771
|
-
const wtSummaryPath = resolveMilestoneFile(
|
|
772
|
-
s.basePath,
|
|
795
|
+
if (isDbAvailable()) {
|
|
796
|
+
const dbRow = getMilestone(s.currentMilestoneId);
|
|
797
|
+
milestoneComplete = dbRow?.status === "complete";
|
|
798
|
+
} else {
|
|
799
|
+
const summaryPath = resolveMilestoneFile(
|
|
800
|
+
s.originalBasePath || s.basePath,
|
|
773
801
|
s.currentMilestoneId,
|
|
774
802
|
"SUMMARY",
|
|
775
803
|
);
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
804
|
+
if (!summaryPath) {
|
|
805
|
+
// Also check in the worktree path (SUMMARY may not be synced yet)
|
|
806
|
+
const wtSummaryPath = resolveMilestoneFile(
|
|
807
|
+
s.basePath,
|
|
808
|
+
s.currentMilestoneId,
|
|
809
|
+
"SUMMARY",
|
|
810
|
+
);
|
|
811
|
+
milestoneComplete = wtSummaryPath !== null;
|
|
812
|
+
} else {
|
|
813
|
+
milestoneComplete = true;
|
|
814
|
+
}
|
|
779
815
|
}
|
|
780
816
|
} catch (err) {
|
|
781
817
|
// Non-fatal — fall through to preserveBranch path
|
|
@@ -943,6 +979,7 @@ export async function stopAuto(
|
|
|
943
979
|
ctx?.ui.setStatus("gsd-auto", undefined);
|
|
944
980
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
945
981
|
ctx?.ui.setFooter(undefined);
|
|
982
|
+
if (ctx) initHealthWidget(ctx);
|
|
946
983
|
restoreProjectRootEnv();
|
|
947
984
|
restoreMilestoneLockEnv();
|
|
948
985
|
|
|
@@ -1044,6 +1081,7 @@ export async function pauseAuto(
|
|
|
1044
1081
|
ctx?.ui.setStatus("gsd-auto", "paused");
|
|
1045
1082
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1046
1083
|
ctx?.ui.setFooter(undefined);
|
|
1084
|
+
if (ctx) initHealthWidget(ctx);
|
|
1047
1085
|
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
1048
1086
|
ctx?.ui.notify(
|
|
1049
1087
|
`${s.stepMode ? "Step" : "Auto"}-mode paused (Escape). Type to interact, or ${resumeCmd} to resume.`,
|
|
@@ -1163,6 +1201,7 @@ function buildLoopDeps(): LoopDeps {
|
|
|
1163
1201
|
getMainBranch,
|
|
1164
1202
|
// Unit closeout + runtime records
|
|
1165
1203
|
closeoutUnit,
|
|
1204
|
+
autoCommitUnit,
|
|
1166
1205
|
recordOutcome,
|
|
1167
1206
|
writeLock,
|
|
1168
1207
|
captureAvailableSkills,
|
|
@@ -1383,6 +1422,11 @@ export async function startAuto(
|
|
|
1383
1422
|
s.stepMode = requestedStepMode;
|
|
1384
1423
|
s.cmdCtx = ctx;
|
|
1385
1424
|
s.basePath = base;
|
|
1425
|
+
// Ensure the workflow-logger audit log is pinned to the project root
|
|
1426
|
+
// even when auto-mode is entered via a path that bypasses the
|
|
1427
|
+
// bootstrap/dynamic-tools ensureDbOpen() → setLogBasePath() chain
|
|
1428
|
+
// (e.g. /clear resume, hot-reload).
|
|
1429
|
+
setLogBasePath(base);
|
|
1386
1430
|
s.unitDispatchCount.clear();
|
|
1387
1431
|
s.unitLifetimeDispatches.clear();
|
|
1388
1432
|
if (!getLedger()) initMetrics(base);
|
|
@@ -1489,7 +1533,13 @@ export async function startAuto(
|
|
|
1489
1533
|
logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", "progress");
|
|
1490
1534
|
|
|
1491
1535
|
captureProjectRootEnv(s.originalBasePath || s.basePath);
|
|
1492
|
-
await
|
|
1536
|
+
await runAutoLoopWithUok({
|
|
1537
|
+
ctx,
|
|
1538
|
+
pi,
|
|
1539
|
+
s,
|
|
1540
|
+
deps: buildLoopDeps(),
|
|
1541
|
+
runLegacyLoop: autoLoop,
|
|
1542
|
+
});
|
|
1493
1543
|
cleanupAfterLoopExit(ctx);
|
|
1494
1544
|
return;
|
|
1495
1545
|
}
|
|
@@ -1524,7 +1574,13 @@ export async function startAuto(
|
|
|
1524
1574
|
logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, requestedStepMode ? "Step-mode started." : "Auto-mode started.", "progress");
|
|
1525
1575
|
|
|
1526
1576
|
// Dispatch the first unit
|
|
1527
|
-
await
|
|
1577
|
+
await runAutoLoopWithUok({
|
|
1578
|
+
ctx,
|
|
1579
|
+
pi,
|
|
1580
|
+
s,
|
|
1581
|
+
deps: buildLoopDeps(),
|
|
1582
|
+
runLegacyLoop: autoLoop,
|
|
1583
|
+
});
|
|
1528
1584
|
cleanupAfterLoopExit(ctx);
|
|
1529
1585
|
}
|
|
1530
1586
|
|