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
|
@@ -54,8 +54,8 @@ let loadAttempted = false;
|
|
|
54
54
|
|
|
55
55
|
function suppressSqliteWarning(): void {
|
|
56
56
|
const origEmit = process.emit;
|
|
57
|
-
//
|
|
58
|
-
process.emit = function (event: string, ...args: unknown[]): boolean {
|
|
57
|
+
// Override via loose cast: Node's overloaded emit signature is not directly assignable.
|
|
58
|
+
(process as any).emit = function (event: string, ...args: unknown[]): boolean {
|
|
59
59
|
if (
|
|
60
60
|
event === "warning" &&
|
|
61
61
|
args[0] &&
|
|
@@ -180,7 +180,7 @@ function openRawDb(path: string): unknown {
|
|
|
180
180
|
return new Database(path);
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
const SCHEMA_VERSION =
|
|
183
|
+
const SCHEMA_VERSION = 15;
|
|
184
184
|
|
|
185
185
|
function indexExists(db: DbAdapter, name: string): boolean {
|
|
186
186
|
return !!db.prepare(
|
|
@@ -443,6 +443,70 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
443
443
|
)
|
|
444
444
|
`);
|
|
445
445
|
|
|
446
|
+
db.exec(`
|
|
447
|
+
CREATE TABLE IF NOT EXISTS gate_runs (
|
|
448
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
449
|
+
trace_id TEXT NOT NULL,
|
|
450
|
+
turn_id TEXT NOT NULL,
|
|
451
|
+
gate_id TEXT NOT NULL,
|
|
452
|
+
gate_type TEXT NOT NULL DEFAULT '',
|
|
453
|
+
unit_type TEXT DEFAULT NULL,
|
|
454
|
+
unit_id TEXT DEFAULT NULL,
|
|
455
|
+
milestone_id TEXT DEFAULT NULL,
|
|
456
|
+
slice_id TEXT DEFAULT NULL,
|
|
457
|
+
task_id TEXT DEFAULT NULL,
|
|
458
|
+
outcome TEXT NOT NULL DEFAULT 'pass',
|
|
459
|
+
failure_class TEXT NOT NULL DEFAULT 'none',
|
|
460
|
+
rationale TEXT NOT NULL DEFAULT '',
|
|
461
|
+
findings TEXT NOT NULL DEFAULT '',
|
|
462
|
+
attempt INTEGER NOT NULL DEFAULT 1,
|
|
463
|
+
max_attempts INTEGER NOT NULL DEFAULT 1,
|
|
464
|
+
retryable INTEGER NOT NULL DEFAULT 0,
|
|
465
|
+
evaluated_at TEXT NOT NULL DEFAULT ''
|
|
466
|
+
)
|
|
467
|
+
`);
|
|
468
|
+
|
|
469
|
+
db.exec(`
|
|
470
|
+
CREATE TABLE IF NOT EXISTS turn_git_transactions (
|
|
471
|
+
trace_id TEXT NOT NULL,
|
|
472
|
+
turn_id TEXT NOT NULL,
|
|
473
|
+
unit_type TEXT DEFAULT NULL,
|
|
474
|
+
unit_id TEXT DEFAULT NULL,
|
|
475
|
+
stage TEXT NOT NULL DEFAULT 'turn-start',
|
|
476
|
+
action TEXT NOT NULL DEFAULT 'status-only',
|
|
477
|
+
push INTEGER NOT NULL DEFAULT 0,
|
|
478
|
+
status TEXT NOT NULL DEFAULT 'ok',
|
|
479
|
+
error TEXT DEFAULT NULL,
|
|
480
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
481
|
+
updated_at TEXT NOT NULL DEFAULT '',
|
|
482
|
+
PRIMARY KEY (trace_id, turn_id, stage)
|
|
483
|
+
)
|
|
484
|
+
`);
|
|
485
|
+
|
|
486
|
+
db.exec(`
|
|
487
|
+
CREATE TABLE IF NOT EXISTS audit_events (
|
|
488
|
+
event_id TEXT PRIMARY KEY,
|
|
489
|
+
trace_id TEXT NOT NULL,
|
|
490
|
+
turn_id TEXT DEFAULT NULL,
|
|
491
|
+
caused_by TEXT DEFAULT NULL,
|
|
492
|
+
category TEXT NOT NULL,
|
|
493
|
+
type TEXT NOT NULL,
|
|
494
|
+
ts TEXT NOT NULL,
|
|
495
|
+
payload_json TEXT NOT NULL DEFAULT '{}'
|
|
496
|
+
)
|
|
497
|
+
`);
|
|
498
|
+
|
|
499
|
+
db.exec(`
|
|
500
|
+
CREATE TABLE IF NOT EXISTS audit_turn_index (
|
|
501
|
+
trace_id TEXT NOT NULL,
|
|
502
|
+
turn_id TEXT NOT NULL,
|
|
503
|
+
first_ts TEXT NOT NULL,
|
|
504
|
+
last_ts TEXT NOT NULL,
|
|
505
|
+
event_count INTEGER NOT NULL DEFAULT 0,
|
|
506
|
+
PRIMARY KEY (trace_id, turn_id)
|
|
507
|
+
)
|
|
508
|
+
`);
|
|
509
|
+
|
|
446
510
|
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(superseded_by)");
|
|
447
511
|
db.exec("CREATE INDEX IF NOT EXISTS idx_replan_history_milestone ON replan_history(milestone_id, created_at)");
|
|
448
512
|
|
|
@@ -456,6 +520,11 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
456
520
|
|
|
457
521
|
// v14 index — slice dependency lookups
|
|
458
522
|
db.exec("CREATE INDEX IF NOT EXISTS idx_slice_deps_target ON slice_dependencies(milestone_id, depends_on_slice_id)");
|
|
523
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
|
|
524
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
|
|
525
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
|
|
526
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
|
|
527
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
|
|
459
528
|
|
|
460
529
|
db.exec(`CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL`);
|
|
461
530
|
db.exec(`CREATE VIEW IF NOT EXISTS active_requirements AS SELECT * FROM requirements WHERE superseded_by IS NULL`);
|
|
@@ -810,6 +879,78 @@ function migrateSchema(db: DbAdapter): void {
|
|
|
810
879
|
});
|
|
811
880
|
}
|
|
812
881
|
|
|
882
|
+
if (currentVersion < 15) {
|
|
883
|
+
db.exec(`
|
|
884
|
+
CREATE TABLE IF NOT EXISTS gate_runs (
|
|
885
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
886
|
+
trace_id TEXT NOT NULL,
|
|
887
|
+
turn_id TEXT NOT NULL,
|
|
888
|
+
gate_id TEXT NOT NULL,
|
|
889
|
+
gate_type TEXT NOT NULL DEFAULT '',
|
|
890
|
+
unit_type TEXT DEFAULT NULL,
|
|
891
|
+
unit_id TEXT DEFAULT NULL,
|
|
892
|
+
milestone_id TEXT DEFAULT NULL,
|
|
893
|
+
slice_id TEXT DEFAULT NULL,
|
|
894
|
+
task_id TEXT DEFAULT NULL,
|
|
895
|
+
outcome TEXT NOT NULL DEFAULT 'pass',
|
|
896
|
+
failure_class TEXT NOT NULL DEFAULT 'none',
|
|
897
|
+
rationale TEXT NOT NULL DEFAULT '',
|
|
898
|
+
findings TEXT NOT NULL DEFAULT '',
|
|
899
|
+
attempt INTEGER NOT NULL DEFAULT 1,
|
|
900
|
+
max_attempts INTEGER NOT NULL DEFAULT 1,
|
|
901
|
+
retryable INTEGER NOT NULL DEFAULT 0,
|
|
902
|
+
evaluated_at TEXT NOT NULL DEFAULT ''
|
|
903
|
+
)
|
|
904
|
+
`);
|
|
905
|
+
db.exec(`
|
|
906
|
+
CREATE TABLE IF NOT EXISTS turn_git_transactions (
|
|
907
|
+
trace_id TEXT NOT NULL,
|
|
908
|
+
turn_id TEXT NOT NULL,
|
|
909
|
+
unit_type TEXT DEFAULT NULL,
|
|
910
|
+
unit_id TEXT DEFAULT NULL,
|
|
911
|
+
stage TEXT NOT NULL DEFAULT 'turn-start',
|
|
912
|
+
action TEXT NOT NULL DEFAULT 'status-only',
|
|
913
|
+
push INTEGER NOT NULL DEFAULT 0,
|
|
914
|
+
status TEXT NOT NULL DEFAULT 'ok',
|
|
915
|
+
error TEXT DEFAULT NULL,
|
|
916
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
917
|
+
updated_at TEXT NOT NULL DEFAULT '',
|
|
918
|
+
PRIMARY KEY (trace_id, turn_id, stage)
|
|
919
|
+
)
|
|
920
|
+
`);
|
|
921
|
+
db.exec(`
|
|
922
|
+
CREATE TABLE IF NOT EXISTS audit_events (
|
|
923
|
+
event_id TEXT PRIMARY KEY,
|
|
924
|
+
trace_id TEXT NOT NULL,
|
|
925
|
+
turn_id TEXT DEFAULT NULL,
|
|
926
|
+
caused_by TEXT DEFAULT NULL,
|
|
927
|
+
category TEXT NOT NULL,
|
|
928
|
+
type TEXT NOT NULL,
|
|
929
|
+
ts TEXT NOT NULL,
|
|
930
|
+
payload_json TEXT NOT NULL DEFAULT '{}'
|
|
931
|
+
)
|
|
932
|
+
`);
|
|
933
|
+
db.exec(`
|
|
934
|
+
CREATE TABLE IF NOT EXISTS audit_turn_index (
|
|
935
|
+
trace_id TEXT NOT NULL,
|
|
936
|
+
turn_id TEXT NOT NULL,
|
|
937
|
+
first_ts TEXT NOT NULL,
|
|
938
|
+
last_ts TEXT NOT NULL,
|
|
939
|
+
event_count INTEGER NOT NULL DEFAULT 0,
|
|
940
|
+
PRIMARY KEY (trace_id, turn_id)
|
|
941
|
+
)
|
|
942
|
+
`);
|
|
943
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
|
|
944
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
|
|
945
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
|
|
946
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
|
|
947
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
|
|
948
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
949
|
+
":version": 15,
|
|
950
|
+
":applied_at": new Date().toISOString(),
|
|
951
|
+
});
|
|
952
|
+
}
|
|
953
|
+
|
|
813
954
|
db.exec("COMMIT");
|
|
814
955
|
} catch (err) {
|
|
815
956
|
db.exec("ROLLBACK");
|
|
@@ -2287,6 +2428,9 @@ export function deleteMilestone(milestoneId: string): void {
|
|
|
2287
2428
|
currentDb!.prepare(
|
|
2288
2429
|
`DELETE FROM quality_gates WHERE milestone_id = :mid`,
|
|
2289
2430
|
).run({ ":mid": milestoneId });
|
|
2431
|
+
currentDb!.prepare(
|
|
2432
|
+
`DELETE FROM gate_runs WHERE milestone_id = :mid`,
|
|
2433
|
+
).run({ ":mid": milestoneId });
|
|
2290
2434
|
currentDb!.prepare(
|
|
2291
2435
|
`DELETE FROM tasks WHERE milestone_id = :mid`,
|
|
2292
2436
|
).run({ ":mid": milestoneId });
|
|
@@ -2420,6 +2564,30 @@ export function saveGateResult(g: {
|
|
|
2420
2564
|
":findings": g.findings,
|
|
2421
2565
|
":evaluated_at": new Date().toISOString(),
|
|
2422
2566
|
});
|
|
2567
|
+
|
|
2568
|
+
const outcome =
|
|
2569
|
+
g.verdict === "pass"
|
|
2570
|
+
? "pass"
|
|
2571
|
+
: g.verdict === "omitted"
|
|
2572
|
+
? "manual-attention"
|
|
2573
|
+
: "fail";
|
|
2574
|
+
insertGateRun({
|
|
2575
|
+
traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
|
|
2576
|
+
turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
|
|
2577
|
+
gateId: g.gateId,
|
|
2578
|
+
gateType: "quality-gate",
|
|
2579
|
+
milestoneId: g.milestoneId,
|
|
2580
|
+
sliceId: g.sliceId,
|
|
2581
|
+
taskId: g.taskId ?? undefined,
|
|
2582
|
+
outcome,
|
|
2583
|
+
failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
|
|
2584
|
+
rationale: g.rationale,
|
|
2585
|
+
findings: g.findings,
|
|
2586
|
+
attempt: 1,
|
|
2587
|
+
maxAttempts: 1,
|
|
2588
|
+
retryable: false,
|
|
2589
|
+
evaluatedAt: new Date().toISOString(),
|
|
2590
|
+
});
|
|
2423
2591
|
}
|
|
2424
2592
|
|
|
2425
2593
|
export function getPendingGates(milestoneId: string, sliceId: string, scope?: GateScope): GateRow[] {
|
|
@@ -2513,6 +2681,156 @@ export function getPendingGateCountForTurn(
|
|
|
2513
2681
|
return getPendingGatesForTurn(milestoneId, sliceId, turn).length;
|
|
2514
2682
|
}
|
|
2515
2683
|
|
|
2684
|
+
export function insertGateRun(entry: {
|
|
2685
|
+
traceId: string;
|
|
2686
|
+
turnId: string;
|
|
2687
|
+
gateId: string;
|
|
2688
|
+
gateType: string;
|
|
2689
|
+
unitType?: string;
|
|
2690
|
+
unitId?: string;
|
|
2691
|
+
milestoneId?: string;
|
|
2692
|
+
sliceId?: string;
|
|
2693
|
+
taskId?: string;
|
|
2694
|
+
outcome: "pass" | "fail" | "retry" | "manual-attention";
|
|
2695
|
+
failureClass: "none" | "policy" | "input" | "execution" | "artifact" | "verification" | "closeout" | "git" | "timeout" | "manual-attention" | "unknown";
|
|
2696
|
+
rationale?: string;
|
|
2697
|
+
findings?: string;
|
|
2698
|
+
attempt: number;
|
|
2699
|
+
maxAttempts: number;
|
|
2700
|
+
retryable: boolean;
|
|
2701
|
+
evaluatedAt: string;
|
|
2702
|
+
}): void {
|
|
2703
|
+
if (!currentDb) return;
|
|
2704
|
+
currentDb.prepare(
|
|
2705
|
+
`INSERT INTO gate_runs (
|
|
2706
|
+
trace_id, turn_id, gate_id, gate_type, unit_type, unit_id, milestone_id, slice_id, task_id,
|
|
2707
|
+
outcome, failure_class, rationale, findings, attempt, max_attempts, retryable, evaluated_at
|
|
2708
|
+
) VALUES (
|
|
2709
|
+
:trace_id, :turn_id, :gate_id, :gate_type, :unit_type, :unit_id, :milestone_id, :slice_id, :task_id,
|
|
2710
|
+
:outcome, :failure_class, :rationale, :findings, :attempt, :max_attempts, :retryable, :evaluated_at
|
|
2711
|
+
)`,
|
|
2712
|
+
).run({
|
|
2713
|
+
":trace_id": entry.traceId,
|
|
2714
|
+
":turn_id": entry.turnId,
|
|
2715
|
+
":gate_id": entry.gateId,
|
|
2716
|
+
":gate_type": entry.gateType,
|
|
2717
|
+
":unit_type": entry.unitType ?? null,
|
|
2718
|
+
":unit_id": entry.unitId ?? null,
|
|
2719
|
+
":milestone_id": entry.milestoneId ?? null,
|
|
2720
|
+
":slice_id": entry.sliceId ?? null,
|
|
2721
|
+
":task_id": entry.taskId ?? null,
|
|
2722
|
+
":outcome": entry.outcome,
|
|
2723
|
+
":failure_class": entry.failureClass,
|
|
2724
|
+
":rationale": entry.rationale ?? "",
|
|
2725
|
+
":findings": entry.findings ?? "",
|
|
2726
|
+
":attempt": entry.attempt,
|
|
2727
|
+
":max_attempts": entry.maxAttempts,
|
|
2728
|
+
":retryable": entry.retryable ? 1 : 0,
|
|
2729
|
+
":evaluated_at": entry.evaluatedAt,
|
|
2730
|
+
});
|
|
2731
|
+
}
|
|
2732
|
+
|
|
2733
|
+
export function upsertTurnGitTransaction(entry: {
|
|
2734
|
+
traceId: string;
|
|
2735
|
+
turnId: string;
|
|
2736
|
+
unitType?: string;
|
|
2737
|
+
unitId?: string;
|
|
2738
|
+
stage: string;
|
|
2739
|
+
action: "commit" | "snapshot" | "status-only";
|
|
2740
|
+
push: boolean;
|
|
2741
|
+
status: "ok" | "failed";
|
|
2742
|
+
error?: string;
|
|
2743
|
+
metadata?: Record<string, unknown>;
|
|
2744
|
+
updatedAt: string;
|
|
2745
|
+
}): void {
|
|
2746
|
+
if (!currentDb) return;
|
|
2747
|
+
currentDb.prepare(
|
|
2748
|
+
`INSERT OR REPLACE INTO turn_git_transactions (
|
|
2749
|
+
trace_id, turn_id, unit_type, unit_id, stage, action, push, status, error, metadata_json, updated_at
|
|
2750
|
+
) VALUES (
|
|
2751
|
+
:trace_id, :turn_id, :unit_type, :unit_id, :stage, :action, :push, :status, :error, :metadata_json, :updated_at
|
|
2752
|
+
)`,
|
|
2753
|
+
).run({
|
|
2754
|
+
":trace_id": entry.traceId,
|
|
2755
|
+
":turn_id": entry.turnId,
|
|
2756
|
+
":unit_type": entry.unitType ?? null,
|
|
2757
|
+
":unit_id": entry.unitId ?? null,
|
|
2758
|
+
":stage": entry.stage,
|
|
2759
|
+
":action": entry.action,
|
|
2760
|
+
":push": entry.push ? 1 : 0,
|
|
2761
|
+
":status": entry.status,
|
|
2762
|
+
":error": entry.error ?? null,
|
|
2763
|
+
":metadata_json": JSON.stringify(entry.metadata ?? {}),
|
|
2764
|
+
":updated_at": entry.updatedAt,
|
|
2765
|
+
});
|
|
2766
|
+
}
|
|
2767
|
+
|
|
2768
|
+
export function insertAuditEvent(entry: {
|
|
2769
|
+
eventId: string;
|
|
2770
|
+
traceId: string;
|
|
2771
|
+
turnId?: string;
|
|
2772
|
+
causedBy?: string;
|
|
2773
|
+
category: string;
|
|
2774
|
+
type: string;
|
|
2775
|
+
ts: string;
|
|
2776
|
+
payload: Record<string, unknown>;
|
|
2777
|
+
}): void {
|
|
2778
|
+
if (!currentDb) return;
|
|
2779
|
+
transaction(() => {
|
|
2780
|
+
currentDb!.prepare(
|
|
2781
|
+
`INSERT OR IGNORE INTO audit_events (
|
|
2782
|
+
event_id, trace_id, turn_id, caused_by, category, type, ts, payload_json
|
|
2783
|
+
) VALUES (
|
|
2784
|
+
:event_id, :trace_id, :turn_id, :caused_by, :category, :type, :ts, :payload_json
|
|
2785
|
+
)`,
|
|
2786
|
+
).run({
|
|
2787
|
+
":event_id": entry.eventId,
|
|
2788
|
+
":trace_id": entry.traceId,
|
|
2789
|
+
":turn_id": entry.turnId ?? null,
|
|
2790
|
+
":caused_by": entry.causedBy ?? null,
|
|
2791
|
+
":category": entry.category,
|
|
2792
|
+
":type": entry.type,
|
|
2793
|
+
":ts": entry.ts,
|
|
2794
|
+
":payload_json": JSON.stringify(entry.payload ?? {}),
|
|
2795
|
+
});
|
|
2796
|
+
|
|
2797
|
+
if (entry.turnId) {
|
|
2798
|
+
const row = currentDb!.prepare(
|
|
2799
|
+
`SELECT event_count, first_ts, last_ts
|
|
2800
|
+
FROM audit_turn_index
|
|
2801
|
+
WHERE trace_id = :trace_id AND turn_id = :turn_id`,
|
|
2802
|
+
).get({
|
|
2803
|
+
":trace_id": entry.traceId,
|
|
2804
|
+
":turn_id": entry.turnId,
|
|
2805
|
+
});
|
|
2806
|
+
if (row) {
|
|
2807
|
+
currentDb!.prepare(
|
|
2808
|
+
`UPDATE audit_turn_index
|
|
2809
|
+
SET first_ts = CASE WHEN :ts < first_ts THEN :ts ELSE first_ts END,
|
|
2810
|
+
last_ts = CASE WHEN :ts > last_ts THEN :ts ELSE last_ts END,
|
|
2811
|
+
event_count = event_count + 1
|
|
2812
|
+
WHERE trace_id = :trace_id AND turn_id = :turn_id`,
|
|
2813
|
+
).run({
|
|
2814
|
+
":trace_id": entry.traceId,
|
|
2815
|
+
":turn_id": entry.turnId,
|
|
2816
|
+
":ts": entry.ts,
|
|
2817
|
+
});
|
|
2818
|
+
} else {
|
|
2819
|
+
currentDb!.prepare(
|
|
2820
|
+
`INSERT INTO audit_turn_index (trace_id, turn_id, first_ts, last_ts, event_count)
|
|
2821
|
+
VALUES (:trace_id, :turn_id, :first_ts, :last_ts, :event_count)`,
|
|
2822
|
+
).run({
|
|
2823
|
+
":trace_id": entry.traceId,
|
|
2824
|
+
":turn_id": entry.turnId,
|
|
2825
|
+
":first_ts": entry.ts,
|
|
2826
|
+
":last_ts": entry.ts,
|
|
2827
|
+
":event_count": 1,
|
|
2828
|
+
});
|
|
2829
|
+
}
|
|
2830
|
+
}
|
|
2831
|
+
});
|
|
2832
|
+
}
|
|
2833
|
+
|
|
2516
2834
|
// ─── Single-writer bypass wrappers ───────────────────────────────────────
|
|
2517
2835
|
// These wrappers exist so modules outside this file never need to call
|
|
2518
2836
|
// `_getAdapter()` for writes. Each one is a byte-equivalent replacement for
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { ExtensionAPI, ExtensionContext, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
10
|
+
import type { GSDState } from "./types.js";
|
|
10
11
|
import { showNextAction } from "../shared/tui.js";
|
|
11
12
|
import { loadFile, saveFile } from "./files.js";
|
|
12
13
|
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
@@ -36,6 +37,8 @@ import { nativeIsRepo, nativeInit } from "./native-git-bridge.js";
|
|
|
36
37
|
import { isInheritedRepo } from "./repo-identity.js";
|
|
37
38
|
import { ensureGitignore, ensurePreferences, untrackRuntimeFiles } from "./gitignore.js";
|
|
38
39
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
40
|
+
import { resolveUokFlags } from "./uok/flags.js";
|
|
41
|
+
import { ensurePlanV2Graph } from "./uok/plan-v2.js";
|
|
39
42
|
import { detectProjectState } from "./detection.js";
|
|
40
43
|
import { showProjectInit, offerMigration } from "./init-wizard.js";
|
|
41
44
|
import { validateDirectory } from "./validate-directory.js";
|
|
@@ -83,6 +86,33 @@ function nextMilestoneIdReserved(existingIds: string[], uniqueEnabled: boolean):
|
|
|
83
86
|
return id;
|
|
84
87
|
}
|
|
85
88
|
|
|
89
|
+
function needsPlanV2Gate(state: GSDState): boolean {
|
|
90
|
+
return state.phase === "executing"
|
|
91
|
+
|| state.phase === "summarizing"
|
|
92
|
+
|| state.phase === "validating-milestone"
|
|
93
|
+
|| state.phase === "completing-milestone";
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function runPlanV2Gate(
|
|
97
|
+
ctx: ExtensionContext,
|
|
98
|
+
basePath: string,
|
|
99
|
+
state: GSDState,
|
|
100
|
+
): boolean {
|
|
101
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
102
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
103
|
+
if (!uokFlags.planV2 || !needsPlanV2Gate(state)) return true;
|
|
104
|
+
const compiled = ensurePlanV2Graph(basePath, state);
|
|
105
|
+
if (!compiled.ok) {
|
|
106
|
+
const reason = compiled.reason ?? "plan-v2 compilation failed";
|
|
107
|
+
ctx.ui.notify(
|
|
108
|
+
`Plan gate failed-closed: ${reason}. Complete plan/discuss artifacts before execution.`,
|
|
109
|
+
"error",
|
|
110
|
+
);
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
|
|
86
116
|
// ─── Commit Instruction Helpers ──────────────────────────────────────────────
|
|
87
117
|
|
|
88
118
|
/** Build commit instruction for planning prompts. .gsd/ is managed externally and always gitignored. */
|
|
@@ -242,7 +272,7 @@ export function checkAutoStartAfterDiscuss(): boolean {
|
|
|
242
272
|
try { unlinkSync(manifestPath); } catch (e) { logWarning("guided", `manifest unlink failed: ${(e as Error).message}`); }
|
|
243
273
|
|
|
244
274
|
pendingAutoStartMap.delete(basePath);
|
|
245
|
-
ctx.ui.notify(`Milestone ${milestoneId} ready.`, "
|
|
275
|
+
ctx.ui.notify(`Milestone ${milestoneId} ready.`, "success");
|
|
246
276
|
startAutoDetached(ctx, pi, basePath, false, { step });
|
|
247
277
|
return true;
|
|
248
278
|
}
|
|
@@ -1320,6 +1350,8 @@ export async function showSmartEntry(
|
|
|
1320
1350
|
logWarning("guided", `STATE.md rebuild failed: ${(err as Error).message}`);
|
|
1321
1351
|
}
|
|
1322
1352
|
|
|
1353
|
+
if (!runPlanV2Gate(ctx, basePath, state)) return;
|
|
1354
|
+
|
|
1323
1355
|
if (!state.activeMilestone?.id) {
|
|
1324
1356
|
// Guard: if a discuss session is already in flight, don't re-inject the prompt.
|
|
1325
1357
|
// Both /gsd and /gsd auto reach this branch when no milestone exists yet.
|
|
@@ -33,7 +33,7 @@ interface ProjectPreferences {
|
|
|
33
33
|
mainBranch: string;
|
|
34
34
|
verificationCommands: string[];
|
|
35
35
|
customInstructions: string[];
|
|
36
|
-
tokenProfile: "budget" | "balanced" | "quality";
|
|
36
|
+
tokenProfile: "budget" | "balanced" | "quality" | "burn-max";
|
|
37
37
|
skipResearch: boolean;
|
|
38
38
|
autoPush: boolean;
|
|
39
39
|
}
|
|
@@ -413,10 +413,11 @@ async function customizeAdvancedPrefs(
|
|
|
413
413
|
{ id: "balanced", label: "Balanced", description: "Good trade-off (default)", recommended: true },
|
|
414
414
|
{ id: "budget", label: "Budget", description: "Minimize token usage" },
|
|
415
415
|
{ id: "quality", label: "Quality", description: "Maximize thoroughness" },
|
|
416
|
+
{ id: "burn-max", label: "Burn Max", description: "Maximum depth, no phase skips" },
|
|
416
417
|
],
|
|
417
418
|
});
|
|
418
419
|
if (profileChoice !== "not_yet") {
|
|
419
|
-
prefs.tokenProfile = profileChoice as "budget" | "balanced" | "quality";
|
|
420
|
+
prefs.tokenProfile = profileChoice as "budget" | "balanced" | "quality" | "burn-max";
|
|
420
421
|
}
|
|
421
422
|
|
|
422
423
|
// Skip research
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
import { appendFileSync, mkdirSync, readdirSync, readFileSync } from "node:fs";
|
|
16
16
|
import { join } from "node:path";
|
|
17
17
|
import { gsdRoot } from "./paths.js";
|
|
18
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
19
|
+
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
18
20
|
|
|
19
21
|
// ─── Types ────────────────────────────────────────────────────────────────────
|
|
20
22
|
|
|
@@ -90,6 +92,34 @@ export function emitJournalEvent(basePath: string, entry: JournalEntry): void {
|
|
|
90
92
|
} catch {
|
|
91
93
|
// Silent failure — journal must never break auto-mode
|
|
92
94
|
}
|
|
95
|
+
|
|
96
|
+
if (!isUnifiedAuditEnabled()) return;
|
|
97
|
+
try {
|
|
98
|
+
const causedBy = entry.causedBy
|
|
99
|
+
? `${entry.causedBy.flowId}:${entry.causedBy.seq}`
|
|
100
|
+
: undefined;
|
|
101
|
+
const turnId =
|
|
102
|
+
typeof entry.data?.turnId === "string"
|
|
103
|
+
? entry.data.turnId
|
|
104
|
+
: undefined;
|
|
105
|
+
emitUokAuditEvent(
|
|
106
|
+
basePath,
|
|
107
|
+
buildAuditEnvelope({
|
|
108
|
+
traceId: entry.flowId,
|
|
109
|
+
turnId,
|
|
110
|
+
causedBy,
|
|
111
|
+
category: "orchestration",
|
|
112
|
+
type: `journal-${entry.eventType}`,
|
|
113
|
+
payload: {
|
|
114
|
+
seq: entry.seq,
|
|
115
|
+
rule: entry.rule,
|
|
116
|
+
data: entry.data ?? {},
|
|
117
|
+
},
|
|
118
|
+
}),
|
|
119
|
+
);
|
|
120
|
+
} catch {
|
|
121
|
+
// Best-effort: audit projection must never block journal writes.
|
|
122
|
+
}
|
|
93
123
|
}
|
|
94
124
|
|
|
95
125
|
// ─── Query ────────────────────────────────────────────────────────────────────
|
|
@@ -19,6 +19,8 @@ import { gsdRoot } from "./paths.js";
|
|
|
19
19
|
import { getAndClearSkills } from "./skill-telemetry.js";
|
|
20
20
|
import { loadJsonFile, loadJsonFileOrNull, saveJsonFile } from "./json-persistence.js";
|
|
21
21
|
import { parseUnitId } from "./unit-id.js";
|
|
22
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
23
|
+
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
22
24
|
|
|
23
25
|
// Re-export from shared — import directly from format-utils to avoid pulling
|
|
24
26
|
// in the full barrel (mod.js → ui.js → @gsd/pi-tui) which breaks when loaded
|
|
@@ -143,6 +145,9 @@ export function snapshotUnitMetrics(
|
|
|
143
145
|
promptCharCount?: number;
|
|
144
146
|
baselineCharCount?: number;
|
|
145
147
|
autoSessionKey?: string;
|
|
148
|
+
traceId?: string;
|
|
149
|
+
turnId?: string;
|
|
150
|
+
causedBy?: string;
|
|
146
151
|
},
|
|
147
152
|
): UnitMetrics | null {
|
|
148
153
|
if (!ledger) return null;
|
|
@@ -235,6 +240,27 @@ export function snapshotUnitMetrics(
|
|
|
235
240
|
}
|
|
236
241
|
saveLedger(basePath, ledger);
|
|
237
242
|
|
|
243
|
+
if (isUnifiedAuditEnabled()) {
|
|
244
|
+
emitUokAuditEvent(
|
|
245
|
+
basePath,
|
|
246
|
+
buildAuditEnvelope({
|
|
247
|
+
traceId: opts?.traceId ?? `metrics:${unitType}:${unitId}`,
|
|
248
|
+
turnId: opts?.turnId,
|
|
249
|
+
causedBy: opts?.causedBy,
|
|
250
|
+
category: "metrics",
|
|
251
|
+
type: "unit-metrics-snapshot",
|
|
252
|
+
payload: {
|
|
253
|
+
unitType,
|
|
254
|
+
unitId,
|
|
255
|
+
model,
|
|
256
|
+
tokens: unit.tokens,
|
|
257
|
+
cost: unit.cost,
|
|
258
|
+
toolCalls: unit.toolCalls,
|
|
259
|
+
},
|
|
260
|
+
}),
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
238
264
|
return unit;
|
|
239
265
|
}
|
|
240
266
|
|
|
@@ -42,6 +42,8 @@ import {
|
|
|
42
42
|
} from "./parallel-eligibility.js";
|
|
43
43
|
import { getErrorMessage } from "./error-utils.js";
|
|
44
44
|
import { logWarning } from "./workflow-logger.js";
|
|
45
|
+
import { resolveUokFlags } from "./uok/flags.js";
|
|
46
|
+
import { selectConflictFreeBatch } from "./uok/execution-graph.js";
|
|
45
47
|
|
|
46
48
|
// ─── Types ─────────────────────────────────────────────────────────────────
|
|
47
49
|
|
|
@@ -69,6 +71,10 @@ export interface OrchestratorState {
|
|
|
69
71
|
|
|
70
72
|
let state: OrchestratorState | null = null;
|
|
71
73
|
|
|
74
|
+
function overlapKey(a: string, b: string): string {
|
|
75
|
+
return a < b ? `${a}::${b}` : `${b}::${a}`;
|
|
76
|
+
}
|
|
77
|
+
|
|
72
78
|
// ─── Persistence ──────────────────────────────────────────────────────────
|
|
73
79
|
|
|
74
80
|
const ORCHESTRATOR_STATE_FILE = "orchestrator.json";
|
|
@@ -365,6 +371,7 @@ export async function startParallel(
|
|
|
365
371
|
}
|
|
366
372
|
|
|
367
373
|
const config = resolveParallelConfig(prefs);
|
|
374
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
368
375
|
|
|
369
376
|
// Release any leftover state from a previous session before reassigning
|
|
370
377
|
if (state) {
|
|
@@ -418,8 +425,40 @@ export async function startParallel(
|
|
|
418
425
|
const started: string[] = [];
|
|
419
426
|
const errors: Array<{ mid: string; error: string }> = [];
|
|
420
427
|
|
|
428
|
+
let filteredMilestoneIds = milestoneIds;
|
|
429
|
+
if (uokFlags.executionGraph && milestoneIds.length > 1) {
|
|
430
|
+
try {
|
|
431
|
+
const requestedIds = new Set(milestoneIds);
|
|
432
|
+
const candidates = await analyzeParallelEligibility(basePath);
|
|
433
|
+
const overlapPairs = new Set<string>();
|
|
434
|
+
for (const overlap of candidates.fileOverlaps) {
|
|
435
|
+
if (!requestedIds.has(overlap.mid1) || !requestedIds.has(overlap.mid2)) continue;
|
|
436
|
+
overlapPairs.add(overlapKey(overlap.mid1, overlap.mid2));
|
|
437
|
+
}
|
|
438
|
+
filteredMilestoneIds = selectConflictFreeBatch({
|
|
439
|
+
orderedIds: milestoneIds,
|
|
440
|
+
maxParallel: milestoneIds.length,
|
|
441
|
+
hasConflict: (candidate, existing) =>
|
|
442
|
+
overlapPairs.has(overlapKey(candidate, existing)),
|
|
443
|
+
});
|
|
444
|
+
if (filteredMilestoneIds.length < milestoneIds.length) {
|
|
445
|
+
const skipped = milestoneIds.filter((mid) => !filteredMilestoneIds.includes(mid));
|
|
446
|
+
logWarning(
|
|
447
|
+
"parallel",
|
|
448
|
+
`uok execution graph filtered ${skipped.length} conflicting milestone(s): ${skipped.join(", ")}`,
|
|
449
|
+
);
|
|
450
|
+
}
|
|
451
|
+
} catch (e) {
|
|
452
|
+
logWarning(
|
|
453
|
+
"parallel",
|
|
454
|
+
`uok execution graph overlap analysis failed; using legacy milestone selection: ${(e as Error).message}`,
|
|
455
|
+
);
|
|
456
|
+
filteredMilestoneIds = milestoneIds;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
421
460
|
// Cap to max_workers
|
|
422
|
-
const toStart =
|
|
461
|
+
const toStart = filteredMilestoneIds.slice(0, config.max_workers);
|
|
423
462
|
|
|
424
463
|
for (const mid of toStart) {
|
|
425
464
|
// Check budget ceiling before each spawn
|
|
@@ -355,7 +355,7 @@ export function resolveAutoSupervisorConfig(): AutoSupervisorConfig {
|
|
|
355
355
|
|
|
356
356
|
// ─── Token Profile Resolution ─────────────────────────────────────────────
|
|
357
357
|
|
|
358
|
-
const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality"]);
|
|
358
|
+
const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality", "burn-max"]);
|
|
359
359
|
|
|
360
360
|
/**
|
|
361
361
|
* Resolve profile defaults for a given token profile tier.
|
|
@@ -400,6 +400,22 @@ export function resolveProfileDefaults(profile: TokenProfile): Partial<GSDPrefer
|
|
|
400
400
|
skip_reassess: true,
|
|
401
401
|
},
|
|
402
402
|
};
|
|
403
|
+
case "burn-max":
|
|
404
|
+
return {
|
|
405
|
+
// Quality-first profile: keep user-selected models, disable downgrade routing.
|
|
406
|
+
// Policy constraints still apply at dispatch time.
|
|
407
|
+
dynamic_routing: {
|
|
408
|
+
enabled: false,
|
|
409
|
+
},
|
|
410
|
+
context_selection: "full",
|
|
411
|
+
phases: {
|
|
412
|
+
skip_research: false,
|
|
413
|
+
skip_slice_research: false,
|
|
414
|
+
skip_reassess: false,
|
|
415
|
+
skip_milestone_validation: false,
|
|
416
|
+
reassess_after_slice: true,
|
|
417
|
+
},
|
|
418
|
+
};
|
|
403
419
|
}
|
|
404
420
|
}
|
|
405
421
|
|
|
@@ -416,7 +432,7 @@ export function resolveEffectiveProfile(): TokenProfile {
|
|
|
416
432
|
|
|
417
433
|
/**
|
|
418
434
|
* Resolve the inline level from the active token profile.
|
|
419
|
-
* budget -> minimal, balanced -> standard, quality -> full.
|
|
435
|
+
* budget -> minimal, balanced -> standard, quality/burn-max -> full.
|
|
420
436
|
*/
|
|
421
437
|
export function resolveInlineLevel(): InlineLevel {
|
|
422
438
|
const profile = resolveEffectiveProfile();
|
|
@@ -424,12 +440,13 @@ export function resolveInlineLevel(): InlineLevel {
|
|
|
424
440
|
case "budget": return "minimal";
|
|
425
441
|
case "balanced": return "standard";
|
|
426
442
|
case "quality": return "full";
|
|
443
|
+
case "burn-max": return "full";
|
|
427
444
|
}
|
|
428
445
|
}
|
|
429
446
|
|
|
430
447
|
/**
|
|
431
448
|
* Resolve the context selection mode from the active token profile.
|
|
432
|
-
* budget -> "smart", balanced/quality -> "full".
|
|
449
|
+
* budget -> "smart", balanced/quality/burn-max -> "full".
|
|
433
450
|
* Explicit preference always wins.
|
|
434
451
|
*/
|
|
435
452
|
export function resolveContextSelection(): import("./types.js").ContextSelectionMode {
|