gsd-pi 2.74.0-dev.b741afb → 2.74.0-dev.b7c5f96
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/resources/extensions/gsd/activity-log.js +16 -0
- package/dist/resources/extensions/gsd/auto/loop.js +147 -10
- package/dist/resources/extensions/gsd/auto/phases.js +164 -9
- 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 +54 -8
- package/dist/resources/extensions/gsd/auto-post-unit.js +215 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +24 -10
- 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-worktree.js +2 -0
- package/dist/resources/extensions/gsd/auto.js +28 -2
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
- package/dist/resources/extensions/gsd/cache.js +16 -5
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +5 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +51 -4
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +16 -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 +98 -7
- package/dist/resources/extensions/gsd/gsd-db.js +260 -2
- package/dist/resources/extensions/gsd/guided-flow.js +31 -6
- package/dist/resources/extensions/gsd/init-wizard.js +1 -0
- package/dist/resources/extensions/gsd/journal.js +27 -0
- package/dist/resources/extensions/gsd/metrics.js +19 -0
- 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 +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +118 -2
- package/dist/resources/extensions/gsd/preferences.js +31 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
- 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/ttsr/ttsr-manager.js +3 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- 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 +8 -8
- 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 +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -1
- package/packages/mcp-server/dist/readers/graph.js +107 -0
- package/packages/mcp-server/dist/readers/graph.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +88 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/readers/graph.test.ts +178 -0
- package/packages/mcp-server/src/readers/graph.ts +148 -1
- package/packages/mcp-server/src/workflow-tools.ts +95 -10
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- 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/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.tsbuildinfo +1 -1
- 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__/chat-frame-compaction-tone.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +61 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -0
- 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 +53 -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/compaction-summary-message.d.ts +8 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +27 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -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 +68 -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 +14 -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 +70 -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__/chat-frame-compaction-tone.test.ts +92 -0
- 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 +75 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +36 -15
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -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 +92 -6
- package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
- package/packages/pi-coding-agent/tsconfig.json +2 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -2
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/tui.ts +9 -1
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +21 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +4 -0
- package/src/resources/extensions/gsd/auto/loop.ts +159 -10
- package/src/resources/extensions/gsd/auto/phases.ts +193 -9
- 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 +69 -8
- package/src/resources/extensions/gsd/auto-post-unit.ts +226 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
- 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-worktree.ts +1 -0
- package/src/resources/extensions/gsd/auto.ts +34 -2
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +5 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
- package/src/resources/extensions/gsd/cache.ts +16 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +5 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +58 -4
- package/src/resources/extensions/gsd/docs/preferences-reference.md +16 -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 +139 -12
- package/src/resources/extensions/gsd/gsd-db.ts +321 -3
- package/src/resources/extensions/gsd/guided-flow.ts +36 -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/metrics.ts +26 -0
- 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 +38 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +117 -2
- package/src/resources/extensions/gsd/preferences.ts +34 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
- 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/templates/PREFERENCES.md +19 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -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/auto-retry-mcp-churn-fixes.test.ts +272 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -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/finalize-timeout-guard.test.ts +10 -7
- 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 +3 -3
- 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/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 +145 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +57 -2
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
- 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/tools/complete-slice.ts +9 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
- 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/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/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_ssgManifest.js +0 -0
|
@@ -29,9 +29,10 @@ import { rebuildState } from "./doctor.js";
|
|
|
29
29
|
import { parseUnitId } from "./unit-id.js";
|
|
30
30
|
import { closeoutUnit, type CloseoutOptions } from "./auto-unit-closeout.js";
|
|
31
31
|
import {
|
|
32
|
-
|
|
32
|
+
runTurnGitAction,
|
|
33
33
|
type TaskCommitContext,
|
|
34
|
-
|
|
34
|
+
type TurnGitActionMode,
|
|
35
|
+
} from "./git-service.js";
|
|
35
36
|
import {
|
|
36
37
|
verifyExpectedArtifact,
|
|
37
38
|
resolveExpectedArtifactPath,
|
|
@@ -66,6 +67,9 @@ import { getSliceTasks } from "./gsd-db.js";
|
|
|
66
67
|
import { runPreExecutionChecks, type PreExecutionResult } from "./pre-execution-checks.js";
|
|
67
68
|
import { writePreExecutionEvidence } from "./verification-evidence.js";
|
|
68
69
|
import { ensureCodebaseMapFresh } from "./codebase-generator.js";
|
|
70
|
+
import { resolveUokFlags } from "./uok/flags.js";
|
|
71
|
+
import { UokGateRunner } from "./uok/gate-runner.js";
|
|
72
|
+
import { writeTurnGitTransaction } from "./uok/gitops.js";
|
|
69
73
|
|
|
70
74
|
/** Maximum verification retry attempts before escalating to blocker placeholder (#2653). */
|
|
71
75
|
const MAX_VERIFICATION_RETRIES = 3;
|
|
@@ -109,6 +113,7 @@ import {
|
|
|
109
113
|
import { existsSync, unlinkSync } from "node:fs";
|
|
110
114
|
import { join } from "node:path";
|
|
111
115
|
import { _resetHasChangesCache } from "./native-git-bridge.js";
|
|
116
|
+
import { autoCommitCurrentBranch } from "./worktree.js";
|
|
112
117
|
|
|
113
118
|
// ─── Rogue File Detection ──────────────────────────────────────────────────
|
|
114
119
|
|
|
@@ -357,10 +362,161 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
357
362
|
await new Promise(r => setTimeout(r, 100));
|
|
358
363
|
}
|
|
359
364
|
|
|
360
|
-
|
|
365
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
366
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
367
|
+
|
|
368
|
+
// Turn-level git action (commit | snapshot | status-only)
|
|
361
369
|
if (s.currentUnit) {
|
|
362
370
|
const unit = s.currentUnit;
|
|
363
|
-
|
|
371
|
+
const turnAction: TurnGitActionMode = uokFlags.gitops ? uokFlags.gitopsTurnAction : "commit";
|
|
372
|
+
const traceId = s.currentTraceId ?? `turn:${unit.startedAt}`;
|
|
373
|
+
const turnId = s.currentTurnId ?? `${unit.type}/${unit.id}/${unit.startedAt}`;
|
|
374
|
+
s.lastGitActionFailure = null;
|
|
375
|
+
s.lastGitActionStatus = null;
|
|
376
|
+
try {
|
|
377
|
+
let taskContext: TaskCommitContext | undefined;
|
|
378
|
+
|
|
379
|
+
if (turnAction === "commit" && s.currentUnit.type === "execute-task") {
|
|
380
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
|
|
381
|
+
if (mid && sid && tid) {
|
|
382
|
+
const summaryPath = resolveTaskFile(s.basePath, mid, sid, tid, "SUMMARY");
|
|
383
|
+
if (summaryPath) {
|
|
384
|
+
try {
|
|
385
|
+
const summaryContent = await loadFile(summaryPath);
|
|
386
|
+
if (summaryContent) {
|
|
387
|
+
const summary = parseSummary(summaryContent);
|
|
388
|
+
// Look up GitHub issue number for commit linking
|
|
389
|
+
let ghIssueNumber: number | undefined;
|
|
390
|
+
try {
|
|
391
|
+
const { getTaskIssueNumberForCommit } = await import("../github-sync/sync.js");
|
|
392
|
+
ghIssueNumber = getTaskIssueNumberForCommit(s.basePath, mid, sid, tid) ?? undefined;
|
|
393
|
+
} catch (err) {
|
|
394
|
+
// GitHub sync not available — skip
|
|
395
|
+
logWarning("engine", `GitHub issue lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
taskContext = {
|
|
399
|
+
taskId: `${sid}/${tid}`,
|
|
400
|
+
taskTitle: summary.title?.replace(/^T\d+:\s*/, "") || tid,
|
|
401
|
+
oneLiner: summary.oneLiner || undefined,
|
|
402
|
+
keyFiles: summary.frontmatter.key_files?.filter(f => !f.includes("{{")) || undefined,
|
|
403
|
+
issueNumber: ghIssueNumber,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
} catch (e) {
|
|
407
|
+
debugLog("postUnit", { phase: "task-summary-parse", error: String(e) });
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
414
|
+
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
415
|
+
// `false` result causes autoCommit to skip staging entirely, leaving
|
|
416
|
+
// code files only in the working tree where they are destroyed by
|
|
417
|
+
// `git worktree remove --force` during teardown.
|
|
418
|
+
_resetHasChangesCache();
|
|
419
|
+
|
|
420
|
+
const skipLifecycleCommit =
|
|
421
|
+
turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(s.currentUnit.type);
|
|
422
|
+
|
|
423
|
+
if (skipLifecycleCommit) {
|
|
424
|
+
debugLog("postUnit", {
|
|
425
|
+
phase: "git-action-skipped",
|
|
426
|
+
reason: "lifecycle-only-unit",
|
|
427
|
+
unitType: s.currentUnit.type,
|
|
428
|
+
unitId: s.currentUnit.id,
|
|
429
|
+
});
|
|
430
|
+
} else {
|
|
431
|
+
const gitResult = runTurnGitAction({
|
|
432
|
+
basePath: s.basePath,
|
|
433
|
+
action: turnAction,
|
|
434
|
+
unitType: s.currentUnit.type,
|
|
435
|
+
unitId: s.currentUnit.id,
|
|
436
|
+
taskContext,
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
if (uokFlags.gitops) {
|
|
440
|
+
writeTurnGitTransaction({
|
|
441
|
+
basePath: s.basePath,
|
|
442
|
+
traceId,
|
|
443
|
+
turnId,
|
|
444
|
+
unitType: unit.type,
|
|
445
|
+
unitId: unit.id,
|
|
446
|
+
stage: "publish",
|
|
447
|
+
action: turnAction,
|
|
448
|
+
push: uokFlags.gitopsTurnPush,
|
|
449
|
+
status: gitResult.status,
|
|
450
|
+
error: gitResult.error,
|
|
451
|
+
metadata: {
|
|
452
|
+
dirty: gitResult.dirty,
|
|
453
|
+
commitMessage: gitResult.commitMessage,
|
|
454
|
+
snapshotLabel: gitResult.snapshotLabel,
|
|
455
|
+
},
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
if (gitResult.status === "failed") {
|
|
460
|
+
s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
|
|
461
|
+
s.lastGitActionStatus = "failed";
|
|
462
|
+
if (uokFlags.gitops && uokFlags.gates) {
|
|
463
|
+
const parsed = parseUnitId(unit.id);
|
|
464
|
+
const gateRunner = new UokGateRunner();
|
|
465
|
+
gateRunner.register({
|
|
466
|
+
id: "closeout-git-action",
|
|
467
|
+
type: "closeout",
|
|
468
|
+
execute: async () => ({
|
|
469
|
+
outcome: "fail",
|
|
470
|
+
failureClass: "git",
|
|
471
|
+
rationale: `turn git action "${turnAction}" failed`,
|
|
472
|
+
findings: gitResult.error ?? "unknown git failure",
|
|
473
|
+
}),
|
|
474
|
+
});
|
|
475
|
+
await gateRunner.run("closeout-git-action", {
|
|
476
|
+
basePath: s.basePath,
|
|
477
|
+
traceId,
|
|
478
|
+
turnId,
|
|
479
|
+
milestoneId: parsed.milestone ?? undefined,
|
|
480
|
+
sliceId: parsed.slice ?? undefined,
|
|
481
|
+
taskId: parsed.task ?? undefined,
|
|
482
|
+
unitType: unit.type,
|
|
483
|
+
unitId: unit.id,
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
const failureMsg = `Git ${turnAction} failed: ${(gitResult.error ?? "unknown error").split("\n")[0]}`;
|
|
488
|
+
if (uokFlags.gitops) {
|
|
489
|
+
ctx.ui.notify(failureMsg, "error");
|
|
490
|
+
await pauseAuto(ctx, pi);
|
|
491
|
+
return "dispatched";
|
|
492
|
+
}
|
|
493
|
+
ctx.ui.notify(failureMsg, "warning");
|
|
494
|
+
debugLog("postUnit", {
|
|
495
|
+
phase: "git-action-failed-nonblocking",
|
|
496
|
+
action: turnAction,
|
|
497
|
+
error: gitResult.error ?? "unknown error",
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
s.lastGitActionStatus = "ok";
|
|
502
|
+
|
|
503
|
+
if (turnAction === "commit" && gitResult.commitMessage) {
|
|
504
|
+
ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
|
|
505
|
+
} else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
|
|
506
|
+
ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
} catch (e) {
|
|
510
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
511
|
+
s.lastGitActionFailure = message;
|
|
512
|
+
s.lastGitActionStatus = "failed";
|
|
513
|
+
debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
|
|
514
|
+
ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, uokFlags.gitops ? "error" : "warning");
|
|
515
|
+
if (uokFlags.gitops) {
|
|
516
|
+
await pauseAuto(ctx, pi);
|
|
517
|
+
return "dispatched";
|
|
518
|
+
}
|
|
519
|
+
}
|
|
364
520
|
|
|
365
521
|
// GitHub sync (non-blocking, opt-in)
|
|
366
522
|
await runSafely("postUnit", "github-sync", async () => {
|
|
@@ -869,11 +1025,13 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
869
1025
|
s.currentUnit &&
|
|
870
1026
|
s.currentUnit.type === "plan-slice"
|
|
871
1027
|
) {
|
|
1028
|
+
const currentUnit = s.currentUnit;
|
|
872
1029
|
let preExecPauseNeeded = false;
|
|
873
1030
|
await runSafely("postUnitPostVerification", "pre-execution-checks", async () => {
|
|
1031
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
1032
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
874
1033
|
try {
|
|
875
1034
|
// Check preferences — respect enhanced_verification and enhanced_verification_pre
|
|
876
|
-
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
877
1035
|
const enhancedEnabled = prefs?.enhanced_verification !== false; // default true
|
|
878
1036
|
const preEnabled = prefs?.enhanced_verification_pre !== false; // default true
|
|
879
1037
|
|
|
@@ -887,7 +1045,7 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
887
1045
|
}
|
|
888
1046
|
|
|
889
1047
|
// Parse the unit ID to get milestone/slice IDs
|
|
890
|
-
const { milestone: mid, slice: sid } = parseUnitId(
|
|
1048
|
+
const { milestone: mid, slice: sid } = parseUnitId(currentUnit.id);
|
|
891
1049
|
if (!mid || !sid) {
|
|
892
1050
|
debugLog("postUnitPostVerification", {
|
|
893
1051
|
phase: "pre-execution-checks",
|
|
@@ -908,6 +1066,8 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
908
1066
|
return;
|
|
909
1067
|
}
|
|
910
1068
|
|
|
1069
|
+
const strictMode = prefs?.enhanced_verification_strict === true;
|
|
1070
|
+
|
|
911
1071
|
// Run pre-execution checks
|
|
912
1072
|
const result: PreExecutionResult = await runPreExecutionChecks(tasks, s.basePath);
|
|
913
1073
|
|
|
@@ -931,11 +1091,45 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
931
1091
|
writePreExecutionEvidence(result, slicePath, mid, sid);
|
|
932
1092
|
}
|
|
933
1093
|
|
|
934
|
-
|
|
1094
|
+
if (uokFlags.gates) {
|
|
1095
|
+
const failedChecks = result.checks
|
|
1096
|
+
.filter((check) => !check.passed)
|
|
1097
|
+
.map((check) => `[${check.category}] ${check.target}: ${check.message}`);
|
|
1098
|
+
const warnEscalated = result.status === "warn" && strictMode;
|
|
1099
|
+
const blockingFailure = result.status === "fail" || warnEscalated;
|
|
1100
|
+
const gateRunner = new UokGateRunner();
|
|
1101
|
+
gateRunner.register({
|
|
1102
|
+
id: "pre-execution-checks",
|
|
1103
|
+
type: "input",
|
|
1104
|
+
execute: async () => ({
|
|
1105
|
+
outcome: blockingFailure ? "fail" : "pass",
|
|
1106
|
+
failureClass: result.status === "fail" ? "input" : warnEscalated ? "policy" : "none",
|
|
1107
|
+
rationale: blockingFailure
|
|
1108
|
+
? `pre-execution checks ${result.status}${warnEscalated ? " (strict)" : ""}`
|
|
1109
|
+
: "pre-execution checks passed",
|
|
1110
|
+
findings: failedChecks.join("\n"),
|
|
1111
|
+
}),
|
|
1112
|
+
});
|
|
1113
|
+
await gateRunner.run("pre-execution-checks", {
|
|
1114
|
+
basePath: s.basePath,
|
|
1115
|
+
traceId: `pre-execution:${currentUnit.id}`,
|
|
1116
|
+
turnId: currentUnit.id,
|
|
1117
|
+
milestoneId: mid,
|
|
1118
|
+
sliceId: sid,
|
|
1119
|
+
unitType: currentUnit.type,
|
|
1120
|
+
unitId: currentUnit.id,
|
|
1121
|
+
});
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
// Notify UI — surface actionable details (#4259)
|
|
935
1125
|
if (result.status === "fail") {
|
|
936
|
-
const
|
|
1126
|
+
const blockingChecks = result.checks.filter(c => !c.passed && c.blocking);
|
|
1127
|
+
const blockingCount = blockingChecks.length;
|
|
1128
|
+
const details = blockingChecks.slice(0, 3).map(c => ` \u2022 ${c.message}`).join("\n");
|
|
1129
|
+
const suffix = blockingChecks.length > 3 ? `\n \u2022 ...and ${blockingChecks.length - 3} more` : "";
|
|
1130
|
+
const evidenceNote = `\nSee ${sid}-PRE-EXEC-VERIFY.json for full details.`;
|
|
937
1131
|
ctx.ui.notify(
|
|
938
|
-
`Pre-execution checks failed: ${blockingCount} blocking issue${blockingCount === 1 ? "" : "s"} found`,
|
|
1132
|
+
`Pre-execution checks failed: ${blockingCount} blocking issue${blockingCount === 1 ? "" : "s"} found\n${details}${suffix}${evidenceNote}`,
|
|
939
1133
|
"error",
|
|
940
1134
|
);
|
|
941
1135
|
preExecPauseNeeded = true;
|
|
@@ -969,6 +1163,29 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
969
1163
|
`Pre-execution checks error: ${errorMessage} — pausing for human review`,
|
|
970
1164
|
"error",
|
|
971
1165
|
);
|
|
1166
|
+
if (uokFlags.gates && s.currentUnit) {
|
|
1167
|
+
const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
|
|
1168
|
+
const gateRunner = new UokGateRunner();
|
|
1169
|
+
gateRunner.register({
|
|
1170
|
+
id: "pre-execution-checks",
|
|
1171
|
+
type: "input",
|
|
1172
|
+
execute: async () => ({
|
|
1173
|
+
outcome: "manual-attention",
|
|
1174
|
+
failureClass: "manual-attention",
|
|
1175
|
+
rationale: "pre-execution checks threw before completion",
|
|
1176
|
+
findings: errorMessage,
|
|
1177
|
+
}),
|
|
1178
|
+
});
|
|
1179
|
+
await gateRunner.run("pre-execution-checks", {
|
|
1180
|
+
basePath: s.basePath,
|
|
1181
|
+
traceId: `pre-execution:${s.currentUnit.id}`,
|
|
1182
|
+
turnId: s.currentUnit.id,
|
|
1183
|
+
milestoneId: mid ?? undefined,
|
|
1184
|
+
sliceId: sid ?? undefined,
|
|
1185
|
+
unitType: s.currentUnit.type,
|
|
1186
|
+
unitId: s.currentUnit.id,
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
972
1189
|
preExecPauseNeeded = true;
|
|
973
1190
|
}
|
|
974
1191
|
});
|
|
@@ -264,18 +264,30 @@ export function verifyExpectedArtifact(
|
|
|
264
264
|
const absPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
265
265
|
// For unit types with no verifiable artifact (null path), the parent directory
|
|
266
266
|
// is missing on disk — treat as stale completion state so the key gets evicted (#313).
|
|
267
|
-
if (!absPath)
|
|
268
|
-
|
|
267
|
+
if (!absPath) {
|
|
268
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: resolveExpectedArtifactPath returned null (parent dir missing)`);
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
if (!existsSync(absPath)) {
|
|
272
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: existsSync false for ${absPath}`);
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
269
275
|
|
|
270
276
|
if (unitType === "validate-milestone") {
|
|
271
277
|
const validationContent = readFileSync(absPath, "utf-8");
|
|
272
|
-
if (!isValidationTerminal(validationContent))
|
|
278
|
+
if (!isValidationTerminal(validationContent)) {
|
|
279
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: validation not terminal (len=${validationContent.length}) at ${absPath}`);
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
273
282
|
}
|
|
274
283
|
|
|
275
284
|
if (unitType === "plan-milestone") {
|
|
276
285
|
try {
|
|
277
286
|
const roadmap = parseLegacyRoadmap(readFileSync(absPath, "utf-8"));
|
|
278
|
-
if (roadmap.slices.length === 0)
|
|
287
|
+
if (roadmap.slices.length === 0) {
|
|
288
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${absPath}`);
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
279
291
|
} catch (err) {
|
|
280
292
|
logWarning("recovery", `plan-milestone roadmap verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
281
293
|
return false;
|
|
@@ -292,7 +304,10 @@ export function verifyExpectedArtifact(
|
|
|
292
304
|
// Accept checkbox-style (- [x] **T01: ...) or heading-style (### T01 -- / ### T01: / ### T01 —)
|
|
293
305
|
const hasCheckboxTask = /^- \[[xX ]\] \*\*T\d+:/m.test(planContent);
|
|
294
306
|
const hasHeadingTask = /^#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
|
|
295
|
-
if (!hasCheckboxTask && !hasHeadingTask)
|
|
307
|
+
if (!hasCheckboxTask && !hasHeadingTask) {
|
|
308
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: plan has no task checkbox/heading (len=${planContent.length}) at ${absPath}`);
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
296
311
|
}
|
|
297
312
|
|
|
298
313
|
// execute-task: DB status is authoritative. Fall back to checked-checkbox
|
|
@@ -349,10 +364,15 @@ export function verifyExpectedArtifact(
|
|
|
349
364
|
|
|
350
365
|
if (taskIds && taskIds.length > 0) {
|
|
351
366
|
const tasksDir = resolveTasksDir(base, mid, sid);
|
|
352
|
-
if (tasksDir) {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
367
|
+
if (!tasksDir) {
|
|
368
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: resolveTasksDir returned null for ${mid}/${sid}`);
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
for (const tid of taskIds) {
|
|
372
|
+
const taskPlanFile = join(tasksDir, `${tid}-PLAN.md`);
|
|
373
|
+
if (!existsSync(taskPlanFile)) {
|
|
374
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: task plan missing ${taskPlanFile}`);
|
|
375
|
+
return false;
|
|
356
376
|
}
|
|
357
377
|
}
|
|
358
378
|
}
|
|
@@ -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
|
-
|
|
@@ -33,6 +33,8 @@ import { runPostExecutionChecks, type PostExecutionResult } from "./post-executi
|
|
|
33
33
|
import type { AutoSession } from "./auto/session.js";
|
|
34
34
|
import type { VerificationResult as VerificationGateResult } from "./types.js";
|
|
35
35
|
import { join } from "node:path";
|
|
36
|
+
import { resolveUokFlags } from "./uok/flags.js";
|
|
37
|
+
import { UokGateRunner } from "./uok/gate-runner.js";
|
|
36
38
|
|
|
37
39
|
export interface VerificationContext {
|
|
38
40
|
s: AutoSession;
|
|
@@ -67,6 +69,37 @@ async function runValidateMilestonePostCheck(
|
|
|
67
69
|
pauseAuto: (ctx?: ExtensionContext, pi?: ExtensionAPI) => Promise<void>,
|
|
68
70
|
): Promise<VerificationResult> {
|
|
69
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
|
+
|
|
70
103
|
if (!s.currentUnit) return "continue";
|
|
71
104
|
|
|
72
105
|
const { milestone: mid } = parseUnitId(s.currentUnit.id);
|
|
@@ -79,14 +112,32 @@ async function runValidateMilestonePostCheck(
|
|
|
79
112
|
if (!validationContent) return "continue";
|
|
80
113
|
|
|
81
114
|
const verdict = extractVerdict(validationContent);
|
|
82
|
-
if (verdict !== "needs-remediation")
|
|
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
|
+
}
|
|
83
125
|
|
|
84
126
|
const incompleteSliceCount = await countIncompleteSlices(s.basePath, mid);
|
|
85
127
|
|
|
86
128
|
// If any non-closed slices exist, the agent successfully queued remediation
|
|
87
129
|
// work — proceed normally. The state machine will execute those slices and
|
|
88
130
|
// re-validate per the #3596/#3670 fix.
|
|
89
|
-
if (incompleteSliceCount > 0)
|
|
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
|
+
}
|
|
90
141
|
|
|
91
142
|
ctx.ui.notify(
|
|
92
143
|
`Milestone ${mid} validation returned verdict=needs-remediation but no remediation slices were added. Pausing for human review.`,
|
|
@@ -96,6 +147,13 @@ async function runValidateMilestonePostCheck(
|
|
|
96
147
|
`validate-milestone: pausing — verdict=needs-remediation with no incomplete slices for ${mid}. ` +
|
|
97
148
|
`The agent must call gsd_reassess_roadmap to add remediation slices before re-validation.\n`,
|
|
98
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
|
+
);
|
|
99
157
|
await pauseAuto(ctx, pi);
|
|
100
158
|
return "pause";
|
|
101
159
|
}
|
|
@@ -158,6 +216,7 @@ export async function runPostUnitVerification(
|
|
|
158
216
|
try {
|
|
159
217
|
const effectivePrefs = loadEffectiveGSDPreferences();
|
|
160
218
|
const prefs = effectivePrefs?.preferences;
|
|
219
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
161
220
|
|
|
162
221
|
// Read task plan verify field
|
|
163
222
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
|
|
@@ -196,6 +255,37 @@ export async function runPostUnitVerification(
|
|
|
196
255
|
}
|
|
197
256
|
}
|
|
198
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
|
+
|
|
199
289
|
// Auto-fix retry preferences
|
|
200
290
|
const autoFixEnabled = prefs?.verification_auto_fix !== false;
|
|
201
291
|
const maxRetries =
|
|
@@ -338,6 +428,43 @@ export async function runPostUnitVerification(
|
|
|
338
428
|
);
|
|
339
429
|
}
|
|
340
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
|
+
|
|
341
468
|
// Check for blocking failures
|
|
342
469
|
if (postExecResult.status === "fail") {
|
|
343
470
|
postExecBlockingFailure = true;
|
|
@@ -102,6 +102,7 @@ function isSamePath(a: string, b: string): boolean {
|
|
|
102
102
|
try {
|
|
103
103
|
return realpathSync(a) === realpathSync(b);
|
|
104
104
|
} catch (e) {
|
|
105
|
+
if ((e as NodeJS.ErrnoException).code === "ENOENT") return false;
|
|
105
106
|
logWarning("worktree", `isSamePath failed: ${(e as Error).message}`);
|
|
106
107
|
return false;
|
|
107
108
|
}
|
|
@@ -202,6 +202,8 @@ import {
|
|
|
202
202
|
import { bootstrapAutoSession, openProjectDbIfPresent, type BootstrapDeps } from "./auto-start.js";
|
|
203
203
|
import { initHealthWidget } from "./health-widget.js";
|
|
204
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";
|
|
205
207
|
// Slice-level parallelism (#2340)
|
|
206
208
|
import { getEligibleSlices } from "./slice-parallel-eligibility.js";
|
|
207
209
|
import { startSliceParallel } from "./slice-parallel-orchestrator.js";
|
|
@@ -605,11 +607,29 @@ function buildSnapshotOpts(
|
|
|
605
607
|
continueHereFired?: boolean;
|
|
606
608
|
promptCharCount?: number;
|
|
607
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;
|
|
608
616
|
} & Record<string, unknown> {
|
|
617
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
618
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
609
619
|
return {
|
|
610
620
|
...(s.autoStartTime > 0 ? { autoSessionKey: String(s.autoStartTime) } : {}),
|
|
611
621
|
promptCharCount: s.lastPromptCharCount,
|
|
612
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
|
+
: {}),
|
|
613
633
|
...(s.currentUnitRouting ?? {}),
|
|
614
634
|
};
|
|
615
635
|
}
|
|
@@ -1513,7 +1533,13 @@ export async function startAuto(
|
|
|
1513
1533
|
logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", "progress");
|
|
1514
1534
|
|
|
1515
1535
|
captureProjectRootEnv(s.originalBasePath || s.basePath);
|
|
1516
|
-
await
|
|
1536
|
+
await runAutoLoopWithUok({
|
|
1537
|
+
ctx,
|
|
1538
|
+
pi,
|
|
1539
|
+
s,
|
|
1540
|
+
deps: buildLoopDeps(),
|
|
1541
|
+
runLegacyLoop: autoLoop,
|
|
1542
|
+
});
|
|
1517
1543
|
cleanupAfterLoopExit(ctx);
|
|
1518
1544
|
return;
|
|
1519
1545
|
}
|
|
@@ -1548,7 +1574,13 @@ export async function startAuto(
|
|
|
1548
1574
|
logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, requestedStepMode ? "Step-mode started." : "Auto-mode started.", "progress");
|
|
1549
1575
|
|
|
1550
1576
|
// Dispatch the first unit
|
|
1551
|
-
await
|
|
1577
|
+
await runAutoLoopWithUok({
|
|
1578
|
+
ctx,
|
|
1579
|
+
pi,
|
|
1580
|
+
s,
|
|
1581
|
+
deps: buildLoopDeps(),
|
|
1582
|
+
runLegacyLoop: autoLoop,
|
|
1583
|
+
});
|
|
1552
1584
|
cleanupAfterLoopExit(ctx);
|
|
1553
1585
|
}
|
|
1554
1586
|
|