gsd-pi 2.74.0-dev.b741afb → 2.74.0-dev.b7c5f96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/resources/extensions/gsd/activity-log.js +16 -0
- package/dist/resources/extensions/gsd/auto/loop.js +147 -10
- package/dist/resources/extensions/gsd/auto/phases.js +164 -9
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +54 -8
- package/dist/resources/extensions/gsd/auto-post-unit.js +215 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +24 -10
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
- package/dist/resources/extensions/gsd/auto-verification.js +100 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +2 -0
- package/dist/resources/extensions/gsd/auto.js +28 -2
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
- package/dist/resources/extensions/gsd/cache.js +16 -5
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +5 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +51 -4
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +16 -1
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
- package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
- package/dist/resources/extensions/gsd/git-service.js +49 -1
- package/dist/resources/extensions/gsd/graph-context.js +98 -7
- package/dist/resources/extensions/gsd/gsd-db.js +260 -2
- package/dist/resources/extensions/gsd/guided-flow.js +31 -6
- package/dist/resources/extensions/gsd/init-wizard.js +1 -0
- package/dist/resources/extensions/gsd/journal.js +27 -0
- package/dist/resources/extensions/gsd/metrics.js +19 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
- package/dist/resources/extensions/gsd/preferences-models.js +20 -3
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +118 -2
- package/dist/resources/extensions/gsd/preferences.js +31 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
- package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
- package/dist/resources/extensions/gsd/uok/audit.js +40 -0
- package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
- package/dist/resources/extensions/gsd/uok/flags.js +29 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
- package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
- package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
- package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -1
- package/packages/mcp-server/dist/readers/graph.js +107 -0
- package/packages/mcp-server/dist/readers/graph.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +88 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/readers/graph.test.ts +178 -0
- package/packages/mcp-server/src/readers/graph.ts +148 -1
- package/packages/mcp-server/src/workflow-tools.ts +95 -10
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -9
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -9
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/capability-patches.js +36 -0
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
- package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
- package/packages/pi-ai/dist/models/custom.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.js +464 -0
- package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.js +311 -0
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
- package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
- package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
- package/packages/pi-ai/dist/models/generated/index.js +51 -0
- package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
- package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.js +702 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
- package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.js +413 -0
- package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.js +239 -0
- package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts +27 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/index.js +80 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts +1 -36
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +1 -2
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.js +3 -112
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +6 -5
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +74 -40
- package/packages/pi-ai/src/index.ts +1 -9
- package/packages/pi-ai/src/models/capability-patches.ts +40 -0
- package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
- package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
- package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
- package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
- package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
- package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
- package/packages/pi-ai/src/models/generated/google.ts +466 -0
- package/packages/pi-ai/src/models/generated/groq.ts +313 -0
- package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
- package/packages/pi-ai/src/models/generated/index.ts +52 -0
- package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
- package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
- package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
- package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
- package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
- package/packages/pi-ai/src/models/generated/openai.ts +704 -0
- package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
- package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
- package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
- package/packages/pi-ai/src/models/generated/xai.ts +415 -0
- package/packages/pi-ai/src/models/generated/zai.ts +241 -0
- package/packages/pi-ai/src/models/index.ts +106 -0
- package/packages/pi-ai/src/models.generated.test.ts +1 -2
- package/packages/pi-ai/src/models.test.ts +6 -5
- package/packages/pi-ai/src/models.ts +3 -153
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +61 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +53 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts +8 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +27 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
- package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +92 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +75 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +36 -15
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
- package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
- package/packages/pi-coding-agent/tsconfig.json +2 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -2
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/tui.ts +9 -1
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +21 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +4 -0
- package/src/resources/extensions/gsd/auto/loop.ts +159 -10
- package/src/resources/extensions/gsd/auto/phases.ts +193 -9
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
- package/src/resources/extensions/gsd/auto-model-selection.ts +69 -8
- package/src/resources/extensions/gsd/auto-post-unit.ts +226 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
- package/src/resources/extensions/gsd/auto-verification.ts +129 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +1 -0
- package/src/resources/extensions/gsd/auto.ts +34 -2
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +5 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
- package/src/resources/extensions/gsd/cache.ts +16 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +5 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +58 -4
- package/src/resources/extensions/gsd/docs/preferences-reference.md +16 -1
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
- package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
- package/src/resources/extensions/gsd/git-service.ts +68 -0
- package/src/resources/extensions/gsd/graph-context.ts +139 -12
- package/src/resources/extensions/gsd/gsd-db.ts +321 -3
- package/src/resources/extensions/gsd/guided-flow.ts +36 -2
- package/src/resources/extensions/gsd/init-wizard.ts +3 -2
- package/src/resources/extensions/gsd/journal.ts +30 -0
- package/src/resources/extensions/gsd/metrics.ts +26 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
- package/src/resources/extensions/gsd/preferences-models.ts +20 -3
- package/src/resources/extensions/gsd/preferences-types.ts +38 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +117 -2
- package/src/resources/extensions/gsd/preferences.ts +34 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
- package/src/resources/extensions/gsd/session-lock.ts +14 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +57 -2
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +9 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
- package/src/resources/extensions/gsd/types.ts +14 -1
- package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
- package/src/resources/extensions/gsd/uok/audit.ts +51 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
- package/src/resources/extensions/gsd/uok/flags.ts +45 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
- package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
- package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
- package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
- package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
- package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
- package/packages/pi-ai/dist/models.custom.js.map +0 -1
- package/packages/pi-ai/dist/models.generated.js +0 -14343
- package/packages/pi-ai/dist/models.generated.js.map +0 -1
- package/packages/pi-ai/src/models.generated.ts +0 -14345
- /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_ssgManifest.js +0 -0
|
@@ -20,8 +20,13 @@ import { writeSessionStatus, readAllSessionStatuses, readSessionStatus, removeSe
|
|
|
20
20
|
import { analyzeParallelEligibility, } from "./parallel-eligibility.js";
|
|
21
21
|
import { getErrorMessage } from "./error-utils.js";
|
|
22
22
|
import { logWarning } from "./workflow-logger.js";
|
|
23
|
+
import { resolveUokFlags } from "./uok/flags.js";
|
|
24
|
+
import { selectConflictFreeBatch } from "./uok/execution-graph.js";
|
|
23
25
|
// ─── Module State ──────────────────────────────────────────────────────────
|
|
24
26
|
let state = null;
|
|
27
|
+
function overlapKey(a, b) {
|
|
28
|
+
return a < b ? `${a}::${b}` : `${b}::${a}`;
|
|
29
|
+
}
|
|
25
30
|
// ─── Persistence ──────────────────────────────────────────────────────────
|
|
26
31
|
const ORCHESTRATOR_STATE_FILE = "orchestrator.json";
|
|
27
32
|
const TMP_SUFFIX = ".tmp";
|
|
@@ -277,6 +282,7 @@ export async function startParallel(basePath, milestoneIds, prefs) {
|
|
|
277
282
|
return { started: [], errors: [{ mid: "all", error: "Cannot start parallel from within a parallel worker" }] };
|
|
278
283
|
}
|
|
279
284
|
const config = resolveParallelConfig(prefs);
|
|
285
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
280
286
|
// Release any leftover state from a previous session before reassigning
|
|
281
287
|
if (state) {
|
|
282
288
|
for (const w of state.workers.values()) {
|
|
@@ -324,8 +330,34 @@ export async function startParallel(basePath, milestoneIds, prefs) {
|
|
|
324
330
|
};
|
|
325
331
|
const started = [];
|
|
326
332
|
const errors = [];
|
|
333
|
+
let filteredMilestoneIds = milestoneIds;
|
|
334
|
+
if (uokFlags.executionGraph && milestoneIds.length > 1) {
|
|
335
|
+
try {
|
|
336
|
+
const requestedIds = new Set(milestoneIds);
|
|
337
|
+
const candidates = await analyzeParallelEligibility(basePath);
|
|
338
|
+
const overlapPairs = new Set();
|
|
339
|
+
for (const overlap of candidates.fileOverlaps) {
|
|
340
|
+
if (!requestedIds.has(overlap.mid1) || !requestedIds.has(overlap.mid2))
|
|
341
|
+
continue;
|
|
342
|
+
overlapPairs.add(overlapKey(overlap.mid1, overlap.mid2));
|
|
343
|
+
}
|
|
344
|
+
filteredMilestoneIds = selectConflictFreeBatch({
|
|
345
|
+
orderedIds: milestoneIds,
|
|
346
|
+
maxParallel: milestoneIds.length,
|
|
347
|
+
hasConflict: (candidate, existing) => overlapPairs.has(overlapKey(candidate, existing)),
|
|
348
|
+
});
|
|
349
|
+
if (filteredMilestoneIds.length < milestoneIds.length) {
|
|
350
|
+
const skipped = milestoneIds.filter((mid) => !filteredMilestoneIds.includes(mid));
|
|
351
|
+
logWarning("parallel", `uok execution graph filtered ${skipped.length} conflicting milestone(s): ${skipped.join(", ")}`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch (e) {
|
|
355
|
+
logWarning("parallel", `uok execution graph overlap analysis failed; using legacy milestone selection: ${e.message}`);
|
|
356
|
+
filteredMilestoneIds = milestoneIds;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
327
359
|
// Cap to max_workers
|
|
328
|
-
const toStart =
|
|
360
|
+
const toStart = filteredMilestoneIds.slice(0, config.max_workers);
|
|
329
361
|
for (const mid of toStart) {
|
|
330
362
|
// Check budget ceiling before each spawn
|
|
331
363
|
if (isBudgetExceeded()) {
|
|
@@ -321,7 +321,7 @@ export function resolveAutoSupervisorConfig() {
|
|
|
321
321
|
};
|
|
322
322
|
}
|
|
323
323
|
// ─── Token Profile Resolution ─────────────────────────────────────────────
|
|
324
|
-
const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality"]);
|
|
324
|
+
const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
|
|
325
325
|
/**
|
|
326
326
|
* Resolve profile defaults for a given token profile tier.
|
|
327
327
|
* Returns a partial GSDPreferences that is used as the base layer --
|
|
@@ -365,6 +365,22 @@ export function resolveProfileDefaults(profile) {
|
|
|
365
365
|
skip_reassess: true,
|
|
366
366
|
},
|
|
367
367
|
};
|
|
368
|
+
case "burn-max":
|
|
369
|
+
return {
|
|
370
|
+
// Quality-first profile: keep user-selected models, disable downgrade routing.
|
|
371
|
+
// Policy constraints still apply at dispatch time.
|
|
372
|
+
dynamic_routing: {
|
|
373
|
+
enabled: false,
|
|
374
|
+
},
|
|
375
|
+
context_selection: "full",
|
|
376
|
+
phases: {
|
|
377
|
+
skip_research: false,
|
|
378
|
+
skip_slice_research: false,
|
|
379
|
+
skip_reassess: false,
|
|
380
|
+
skip_milestone_validation: false,
|
|
381
|
+
reassess_after_slice: true,
|
|
382
|
+
},
|
|
383
|
+
};
|
|
368
384
|
}
|
|
369
385
|
}
|
|
370
386
|
/**
|
|
@@ -380,7 +396,7 @@ export function resolveEffectiveProfile() {
|
|
|
380
396
|
}
|
|
381
397
|
/**
|
|
382
398
|
* Resolve the inline level from the active token profile.
|
|
383
|
-
* budget -> minimal, balanced -> standard, quality -> full.
|
|
399
|
+
* budget -> minimal, balanced -> standard, quality/burn-max -> full.
|
|
384
400
|
*/
|
|
385
401
|
export function resolveInlineLevel() {
|
|
386
402
|
const profile = resolveEffectiveProfile();
|
|
@@ -388,11 +404,12 @@ export function resolveInlineLevel() {
|
|
|
388
404
|
case "budget": return "minimal";
|
|
389
405
|
case "balanced": return "standard";
|
|
390
406
|
case "quality": return "full";
|
|
407
|
+
case "burn-max": return "full";
|
|
391
408
|
}
|
|
392
409
|
}
|
|
393
410
|
/**
|
|
394
411
|
* Resolve the context selection mode from the active token profile.
|
|
395
|
-
* budget -> "smart", balanced/quality -> "full".
|
|
412
|
+
* budget -> "smart", balanced/quality/burn-max -> "full".
|
|
396
413
|
* Explicit preference always wins.
|
|
397
414
|
*/
|
|
398
415
|
export function resolveContextSelection() {
|
|
@@ -53,6 +53,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
|
|
|
53
53
|
"post_unit_hooks",
|
|
54
54
|
"pre_dispatch_hooks",
|
|
55
55
|
"dynamic_routing",
|
|
56
|
+
"uok",
|
|
56
57
|
"token_profile",
|
|
57
58
|
"phases",
|
|
58
59
|
"auto_visualize",
|
|
@@ -84,6 +85,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
|
|
|
84
85
|
"discuss_web_research",
|
|
85
86
|
"discuss_depth",
|
|
86
87
|
"flat_rate_providers",
|
|
88
|
+
"language",
|
|
87
89
|
]);
|
|
88
90
|
/** Canonical list of all dispatch unit types. */
|
|
89
91
|
export const KNOWN_UNIT_TYPES = [
|
|
@@ -8,7 +8,12 @@
|
|
|
8
8
|
import { VALID_BRANCH_NAME } from "./git-service.js";
|
|
9
9
|
import { normalizeStringArray } from "../shared/format-utils.js";
|
|
10
10
|
import { KNOWN_PREFERENCE_KEYS, KNOWN_UNIT_TYPES, SKILL_ACTIONS, } from "./preferences-types.js";
|
|
11
|
-
const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality"]);
|
|
11
|
+
const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
|
|
12
|
+
const VALID_UOK_TURN_ACTIONS = new Set([
|
|
13
|
+
"commit",
|
|
14
|
+
"snapshot",
|
|
15
|
+
"status-only",
|
|
16
|
+
]);
|
|
12
17
|
export function validatePreferences(preferences) {
|
|
13
18
|
const errors = [];
|
|
14
19
|
const warnings = [];
|
|
@@ -136,13 +141,114 @@ export function validatePreferences(preferences) {
|
|
|
136
141
|
errors.push(`budget_enforcement must be one of: warn, pause, halt`);
|
|
137
142
|
}
|
|
138
143
|
}
|
|
144
|
+
// ─── UOK Flags ──────────────────────────────────────────────────────
|
|
145
|
+
if (preferences.uok !== undefined) {
|
|
146
|
+
if (typeof preferences.uok === "object" && preferences.uok !== null) {
|
|
147
|
+
const raw = preferences.uok;
|
|
148
|
+
const valid = {};
|
|
149
|
+
if (raw.enabled !== undefined) {
|
|
150
|
+
if (typeof raw.enabled === "boolean")
|
|
151
|
+
valid.enabled = raw.enabled;
|
|
152
|
+
else
|
|
153
|
+
errors.push("uok.enabled must be a boolean");
|
|
154
|
+
}
|
|
155
|
+
const parseEnabledBlock = (key) => {
|
|
156
|
+
const value = raw[key];
|
|
157
|
+
if (value === undefined)
|
|
158
|
+
return;
|
|
159
|
+
if (typeof value !== "object" || value === null) {
|
|
160
|
+
errors.push(`uok.${key} must be an object`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const block = value;
|
|
164
|
+
const parsed = {};
|
|
165
|
+
if (block.enabled !== undefined) {
|
|
166
|
+
if (typeof block.enabled === "boolean")
|
|
167
|
+
parsed.enabled = block.enabled;
|
|
168
|
+
else
|
|
169
|
+
errors.push(`uok.${key}.enabled must be a boolean`);
|
|
170
|
+
}
|
|
171
|
+
const unknown = Object.keys(block).filter((k) => k !== "enabled");
|
|
172
|
+
for (const unk of unknown) {
|
|
173
|
+
warnings.push(`unknown uok.${key} key "${unk}" — ignored`);
|
|
174
|
+
}
|
|
175
|
+
if (Object.keys(parsed).length > 0) {
|
|
176
|
+
valid[key] = parsed;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
parseEnabledBlock("legacy_fallback");
|
|
180
|
+
parseEnabledBlock("gates");
|
|
181
|
+
parseEnabledBlock("model_policy");
|
|
182
|
+
parseEnabledBlock("execution_graph");
|
|
183
|
+
parseEnabledBlock("audit_unified");
|
|
184
|
+
parseEnabledBlock("plan_v2");
|
|
185
|
+
if (raw.gitops !== undefined) {
|
|
186
|
+
if (typeof raw.gitops !== "object" || raw.gitops === null) {
|
|
187
|
+
errors.push("uok.gitops must be an object");
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const gitops = raw.gitops;
|
|
191
|
+
const parsed = {};
|
|
192
|
+
if (gitops.enabled !== undefined) {
|
|
193
|
+
if (typeof gitops.enabled === "boolean")
|
|
194
|
+
parsed.enabled = gitops.enabled;
|
|
195
|
+
else
|
|
196
|
+
errors.push("uok.gitops.enabled must be a boolean");
|
|
197
|
+
}
|
|
198
|
+
if (gitops.turn_action !== undefined) {
|
|
199
|
+
if (typeof gitops.turn_action === "string" &&
|
|
200
|
+
VALID_UOK_TURN_ACTIONS.has(gitops.turn_action)) {
|
|
201
|
+
parsed.turn_action = gitops.turn_action;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
errors.push("uok.gitops.turn_action must be one of: commit, snapshot, status-only");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (gitops.turn_push !== undefined) {
|
|
208
|
+
if (typeof gitops.turn_push === "boolean")
|
|
209
|
+
parsed.turn_push = gitops.turn_push;
|
|
210
|
+
else
|
|
211
|
+
errors.push("uok.gitops.turn_push must be a boolean");
|
|
212
|
+
}
|
|
213
|
+
const unknown = Object.keys(gitops).filter((k) => !["enabled", "turn_action", "turn_push"].includes(k));
|
|
214
|
+
for (const unk of unknown) {
|
|
215
|
+
warnings.push(`unknown uok.gitops key "${unk}" — ignored`);
|
|
216
|
+
}
|
|
217
|
+
if (Object.keys(parsed).length > 0) {
|
|
218
|
+
valid.gitops = parsed;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const knownUokKeys = new Set([
|
|
223
|
+
"enabled",
|
|
224
|
+
"legacy_fallback",
|
|
225
|
+
"gates",
|
|
226
|
+
"model_policy",
|
|
227
|
+
"execution_graph",
|
|
228
|
+
"gitops",
|
|
229
|
+
"audit_unified",
|
|
230
|
+
"plan_v2",
|
|
231
|
+
]);
|
|
232
|
+
for (const key of Object.keys(raw)) {
|
|
233
|
+
if (!knownUokKeys.has(key)) {
|
|
234
|
+
warnings.push(`unknown uok key "${key}" — ignored`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (Object.keys(valid).length > 0) {
|
|
238
|
+
validated.uok = valid;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
errors.push("uok must be an object");
|
|
243
|
+
}
|
|
244
|
+
}
|
|
139
245
|
// ─── Token Profile ─────────────────────────────────────────────────
|
|
140
246
|
if (preferences.token_profile !== undefined) {
|
|
141
247
|
if (typeof preferences.token_profile === "string" && VALID_TOKEN_PROFILES.has(preferences.token_profile)) {
|
|
142
248
|
validated.token_profile = preferences.token_profile;
|
|
143
249
|
}
|
|
144
250
|
else {
|
|
145
|
-
errors.push(`token_profile must be one of: budget, balanced, quality`);
|
|
251
|
+
errors.push(`token_profile must be one of: budget, balanced, quality, burn-max`);
|
|
146
252
|
}
|
|
147
253
|
}
|
|
148
254
|
// ─── Search Provider ─────────────────────────────────────────────
|
|
@@ -1038,5 +1144,15 @@ export function validatePreferences(preferences) {
|
|
|
1038
1144
|
errors.push(`discuss_depth must be one of: quick, standard, thorough`);
|
|
1039
1145
|
}
|
|
1040
1146
|
}
|
|
1147
|
+
// ─── Language ────────────────────────────────────────────────────────
|
|
1148
|
+
if (preferences.language !== undefined) {
|
|
1149
|
+
const trimmed = typeof preferences.language === "string" ? preferences.language.trim() : undefined;
|
|
1150
|
+
if (trimmed && trimmed.length <= 50 && !/[\r\n]/.test(trimmed)) {
|
|
1151
|
+
validated.language = trimmed;
|
|
1152
|
+
}
|
|
1153
|
+
else {
|
|
1154
|
+
errors.push(`language must be a non-empty string up to 50 characters with no newlines (e.g. "Chinese", "de", "日本語")`);
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1041
1157
|
return { preferences: validated, errors, warnings };
|
|
1042
1158
|
}
|
|
@@ -293,6 +293,32 @@ function mergePreferences(base, override) {
|
|
|
293
293
|
dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
|
|
294
294
|
? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) }
|
|
295
295
|
: undefined,
|
|
296
|
+
uok: (base.uok || override.uok)
|
|
297
|
+
? {
|
|
298
|
+
enabled: override.uok?.enabled ?? base.uok?.enabled,
|
|
299
|
+
legacy_fallback: (base.uok?.legacy_fallback || override.uok?.legacy_fallback)
|
|
300
|
+
? { ...(base.uok?.legacy_fallback ?? {}), ...(override.uok?.legacy_fallback ?? {}) }
|
|
301
|
+
: undefined,
|
|
302
|
+
gates: (base.uok?.gates || override.uok?.gates)
|
|
303
|
+
? { ...(base.uok?.gates ?? {}), ...(override.uok?.gates ?? {}) }
|
|
304
|
+
: undefined,
|
|
305
|
+
model_policy: (base.uok?.model_policy || override.uok?.model_policy)
|
|
306
|
+
? { ...(base.uok?.model_policy ?? {}), ...(override.uok?.model_policy ?? {}) }
|
|
307
|
+
: undefined,
|
|
308
|
+
execution_graph: (base.uok?.execution_graph || override.uok?.execution_graph)
|
|
309
|
+
? { ...(base.uok?.execution_graph ?? {}), ...(override.uok?.execution_graph ?? {}) }
|
|
310
|
+
: undefined,
|
|
311
|
+
gitops: (base.uok?.gitops || override.uok?.gitops)
|
|
312
|
+
? { ...(base.uok?.gitops ?? {}), ...(override.uok?.gitops ?? {}) }
|
|
313
|
+
: undefined,
|
|
314
|
+
audit_unified: (base.uok?.audit_unified || override.uok?.audit_unified)
|
|
315
|
+
? { ...(base.uok?.audit_unified ?? {}), ...(override.uok?.audit_unified ?? {}) }
|
|
316
|
+
: undefined,
|
|
317
|
+
plan_v2: (base.uok?.plan_v2 || override.uok?.plan_v2)
|
|
318
|
+
? { ...(base.uok?.plan_v2 ?? {}), ...(override.uok?.plan_v2 ?? {}) }
|
|
319
|
+
: undefined,
|
|
320
|
+
}
|
|
321
|
+
: undefined,
|
|
296
322
|
token_profile: override.token_profile ?? base.token_profile,
|
|
297
323
|
phases: (base.phases || override.phases)
|
|
298
324
|
? { ...(base.phases ?? {}), ...(override.phases ?? {}) }
|
|
@@ -334,6 +360,7 @@ function mergePreferences(base, override) {
|
|
|
334
360
|
slice_parallel: (base.slice_parallel || override.slice_parallel)
|
|
335
361
|
? { ...(base.slice_parallel ?? {}), ...(override.slice_parallel ?? {}) }
|
|
336
362
|
: undefined,
|
|
363
|
+
language: override.language ?? base.language,
|
|
337
364
|
};
|
|
338
365
|
}
|
|
339
366
|
function mergeStringLists(base, override) {
|
|
@@ -428,6 +455,10 @@ export function renderPreferencesForSystemPrompt(preferences, resolutions) {
|
|
|
428
455
|
lines.push(` - ${instruction}`);
|
|
429
456
|
}
|
|
430
457
|
}
|
|
458
|
+
if (preferences.language) {
|
|
459
|
+
const safeLang = preferences.language.replace(/[\r\n]/g, " ").slice(0, 50);
|
|
460
|
+
lines.push(`- Language: Always respond in ${safeLang}.`);
|
|
461
|
+
}
|
|
431
462
|
return lines.join("\n");
|
|
432
463
|
}
|
|
433
464
|
// ─── Hook Resolution ──────────────────────────────────────────────────────────
|
|
@@ -32,11 +32,11 @@ export function getFilePaths() {
|
|
|
32
32
|
* Record a tool call at dispatch time (before execution).
|
|
33
33
|
* Exit codes and output are filled in by recordToolResult after execution.
|
|
34
34
|
*/
|
|
35
|
-
export function recordToolCall(toolName, input) {
|
|
35
|
+
export function recordToolCall(toolCallId, toolName, input) {
|
|
36
36
|
if (toolName === "bash" || toolName === "Bash") {
|
|
37
37
|
unitEvidence.push({
|
|
38
38
|
kind: "bash",
|
|
39
|
-
toolCallId
|
|
39
|
+
toolCallId,
|
|
40
40
|
command: String(input.command ?? ""),
|
|
41
41
|
exitCode: -1,
|
|
42
42
|
outputSnippet: "",
|
|
@@ -46,7 +46,7 @@ export function recordToolCall(toolName, input) {
|
|
|
46
46
|
else if (toolName === "write" || toolName === "Write") {
|
|
47
47
|
unitEvidence.push({
|
|
48
48
|
kind: "write",
|
|
49
|
-
toolCallId
|
|
49
|
+
toolCallId,
|
|
50
50
|
path: String(input.file_path ?? input.path ?? ""),
|
|
51
51
|
timestamp: Date.now(),
|
|
52
52
|
});
|
|
@@ -54,44 +54,29 @@ export function recordToolCall(toolName, input) {
|
|
|
54
54
|
else if (toolName === "edit" || toolName === "Edit") {
|
|
55
55
|
unitEvidence.push({
|
|
56
56
|
kind: "edit",
|
|
57
|
-
toolCallId
|
|
57
|
+
toolCallId,
|
|
58
58
|
path: String(input.file_path ?? input.path ?? ""),
|
|
59
59
|
timestamp: Date.now(),
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
* Record a tool execution result. Matches the
|
|
65
|
-
*
|
|
64
|
+
* Record a tool execution result. Matches the entry by toolCallId (assigned
|
|
65
|
+
* at dispatch time) and fills in exit code + output. Prior versions matched
|
|
66
|
+
* by `kind + empty-string` which corrupted parallel tool calls.
|
|
66
67
|
*/
|
|
67
68
|
export function recordToolResult(toolCallId, toolName, result, isError) {
|
|
68
|
-
const
|
|
69
|
-
if (
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
entry.exitCode = exitMatch ? Number(exitMatch[1]) : (isError ? 1 : 0);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
else if (normalizedName === "write" || normalizedName === "edit") {
|
|
80
|
-
const entry = findLastUnresolved(normalizedName);
|
|
81
|
-
if (entry) {
|
|
82
|
-
entry.toolCallId = toolCallId;
|
|
83
|
-
}
|
|
69
|
+
const entry = unitEvidence.find(e => e.toolCallId === toolCallId);
|
|
70
|
+
if (!entry)
|
|
71
|
+
return;
|
|
72
|
+
if (entry.kind === "bash") {
|
|
73
|
+
const text = extractResultText(result);
|
|
74
|
+
entry.outputSnippet = text.slice(0, 500);
|
|
75
|
+
const exitMatch = text.match(/Command exited with code (\d+)/);
|
|
76
|
+
entry.exitCode = exitMatch ? Number(exitMatch[1]) : (isError ? 1 : 0);
|
|
84
77
|
}
|
|
85
78
|
}
|
|
86
79
|
// ─── Internals ──────────────────────────────────────────────────────────────
|
|
87
|
-
function findLastUnresolved(kind) {
|
|
88
|
-
for (let i = unitEvidence.length - 1; i >= 0; i--) {
|
|
89
|
-
if (unitEvidence[i].kind === kind && unitEvidence[i].toolCallId === "") {
|
|
90
|
-
return unitEvidence[i];
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return undefined;
|
|
94
|
-
}
|
|
95
80
|
function extractResultText(result) {
|
|
96
81
|
if (typeof result === "string")
|
|
97
82
|
return result;
|
|
@@ -21,6 +21,7 @@ import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager
|
|
|
21
21
|
import { writeSessionStatus, } from "./session-status-io.js";
|
|
22
22
|
import { hasFileConflict } from "./slice-parallel-conflict.js";
|
|
23
23
|
import { getErrorMessage } from "./error-utils.js";
|
|
24
|
+
import { selectConflictFreeBatch } from "./uok/execution-graph.js";
|
|
24
25
|
// ─── Module State ──────────────────────────────────────────────────────────
|
|
25
26
|
let sliceState = null;
|
|
26
27
|
// ─── Public API ────────────────────────────────────────────────────────────
|
|
@@ -62,7 +63,7 @@ export async function startSliceParallel(basePath, milestoneId, eligibleSlices,
|
|
|
62
63
|
const started = [];
|
|
63
64
|
const errors = [];
|
|
64
65
|
// Filter out conflicting slices (conservative: check all pairs)
|
|
65
|
-
const safeSlices = filterConflictingSlices(basePath, milestoneId, eligibleSlices);
|
|
66
|
+
const safeSlices = filterConflictingSlices(basePath, milestoneId, eligibleSlices, opts.useExecutionGraph === true);
|
|
66
67
|
// Limit to maxWorkers
|
|
67
68
|
const toSpawn = safeSlices.slice(0, maxWorkers);
|
|
68
69
|
for (const slice of toSpawn) {
|
|
@@ -176,7 +177,16 @@ export function resetSliceOrchestrator() {
|
|
|
176
177
|
* Greedy: add slices to the safe set in order; skip any that conflict
|
|
177
178
|
* with an already-included slice.
|
|
178
179
|
*/
|
|
179
|
-
function filterConflictingSlices(basePath, milestoneId, slices) {
|
|
180
|
+
function filterConflictingSlices(basePath, milestoneId, slices, useExecutionGraph) {
|
|
181
|
+
if (useExecutionGraph) {
|
|
182
|
+
const selectedIds = selectConflictFreeBatch({
|
|
183
|
+
orderedIds: slices.map((slice) => slice.id),
|
|
184
|
+
maxParallel: slices.length,
|
|
185
|
+
hasConflict: (candidate, existing) => hasFileConflict(basePath, milestoneId, candidate, existing),
|
|
186
|
+
});
|
|
187
|
+
const selected = new Set(selectedIds);
|
|
188
|
+
return slices.filter((slice) => selected.has(slice.id));
|
|
189
|
+
}
|
|
180
190
|
const safe = [];
|
|
181
191
|
for (const candidate of slices) {
|
|
182
192
|
let conflictsWithSafe = false;
|
|
@@ -39,6 +39,24 @@ dynamic_routing:
|
|
|
39
39
|
budget_pressure:
|
|
40
40
|
cross_provider:
|
|
41
41
|
hooks:
|
|
42
|
+
uok:
|
|
43
|
+
enabled: true
|
|
44
|
+
legacy_fallback:
|
|
45
|
+
enabled: false
|
|
46
|
+
gates:
|
|
47
|
+
enabled: false
|
|
48
|
+
model_policy:
|
|
49
|
+
enabled: false
|
|
50
|
+
execution_graph:
|
|
51
|
+
enabled: false
|
|
52
|
+
gitops:
|
|
53
|
+
enabled: false
|
|
54
|
+
turn_action: status-only
|
|
55
|
+
turn_push: false
|
|
56
|
+
audit_unified:
|
|
57
|
+
enabled: false
|
|
58
|
+
plan_v2:
|
|
59
|
+
enabled: false
|
|
42
60
|
auto_visualize:
|
|
43
61
|
auto_report:
|
|
44
62
|
parallel:
|
|
@@ -71,6 +89,7 @@ remote_questions:
|
|
|
71
89
|
uat_dispatch:
|
|
72
90
|
post_unit_hooks: []
|
|
73
91
|
pre_dispatch_hooks: []
|
|
92
|
+
# language:
|
|
74
93
|
# experimental:
|
|
75
94
|
# rtk: false
|
|
76
95
|
---
|
|
@@ -361,6 +361,11 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
361
361
|
(async () => {
|
|
362
362
|
try {
|
|
363
363
|
const graphMod = await import("@gsd-build/mcp-server");
|
|
364
|
+
if (typeof graphMod.buildGraph !== "function"
|
|
365
|
+
|| typeof graphMod.writeGraph !== "function"
|
|
366
|
+
|| typeof graphMod.resolveGsdRoot !== "function") {
|
|
367
|
+
throw new Error("graph helpers unavailable from @gsd-build/mcp-server");
|
|
368
|
+
}
|
|
364
369
|
const g = await graphMod.buildGraph(basePath);
|
|
365
370
|
await graphMod.writeGraph(graphMod.resolveGsdRoot(basePath), g);
|
|
366
371
|
}
|
|
@@ -16,6 +16,9 @@ import { invalidateStateCache } from "../state.js";
|
|
|
16
16
|
import { VALIDATION_VERDICTS, isValidMilestoneVerdict } from "../verdict-parser.js";
|
|
17
17
|
import { insertMilestoneValidationGates } from "../milestone-validation-gates.js";
|
|
18
18
|
import { logWarning } from "../workflow-logger.js";
|
|
19
|
+
import { UokGateRunner } from "../uok/gate-runner.js";
|
|
20
|
+
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
21
|
+
import { resolveUokFlags } from "../uok/flags.js";
|
|
19
22
|
function renderValidationMarkdown(params) {
|
|
20
23
|
let md = `---
|
|
21
24
|
verdict: ${params.verdict}
|
|
@@ -48,7 +51,7 @@ ${params.verdictRationale}
|
|
|
48
51
|
}
|
|
49
52
|
return md;
|
|
50
53
|
}
|
|
51
|
-
export async function handleValidateMilestone(params, basePath) {
|
|
54
|
+
export async function handleValidateMilestone(params, basePath, opts) {
|
|
52
55
|
if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
|
|
53
56
|
return { error: "milestoneId is required and must be a non-empty string" };
|
|
54
57
|
}
|
|
@@ -73,6 +76,8 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
73
76
|
// rendering can regenerate. The inverse (file exists, no DB row) is
|
|
74
77
|
// harder to detect and recover from (#2725).
|
|
75
78
|
const validatedAt = new Date().toISOString();
|
|
79
|
+
const slices = getMilestoneSlices(params.milestoneId);
|
|
80
|
+
const gateSliceId = slices.length > 0 ? slices[0].id : "_milestone";
|
|
76
81
|
transaction(() => {
|
|
77
82
|
insertAssessment({
|
|
78
83
|
path: validationPath,
|
|
@@ -86,9 +91,7 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
86
91
|
// #2945 Bug 4: persist quality_gates records alongside the assessment.
|
|
87
92
|
// Previously only the assessment was written, leaving M002+ milestones
|
|
88
93
|
// with zero quality_gate records despite passing validation.
|
|
89
|
-
|
|
90
|
-
const sliceId = slices.length > 0 ? slices[0].id : "_milestone";
|
|
91
|
-
insertMilestoneValidationGates(params.milestoneId, sliceId, params.verdict, validatedAt);
|
|
94
|
+
insertMilestoneValidationGates(params.milestoneId, gateSliceId, params.verdict, validatedAt);
|
|
92
95
|
});
|
|
93
96
|
// ── Filesystem render (outside transaction) ────────────────────────────
|
|
94
97
|
// If disk render fails, roll back the DB row so state stays consistent.
|
|
@@ -103,6 +106,38 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
103
106
|
invalidateStateCache();
|
|
104
107
|
clearPathCache();
|
|
105
108
|
clearParseCache();
|
|
109
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
110
|
+
const gatesEnabled = opts?.uokGatesEnabled ?? resolveUokFlags(prefs).gates;
|
|
111
|
+
if (gatesEnabled) {
|
|
112
|
+
try {
|
|
113
|
+
const gateRunner = new UokGateRunner();
|
|
114
|
+
const nonPassVerdict = params.verdict !== "pass";
|
|
115
|
+
gateRunner.register({
|
|
116
|
+
id: "milestone-validation-gates",
|
|
117
|
+
type: "verification",
|
|
118
|
+
execute: async () => ({
|
|
119
|
+
outcome: nonPassVerdict ? "manual-attention" : "pass",
|
|
120
|
+
failureClass: nonPassVerdict ? "manual-attention" : "none",
|
|
121
|
+
rationale: `milestone validation verdict: ${params.verdict}`,
|
|
122
|
+
findings: nonPassVerdict
|
|
123
|
+
? [params.verdictRationale, params.remediationPlan ?? ""].filter(Boolean).join("\n")
|
|
124
|
+
: "",
|
|
125
|
+
}),
|
|
126
|
+
});
|
|
127
|
+
await gateRunner.run("milestone-validation-gates", {
|
|
128
|
+
basePath,
|
|
129
|
+
traceId: opts?.traceId ?? `validate-milestone:${params.milestoneId}`,
|
|
130
|
+
turnId: opts?.turnId ?? `${params.milestoneId}:validate`,
|
|
131
|
+
milestoneId: params.milestoneId,
|
|
132
|
+
sliceId: gateSliceId,
|
|
133
|
+
unitType: "validate-milestone",
|
|
134
|
+
unitId: params.milestoneId,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
logWarning("tool", `validate_milestone — failed to persist UOK gate result: ${err.message}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
106
141
|
return {
|
|
107
142
|
milestoneId: params.milestoneId,
|
|
108
143
|
verdict: params.verdict,
|
|
@@ -20,7 +20,7 @@ let providerModule = null;
|
|
|
20
20
|
let loadAttempted = false;
|
|
21
21
|
function suppressSqliteWarning() {
|
|
22
22
|
const origEmit = process.emit;
|
|
23
|
-
//
|
|
23
|
+
// Override via loose cast: Node's overloaded emit signature is not directly assignable.
|
|
24
24
|
process.emit = function (event, ...args) {
|
|
25
25
|
if (event === "warning" &&
|
|
26
26
|
args[0] &&
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { gsdRoot } from "../paths.js";
|
|
5
|
+
import { isDbAvailable, insertAuditEvent } from "../gsd-db.js";
|
|
6
|
+
function auditLogPath(basePath) {
|
|
7
|
+
return join(gsdRoot(basePath), "audit", "events.jsonl");
|
|
8
|
+
}
|
|
9
|
+
function ensureAuditDir(basePath) {
|
|
10
|
+
mkdirSync(join(gsdRoot(basePath), "audit"), { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
export function buildAuditEnvelope(args) {
|
|
13
|
+
return {
|
|
14
|
+
eventId: randomUUID(),
|
|
15
|
+
traceId: args.traceId,
|
|
16
|
+
turnId: args.turnId,
|
|
17
|
+
causedBy: args.causedBy,
|
|
18
|
+
category: args.category,
|
|
19
|
+
type: args.type,
|
|
20
|
+
ts: new Date().toISOString(),
|
|
21
|
+
payload: args.payload ?? {},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function emitUokAuditEvent(basePath, event) {
|
|
25
|
+
try {
|
|
26
|
+
ensureAuditDir(basePath);
|
|
27
|
+
appendFileSync(auditLogPath(basePath), `${JSON.stringify(event)}\n`, "utf-8");
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Best-effort: audit writes must never break orchestration.
|
|
31
|
+
}
|
|
32
|
+
if (!isDbAvailable())
|
|
33
|
+
return;
|
|
34
|
+
try {
|
|
35
|
+
insertAuditEvent(event);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Projection failures are non-fatal while legacy readers are still active.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|