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
|
@@ -15,7 +15,7 @@ import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
|
15
15
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
16
16
|
import { detectWorktreeName, } from "./worktree.js";
|
|
17
17
|
import { SLICE_BRANCH_RE, QUICK_BRANCH_RE, WORKFLOW_BRANCH_RE } from "./branch-patterns.js";
|
|
18
|
-
import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeBranchExists, nativeHasChanges, nativeAddAllWithExclusions, nativeHasStagedChanges, nativeCommit, nativeRmCached, nativeUpdateRef, nativeResetSoft, nativeCommitSubject, } from "./native-git-bridge.js";
|
|
18
|
+
import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeBranchExists, nativeHasChanges, nativeAddAllWithExclusions, nativeHasStagedChanges, nativeCommit, nativeRmCached, nativeUpdateRef, nativeResetSoft, nativeCommitSubject, _resetHasChangesCache, } from "./native-git-bridge.js";
|
|
19
19
|
import { GSDError, GSD_MERGE_CONFLICT, GSD_GIT_ERROR } from "./errors.js";
|
|
20
20
|
import { getErrorMessage } from "./error-utils.js";
|
|
21
21
|
export const VALID_BRANCH_NAME = /^[a-zA-Z0-9_\-\/.]+$/;
|
|
@@ -641,6 +641,54 @@ export function createGitService(basePath) {
|
|
|
641
641
|
const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
642
642
|
return new GitServiceImpl(basePath, gitPrefs);
|
|
643
643
|
}
|
|
644
|
+
function buildTurnSnapshotLabel(unitType, unitId) {
|
|
645
|
+
const raw = `${unitType}/${unitId}`.trim();
|
|
646
|
+
if (!raw)
|
|
647
|
+
return "turn";
|
|
648
|
+
return raw
|
|
649
|
+
.replace(/[^a-zA-Z0-9._/-]/g, "-")
|
|
650
|
+
.replace(/\/{2,}/g, "/")
|
|
651
|
+
.replace(/-{2,}/g, "-")
|
|
652
|
+
.replace(/^[-/]+|[-/]+$/g, "") || "turn";
|
|
653
|
+
}
|
|
654
|
+
export function runTurnGitAction(args) {
|
|
655
|
+
try {
|
|
656
|
+
// Force fresh working-tree status per turn; nativeHasChanges caches briefly.
|
|
657
|
+
_resetHasChangesCache();
|
|
658
|
+
if (args.action === "status-only") {
|
|
659
|
+
return {
|
|
660
|
+
action: args.action,
|
|
661
|
+
status: "ok",
|
|
662
|
+
dirty: nativeHasChanges(args.basePath),
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
const git = createGitService(args.basePath);
|
|
666
|
+
if (args.action === "snapshot") {
|
|
667
|
+
const label = buildTurnSnapshotLabel(args.unitType, args.unitId);
|
|
668
|
+
git.createSnapshot(label);
|
|
669
|
+
return {
|
|
670
|
+
action: args.action,
|
|
671
|
+
status: "ok",
|
|
672
|
+
snapshotLabel: label,
|
|
673
|
+
dirty: nativeHasChanges(args.basePath),
|
|
674
|
+
};
|
|
675
|
+
}
|
|
676
|
+
const commitMessage = git.autoCommit(args.unitType, args.unitId, [], args.taskContext) ?? undefined;
|
|
677
|
+
return {
|
|
678
|
+
action: args.action,
|
|
679
|
+
status: "ok",
|
|
680
|
+
commitMessage,
|
|
681
|
+
dirty: nativeHasChanges(args.basePath),
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
catch (err) {
|
|
685
|
+
return {
|
|
686
|
+
action: args.action,
|
|
687
|
+
status: "failed",
|
|
688
|
+
error: getErrorMessage(err),
|
|
689
|
+
};
|
|
690
|
+
}
|
|
691
|
+
}
|
|
644
692
|
// ─── Commit Type Inference ─────────────────────────────────────────────────
|
|
645
693
|
/**
|
|
646
694
|
* Infer a conventional commit type from a title (and optional one-liner).
|
|
@@ -6,6 +6,97 @@
|
|
|
6
6
|
* or the query yields no results — callers must handle null.
|
|
7
7
|
*/
|
|
8
8
|
import { logWarning } from "./workflow-logger.js";
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
let cachedGraphApi = null;
|
|
12
|
+
let resolvedGraphApi = false;
|
|
13
|
+
function readGraphFile(projectDir) {
|
|
14
|
+
try {
|
|
15
|
+
const graphPath = join(projectDir, ".gsd", "graphs", "graph.json");
|
|
16
|
+
const raw = readFileSync(graphPath, "utf-8");
|
|
17
|
+
const parsed = JSON.parse(raw);
|
|
18
|
+
const nodes = Array.isArray(parsed.nodes) ? parsed.nodes : [];
|
|
19
|
+
const edges = Array.isArray(parsed.edges) ? parsed.edges : [];
|
|
20
|
+
return { nodes, edges, builtAt: typeof parsed.builtAt === "string" ? parsed.builtAt : undefined };
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function fallbackGraphQuery(projectDir, term, budget = 3000) {
|
|
27
|
+
const graph = readGraphFile(projectDir);
|
|
28
|
+
if (!graph)
|
|
29
|
+
return { nodes: [], edges: [] };
|
|
30
|
+
const needle = term.trim().toLowerCase();
|
|
31
|
+
const matches = graph.nodes.filter((node) => {
|
|
32
|
+
const hay = [node.id, node.label, node.description].filter(Boolean).join(" ").toLowerCase();
|
|
33
|
+
return hay.includes(needle);
|
|
34
|
+
});
|
|
35
|
+
const maxNodes = Math.max(1, Math.floor(Math.max(1, budget) / 20));
|
|
36
|
+
const selectedIds = new Set(matches.slice(0, maxNodes).map((node) => node.id));
|
|
37
|
+
const nodeById = new Map(graph.nodes.map((node) => [node.id, node]));
|
|
38
|
+
// Pull one-hop neighbors so relation context survives even when the term
|
|
39
|
+
// matches only one side of an edge.
|
|
40
|
+
for (const edge of graph.edges) {
|
|
41
|
+
if (selectedIds.size >= maxNodes)
|
|
42
|
+
break;
|
|
43
|
+
const touchesSelection = selectedIds.has(edge.from) || selectedIds.has(edge.to);
|
|
44
|
+
if (!touchesSelection)
|
|
45
|
+
continue;
|
|
46
|
+
if (selectedIds.has(edge.from) && !selectedIds.has(edge.to) && nodeById.has(edge.to)) {
|
|
47
|
+
selectedIds.add(edge.to);
|
|
48
|
+
}
|
|
49
|
+
else if (selectedIds.has(edge.to) && !selectedIds.has(edge.from) && nodeById.has(edge.from)) {
|
|
50
|
+
selectedIds.add(edge.from);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const nodes = graph.nodes.filter((node) => selectedIds.has(node.id));
|
|
54
|
+
const remainingBudget = Math.max(0, budget - nodes.length * 20);
|
|
55
|
+
const maxEdges = Math.floor(remainingBudget / 10);
|
|
56
|
+
const edges = graph.edges
|
|
57
|
+
.filter((edge) => selectedIds.has(edge.from) && selectedIds.has(edge.to))
|
|
58
|
+
.slice(0, maxEdges);
|
|
59
|
+
return { nodes, edges };
|
|
60
|
+
}
|
|
61
|
+
async function fallbackGraphStatus(projectDir) {
|
|
62
|
+
const graph = readGraphFile(projectDir);
|
|
63
|
+
if (!graph)
|
|
64
|
+
return { exists: false, stale: false };
|
|
65
|
+
if (!graph.builtAt)
|
|
66
|
+
return { exists: true, stale: false };
|
|
67
|
+
const builtAtMs = Date.parse(graph.builtAt);
|
|
68
|
+
if (!Number.isFinite(builtAtMs))
|
|
69
|
+
return { exists: true, stale: false };
|
|
70
|
+
const ageHours = (Date.now() - builtAtMs) / (1000 * 60 * 60);
|
|
71
|
+
return { exists: true, stale: ageHours > 24, ageHours };
|
|
72
|
+
}
|
|
73
|
+
function isGraphApi(mod) {
|
|
74
|
+
if (!mod || typeof mod !== "object")
|
|
75
|
+
return false;
|
|
76
|
+
const candidate = mod;
|
|
77
|
+
return typeof candidate.graphQuery === "function" && typeof candidate.graphStatus === "function";
|
|
78
|
+
}
|
|
79
|
+
async function resolveGraphApi() {
|
|
80
|
+
if (resolvedGraphApi && cachedGraphApi)
|
|
81
|
+
return cachedGraphApi;
|
|
82
|
+
resolvedGraphApi = true;
|
|
83
|
+
try {
|
|
84
|
+
const imported = await import("@gsd-build/mcp-server");
|
|
85
|
+
if (isGraphApi(imported)) {
|
|
86
|
+
cachedGraphApi = imported;
|
|
87
|
+
return cachedGraphApi;
|
|
88
|
+
}
|
|
89
|
+
logWarning("prompt", "@gsd-build/mcp-server graph exports unavailable; using local graph fallback");
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Fall back to local reader implementation.
|
|
93
|
+
}
|
|
94
|
+
cachedGraphApi = {
|
|
95
|
+
graphQuery: fallbackGraphQuery,
|
|
96
|
+
graphStatus: fallbackGraphStatus,
|
|
97
|
+
};
|
|
98
|
+
return cachedGraphApi;
|
|
99
|
+
}
|
|
9
100
|
/**
|
|
10
101
|
* Query the knowledge graph for nodes related to the given term and format
|
|
11
102
|
* the result as an inlined context block.
|
|
@@ -21,14 +112,14 @@ export async function inlineGraphSubgraph(projectDir, term, opts) {
|
|
|
21
112
|
if (!term || !term.trim())
|
|
22
113
|
return null;
|
|
23
114
|
try {
|
|
24
|
-
const
|
|
25
|
-
const result = await graphQuery(projectDir, term, opts.budget);
|
|
115
|
+
const graphApi = await resolveGraphApi();
|
|
116
|
+
const result = await graphApi.graphQuery(projectDir, term, opts.budget);
|
|
26
117
|
if (result.nodes.length === 0)
|
|
27
118
|
return null;
|
|
28
119
|
// Check staleness for annotation
|
|
29
120
|
let staleAnnotation = "";
|
|
30
121
|
try {
|
|
31
|
-
const status = await graphStatus(projectDir);
|
|
122
|
+
const status = await graphApi.graphStatus(projectDir);
|
|
32
123
|
if (status.exists && status.stale && status.ageHours !== undefined) {
|
|
33
124
|
const hours = Math.round(status.ageHours);
|
|
34
125
|
staleAnnotation = `\n> ⚠ Graph last built ${hours}h ago — context may be outdated`;
|
|
@@ -38,13 +129,13 @@ export async function inlineGraphSubgraph(projectDir, term, opts) {
|
|
|
38
129
|
// Non-fatal — skip annotation on error
|
|
39
130
|
}
|
|
40
131
|
// Format nodes as a compact list
|
|
41
|
-
const nodeLines = result.nodes.map((
|
|
42
|
-
const desc =
|
|
43
|
-
return `- **${
|
|
132
|
+
const nodeLines = result.nodes.map((node) => {
|
|
133
|
+
const desc = node.description ? ` — ${node.description}` : "";
|
|
134
|
+
return `- **${node.label}** (\`${node.type}\`, ${node.confidence})${desc}`;
|
|
44
135
|
});
|
|
45
136
|
// Format edges as relations (only if present)
|
|
46
137
|
const edgeLines = result.edges.length > 0
|
|
47
|
-
? result.edges.map((
|
|
138
|
+
? result.edges.map((edge) => `- \`${edge.from}\` →[${edge.type}]→ \`${edge.to}\``)
|
|
48
139
|
: [];
|
|
49
140
|
const sections = [
|
|
50
141
|
`### Knowledge Graph Context (term: "${term}")`,
|
|
@@ -31,7 +31,7 @@ let providerModule = null;
|
|
|
31
31
|
let loadAttempted = false;
|
|
32
32
|
function suppressSqliteWarning() {
|
|
33
33
|
const origEmit = process.emit;
|
|
34
|
-
//
|
|
34
|
+
// Override via loose cast: Node's overloaded emit signature is not directly assignable.
|
|
35
35
|
process.emit = function (event, ...args) {
|
|
36
36
|
if (event === "warning" &&
|
|
37
37
|
args[0] &&
|
|
@@ -135,7 +135,7 @@ function openRawDb(path) {
|
|
|
135
135
|
const Database = providerModule;
|
|
136
136
|
return new Database(path);
|
|
137
137
|
}
|
|
138
|
-
const SCHEMA_VERSION =
|
|
138
|
+
const SCHEMA_VERSION = 15;
|
|
139
139
|
function indexExists(db, name) {
|
|
140
140
|
return !!db.prepare("SELECT 1 as present FROM sqlite_master WHERE type = 'index' AND name = ?").get(name);
|
|
141
141
|
}
|
|
@@ -383,6 +383,66 @@ function initSchema(db, fileBacked) {
|
|
|
383
383
|
FOREIGN KEY (milestone_id, slice_id) REFERENCES slices(milestone_id, id),
|
|
384
384
|
FOREIGN KEY (milestone_id, depends_on_slice_id) REFERENCES slices(milestone_id, id)
|
|
385
385
|
)
|
|
386
|
+
`);
|
|
387
|
+
db.exec(`
|
|
388
|
+
CREATE TABLE IF NOT EXISTS gate_runs (
|
|
389
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
390
|
+
trace_id TEXT NOT NULL,
|
|
391
|
+
turn_id TEXT NOT NULL,
|
|
392
|
+
gate_id TEXT NOT NULL,
|
|
393
|
+
gate_type TEXT NOT NULL DEFAULT '',
|
|
394
|
+
unit_type TEXT DEFAULT NULL,
|
|
395
|
+
unit_id TEXT DEFAULT NULL,
|
|
396
|
+
milestone_id TEXT DEFAULT NULL,
|
|
397
|
+
slice_id TEXT DEFAULT NULL,
|
|
398
|
+
task_id TEXT DEFAULT NULL,
|
|
399
|
+
outcome TEXT NOT NULL DEFAULT 'pass',
|
|
400
|
+
failure_class TEXT NOT NULL DEFAULT 'none',
|
|
401
|
+
rationale TEXT NOT NULL DEFAULT '',
|
|
402
|
+
findings TEXT NOT NULL DEFAULT '',
|
|
403
|
+
attempt INTEGER NOT NULL DEFAULT 1,
|
|
404
|
+
max_attempts INTEGER NOT NULL DEFAULT 1,
|
|
405
|
+
retryable INTEGER NOT NULL DEFAULT 0,
|
|
406
|
+
evaluated_at TEXT NOT NULL DEFAULT ''
|
|
407
|
+
)
|
|
408
|
+
`);
|
|
409
|
+
db.exec(`
|
|
410
|
+
CREATE TABLE IF NOT EXISTS turn_git_transactions (
|
|
411
|
+
trace_id TEXT NOT NULL,
|
|
412
|
+
turn_id TEXT NOT NULL,
|
|
413
|
+
unit_type TEXT DEFAULT NULL,
|
|
414
|
+
unit_id TEXT DEFAULT NULL,
|
|
415
|
+
stage TEXT NOT NULL DEFAULT 'turn-start',
|
|
416
|
+
action TEXT NOT NULL DEFAULT 'status-only',
|
|
417
|
+
push INTEGER NOT NULL DEFAULT 0,
|
|
418
|
+
status TEXT NOT NULL DEFAULT 'ok',
|
|
419
|
+
error TEXT DEFAULT NULL,
|
|
420
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
421
|
+
updated_at TEXT NOT NULL DEFAULT '',
|
|
422
|
+
PRIMARY KEY (trace_id, turn_id, stage)
|
|
423
|
+
)
|
|
424
|
+
`);
|
|
425
|
+
db.exec(`
|
|
426
|
+
CREATE TABLE IF NOT EXISTS audit_events (
|
|
427
|
+
event_id TEXT PRIMARY KEY,
|
|
428
|
+
trace_id TEXT NOT NULL,
|
|
429
|
+
turn_id TEXT DEFAULT NULL,
|
|
430
|
+
caused_by TEXT DEFAULT NULL,
|
|
431
|
+
category TEXT NOT NULL,
|
|
432
|
+
type TEXT NOT NULL,
|
|
433
|
+
ts TEXT NOT NULL,
|
|
434
|
+
payload_json TEXT NOT NULL DEFAULT '{}'
|
|
435
|
+
)
|
|
436
|
+
`);
|
|
437
|
+
db.exec(`
|
|
438
|
+
CREATE TABLE IF NOT EXISTS audit_turn_index (
|
|
439
|
+
trace_id TEXT NOT NULL,
|
|
440
|
+
turn_id TEXT NOT NULL,
|
|
441
|
+
first_ts TEXT NOT NULL,
|
|
442
|
+
last_ts TEXT NOT NULL,
|
|
443
|
+
event_count INTEGER NOT NULL DEFAULT 0,
|
|
444
|
+
PRIMARY KEY (trace_id, turn_id)
|
|
445
|
+
)
|
|
386
446
|
`);
|
|
387
447
|
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(superseded_by)");
|
|
388
448
|
db.exec("CREATE INDEX IF NOT EXISTS idx_replan_history_milestone ON replan_history(milestone_id, created_at)");
|
|
@@ -395,6 +455,11 @@ function initSchema(db, fileBacked) {
|
|
|
395
455
|
ensureVerificationEvidenceDedupIndex(db);
|
|
396
456
|
// v14 index — slice dependency lookups
|
|
397
457
|
db.exec("CREATE INDEX IF NOT EXISTS idx_slice_deps_target ON slice_dependencies(milestone_id, depends_on_slice_id)");
|
|
458
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
|
|
459
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
|
|
460
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
|
|
461
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
|
|
462
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
|
|
398
463
|
db.exec(`CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL`);
|
|
399
464
|
db.exec(`CREATE VIEW IF NOT EXISTS active_requirements AS SELECT * FROM requirements WHERE superseded_by IS NULL`);
|
|
400
465
|
db.exec(`CREATE VIEW IF NOT EXISTS active_memories AS SELECT * FROM memories WHERE superseded_by IS NULL`);
|
|
@@ -725,6 +790,77 @@ function migrateSchema(db) {
|
|
|
725
790
|
":applied_at": new Date().toISOString(),
|
|
726
791
|
});
|
|
727
792
|
}
|
|
793
|
+
if (currentVersion < 15) {
|
|
794
|
+
db.exec(`
|
|
795
|
+
CREATE TABLE IF NOT EXISTS gate_runs (
|
|
796
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
797
|
+
trace_id TEXT NOT NULL,
|
|
798
|
+
turn_id TEXT NOT NULL,
|
|
799
|
+
gate_id TEXT NOT NULL,
|
|
800
|
+
gate_type TEXT NOT NULL DEFAULT '',
|
|
801
|
+
unit_type TEXT DEFAULT NULL,
|
|
802
|
+
unit_id TEXT DEFAULT NULL,
|
|
803
|
+
milestone_id TEXT DEFAULT NULL,
|
|
804
|
+
slice_id TEXT DEFAULT NULL,
|
|
805
|
+
task_id TEXT DEFAULT NULL,
|
|
806
|
+
outcome TEXT NOT NULL DEFAULT 'pass',
|
|
807
|
+
failure_class TEXT NOT NULL DEFAULT 'none',
|
|
808
|
+
rationale TEXT NOT NULL DEFAULT '',
|
|
809
|
+
findings TEXT NOT NULL DEFAULT '',
|
|
810
|
+
attempt INTEGER NOT NULL DEFAULT 1,
|
|
811
|
+
max_attempts INTEGER NOT NULL DEFAULT 1,
|
|
812
|
+
retryable INTEGER NOT NULL DEFAULT 0,
|
|
813
|
+
evaluated_at TEXT NOT NULL DEFAULT ''
|
|
814
|
+
)
|
|
815
|
+
`);
|
|
816
|
+
db.exec(`
|
|
817
|
+
CREATE TABLE IF NOT EXISTS turn_git_transactions (
|
|
818
|
+
trace_id TEXT NOT NULL,
|
|
819
|
+
turn_id TEXT NOT NULL,
|
|
820
|
+
unit_type TEXT DEFAULT NULL,
|
|
821
|
+
unit_id TEXT DEFAULT NULL,
|
|
822
|
+
stage TEXT NOT NULL DEFAULT 'turn-start',
|
|
823
|
+
action TEXT NOT NULL DEFAULT 'status-only',
|
|
824
|
+
push INTEGER NOT NULL DEFAULT 0,
|
|
825
|
+
status TEXT NOT NULL DEFAULT 'ok',
|
|
826
|
+
error TEXT DEFAULT NULL,
|
|
827
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
828
|
+
updated_at TEXT NOT NULL DEFAULT '',
|
|
829
|
+
PRIMARY KEY (trace_id, turn_id, stage)
|
|
830
|
+
)
|
|
831
|
+
`);
|
|
832
|
+
db.exec(`
|
|
833
|
+
CREATE TABLE IF NOT EXISTS audit_events (
|
|
834
|
+
event_id TEXT PRIMARY KEY,
|
|
835
|
+
trace_id TEXT NOT NULL,
|
|
836
|
+
turn_id TEXT DEFAULT NULL,
|
|
837
|
+
caused_by TEXT DEFAULT NULL,
|
|
838
|
+
category TEXT NOT NULL,
|
|
839
|
+
type TEXT NOT NULL,
|
|
840
|
+
ts TEXT NOT NULL,
|
|
841
|
+
payload_json TEXT NOT NULL DEFAULT '{}'
|
|
842
|
+
)
|
|
843
|
+
`);
|
|
844
|
+
db.exec(`
|
|
845
|
+
CREATE TABLE IF NOT EXISTS audit_turn_index (
|
|
846
|
+
trace_id TEXT NOT NULL,
|
|
847
|
+
turn_id TEXT NOT NULL,
|
|
848
|
+
first_ts TEXT NOT NULL,
|
|
849
|
+
last_ts TEXT NOT NULL,
|
|
850
|
+
event_count INTEGER NOT NULL DEFAULT 0,
|
|
851
|
+
PRIMARY KEY (trace_id, turn_id)
|
|
852
|
+
)
|
|
853
|
+
`);
|
|
854
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
|
|
855
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
|
|
856
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
|
|
857
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
|
|
858
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
|
|
859
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
860
|
+
":version": 15,
|
|
861
|
+
":applied_at": new Date().toISOString(),
|
|
862
|
+
});
|
|
863
|
+
}
|
|
728
864
|
db.exec("COMMIT");
|
|
729
865
|
}
|
|
730
866
|
catch (err) {
|
|
@@ -1939,6 +2075,7 @@ export function deleteMilestone(milestoneId) {
|
|
|
1939
2075
|
transaction(() => {
|
|
1940
2076
|
currentDb.prepare(`DELETE FROM verification_evidence WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
1941
2077
|
currentDb.prepare(`DELETE FROM quality_gates WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
2078
|
+
currentDb.prepare(`DELETE FROM gate_runs WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
1942
2079
|
currentDb.prepare(`DELETE FROM tasks WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
1943
2080
|
currentDb.prepare(`DELETE FROM slice_dependencies WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
1944
2081
|
currentDb.prepare(`DELETE FROM slices WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
@@ -2024,6 +2161,28 @@ export function saveGateResult(g) {
|
|
|
2024
2161
|
":findings": g.findings,
|
|
2025
2162
|
":evaluated_at": new Date().toISOString(),
|
|
2026
2163
|
});
|
|
2164
|
+
const outcome = g.verdict === "pass"
|
|
2165
|
+
? "pass"
|
|
2166
|
+
: g.verdict === "omitted"
|
|
2167
|
+
? "manual-attention"
|
|
2168
|
+
: "fail";
|
|
2169
|
+
insertGateRun({
|
|
2170
|
+
traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
|
|
2171
|
+
turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
|
|
2172
|
+
gateId: g.gateId,
|
|
2173
|
+
gateType: "quality-gate",
|
|
2174
|
+
milestoneId: g.milestoneId,
|
|
2175
|
+
sliceId: g.sliceId,
|
|
2176
|
+
taskId: g.taskId ?? undefined,
|
|
2177
|
+
outcome,
|
|
2178
|
+
failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
|
|
2179
|
+
rationale: g.rationale,
|
|
2180
|
+
findings: g.findings,
|
|
2181
|
+
attempt: 1,
|
|
2182
|
+
maxAttempts: 1,
|
|
2183
|
+
retryable: false,
|
|
2184
|
+
evaluatedAt: new Date().toISOString(),
|
|
2185
|
+
});
|
|
2027
2186
|
}
|
|
2028
2187
|
export function getPendingGates(milestoneId, sliceId, scope) {
|
|
2029
2188
|
if (!currentDb)
|
|
@@ -2104,6 +2263,105 @@ export function getPendingGatesForTurn(milestoneId, sliceId, turn, taskId) {
|
|
|
2104
2263
|
export function getPendingGateCountForTurn(milestoneId, sliceId, turn) {
|
|
2105
2264
|
return getPendingGatesForTurn(milestoneId, sliceId, turn).length;
|
|
2106
2265
|
}
|
|
2266
|
+
export function insertGateRun(entry) {
|
|
2267
|
+
if (!currentDb)
|
|
2268
|
+
return;
|
|
2269
|
+
currentDb.prepare(`INSERT INTO gate_runs (
|
|
2270
|
+
trace_id, turn_id, gate_id, gate_type, unit_type, unit_id, milestone_id, slice_id, task_id,
|
|
2271
|
+
outcome, failure_class, rationale, findings, attempt, max_attempts, retryable, evaluated_at
|
|
2272
|
+
) VALUES (
|
|
2273
|
+
:trace_id, :turn_id, :gate_id, :gate_type, :unit_type, :unit_id, :milestone_id, :slice_id, :task_id,
|
|
2274
|
+
:outcome, :failure_class, :rationale, :findings, :attempt, :max_attempts, :retryable, :evaluated_at
|
|
2275
|
+
)`).run({
|
|
2276
|
+
":trace_id": entry.traceId,
|
|
2277
|
+
":turn_id": entry.turnId,
|
|
2278
|
+
":gate_id": entry.gateId,
|
|
2279
|
+
":gate_type": entry.gateType,
|
|
2280
|
+
":unit_type": entry.unitType ?? null,
|
|
2281
|
+
":unit_id": entry.unitId ?? null,
|
|
2282
|
+
":milestone_id": entry.milestoneId ?? null,
|
|
2283
|
+
":slice_id": entry.sliceId ?? null,
|
|
2284
|
+
":task_id": entry.taskId ?? null,
|
|
2285
|
+
":outcome": entry.outcome,
|
|
2286
|
+
":failure_class": entry.failureClass,
|
|
2287
|
+
":rationale": entry.rationale ?? "",
|
|
2288
|
+
":findings": entry.findings ?? "",
|
|
2289
|
+
":attempt": entry.attempt,
|
|
2290
|
+
":max_attempts": entry.maxAttempts,
|
|
2291
|
+
":retryable": entry.retryable ? 1 : 0,
|
|
2292
|
+
":evaluated_at": entry.evaluatedAt,
|
|
2293
|
+
});
|
|
2294
|
+
}
|
|
2295
|
+
export function upsertTurnGitTransaction(entry) {
|
|
2296
|
+
if (!currentDb)
|
|
2297
|
+
return;
|
|
2298
|
+
currentDb.prepare(`INSERT OR REPLACE INTO turn_git_transactions (
|
|
2299
|
+
trace_id, turn_id, unit_type, unit_id, stage, action, push, status, error, metadata_json, updated_at
|
|
2300
|
+
) VALUES (
|
|
2301
|
+
:trace_id, :turn_id, :unit_type, :unit_id, :stage, :action, :push, :status, :error, :metadata_json, :updated_at
|
|
2302
|
+
)`).run({
|
|
2303
|
+
":trace_id": entry.traceId,
|
|
2304
|
+
":turn_id": entry.turnId,
|
|
2305
|
+
":unit_type": entry.unitType ?? null,
|
|
2306
|
+
":unit_id": entry.unitId ?? null,
|
|
2307
|
+
":stage": entry.stage,
|
|
2308
|
+
":action": entry.action,
|
|
2309
|
+
":push": entry.push ? 1 : 0,
|
|
2310
|
+
":status": entry.status,
|
|
2311
|
+
":error": entry.error ?? null,
|
|
2312
|
+
":metadata_json": JSON.stringify(entry.metadata ?? {}),
|
|
2313
|
+
":updated_at": entry.updatedAt,
|
|
2314
|
+
});
|
|
2315
|
+
}
|
|
2316
|
+
export function insertAuditEvent(entry) {
|
|
2317
|
+
if (!currentDb)
|
|
2318
|
+
return;
|
|
2319
|
+
transaction(() => {
|
|
2320
|
+
currentDb.prepare(`INSERT OR IGNORE INTO audit_events (
|
|
2321
|
+
event_id, trace_id, turn_id, caused_by, category, type, ts, payload_json
|
|
2322
|
+
) VALUES (
|
|
2323
|
+
:event_id, :trace_id, :turn_id, :caused_by, :category, :type, :ts, :payload_json
|
|
2324
|
+
)`).run({
|
|
2325
|
+
":event_id": entry.eventId,
|
|
2326
|
+
":trace_id": entry.traceId,
|
|
2327
|
+
":turn_id": entry.turnId ?? null,
|
|
2328
|
+
":caused_by": entry.causedBy ?? null,
|
|
2329
|
+
":category": entry.category,
|
|
2330
|
+
":type": entry.type,
|
|
2331
|
+
":ts": entry.ts,
|
|
2332
|
+
":payload_json": JSON.stringify(entry.payload ?? {}),
|
|
2333
|
+
});
|
|
2334
|
+
if (entry.turnId) {
|
|
2335
|
+
const row = currentDb.prepare(`SELECT event_count, first_ts, last_ts
|
|
2336
|
+
FROM audit_turn_index
|
|
2337
|
+
WHERE trace_id = :trace_id AND turn_id = :turn_id`).get({
|
|
2338
|
+
":trace_id": entry.traceId,
|
|
2339
|
+
":turn_id": entry.turnId,
|
|
2340
|
+
});
|
|
2341
|
+
if (row) {
|
|
2342
|
+
currentDb.prepare(`UPDATE audit_turn_index
|
|
2343
|
+
SET first_ts = CASE WHEN :ts < first_ts THEN :ts ELSE first_ts END,
|
|
2344
|
+
last_ts = CASE WHEN :ts > last_ts THEN :ts ELSE last_ts END,
|
|
2345
|
+
event_count = event_count + 1
|
|
2346
|
+
WHERE trace_id = :trace_id AND turn_id = :turn_id`).run({
|
|
2347
|
+
":trace_id": entry.traceId,
|
|
2348
|
+
":turn_id": entry.turnId,
|
|
2349
|
+
":ts": entry.ts,
|
|
2350
|
+
});
|
|
2351
|
+
}
|
|
2352
|
+
else {
|
|
2353
|
+
currentDb.prepare(`INSERT INTO audit_turn_index (trace_id, turn_id, first_ts, last_ts, event_count)
|
|
2354
|
+
VALUES (:trace_id, :turn_id, :first_ts, :last_ts, :event_count)`).run({
|
|
2355
|
+
":trace_id": entry.traceId,
|
|
2356
|
+
":turn_id": entry.turnId,
|
|
2357
|
+
":first_ts": entry.ts,
|
|
2358
|
+
":last_ts": entry.ts,
|
|
2359
|
+
":event_count": 1,
|
|
2360
|
+
});
|
|
2361
|
+
}
|
|
2362
|
+
}
|
|
2363
|
+
});
|
|
2364
|
+
}
|
|
2107
2365
|
// ─── Single-writer bypass wrappers ───────────────────────────────────────
|
|
2108
2366
|
// These wrappers exist so modules outside this file never need to call
|
|
2109
2367
|
// `_getAdapter()` for writes. Each one is a byte-equivalent replacement for
|
|
@@ -26,6 +26,8 @@ import { nativeIsRepo, nativeInit } from "./native-git-bridge.js";
|
|
|
26
26
|
import { isInheritedRepo } from "./repo-identity.js";
|
|
27
27
|
import { ensureGitignore, ensurePreferences, untrackRuntimeFiles } from "./gitignore.js";
|
|
28
28
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
29
|
+
import { resolveUokFlags } from "./uok/flags.js";
|
|
30
|
+
import { ensurePlanV2Graph } from "./uok/plan-v2.js";
|
|
29
31
|
import { detectProjectState } from "./detection.js";
|
|
30
32
|
import { showProjectInit, offerMigration } from "./init-wizard.js";
|
|
31
33
|
import { validateDirectory } from "./validate-directory.js";
|
|
@@ -53,6 +55,25 @@ function nextMilestoneIdReserved(existingIds, uniqueEnabled) {
|
|
|
53
55
|
reserveMilestoneId(id);
|
|
54
56
|
return id;
|
|
55
57
|
}
|
|
58
|
+
function needsPlanV2Gate(state) {
|
|
59
|
+
return state.phase === "executing"
|
|
60
|
+
|| state.phase === "summarizing"
|
|
61
|
+
|| state.phase === "validating-milestone"
|
|
62
|
+
|| state.phase === "completing-milestone";
|
|
63
|
+
}
|
|
64
|
+
function runPlanV2Gate(ctx, basePath, state) {
|
|
65
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
66
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
67
|
+
if (!uokFlags.planV2 || !needsPlanV2Gate(state))
|
|
68
|
+
return true;
|
|
69
|
+
const compiled = ensurePlanV2Graph(basePath, state);
|
|
70
|
+
if (!compiled.ok) {
|
|
71
|
+
const reason = compiled.reason ?? "plan-v2 compilation failed";
|
|
72
|
+
ctx.ui.notify(`Plan gate failed-closed: ${reason}. Complete plan/discuss artifacts before execution.`, "error");
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
56
77
|
// ─── Commit Instruction Helpers ──────────────────────────────────────────────
|
|
57
78
|
/** Build commit instruction for planning prompts. .gsd/ is managed externally and always gitignored. */
|
|
58
79
|
function buildDocsCommitInstruction(_message) {
|
|
@@ -191,14 +212,16 @@ export function checkAutoStartAfterDiscuss() {
|
|
|
191
212
|
logWarning("guided", `CONTEXT-DRAFT.md unlink failed: ${e.message}`);
|
|
192
213
|
}
|
|
193
214
|
// Cleanup: remove discussion manifest after auto-start (only needed during discussion)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
215
|
+
if (existsSync(manifestPath)) {
|
|
216
|
+
try {
|
|
217
|
+
unlinkSync(manifestPath);
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
logWarning("guided", `manifest unlink failed: ${e.message}`);
|
|
221
|
+
}
|
|
199
222
|
}
|
|
200
223
|
pendingAutoStartMap.delete(basePath);
|
|
201
|
-
ctx.ui.notify(`Milestone ${milestoneId} ready.`, "
|
|
224
|
+
ctx.ui.notify(`Milestone ${milestoneId} ready.`, "success");
|
|
202
225
|
startAutoDetached(ctx, pi, basePath, false, { step });
|
|
203
226
|
return true;
|
|
204
227
|
}
|
|
@@ -1110,6 +1133,8 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1110
1133
|
catch (err) {
|
|
1111
1134
|
logWarning("guided", `STATE.md rebuild failed: ${err.message}`);
|
|
1112
1135
|
}
|
|
1136
|
+
if (!runPlanV2Gate(ctx, basePath, state))
|
|
1137
|
+
return;
|
|
1113
1138
|
if (!state.activeMilestone?.id) {
|
|
1114
1139
|
// Guard: if a discuss session is already in flight, don't re-inject the prompt.
|
|
1115
1140
|
// Both /gsd and /gsd auto reach this branch when no milestone exists yet.
|
|
@@ -336,6 +336,7 @@ async function customizeAdvancedPrefs(ctx, prefs) {
|
|
|
336
336
|
{ id: "balanced", label: "Balanced", description: "Good trade-off (default)", recommended: true },
|
|
337
337
|
{ id: "budget", label: "Budget", description: "Minimize token usage" },
|
|
338
338
|
{ id: "quality", label: "Quality", description: "Maximize thoroughness" },
|
|
339
|
+
{ id: "burn-max", label: "Burn Max", description: "Maximum depth, no phase skips" },
|
|
339
340
|
],
|
|
340
341
|
});
|
|
341
342
|
if (profileChoice !== "not_yet") {
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
import { appendFileSync, mkdirSync, readdirSync, readFileSync } from "node:fs";
|
|
15
15
|
import { join } from "node:path";
|
|
16
16
|
import { gsdRoot } from "./paths.js";
|
|
17
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
18
|
+
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
17
19
|
// ─── Emit ─────────────────────────────────────────────────────────────────────
|
|
18
20
|
/**
|
|
19
21
|
* Append a journal event to the daily JSONL file.
|
|
@@ -34,6 +36,31 @@ export function emitJournalEvent(basePath, entry) {
|
|
|
34
36
|
catch {
|
|
35
37
|
// Silent failure — journal must never break auto-mode
|
|
36
38
|
}
|
|
39
|
+
if (!isUnifiedAuditEnabled())
|
|
40
|
+
return;
|
|
41
|
+
try {
|
|
42
|
+
const causedBy = entry.causedBy
|
|
43
|
+
? `${entry.causedBy.flowId}:${entry.causedBy.seq}`
|
|
44
|
+
: undefined;
|
|
45
|
+
const turnId = typeof entry.data?.turnId === "string"
|
|
46
|
+
? entry.data.turnId
|
|
47
|
+
: undefined;
|
|
48
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
49
|
+
traceId: entry.flowId,
|
|
50
|
+
turnId,
|
|
51
|
+
causedBy,
|
|
52
|
+
category: "orchestration",
|
|
53
|
+
type: `journal-${entry.eventType}`,
|
|
54
|
+
payload: {
|
|
55
|
+
seq: entry.seq,
|
|
56
|
+
rule: entry.rule,
|
|
57
|
+
data: entry.data ?? {},
|
|
58
|
+
},
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Best-effort: audit projection must never block journal writes.
|
|
63
|
+
}
|
|
37
64
|
}
|
|
38
65
|
// ─── Query ────────────────────────────────────────────────────────────────────
|
|
39
66
|
/**
|
|
@@ -17,6 +17,8 @@ import { gsdRoot } from "./paths.js";
|
|
|
17
17
|
import { getAndClearSkills } from "./skill-telemetry.js";
|
|
18
18
|
import { loadJsonFile, loadJsonFileOrNull, saveJsonFile } from "./json-persistence.js";
|
|
19
19
|
import { parseUnitId } from "./unit-id.js";
|
|
20
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
21
|
+
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
20
22
|
// Re-export from shared — import directly from format-utils to avoid pulling
|
|
21
23
|
// in the full barrel (mod.js → ui.js → @gsd/pi-tui) which breaks when loaded
|
|
22
24
|
// outside jiti's alias resolution (e.g. dynamic import in auto-loop reports).
|
|
@@ -152,6 +154,23 @@ export function snapshotUnitMetrics(ctx, unitType, unitId, startedAt, model, opt
|
|
|
152
154
|
ledger.units.push(unit);
|
|
153
155
|
}
|
|
154
156
|
saveLedger(basePath, ledger);
|
|
157
|
+
if (isUnifiedAuditEnabled()) {
|
|
158
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
159
|
+
traceId: opts?.traceId ?? `metrics:${unitType}:${unitId}`,
|
|
160
|
+
turnId: opts?.turnId,
|
|
161
|
+
causedBy: opts?.causedBy,
|
|
162
|
+
category: "metrics",
|
|
163
|
+
type: "unit-metrics-snapshot",
|
|
164
|
+
payload: {
|
|
165
|
+
unitType,
|
|
166
|
+
unitId,
|
|
167
|
+
model,
|
|
168
|
+
tokens: unit.tokens,
|
|
169
|
+
cost: unit.cost,
|
|
170
|
+
toolCalls: unit.toolCalls,
|
|
171
|
+
},
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
155
174
|
return unit;
|
|
156
175
|
}
|
|
157
176
|
/**
|