gsd-pi 2.74.0-dev.b741afb → 2.74.0-dev.ffbcc03
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/resources/extensions/gsd/activity-log.js +16 -0
- package/dist/resources/extensions/gsd/auto/loop.js +147 -10
- package/dist/resources/extensions/gsd/auto/phases.js +113 -3
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +215 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +24 -10
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
- package/dist/resources/extensions/gsd/auto-verification.js +100 -2
- package/dist/resources/extensions/gsd/auto.js +28 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
- package/dist/resources/extensions/gsd/cache.js +16 -5
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
- package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
- package/dist/resources/extensions/gsd/git-service.js +49 -1
- package/dist/resources/extensions/gsd/graph-context.js +98 -7
- package/dist/resources/extensions/gsd/gsd-db.js +260 -2
- package/dist/resources/extensions/gsd/guided-flow.js +24 -1
- package/dist/resources/extensions/gsd/init-wizard.js +1 -0
- package/dist/resources/extensions/gsd/journal.js +27 -0
- package/dist/resources/extensions/gsd/metrics.js +19 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
- package/dist/resources/extensions/gsd/preferences-models.js +20 -3
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
- package/dist/resources/extensions/gsd/preferences.js +26 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
- package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
- package/dist/resources/extensions/gsd/uok/audit.js +40 -0
- package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
- package/dist/resources/extensions/gsd/uok/flags.js +29 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
- package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
- package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
- package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -1
- package/packages/mcp-server/dist/readers/graph.js +107 -0
- package/packages/mcp-server/dist/readers/graph.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +88 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/readers/graph.test.ts +178 -0
- package/packages/mcp-server/src/readers/graph.ts +148 -1
- package/packages/mcp-server/src/workflow-tools.ts +95 -10
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -9
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -9
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/capability-patches.js +36 -0
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
- package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
- package/packages/pi-ai/dist/models/custom.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.js +464 -0
- package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.js +311 -0
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
- package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
- package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
- package/packages/pi-ai/dist/models/generated/index.js +51 -0
- package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
- package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.js +702 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
- package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.js +413 -0
- package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.js +239 -0
- package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts +27 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/index.js +80 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts +1 -36
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +1 -2
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.js +3 -112
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +6 -5
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +74 -40
- package/packages/pi-ai/src/index.ts +1 -9
- package/packages/pi-ai/src/models/capability-patches.ts +40 -0
- package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
- package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
- package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
- package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
- package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
- package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
- package/packages/pi-ai/src/models/generated/google.ts +466 -0
- package/packages/pi-ai/src/models/generated/groq.ts +313 -0
- package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
- package/packages/pi-ai/src/models/generated/index.ts +52 -0
- package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
- package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
- package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
- package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
- package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
- package/packages/pi-ai/src/models/generated/openai.ts +704 -0
- package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
- package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
- package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
- package/packages/pi-ai/src/models/generated/xai.ts +415 -0
- package/packages/pi-ai/src/models/generated/zai.ts +241 -0
- package/packages/pi-ai/src/models/index.ts +106 -0
- package/packages/pi-ai/src/models.generated.test.ts +1 -2
- package/packages/pi-ai/src/models.test.ts +6 -5
- package/packages/pi-ai/src/models.ts +3 -153
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
- package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
- package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
- package/packages/pi-coding-agent/tsconfig.json +2 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +21 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +4 -0
- package/src/resources/extensions/gsd/auto/loop.ts +159 -10
- package/src/resources/extensions/gsd/auto/phases.ts +123 -3
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
- package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +226 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
- package/src/resources/extensions/gsd/auto-verification.ts +129 -2
- package/src/resources/extensions/gsd/auto.ts +34 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
- package/src/resources/extensions/gsd/cache.ts +16 -5
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
- package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
- package/src/resources/extensions/gsd/git-service.ts +68 -0
- package/src/resources/extensions/gsd/graph-context.ts +139 -12
- package/src/resources/extensions/gsd/gsd-db.ts +321 -3
- package/src/resources/extensions/gsd/guided-flow.ts +33 -1
- package/src/resources/extensions/gsd/init-wizard.ts +3 -2
- package/src/resources/extensions/gsd/journal.ts +30 -0
- package/src/resources/extensions/gsd/metrics.ts +26 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
- package/src/resources/extensions/gsd/preferences-models.ts +20 -3
- package/src/resources/extensions/gsd/preferences-types.ts +32 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
- package/src/resources/extensions/gsd/preferences.ts +28 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
- package/src/resources/extensions/gsd/session-lock.ts +14 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +9 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
- package/src/resources/extensions/gsd/types.ts +14 -1
- package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
- package/src/resources/extensions/gsd/uok/audit.ts +51 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
- package/src/resources/extensions/gsd/uok/flags.ts +45 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
- package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
- package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
- package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
- package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
- package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
- package/packages/pi-ai/dist/models.custom.js.map +0 -1
- package/packages/pi-ai/dist/models.generated.js +0 -14343
- package/packages/pi-ai/dist/models.generated.js.map +0 -1
- package/packages/pi-ai/src/models.generated.ts +0 -14345
- /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → kn6xzWKYnogsxp2b6RpDD}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → kn6xzWKYnogsxp2b6RpDD}/_ssgManifest.js +0 -0
|
@@ -26,6 +26,14 @@ import { MAX_FINALIZE_TIMEOUTS } from "../auto/types.ts";
|
|
|
26
26
|
|
|
27
27
|
const { assertTrue, assertEq, report } = createTestContext();
|
|
28
28
|
|
|
29
|
+
function getRunFinalizeBody(phasesSource: string): string {
|
|
30
|
+
const fnIdx = phasesSource.indexOf("export async function runFinalize(");
|
|
31
|
+
assertTrue(fnIdx > 0, "runFinalize function should exist in phases.ts");
|
|
32
|
+
|
|
33
|
+
const nextExportIdx = phasesSource.indexOf("\nexport ", fnIdx + 1);
|
|
34
|
+
return phasesSource.slice(fnIdx, nextExportIdx > fnIdx ? nextExportIdx : undefined);
|
|
35
|
+
}
|
|
36
|
+
|
|
29
37
|
// ═══ Test: withTimeout resolves when inner promise resolves promptly ══════════
|
|
30
38
|
|
|
31
39
|
{
|
|
@@ -145,11 +153,7 @@ const { assertTrue, assertEq, report } = createTestContext();
|
|
|
145
153
|
"utf-8",
|
|
146
154
|
);
|
|
147
155
|
|
|
148
|
-
|
|
149
|
-
const fnIdx = phasesSource.indexOf("export async function runFinalize(");
|
|
150
|
-
assertTrue(fnIdx > 0, "runFinalize function should exist in phases.ts");
|
|
151
|
-
|
|
152
|
-
const fnBody = phasesSource.slice(fnIdx, fnIdx + 8000);
|
|
156
|
+
const fnBody = getRunFinalizeBody(phasesSource);
|
|
153
157
|
|
|
154
158
|
// postUnitPreVerification must be wrapped in withTimeout
|
|
155
159
|
const preTimeoutIdx = fnBody.indexOf("withTimeout(");
|
|
@@ -207,8 +211,7 @@ const { assertTrue, assertEq, report } = createTestContext();
|
|
|
207
211
|
"utf-8",
|
|
208
212
|
);
|
|
209
213
|
|
|
210
|
-
const
|
|
211
|
-
const fnBody = phasesSource.slice(fnIdx, fnIdx + 8000);
|
|
214
|
+
const fnBody = getRunFinalizeBody(phasesSource);
|
|
212
215
|
|
|
213
216
|
// Both timeout handlers should increment consecutiveFinalizeTimeouts
|
|
214
217
|
const incrementCount = (fnBody.match(/consecutiveFinalizeTimeouts\+\+/g) || []).length;
|
|
@@ -80,7 +80,7 @@ describe('gsd-db', () => {
|
|
|
80
80
|
// Check schema_version table
|
|
81
81
|
const adapter = _getAdapter()!;
|
|
82
82
|
const version = adapter.prepare('SELECT MAX(version) as version FROM schema_version').get();
|
|
83
|
-
assert.deepStrictEqual(version?.['version'],
|
|
83
|
+
assert.deepStrictEqual(version?.['version'], 15, 'schema version should be 15');
|
|
84
84
|
|
|
85
85
|
// Check tables exist by querying them
|
|
86
86
|
const dRows = adapter.prepare('SELECT count(*) as cnt FROM decisions').get();
|
|
@@ -198,7 +198,7 @@ test("session_start bootstraps the health widget alongside notifications", async
|
|
|
198
198
|
},
|
|
199
199
|
} as any;
|
|
200
200
|
|
|
201
|
-
registerHooks(pi);
|
|
201
|
+
registerHooks(pi, []);
|
|
202
202
|
const sessionStart = handlers.get("session_start");
|
|
203
203
|
assert.ok(sessionStart, "session_start handler is registered");
|
|
204
204
|
|
|
@@ -363,7 +363,7 @@ test('md-importer: schema v1→v2 migration', () => {
|
|
|
363
363
|
openDatabase(':memory:');
|
|
364
364
|
const adapter = _getAdapter();
|
|
365
365
|
const version = adapter?.prepare('SELECT MAX(version) as v FROM schema_version').get();
|
|
366
|
-
assert.deepStrictEqual(version?.v,
|
|
366
|
+
assert.deepStrictEqual(version?.v, 15, 'new DB should be at schema version 15');
|
|
367
367
|
|
|
368
368
|
// Artifacts table should exist
|
|
369
369
|
const tableCheck = adapter?.prepare("SELECT count(*) as c FROM sqlite_master WHERE type='table' AND name='artifacts'").get();
|
|
@@ -413,4 +413,3 @@ test('md-importer: round-trip fidelity', () => {
|
|
|
413
413
|
});
|
|
414
414
|
|
|
415
415
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
416
|
-
|
|
@@ -323,10 +323,9 @@ test('memory-store: schema includes memories table', () => {
|
|
|
323
323
|
const viewCount = adapter.prepare('SELECT count(*) as cnt FROM active_memories').get();
|
|
324
324
|
assert.deepStrictEqual(viewCount?.['cnt'], 0, 'active_memories view should exist');
|
|
325
325
|
|
|
326
|
-
// Verify schema version is
|
|
326
|
+
// Verify schema version is 15 (UOK gate/git/audit projection tables included)
|
|
327
327
|
const version = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
|
|
328
|
-
assert.deepStrictEqual(version?.['v'],
|
|
328
|
+
assert.deepStrictEqual(version?.['v'], 15, 'schema version should be 15');
|
|
329
329
|
|
|
330
330
|
closeDatabase();
|
|
331
331
|
});
|
|
332
|
-
|
|
@@ -14,7 +14,7 @@ import { join } from "node:path";
|
|
|
14
14
|
|
|
15
15
|
import { runPostUnitVerification, type VerificationContext } from "../auto-verification.ts";
|
|
16
16
|
import { AutoSession } from "../auto/session.ts";
|
|
17
|
-
import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask } from "../gsd-db.ts";
|
|
17
|
+
import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask, _getAdapter } from "../gsd-db.ts";
|
|
18
18
|
import { invalidateAllCaches } from "../cache.ts";
|
|
19
19
|
import { _clearGsdRootCache } from "../paths.ts";
|
|
20
20
|
|
|
@@ -140,6 +140,43 @@ function createBasicTask(): void {
|
|
|
140
140
|
});
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
+
function createPostExecFailureTask(): void {
|
|
144
|
+
insertMilestone({ id: "M001" });
|
|
145
|
+
insertSlice({
|
|
146
|
+
id: "S01",
|
|
147
|
+
milestoneId: "M001",
|
|
148
|
+
title: "Test Slice",
|
|
149
|
+
risk: "low",
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
const srcDir = join(tempDir, "src");
|
|
153
|
+
mkdirSync(srcDir, { recursive: true });
|
|
154
|
+
writeFileSync(
|
|
155
|
+
join(srcDir, "broken.ts"),
|
|
156
|
+
"import { missing } from './does-not-exist.js';\nexport const ok = 1;\n",
|
|
157
|
+
"utf-8",
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
insertTask({
|
|
161
|
+
id: "T01",
|
|
162
|
+
sliceId: "S01",
|
|
163
|
+
milestoneId: "M001",
|
|
164
|
+
title: "Task with broken import",
|
|
165
|
+
status: "pending",
|
|
166
|
+
keyFiles: ["src/broken.ts"],
|
|
167
|
+
planning: {
|
|
168
|
+
description: "Task that introduces an unresolved import in key files",
|
|
169
|
+
estimate: "1h",
|
|
170
|
+
files: ["src/broken.ts"],
|
|
171
|
+
verify: "echo pass",
|
|
172
|
+
inputs: [],
|
|
173
|
+
expectedOutput: [],
|
|
174
|
+
observabilityImpact: "",
|
|
175
|
+
},
|
|
176
|
+
sequence: 0,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
143
180
|
// ─── Tests ───────────────────────────────────────────────────────────────────
|
|
144
181
|
|
|
145
182
|
describe("Post-execution blocking failure retry bypass", () => {
|
|
@@ -249,6 +286,47 @@ describe("Post-execution blocking failure retry bypass", () => {
|
|
|
249
286
|
// This test mainly confirms the wiring is correct
|
|
250
287
|
assert.equal(result, "continue");
|
|
251
288
|
});
|
|
289
|
+
|
|
290
|
+
test("uok gate runner persists post-execution gate failures when enabled", async () => {
|
|
291
|
+
createPostExecFailureTask();
|
|
292
|
+
writePreferences({
|
|
293
|
+
enhanced_verification: true,
|
|
294
|
+
enhanced_verification_post: true,
|
|
295
|
+
verification_auto_fix: true,
|
|
296
|
+
verification_max_retries: 2,
|
|
297
|
+
uok: {
|
|
298
|
+
enabled: true,
|
|
299
|
+
gates: { enabled: true },
|
|
300
|
+
},
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
const ctx = makeMockCtx();
|
|
304
|
+
const pi = makeMockPi();
|
|
305
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
306
|
+
const s = makeMockSession(tempDir, { type: "execute-task", id: "M001/S01/T01" });
|
|
307
|
+
const vctx: VerificationContext = { s, ctx, pi };
|
|
308
|
+
|
|
309
|
+
const result = await runPostUnitVerification(vctx, pauseAutoMock);
|
|
310
|
+
|
|
311
|
+
assert.equal(result, "pause");
|
|
312
|
+
assert.equal(pauseAutoMock.mock.callCount(), 1);
|
|
313
|
+
|
|
314
|
+
const adapter = _getAdapter();
|
|
315
|
+
const row = adapter
|
|
316
|
+
?.prepare(
|
|
317
|
+
`SELECT gate_id, outcome, failure_class
|
|
318
|
+
FROM gate_runs
|
|
319
|
+
WHERE gate_id = 'post-execution-checks'
|
|
320
|
+
ORDER BY id DESC
|
|
321
|
+
LIMIT 1`,
|
|
322
|
+
)
|
|
323
|
+
.get() as { gate_id: string; outcome: string; failure_class: string } | undefined;
|
|
324
|
+
|
|
325
|
+
assert.ok(row, "post-execution gate run should be persisted when uok.gates is enabled");
|
|
326
|
+
assert.equal(row?.gate_id, "post-execution-checks");
|
|
327
|
+
assert.equal(row?.outcome, "fail");
|
|
328
|
+
assert.equal(row?.failure_class, "artifact");
|
|
329
|
+
});
|
|
252
330
|
});
|
|
253
331
|
|
|
254
332
|
describe("Post-execution retry behavior", () => {
|
|
@@ -21,7 +21,8 @@ test("postUnitPreVerification rebuilds STATE.md before worktree sync", () => {
|
|
|
21
21
|
const fnStart = source.indexOf("export async function postUnitPreVerification");
|
|
22
22
|
assert.ok(fnStart > 0, "postUnitPreVerification should exist");
|
|
23
23
|
|
|
24
|
-
const
|
|
24
|
+
const fnEnd = source.indexOf("export async function postUnitPostVerification", fnStart);
|
|
25
|
+
const section = source.slice(fnStart, fnEnd > fnStart ? fnEnd : undefined);
|
|
25
26
|
const rebuildIdx = section.indexOf('await runSafely("postUnit", "state-rebuild"');
|
|
26
27
|
const syncIdx = section.indexOf('await runSafely("postUnit", "worktree-sync"');
|
|
27
28
|
|
|
@@ -17,7 +17,7 @@ import { join } from "node:path";
|
|
|
17
17
|
|
|
18
18
|
import { postUnitPostVerification, type PostUnitContext } from "../auto-post-unit.ts";
|
|
19
19
|
import { AutoSession } from "../auto/session.ts";
|
|
20
|
-
import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask } from "../gsd-db.ts";
|
|
20
|
+
import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask, _getAdapter } from "../gsd-db.ts";
|
|
21
21
|
import { invalidateAllCaches } from "../cache.ts";
|
|
22
22
|
import { _clearGsdRootCache } from "../paths.ts";
|
|
23
23
|
|
|
@@ -454,4 +454,43 @@ describe("Pre-execution checks → pauseAuto wiring", () => {
|
|
|
454
454
|
"postUnitPostVerification should return 'continue' when pre-execution checks are disabled"
|
|
455
455
|
);
|
|
456
456
|
});
|
|
457
|
+
|
|
458
|
+
test("uok gate runner persists pre-execution gate outcomes when enabled", async () => {
|
|
459
|
+
writePreferences({
|
|
460
|
+
enhanced_verification: true,
|
|
461
|
+
enhanced_verification_pre: true,
|
|
462
|
+
enhanced_verification_strict: true,
|
|
463
|
+
uok: {
|
|
464
|
+
enabled: true,
|
|
465
|
+
gates: { enabled: true },
|
|
466
|
+
},
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
createFailingTasks();
|
|
470
|
+
|
|
471
|
+
const ctx = makeMockCtx();
|
|
472
|
+
const pi = makeMockPi();
|
|
473
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
474
|
+
const s = makeMockSession(tempDir, { type: "plan-slice", id: "M001/S01" });
|
|
475
|
+
const pctx = makePostUnitContext(s, ctx, pi, pauseAutoMock);
|
|
476
|
+
|
|
477
|
+
const result = await postUnitPostVerification(pctx);
|
|
478
|
+
assert.equal(result, "stopped");
|
|
479
|
+
|
|
480
|
+
const adapter = _getAdapter();
|
|
481
|
+
const row = adapter
|
|
482
|
+
?.prepare(
|
|
483
|
+
`SELECT gate_id, outcome, failure_class
|
|
484
|
+
FROM gate_runs
|
|
485
|
+
WHERE gate_id = 'pre-execution-checks'
|
|
486
|
+
ORDER BY id DESC
|
|
487
|
+
LIMIT 1`,
|
|
488
|
+
)
|
|
489
|
+
.get() as { gate_id: string; outcome: string; failure_class: string } | undefined;
|
|
490
|
+
|
|
491
|
+
assert.ok(row, "pre-execution gate run should be persisted when uok.gates is enabled");
|
|
492
|
+
assert.equal(row?.gate_id, "pre-execution-checks");
|
|
493
|
+
assert.equal(row?.outcome, "fail");
|
|
494
|
+
assert.equal(row?.failure_class, "input");
|
|
495
|
+
});
|
|
457
496
|
});
|
|
@@ -34,11 +34,12 @@ const typesSrc = readFileSync(join(__dirname, "..", "types.ts"), "utf-8");
|
|
|
34
34
|
// Type Definitions
|
|
35
35
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
36
36
|
|
|
37
|
-
test("types: TokenProfile type exported with budget/balanced/quality", () => {
|
|
37
|
+
test("types: TokenProfile type exported with budget/balanced/quality/burn-max", () => {
|
|
38
38
|
assert.ok(typesSrc.includes("export type TokenProfile"), "TokenProfile should be exported");
|
|
39
39
|
assert.match(typesSrc, /["']budget["']/, "should include budget");
|
|
40
40
|
assert.match(typesSrc, /["']balanced["']/, "should include balanced");
|
|
41
41
|
assert.match(typesSrc, /["']quality["']/, "should include quality");
|
|
42
|
+
assert.match(typesSrc, /["']burn-max["']/, "should include burn-max");
|
|
42
43
|
});
|
|
43
44
|
|
|
44
45
|
test("types: InlineLevel type exported with full/standard/minimal", () => {
|
|
@@ -91,7 +92,7 @@ test("preferences: KNOWN_PREFERENCE_KEYS includes token_profile and phases", ()
|
|
|
91
92
|
// Profile Resolution
|
|
92
93
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
93
94
|
|
|
94
|
-
test("profile: resolveProfileDefaults exists and handles all
|
|
95
|
+
test("profile: resolveProfileDefaults exists and handles all 4 tiers", () => {
|
|
95
96
|
assert.ok(
|
|
96
97
|
preferencesSrc.includes("export function resolveProfileDefaults"),
|
|
97
98
|
"resolveProfileDefaults should be exported",
|
|
@@ -99,8 +100,9 @@ test("profile: resolveProfileDefaults exists and handles all 3 tiers", () => {
|
|
|
99
100
|
assert.ok(
|
|
100
101
|
preferencesSrc.includes('case "budget"') &&
|
|
101
102
|
preferencesSrc.includes('case "balanced"') &&
|
|
102
|
-
preferencesSrc.includes('case "quality"')
|
|
103
|
-
|
|
103
|
+
preferencesSrc.includes('case "quality"') &&
|
|
104
|
+
preferencesSrc.includes('case "burn-max"'),
|
|
105
|
+
"resolveProfileDefaults should handle all 4 tiers",
|
|
104
106
|
);
|
|
105
107
|
});
|
|
106
108
|
|
|
@@ -158,6 +160,7 @@ test("profile: resolveInlineLevel maps profile to inline level", () => {
|
|
|
158
160
|
assert.ok(preferencesSrc.includes('case "budget": return "minimal"'), "budget → minimal");
|
|
159
161
|
assert.ok(preferencesSrc.includes('case "balanced": return "standard"'), "balanced → standard");
|
|
160
162
|
assert.ok(preferencesSrc.includes('case "quality": return "full"'), "quality → full");
|
|
163
|
+
assert.ok(preferencesSrc.includes('case "burn-max": return "full"'), "burn-max → full");
|
|
161
164
|
});
|
|
162
165
|
|
|
163
166
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -167,7 +170,7 @@ test("profile: resolveInlineLevel maps profile to inline level", () => {
|
|
|
167
170
|
test("validate: validatePreferences handles token_profile", () => {
|
|
168
171
|
assert.ok(
|
|
169
172
|
preferencesSrc.includes("preferences.token_profile") &&
|
|
170
|
-
preferencesSrc.includes("budget, balanced, quality"),
|
|
173
|
+
preferencesSrc.includes("budget, balanced, quality, burn-max"),
|
|
171
174
|
"validatePreferences should validate token_profile enum values",
|
|
172
175
|
);
|
|
173
176
|
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, readFileSync, rmSync, existsSync } from "node:fs";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { emitJournalEvent } from "../journal.ts";
|
|
7
|
+
import { saveActivityLog } from "../activity-log.ts";
|
|
8
|
+
import { initMetrics, resetMetrics, snapshotUnitMetrics } from "../metrics.ts";
|
|
9
|
+
import { setLogBasePath, logWarning } from "../workflow-logger.ts";
|
|
10
|
+
import { setUnifiedAuditEnabled } from "../uok/audit-toggle.ts";
|
|
11
|
+
|
|
12
|
+
function readAuditEvents(basePath: string): Array<Record<string, unknown>> {
|
|
13
|
+
const file = join(basePath, ".gsd", "audit", "events.jsonl");
|
|
14
|
+
if (!existsSync(file)) return [];
|
|
15
|
+
const raw = readFileSync(file, "utf-8");
|
|
16
|
+
return raw
|
|
17
|
+
.split("\n")
|
|
18
|
+
.filter(Boolean)
|
|
19
|
+
.map((line) => JSON.parse(line) as Record<string, unknown>);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function makeMockContext(entries: unknown[]): any {
|
|
23
|
+
return {
|
|
24
|
+
sessionManager: {
|
|
25
|
+
getEntries: () => entries,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
test("unified audit plane bridges journal/activity/metrics/workflow logger into audit envelope log", () => {
|
|
31
|
+
const basePath = mkdtempSync(join(tmpdir(), "gsd-uok-audit-"));
|
|
32
|
+
setUnifiedAuditEnabled(true);
|
|
33
|
+
try {
|
|
34
|
+
emitJournalEvent(basePath, {
|
|
35
|
+
ts: new Date().toISOString(),
|
|
36
|
+
flowId: "trace-123",
|
|
37
|
+
seq: 1,
|
|
38
|
+
eventType: "iteration-start",
|
|
39
|
+
data: { turnId: "turn-123", unitId: "M001/S01/T01" },
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const activityCtx = makeMockContext([
|
|
43
|
+
{ type: "message", message: { role: "assistant", content: [{ type: "text", text: "hello" }] } },
|
|
44
|
+
]);
|
|
45
|
+
const activityPath = saveActivityLog(activityCtx, basePath, "execute-task", "M001/S01/T01");
|
|
46
|
+
assert.ok(activityPath);
|
|
47
|
+
|
|
48
|
+
initMetrics(basePath);
|
|
49
|
+
const metricsCtx = makeMockContext([
|
|
50
|
+
{
|
|
51
|
+
type: "message",
|
|
52
|
+
message: {
|
|
53
|
+
role: "assistant",
|
|
54
|
+
usage: { input: 10, output: 5, cacheRead: 0, cacheWrite: 0, totalTokens: 15, cost: 0.01 },
|
|
55
|
+
content: [],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
]);
|
|
59
|
+
const unit = snapshotUnitMetrics(
|
|
60
|
+
metricsCtx,
|
|
61
|
+
"execute-task",
|
|
62
|
+
"M001/S01/T01",
|
|
63
|
+
Date.now() - 1000,
|
|
64
|
+
"openai/gpt-5.4",
|
|
65
|
+
{ traceId: "trace-123", turnId: "turn-123" },
|
|
66
|
+
);
|
|
67
|
+
assert.ok(unit);
|
|
68
|
+
resetMetrics();
|
|
69
|
+
|
|
70
|
+
setLogBasePath(basePath);
|
|
71
|
+
logWarning("engine", "audit bridge check", { id: "turn-123" });
|
|
72
|
+
|
|
73
|
+
const events = readAuditEvents(basePath);
|
|
74
|
+
const types = new Set(events.map((event) => String(event.type ?? "")));
|
|
75
|
+
assert.ok(types.has("journal-iteration-start"));
|
|
76
|
+
assert.ok(types.has("activity-log-saved"));
|
|
77
|
+
assert.ok(types.has("unit-metrics-snapshot"));
|
|
78
|
+
assert.ok(types.has("workflow-log-warn"));
|
|
79
|
+
} finally {
|
|
80
|
+
setUnifiedAuditEnabled(false);
|
|
81
|
+
resetMetrics();
|
|
82
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("unified audit bridge is disabled when toggle is off", () => {
|
|
87
|
+
const basePath = mkdtempSync(join(tmpdir(), "gsd-uok-audit-off-"));
|
|
88
|
+
setUnifiedAuditEnabled(false);
|
|
89
|
+
try {
|
|
90
|
+
emitJournalEvent(basePath, {
|
|
91
|
+
ts: new Date().toISOString(),
|
|
92
|
+
flowId: "trace-off",
|
|
93
|
+
seq: 1,
|
|
94
|
+
eventType: "iteration-start",
|
|
95
|
+
});
|
|
96
|
+
const events = readAuditEvents(basePath);
|
|
97
|
+
assert.equal(events.length, 0);
|
|
98
|
+
} finally {
|
|
99
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
100
|
+
}
|
|
101
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
AuditEventEnvelope,
|
|
6
|
+
GateResult,
|
|
7
|
+
TurnContract,
|
|
8
|
+
TurnResult,
|
|
9
|
+
UokNodeKind,
|
|
10
|
+
} from "../uok/contracts.ts";
|
|
11
|
+
import { buildAuditEnvelope } from "../uok/audit.ts";
|
|
12
|
+
|
|
13
|
+
test("uok contracts serialize/deserialize turn envelopes", () => {
|
|
14
|
+
const contract: TurnContract = {
|
|
15
|
+
traceId: "trace-1",
|
|
16
|
+
turnId: "turn-1",
|
|
17
|
+
iteration: 1,
|
|
18
|
+
basePath: "/tmp/project",
|
|
19
|
+
unitType: "execute-task",
|
|
20
|
+
unitId: "M001.S01.T01",
|
|
21
|
+
startedAt: new Date().toISOString(),
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const gate: GateResult = {
|
|
25
|
+
gateId: "Q3",
|
|
26
|
+
gateType: "policy",
|
|
27
|
+
outcome: "pass",
|
|
28
|
+
failureClass: "none",
|
|
29
|
+
attempt: 1,
|
|
30
|
+
maxAttempts: 1,
|
|
31
|
+
retryable: false,
|
|
32
|
+
evaluatedAt: new Date().toISOString(),
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const result: TurnResult = {
|
|
36
|
+
traceId: contract.traceId,
|
|
37
|
+
turnId: contract.turnId,
|
|
38
|
+
iteration: contract.iteration,
|
|
39
|
+
unitType: contract.unitType,
|
|
40
|
+
unitId: contract.unitId,
|
|
41
|
+
status: "completed",
|
|
42
|
+
failureClass: "none",
|
|
43
|
+
phaseResults: [
|
|
44
|
+
{ phase: "dispatch", action: "next", ts: new Date().toISOString() },
|
|
45
|
+
{ phase: "unit", action: "continue", ts: new Date().toISOString() },
|
|
46
|
+
{ phase: "finalize", action: "next", ts: new Date().toISOString() },
|
|
47
|
+
],
|
|
48
|
+
gateResults: [gate],
|
|
49
|
+
startedAt: contract.startedAt,
|
|
50
|
+
finishedAt: new Date().toISOString(),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const roundTrip = JSON.parse(JSON.stringify(result)) as TurnResult;
|
|
54
|
+
assert.equal(roundTrip.turnId, "turn-1");
|
|
55
|
+
assert.equal(roundTrip.gateResults?.[0]?.gateId, "Q3");
|
|
56
|
+
assert.equal(roundTrip.phaseResults.length, 3);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("uok contracts include required DAG node kinds", () => {
|
|
60
|
+
const required: UokNodeKind[] = [
|
|
61
|
+
"unit",
|
|
62
|
+
"hook",
|
|
63
|
+
"subagent",
|
|
64
|
+
"team-worker",
|
|
65
|
+
"verification",
|
|
66
|
+
"reprocess",
|
|
67
|
+
];
|
|
68
|
+
assert.deepEqual(required.length, 6);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("uok audit envelope includes trace/turn/causality fields", () => {
|
|
72
|
+
const event: AuditEventEnvelope = buildAuditEnvelope({
|
|
73
|
+
traceId: "trace-xyz",
|
|
74
|
+
turnId: "turn-xyz",
|
|
75
|
+
causedBy: "turn-start",
|
|
76
|
+
category: "orchestration",
|
|
77
|
+
type: "turn-result",
|
|
78
|
+
payload: { status: "completed" },
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
assert.equal(event.traceId, "trace-xyz");
|
|
82
|
+
assert.equal(event.turnId, "turn-xyz");
|
|
83
|
+
assert.equal(event.causedBy, "turn-start");
|
|
84
|
+
assert.equal(event.payload.status, "completed");
|
|
85
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import type { SidecarItem } from "../auto/session.ts";
|
|
4
|
+
import {
|
|
5
|
+
selectConflictFreeBatch,
|
|
6
|
+
selectReactiveDispatchBatch,
|
|
7
|
+
buildSidecarQueueNodes,
|
|
8
|
+
scheduleSidecarQueue,
|
|
9
|
+
} from "../uok/execution-graph.ts";
|
|
10
|
+
|
|
11
|
+
test("uok execution graph selects deterministic conflict-free IDs", () => {
|
|
12
|
+
const selected = selectConflictFreeBatch({
|
|
13
|
+
orderedIds: ["S01", "S02", "S03", "S04"],
|
|
14
|
+
maxParallel: 4,
|
|
15
|
+
hasConflict: (candidate, existing) =>
|
|
16
|
+
(candidate === "S02" && existing === "S01") ||
|
|
17
|
+
(candidate === "S01" && existing === "S02"),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
assert.deepEqual(selected, ["S01", "S03", "S04"]);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("uok execution graph reactive batch honors file conflicts and in-flight writes", () => {
|
|
24
|
+
const result = selectReactiveDispatchBatch({
|
|
25
|
+
graph: [
|
|
26
|
+
{ id: "T01", dependsOn: [], outputFiles: ["src/a.ts"] },
|
|
27
|
+
{ id: "T02", dependsOn: [], outputFiles: ["src/a.ts"] },
|
|
28
|
+
{ id: "T03", dependsOn: [], outputFiles: ["src/b.ts"] },
|
|
29
|
+
{ id: "T04", dependsOn: ["T03"], outputFiles: ["src/c.ts"] },
|
|
30
|
+
],
|
|
31
|
+
readyIds: ["T01", "T02", "T03", "T04"],
|
|
32
|
+
maxParallel: 3,
|
|
33
|
+
inFlightOutputs: new Set(["src/c.ts"]),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
assert.deepEqual(result.selected, ["T01", "T03"]);
|
|
37
|
+
assert.ok(
|
|
38
|
+
result.conflicts.some((c) => c.nodeA === "T01" && c.nodeB === "T02" && c.file === "src/a.ts"),
|
|
39
|
+
"conflict list should include overlapping outputs",
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("uok execution graph sidecar nodes map queue kinds to supported DAG kinds", () => {
|
|
44
|
+
const queue: SidecarItem[] = [
|
|
45
|
+
{ kind: "hook", unitType: "execute-task", unitId: "M001/S01/T01", prompt: "hook" },
|
|
46
|
+
{ kind: "triage", unitType: "triage", unitId: "M001/S01", prompt: "triage" },
|
|
47
|
+
{ kind: "quick-task", unitType: "quick-task", unitId: "M001/S01/Q01", prompt: "quick" },
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
const nodes = buildSidecarQueueNodes(queue);
|
|
51
|
+
assert.equal(nodes[0]?.kind, "hook");
|
|
52
|
+
assert.equal(nodes[1]?.kind, "verification");
|
|
53
|
+
assert.equal(nodes[2]?.kind, "team-worker");
|
|
54
|
+
assert.equal(nodes[1]?.dependsOn.length, 1);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("uok execution graph sidecar scheduler preserves deterministic queue order", async () => {
|
|
58
|
+
const queue: SidecarItem[] = [
|
|
59
|
+
{ kind: "quick-task", unitType: "quick-task", unitId: "M001/S01/Q01", prompt: "q1" },
|
|
60
|
+
{ kind: "hook", unitType: "hook", unitId: "M001/S01/H01", prompt: "h1" },
|
|
61
|
+
{ kind: "triage", unitType: "triage", unitId: "M001/S01/TR1", prompt: "t1" },
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
const scheduled = await scheduleSidecarQueue(queue);
|
|
65
|
+
assert.deepEqual(
|
|
66
|
+
scheduled.map((item) => item.unitId),
|
|
67
|
+
queue.map((item) => item.unitId),
|
|
68
|
+
);
|
|
69
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
|
|
4
|
+
import { resolveUokFlags } from "../uok/flags.ts";
|
|
5
|
+
|
|
6
|
+
test("uok flags default to enabled when preference is unset", () => {
|
|
7
|
+
const flags = resolveUokFlags(undefined);
|
|
8
|
+
assert.equal(flags.enabled, true);
|
|
9
|
+
assert.equal(flags.legacyFallback, false);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test("uok legacy fallback preference forces legacy path", () => {
|
|
13
|
+
const flags = resolveUokFlags({
|
|
14
|
+
uok: {
|
|
15
|
+
enabled: true,
|
|
16
|
+
legacy_fallback: { enabled: true },
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
assert.equal(flags.enabled, false);
|
|
20
|
+
assert.equal(flags.legacyFallback, true);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("uok legacy fallback env var forces legacy path", () => {
|
|
24
|
+
const previous = process.env.GSD_UOK_FORCE_LEGACY;
|
|
25
|
+
process.env.GSD_UOK_FORCE_LEGACY = "1";
|
|
26
|
+
try {
|
|
27
|
+
const flags = resolveUokFlags({
|
|
28
|
+
uok: {
|
|
29
|
+
enabled: true,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
assert.equal(flags.enabled, false);
|
|
33
|
+
assert.equal(flags.legacyFallback, true);
|
|
34
|
+
} finally {
|
|
35
|
+
if (previous === undefined) delete process.env.GSD_UOK_FORCE_LEGACY;
|
|
36
|
+
else process.env.GSD_UOK_FORCE_LEGACY = previous;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|