gsd-pi 2.74.0-dev.b741afb → 2.74.0-dev.ffbcc03
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 +113 -3
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +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.js +28 -2
- 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/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 +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
- package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
- package/dist/resources/extensions/gsd/git-service.js +49 -1
- package/dist/resources/extensions/gsd/graph-context.js +98 -7
- package/dist/resources/extensions/gsd/gsd-db.js +260 -2
- package/dist/resources/extensions/gsd/guided-flow.js +24 -1
- 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 +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
- package/dist/resources/extensions/gsd/preferences.js +26 -0
- package/dist/resources/extensions/gsd/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 +18 -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 +9 -9
- 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 +9 -9
- 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__/tool-execution.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +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__/tool-execution.test.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +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/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 +123 -3
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
- package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +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.ts +34 -2
- 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/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 +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
- package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
- package/src/resources/extensions/gsd/git-service.ts +68 -0
- package/src/resources/extensions/gsd/graph-context.ts +139 -12
- package/src/resources/extensions/gsd/gsd-db.ts +321 -3
- package/src/resources/extensions/gsd/guided-flow.ts +33 -1
- 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 +32 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
- package/src/resources/extensions/gsd/preferences.ts +28 -0
- package/src/resources/extensions/gsd/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 +18 -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/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/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/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 → kn6xzWKYnogsxp2b6RpDD}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → kn6xzWKYnogsxp2b6RpDD}/_ssgManifest.js +0 -0
|
@@ -16,6 +16,8 @@ import { GSDError, GSD_IO_ERROR } from "./errors.js";
|
|
|
16
16
|
const SEQ_PREFIX_RE = /^(\d+)-/;
|
|
17
17
|
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
18
18
|
import { gsdRoot } from "./paths.js";
|
|
19
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
20
|
+
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
19
21
|
|
|
20
22
|
interface ActivityLogState {
|
|
21
23
|
nextSeq: number;
|
|
@@ -132,6 +134,25 @@ export function saveActivityLog(
|
|
|
132
134
|
}
|
|
133
135
|
state.nextSeq += 1;
|
|
134
136
|
state.lastSnapshotKeyByUnit.set(unitKey, key);
|
|
137
|
+
|
|
138
|
+
if (isUnifiedAuditEnabled()) {
|
|
139
|
+
emitUokAuditEvent(
|
|
140
|
+
basePath,
|
|
141
|
+
buildAuditEnvelope({
|
|
142
|
+
traceId: `activity:${unitType}:${unitId}`,
|
|
143
|
+
turnId: unitId,
|
|
144
|
+
category: "execution",
|
|
145
|
+
type: "activity-log-saved",
|
|
146
|
+
payload: {
|
|
147
|
+
unitType,
|
|
148
|
+
unitId,
|
|
149
|
+
filePath,
|
|
150
|
+
entryCount: entries.length,
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
135
156
|
return filePath;
|
|
136
157
|
} catch (e) {
|
|
137
158
|
// Don't let logging failures break auto-mode
|
|
@@ -21,6 +21,7 @@ import type { WorktreeResolver } from "../worktree-resolver.js";
|
|
|
21
21
|
import type { CmuxLogLevel } from "../../cmux/index.js";
|
|
22
22
|
import type { JournalEntry } from "../journal.js";
|
|
23
23
|
import type { MergeReconcileResult } from "../auto-recovery.js";
|
|
24
|
+
import type { UokTurnObserver } from "../uok/contracts.js";
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* Dependencies injected by the caller (auto.ts startAuto) so autoLoop
|
|
@@ -274,4 +275,7 @@ export interface LoopDeps {
|
|
|
274
275
|
|
|
275
276
|
// Journal
|
|
276
277
|
emitJournalEvent: (entry: JournalEntry) => void;
|
|
278
|
+
|
|
279
|
+
// UOK (optional, flag-gated)
|
|
280
|
+
uokObserver?: UokTurnObserver;
|
|
277
281
|
}
|
|
@@ -31,6 +31,8 @@ import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterM
|
|
|
31
31
|
import { resolveEngine } from "../engine-resolver.js";
|
|
32
32
|
import { logWarning } from "../workflow-logger.js";
|
|
33
33
|
import { gsdRoot } from "../paths.js";
|
|
34
|
+
import { resolveUokFlags } from "../uok/flags.js";
|
|
35
|
+
import { scheduleSidecarQueue } from "../uok/execution-graph.js";
|
|
34
36
|
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
35
37
|
import { join } from "node:path";
|
|
36
38
|
|
|
@@ -128,6 +130,43 @@ export async function autoLoop(
|
|
|
128
130
|
const flowId = randomUUID();
|
|
129
131
|
let seqCounter = 0;
|
|
130
132
|
const nextSeq = () => ++seqCounter;
|
|
133
|
+
const turnId = randomUUID();
|
|
134
|
+
s.currentTraceId = flowId;
|
|
135
|
+
s.currentTurnId = turnId;
|
|
136
|
+
const turnStartedAt = new Date().toISOString();
|
|
137
|
+
let observedUnitType: string | undefined;
|
|
138
|
+
let observedUnitId: string | undefined;
|
|
139
|
+
let turnFinished = false;
|
|
140
|
+
const finishTurn = (
|
|
141
|
+
status: "completed" | "failed" | "paused" | "stopped" | "skipped" | "retry",
|
|
142
|
+
failureClass: "none" | "unknown" | "manual-attention" | "timeout" | "execution" | "closeout" | "git" = "none",
|
|
143
|
+
error?: string,
|
|
144
|
+
): void => {
|
|
145
|
+
if (turnFinished) return;
|
|
146
|
+
turnFinished = true;
|
|
147
|
+
deps.uokObserver?.onTurnResult({
|
|
148
|
+
traceId: flowId,
|
|
149
|
+
turnId,
|
|
150
|
+
iteration,
|
|
151
|
+
unitType: observedUnitType,
|
|
152
|
+
unitId: observedUnitId,
|
|
153
|
+
status,
|
|
154
|
+
failureClass,
|
|
155
|
+
phaseResults: [],
|
|
156
|
+
error,
|
|
157
|
+
startedAt: turnStartedAt,
|
|
158
|
+
finishedAt: new Date().toISOString(),
|
|
159
|
+
});
|
|
160
|
+
s.currentTraceId = null;
|
|
161
|
+
s.currentTurnId = null;
|
|
162
|
+
};
|
|
163
|
+
deps.uokObserver?.onTurnStart({
|
|
164
|
+
traceId: flowId,
|
|
165
|
+
turnId,
|
|
166
|
+
iteration,
|
|
167
|
+
basePath: s.basePath,
|
|
168
|
+
startedAt: turnStartedAt,
|
|
169
|
+
});
|
|
131
170
|
|
|
132
171
|
if (iteration > MAX_LOOP_ITERATIONS) {
|
|
133
172
|
debugLog("autoLoop", {
|
|
@@ -140,6 +179,7 @@ export async function autoLoop(
|
|
|
140
179
|
pi,
|
|
141
180
|
`Safety: loop exceeded ${MAX_LOOP_ITERATIONS} iterations — possible runaway`,
|
|
142
181
|
);
|
|
182
|
+
finishTurn("stopped", "manual-attention", "max-iterations");
|
|
143
183
|
break;
|
|
144
184
|
}
|
|
145
185
|
|
|
@@ -157,22 +197,32 @@ export async function autoLoop(
|
|
|
157
197
|
`Stopping gracefully to prevent OOM kill after ${iteration} iterations. ` +
|
|
158
198
|
`Resume with /gsd auto to continue from where you left off.`,
|
|
159
199
|
);
|
|
200
|
+
finishTurn("stopped", "timeout", "memory-pressure");
|
|
160
201
|
break;
|
|
161
202
|
}
|
|
162
203
|
}
|
|
163
204
|
|
|
164
205
|
if (!s.cmdCtx) {
|
|
165
206
|
debugLog("autoLoop", { phase: "exit", reason: "no-cmdCtx" });
|
|
207
|
+
finishTurn("stopped", "manual-attention", "missing-command-context");
|
|
166
208
|
break;
|
|
167
209
|
}
|
|
168
210
|
|
|
169
211
|
try {
|
|
170
212
|
// ── Blanket try/catch: one bad iteration must not kill the session
|
|
171
213
|
const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
|
|
214
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
172
215
|
|
|
173
216
|
// ── Check sidecar queue before deriveState ──
|
|
174
217
|
let sidecarItem: SidecarItem | undefined;
|
|
175
218
|
if (s.sidecarQueue.length > 0) {
|
|
219
|
+
if (uokFlags.executionGraph && s.sidecarQueue.length > 1) {
|
|
220
|
+
try {
|
|
221
|
+
s.sidecarQueue = await scheduleSidecarQueue(s.sidecarQueue);
|
|
222
|
+
} catch (err) {
|
|
223
|
+
logWarning("dispatch", `sidecar queue scheduling failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
176
226
|
sidecarItem = s.sidecarQueue.shift()!;
|
|
177
227
|
debugLog("autoLoop", {
|
|
178
228
|
phase: "sidecar-dequeue",
|
|
@@ -256,27 +306,53 @@ export async function autoLoop(
|
|
|
256
306
|
isRetry: false,
|
|
257
307
|
previousTier: undefined,
|
|
258
308
|
};
|
|
309
|
+
observedUnitType = iterData.unitType;
|
|
310
|
+
observedUnitId = iterData.unitId;
|
|
259
311
|
|
|
260
312
|
// ── Progress widget (mirrors dev path in runDispatch) ──
|
|
261
313
|
deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state);
|
|
262
314
|
|
|
263
315
|
// ── Guards (shared with dev path) ──
|
|
264
316
|
const guardsResult = await runGuards(ic, s.currentMilestoneId ?? "workflow");
|
|
265
|
-
|
|
317
|
+
deps.uokObserver?.onPhaseResult("guard", guardsResult.action, {
|
|
318
|
+
unitType: iterData.unitType,
|
|
319
|
+
unitId: iterData.unitId,
|
|
320
|
+
});
|
|
321
|
+
if (guardsResult.action === "break") {
|
|
322
|
+
finishTurn("stopped", "manual-attention", "guard-break");
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
266
325
|
|
|
267
326
|
// ── Unit execution (shared with dev path) ──
|
|
268
327
|
const unitPhaseResult = await runUnitPhase(ic, iterData, loopState);
|
|
269
|
-
|
|
328
|
+
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
329
|
+
unitType: iterData.unitType,
|
|
330
|
+
unitId: iterData.unitId,
|
|
331
|
+
});
|
|
332
|
+
if (unitPhaseResult.action === "break") {
|
|
333
|
+
finishTurn("stopped", "execution", "unit-break");
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
270
336
|
|
|
271
337
|
// ── Verify first, then reconcile (only mark complete on pass) ──
|
|
272
338
|
debugLog("autoLoop", { phase: "custom-engine-verify", iteration, unitId: iterData.unitId });
|
|
273
339
|
const verifyResult = await policy.verify(iterData.unitType, iterData.unitId, { basePath: s.basePath });
|
|
274
340
|
if (verifyResult === "pause") {
|
|
275
341
|
await deps.pauseAuto(ctx, pi);
|
|
342
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
|
|
343
|
+
unitType: iterData.unitType,
|
|
344
|
+
unitId: iterData.unitId,
|
|
345
|
+
});
|
|
346
|
+
finishTurn("paused", "manual-attention", "custom-engine-verify-pause");
|
|
276
347
|
break;
|
|
277
348
|
}
|
|
278
349
|
if (verifyResult === "retry") {
|
|
279
350
|
debugLog("autoLoop", { phase: "custom-engine-verify-retry", iteration, unitId: iterData.unitId });
|
|
351
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "retry", {
|
|
352
|
+
unitType: iterData.unitType,
|
|
353
|
+
unitId: iterData.unitId,
|
|
354
|
+
});
|
|
355
|
+
finishTurn("retry");
|
|
280
356
|
continue;
|
|
281
357
|
}
|
|
282
358
|
|
|
@@ -299,36 +375,77 @@ export async function autoLoop(
|
|
|
299
375
|
|
|
300
376
|
if (reconcileResult.outcome === "milestone-complete") {
|
|
301
377
|
await deps.stopAuto(ctx, pi, "Workflow complete");
|
|
378
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "milestone-complete", {
|
|
379
|
+
unitType: iterData.unitType,
|
|
380
|
+
unitId: iterData.unitId,
|
|
381
|
+
});
|
|
382
|
+
finishTurn("completed");
|
|
302
383
|
break;
|
|
303
384
|
}
|
|
304
385
|
if (reconcileResult.outcome === "pause") {
|
|
305
386
|
await deps.pauseAuto(ctx, pi);
|
|
387
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
|
|
388
|
+
unitType: iterData.unitType,
|
|
389
|
+
unitId: iterData.unitId,
|
|
390
|
+
});
|
|
391
|
+
finishTurn("paused", "manual-attention");
|
|
306
392
|
break;
|
|
307
393
|
}
|
|
308
394
|
if (reconcileResult.outcome === "stop") {
|
|
309
395
|
await deps.stopAuto(ctx, pi, reconcileResult.reason ?? "Engine stopped");
|
|
396
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "stop", {
|
|
397
|
+
unitType: iterData.unitType,
|
|
398
|
+
unitId: iterData.unitId,
|
|
399
|
+
reason: reconcileResult.reason,
|
|
400
|
+
});
|
|
401
|
+
finishTurn("stopped", "manual-attention", reconcileResult.reason);
|
|
310
402
|
break;
|
|
311
403
|
}
|
|
404
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "continue", {
|
|
405
|
+
unitType: iterData.unitType,
|
|
406
|
+
unitId: iterData.unitId,
|
|
407
|
+
});
|
|
408
|
+
finishTurn("completed");
|
|
312
409
|
continue;
|
|
313
410
|
}
|
|
314
411
|
|
|
315
412
|
if (!sidecarItem) {
|
|
316
413
|
// ── Phase 1: Pre-dispatch ─────────────────────────────────────────
|
|
317
414
|
const preDispatchResult = await runPreDispatch(ic, loopState);
|
|
318
|
-
|
|
319
|
-
if (preDispatchResult.action === "
|
|
415
|
+
deps.uokObserver?.onPhaseResult("pre-dispatch", preDispatchResult.action);
|
|
416
|
+
if (preDispatchResult.action === "break") {
|
|
417
|
+
finishTurn("stopped", "manual-attention", "pre-dispatch-break");
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
if (preDispatchResult.action === "continue") {
|
|
421
|
+
finishTurn("skipped");
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
320
424
|
|
|
321
425
|
const preData = preDispatchResult.data;
|
|
322
426
|
|
|
323
427
|
// ── Phase 2: Guards ───────────────────────────────────────────────
|
|
324
428
|
const guardsResult = await runGuards(ic, preData.mid);
|
|
325
|
-
|
|
429
|
+
deps.uokObserver?.onPhaseResult("guard", guardsResult.action);
|
|
430
|
+
if (guardsResult.action === "break") {
|
|
431
|
+
finishTurn("stopped", "manual-attention", "guard-break");
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
326
434
|
|
|
327
435
|
// ── Phase 3: Dispatch ─────────────────────────────────────────────
|
|
328
436
|
const dispatchResult = await runDispatch(ic, preData, loopState);
|
|
329
|
-
|
|
330
|
-
if (dispatchResult.action === "
|
|
437
|
+
deps.uokObserver?.onPhaseResult("dispatch", dispatchResult.action);
|
|
438
|
+
if (dispatchResult.action === "break") {
|
|
439
|
+
finishTurn("stopped", "manual-attention", "dispatch-break");
|
|
440
|
+
break;
|
|
441
|
+
}
|
|
442
|
+
if (dispatchResult.action === "continue") {
|
|
443
|
+
finishTurn("skipped");
|
|
444
|
+
continue;
|
|
445
|
+
}
|
|
331
446
|
iterData = dispatchResult.data;
|
|
447
|
+
observedUnitType = iterData.unitType;
|
|
448
|
+
observedUnitId = iterData.unitId;
|
|
332
449
|
} else {
|
|
333
450
|
// ── Sidecar path: use values from the sidecar item directly ──
|
|
334
451
|
const sidecarState = await deps.deriveState(s.basePath);
|
|
@@ -343,22 +460,50 @@ export async function autoLoop(
|
|
|
343
460
|
midTitle: sidecarState.activeMilestone?.title,
|
|
344
461
|
isRetry: false, previousTier: undefined,
|
|
345
462
|
};
|
|
463
|
+
observedUnitType = iterData.unitType;
|
|
464
|
+
observedUnitId = iterData.unitId;
|
|
465
|
+
deps.uokObserver?.onPhaseResult("dispatch", "sidecar", {
|
|
466
|
+
unitType: iterData.unitType,
|
|
467
|
+
unitId: iterData.unitId,
|
|
468
|
+
sidecarKind: sidecarItem.kind,
|
|
469
|
+
});
|
|
346
470
|
}
|
|
347
471
|
|
|
348
472
|
const unitPhaseResult = await runUnitPhase(ic, iterData, loopState, sidecarItem);
|
|
349
|
-
|
|
473
|
+
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
474
|
+
unitType: iterData.unitType,
|
|
475
|
+
unitId: iterData.unitId,
|
|
476
|
+
});
|
|
477
|
+
if (unitPhaseResult.action === "break") {
|
|
478
|
+
finishTurn("stopped", "execution", "unit-break");
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
350
481
|
|
|
351
482
|
// ── Phase 5: Finalize ───────────────────────────────────────────────
|
|
352
483
|
|
|
353
484
|
const finalizeResult = await runFinalize(ic, iterData, loopState, sidecarItem);
|
|
354
|
-
|
|
355
|
-
|
|
485
|
+
deps.uokObserver?.onPhaseResult("finalize", finalizeResult.action, {
|
|
486
|
+
unitType: iterData.unitType,
|
|
487
|
+
unitId: iterData.unitId,
|
|
488
|
+
});
|
|
489
|
+
if (finalizeResult.action === "break") {
|
|
490
|
+
const finalizeFailureClass = finalizeResult.reason === "git-closeout-failure"
|
|
491
|
+
? "git"
|
|
492
|
+
: "closeout";
|
|
493
|
+
finishTurn("stopped", finalizeFailureClass, "finalize-break");
|
|
494
|
+
break;
|
|
495
|
+
}
|
|
496
|
+
if (finalizeResult.action === "continue") {
|
|
497
|
+
finishTurn("retry");
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
356
500
|
|
|
357
501
|
consecutiveErrors = 0; // Iteration completed successfully
|
|
358
502
|
consecutiveCooldowns = 0;
|
|
359
503
|
recentErrorMessages.length = 0;
|
|
360
504
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId, seq: nextSeq(), eventType: "iteration-end", data: { iteration } });
|
|
361
505
|
debugLog("autoLoop", { phase: "iteration-complete", iteration });
|
|
506
|
+
finishTurn("completed");
|
|
362
507
|
} catch (loopErr) {
|
|
363
508
|
// ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
|
|
364
509
|
const msg = loopErr instanceof Error ? loopErr.message : String(loopErr);
|
|
@@ -388,6 +533,7 @@ export async function autoLoop(
|
|
|
388
533
|
pi,
|
|
389
534
|
`Infrastructure error (${infraCode}): not recoverable by retry`,
|
|
390
535
|
);
|
|
536
|
+
finishTurn("failed", "execution", msg);
|
|
391
537
|
break;
|
|
392
538
|
}
|
|
393
539
|
|
|
@@ -429,6 +575,7 @@ export async function autoLoop(
|
|
|
429
575
|
"warning",
|
|
430
576
|
);
|
|
431
577
|
await new Promise(resolve => setTimeout(resolve, waitMs));
|
|
578
|
+
finishTurn("retry", "timeout", msg);
|
|
432
579
|
continue; // Retry iteration without incrementing consecutiveErrors
|
|
433
580
|
}
|
|
434
581
|
|
|
@@ -455,6 +602,7 @@ export async function autoLoop(
|
|
|
455
602
|
pi,
|
|
456
603
|
`${consecutiveErrors} consecutive iteration failures`,
|
|
457
604
|
);
|
|
605
|
+
finishTurn("failed", "execution", msg);
|
|
458
606
|
break;
|
|
459
607
|
} else if (consecutiveErrors === 2) {
|
|
460
608
|
// 2nd consecutive: try invalidating caches + re-deriving state
|
|
@@ -467,6 +615,7 @@ export async function autoLoop(
|
|
|
467
615
|
// 1st error: log and retry — transient failures happen
|
|
468
616
|
ctx.ui.notify(`Iteration error: ${msg}. Retrying.`, "warning");
|
|
469
617
|
}
|
|
618
|
+
finishTurn("retry", "execution", msg);
|
|
470
619
|
}
|
|
471
620
|
}
|
|
472
621
|
|
|
@@ -12,6 +12,7 @@ import { importExtensionModule, type ExtensionAPI, type ExtensionContext } from
|
|
|
12
12
|
import type { AutoSession, SidecarItem } from "./session.js";
|
|
13
13
|
import type { LoopDeps } from "./loop-deps.js";
|
|
14
14
|
import type { PostUnitContext, PreVerificationOpts } from "../auto-post-unit.js";
|
|
15
|
+
import type { Phase } from "../types.js";
|
|
15
16
|
import {
|
|
16
17
|
MAX_RECOVERY_CHARS,
|
|
17
18
|
BUDGET_THRESHOLDS,
|
|
@@ -47,6 +48,9 @@ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "
|
|
|
47
48
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
48
49
|
import { startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
49
50
|
import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
|
|
51
|
+
import { ensurePlanV2Graph } from "../uok/plan-v2.js";
|
|
52
|
+
import { resolveUokFlags } from "../uok/flags.js";
|
|
53
|
+
import { UokGateRunner } from "../uok/gate-runner.js";
|
|
50
54
|
import { resetEvidence } from "../safety/evidence-collector.js";
|
|
51
55
|
import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
|
|
52
56
|
import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
|
|
@@ -77,6 +81,17 @@ export function _resolveDispatchGuardBasePath(
|
|
|
77
81
|
return s.originalBasePath || s.basePath;
|
|
78
82
|
}
|
|
79
83
|
|
|
84
|
+
const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
|
|
85
|
+
"executing",
|
|
86
|
+
"summarizing",
|
|
87
|
+
"validating-milestone",
|
|
88
|
+
"completing-milestone",
|
|
89
|
+
]);
|
|
90
|
+
|
|
91
|
+
function shouldRunPlanV2Gate(phase: Phase): boolean {
|
|
92
|
+
return PLAN_V2_GATE_PHASES.has(phase);
|
|
93
|
+
}
|
|
94
|
+
|
|
80
95
|
/**
|
|
81
96
|
* Generate and write an HTML milestone report snapshot.
|
|
82
97
|
* Extracted from the milestone-transition block in autoLoop.
|
|
@@ -202,14 +217,60 @@ export async function runPreDispatch(
|
|
|
202
217
|
loopState: LoopState,
|
|
203
218
|
): Promise<PhaseResult<PreDispatchData>> {
|
|
204
219
|
const { ctx, pi, s, deps, prefs } = ic;
|
|
220
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
221
|
+
const runPreDispatchGate = async (input: {
|
|
222
|
+
gateId: string;
|
|
223
|
+
gateType: string;
|
|
224
|
+
outcome: "pass" | "fail" | "retry" | "manual-attention";
|
|
225
|
+
failureClass: "none" | "policy" | "input" | "execution" | "artifact" | "verification" | "closeout" | "git" | "timeout" | "manual-attention" | "unknown";
|
|
226
|
+
rationale: string;
|
|
227
|
+
findings?: string;
|
|
228
|
+
milestoneId?: string;
|
|
229
|
+
}): Promise<void> => {
|
|
230
|
+
if (!uokFlags.gates) return;
|
|
231
|
+
const gateRunner = new UokGateRunner();
|
|
232
|
+
gateRunner.register({
|
|
233
|
+
id: input.gateId,
|
|
234
|
+
type: input.gateType,
|
|
235
|
+
execute: async () => ({
|
|
236
|
+
outcome: input.outcome,
|
|
237
|
+
failureClass: input.failureClass,
|
|
238
|
+
rationale: input.rationale,
|
|
239
|
+
findings: input.findings ?? "",
|
|
240
|
+
}),
|
|
241
|
+
});
|
|
242
|
+
await gateRunner.run(input.gateId, {
|
|
243
|
+
basePath: s.basePath,
|
|
244
|
+
traceId: `pre-dispatch:${ic.flowId}`,
|
|
245
|
+
turnId: `iter-${ic.iteration}`,
|
|
246
|
+
milestoneId: input.milestoneId ?? s.currentMilestoneId ?? undefined,
|
|
247
|
+
unitType: "pre-dispatch",
|
|
248
|
+
unitId: `iter-${ic.iteration}`,
|
|
249
|
+
});
|
|
250
|
+
};
|
|
205
251
|
|
|
206
252
|
// Resource version guard
|
|
207
253
|
const staleMsg = deps.checkResourcesStale(s.resourceVersionOnStart);
|
|
208
254
|
if (staleMsg) {
|
|
255
|
+
await runPreDispatchGate({
|
|
256
|
+
gateId: "resource-version-guard",
|
|
257
|
+
gateType: "policy",
|
|
258
|
+
outcome: "fail",
|
|
259
|
+
failureClass: "policy",
|
|
260
|
+
rationale: "resource version guard blocked dispatch",
|
|
261
|
+
findings: staleMsg,
|
|
262
|
+
});
|
|
209
263
|
await deps.stopAuto(ctx, pi, staleMsg);
|
|
210
264
|
debugLog("autoLoop", { phase: "exit", reason: "resources-stale" });
|
|
211
265
|
return { action: "break", reason: "resources-stale" };
|
|
212
266
|
}
|
|
267
|
+
await runPreDispatchGate({
|
|
268
|
+
gateId: "resource-version-guard",
|
|
269
|
+
gateType: "policy",
|
|
270
|
+
outcome: "pass",
|
|
271
|
+
failureClass: "none",
|
|
272
|
+
rationale: "resource version guard passed",
|
|
273
|
+
});
|
|
213
274
|
|
|
214
275
|
deps.invalidateAllCaches();
|
|
215
276
|
s.lastPromptCharCount = undefined;
|
|
@@ -225,6 +286,14 @@ export async function runPreDispatch(
|
|
|
225
286
|
);
|
|
226
287
|
}
|
|
227
288
|
if (!healthGate.proceed) {
|
|
289
|
+
await runPreDispatchGate({
|
|
290
|
+
gateId: "pre-dispatch-health-gate",
|
|
291
|
+
gateType: "execution",
|
|
292
|
+
outcome: "manual-attention",
|
|
293
|
+
failureClass: "manual-attention",
|
|
294
|
+
rationale: "pre-dispatch health gate blocked dispatch",
|
|
295
|
+
findings: healthGate.reason,
|
|
296
|
+
});
|
|
228
297
|
ctx.ui.notify(
|
|
229
298
|
healthGate.reason || "Pre-dispatch health check failed — run /gsd doctor for details.",
|
|
230
299
|
"error",
|
|
@@ -233,7 +302,23 @@ export async function runPreDispatch(
|
|
|
233
302
|
debugLog("autoLoop", { phase: "exit", reason: "health-gate-failed" });
|
|
234
303
|
return { action: "break", reason: "health-gate-failed" };
|
|
235
304
|
}
|
|
305
|
+
await runPreDispatchGate({
|
|
306
|
+
gateId: "pre-dispatch-health-gate",
|
|
307
|
+
gateType: "execution",
|
|
308
|
+
outcome: "pass",
|
|
309
|
+
failureClass: "none",
|
|
310
|
+
rationale: "pre-dispatch health gate passed",
|
|
311
|
+
findings: healthGate.fixesApplied.length > 0 ? healthGate.fixesApplied.join(", ") : "",
|
|
312
|
+
});
|
|
236
313
|
} catch (e) {
|
|
314
|
+
await runPreDispatchGate({
|
|
315
|
+
gateId: "pre-dispatch-health-gate",
|
|
316
|
+
gateType: "execution",
|
|
317
|
+
outcome: "manual-attention",
|
|
318
|
+
failureClass: "manual-attention",
|
|
319
|
+
rationale: "pre-dispatch health gate threw unexpectedly",
|
|
320
|
+
findings: String(e),
|
|
321
|
+
});
|
|
237
322
|
logWarning("engine", "Pre-dispatch health gate threw unexpectedly", { error: String(e) });
|
|
238
323
|
}
|
|
239
324
|
|
|
@@ -252,6 +337,32 @@ export async function runPreDispatch(
|
|
|
252
337
|
|
|
253
338
|
// Derive state
|
|
254
339
|
let state = await deps.deriveState(s.basePath);
|
|
340
|
+
if (prefs?.uok?.plan_v2?.enabled && shouldRunPlanV2Gate(state.phase)) {
|
|
341
|
+
const compiled = ensurePlanV2Graph(s.basePath, state);
|
|
342
|
+
if (!compiled.ok) {
|
|
343
|
+
const reason = compiled.reason ?? "Plan v2 compilation failed";
|
|
344
|
+
await runPreDispatchGate({
|
|
345
|
+
gateId: "plan-v2-gate",
|
|
346
|
+
gateType: "policy",
|
|
347
|
+
outcome: "manual-attention",
|
|
348
|
+
failureClass: "manual-attention",
|
|
349
|
+
rationale: "plan v2 compile gate failed",
|
|
350
|
+
findings: reason,
|
|
351
|
+
milestoneId: state.activeMilestone?.id ?? undefined,
|
|
352
|
+
});
|
|
353
|
+
ctx.ui.notify(`Plan gate failed-closed: ${reason}`, "error");
|
|
354
|
+
await deps.pauseAuto(ctx, pi);
|
|
355
|
+
return { action: "break", reason: "plan-v2-gate-failed" };
|
|
356
|
+
}
|
|
357
|
+
await runPreDispatchGate({
|
|
358
|
+
gateId: "plan-v2-gate",
|
|
359
|
+
gateType: "policy",
|
|
360
|
+
outcome: "pass",
|
|
361
|
+
failureClass: "none",
|
|
362
|
+
rationale: "plan v2 compile gate passed",
|
|
363
|
+
milestoneId: state.activeMilestone?.id ?? undefined,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
255
366
|
deps.syncCmuxSidebar(prefs, state);
|
|
256
367
|
let mid = state.activeMilestone?.id;
|
|
257
368
|
let midTitle = state.activeMilestone?.title;
|
|
@@ -297,7 +408,10 @@ export async function runPreDispatch(
|
|
|
297
408
|
s.basePath,
|
|
298
409
|
mid,
|
|
299
410
|
eligible,
|
|
300
|
-
{
|
|
411
|
+
{
|
|
412
|
+
maxWorkers: prefs.slice_parallel.max_workers ?? 2,
|
|
413
|
+
useExecutionGraph: uokFlags.executionGraph,
|
|
414
|
+
},
|
|
301
415
|
);
|
|
302
416
|
if (result.started.length > 0) {
|
|
303
417
|
ctx.ui.notify(
|
|
@@ -1117,6 +1231,8 @@ export async function runUnitPhase(
|
|
|
1117
1231
|
// unit in the same Node process (see workflow-logger.ts module header).
|
|
1118
1232
|
_resetLogs();
|
|
1119
1233
|
s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
|
|
1234
|
+
s.lastGitActionFailure = null;
|
|
1235
|
+
s.lastGitActionStatus = null;
|
|
1120
1236
|
setCurrentPhase(unitType);
|
|
1121
1237
|
s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
|
|
1122
1238
|
const unitStartSeq = ic.nextSeq();
|
|
@@ -1625,11 +1741,15 @@ export async function runFinalize(
|
|
|
1625
1741
|
|
|
1626
1742
|
const preResult = preResultGuard.value;
|
|
1627
1743
|
if (preResult === "dispatched") {
|
|
1744
|
+
const dispatchedReason = s.lastGitActionFailure
|
|
1745
|
+
? "git-closeout-failure"
|
|
1746
|
+
: "pre-verification-dispatched";
|
|
1628
1747
|
debugLog("autoLoop", {
|
|
1629
1748
|
phase: "exit",
|
|
1630
|
-
reason:
|
|
1749
|
+
reason: dispatchedReason,
|
|
1750
|
+
gitError: s.lastGitActionFailure ?? undefined,
|
|
1631
1751
|
});
|
|
1632
|
-
return { action: "break", reason:
|
|
1752
|
+
return { action: "break", reason: dispatchedReason };
|
|
1633
1753
|
}
|
|
1634
1754
|
if (preResult === "retry") {
|
|
1635
1755
|
if (sidecarItem) {
|
|
@@ -106,6 +106,8 @@ export class AutoSession {
|
|
|
106
106
|
|
|
107
107
|
// ── Current unit ─────────────────────────────────────────────────────────
|
|
108
108
|
currentUnit: CurrentUnit | null = null;
|
|
109
|
+
currentTraceId: string | null = null;
|
|
110
|
+
currentTurnId: string | null = null;
|
|
109
111
|
currentUnitRouting: UnitRouting | null = null;
|
|
110
112
|
currentMilestoneId: string | null = null;
|
|
111
113
|
|
|
@@ -137,6 +139,10 @@ export class AutoSession {
|
|
|
137
139
|
/** Set when a GSD tool execution ends with isError due to malformed/truncated
|
|
138
140
|
* JSON arguments. Checked by postUnitPreVerification to break retry loops. */
|
|
139
141
|
lastToolInvocationError: string | null = null;
|
|
142
|
+
/** Set when turn-level git action fails during closeout. */
|
|
143
|
+
lastGitActionFailure: string | null = null;
|
|
144
|
+
/** Last turn-level git action status captured during finalize. */
|
|
145
|
+
lastGitActionStatus: "ok" | "failed" | null = null;
|
|
140
146
|
|
|
141
147
|
// ── Isolation degradation ────────────────────────────────────────────
|
|
142
148
|
/** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
|
|
@@ -219,6 +225,8 @@ export class AutoSession {
|
|
|
219
225
|
|
|
220
226
|
// Unit
|
|
221
227
|
this.currentUnit = null;
|
|
228
|
+
this.currentTraceId = null;
|
|
229
|
+
this.currentTurnId = null;
|
|
222
230
|
this.currentUnitRouting = null;
|
|
223
231
|
this.currentMilestoneId = null;
|
|
224
232
|
|
|
@@ -250,6 +258,8 @@ export class AutoSession {
|
|
|
250
258
|
this.rewriteAttemptCount = 0;
|
|
251
259
|
this.consecutiveCompleteBootstraps = 0;
|
|
252
260
|
this.lastToolInvocationError = null;
|
|
261
|
+
this.lastGitActionFailure = null;
|
|
262
|
+
this.lastGitActionStatus = null;
|
|
253
263
|
this.isolationDegraded = false;
|
|
254
264
|
this.milestoneMergedInPhases = false;
|
|
255
265
|
this.checkpointSha = null;
|
|
@@ -53,6 +53,8 @@ import {
|
|
|
53
53
|
checkNeedsRunUat,
|
|
54
54
|
} from "./auto-prompts.js";
|
|
55
55
|
import { resolveModelWithFallbacksForUnit } from "./preferences-models.js";
|
|
56
|
+
import { resolveUokFlags } from "./uok/flags.js";
|
|
57
|
+
import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
|
|
56
58
|
|
|
57
59
|
// ─── Types ────────────────────────────────────────────────────────────────
|
|
58
60
|
|
|
@@ -584,12 +586,20 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
584
586
|
// Only activate reactive dispatch when >1 task is ready
|
|
585
587
|
if (readyIds.length <= 1) return null;
|
|
586
588
|
|
|
587
|
-
const
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
589
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
590
|
+
const selected = uokFlags.executionGraph
|
|
591
|
+
? selectReactiveDispatchBatch({
|
|
592
|
+
graph,
|
|
593
|
+
readyIds,
|
|
594
|
+
maxParallel,
|
|
595
|
+
inFlightOutputs: new Set(),
|
|
596
|
+
}).selected
|
|
597
|
+
: chooseNonConflictingSubset(
|
|
598
|
+
readyIds,
|
|
599
|
+
graph,
|
|
600
|
+
maxParallel,
|
|
601
|
+
new Set(),
|
|
602
|
+
);
|
|
593
603
|
if (selected.length <= 1) return null;
|
|
594
604
|
|
|
595
605
|
// Log graph metrics for observability
|