gsd-pi 2.74.0-dev.2b524c3 → 2.74.0-dev.658744a
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/cli.js +85 -0
- package/dist/headless-query.js +4 -1
- package/dist/help-text.js +23 -0
- package/dist/resources/extensions/gsd/activity-log.js +16 -0
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
- package/dist/resources/extensions/gsd/auto/loop.js +147 -10
- package/dist/resources/extensions/gsd/auto/phases.js +209 -10
- 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 +220 -17
- package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
- 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 +36 -4
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
- 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 +31 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +5 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
- package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
- package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
- package/dist/resources/extensions/gsd/commands-do.js +79 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
- package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
- package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +51 -4
- package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
- package/dist/resources/extensions/gsd/commands-ship.js +187 -0
- package/dist/resources/extensions/gsd/db-writer.js +3 -5
- 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 +157 -0
- package/dist/resources/extensions/gsd/gsd-db.js +581 -2
- package/dist/resources/extensions/gsd/guided-flow.js +31 -6
- package/dist/resources/extensions/gsd/index.js +15 -2
- package/dist/resources/extensions/gsd/init-wizard.js +1 -0
- package/dist/resources/extensions/gsd/journal.js +27 -0
- package/dist/resources/extensions/gsd/md-importer.js +3 -4
- package/dist/resources/extensions/gsd/memory-store.js +19 -51
- package/dist/resources/extensions/gsd/metrics.js +19 -0
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
- package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
- 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/prompts/add-tests.md +35 -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/state.js +5 -1
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
- 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/gsd/workflow-manifest.js +8 -69
- package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
- package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
- package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- 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 +3 -2
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/index.d.ts +3 -0
- package/packages/mcp-server/dist/index.d.ts.map +1 -1
- package/packages/mcp-server/dist/index.js +3 -0
- package/packages/mcp-server/dist/index.js.map +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
- package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/graph.js +655 -0
- package/packages/mcp-server/dist/readers/graph.js.map +1 -0
- package/packages/mcp-server/dist/readers/index.d.ts +2 -0
- package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
- package/packages/mcp-server/dist/readers/index.js +1 -0
- package/packages/mcp-server/dist/readers/index.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +65 -0
- package/packages/mcp-server/dist/server.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/package.json +2 -2
- package/packages/mcp-server/src/index.ts +15 -0
- package/packages/mcp-server/src/readers/graph.test.ts +604 -0
- package/packages/mcp-server/src/readers/graph.ts +855 -0
- package/packages/mcp-server/src/readers/index.ts +12 -0
- package/packages/mcp-server/src/server.ts +83 -0
- package/packages/mcp-server/src/workflow-tools.ts +95 -10
- package/packages/mcp-server/tsconfig.json +1 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
- package/packages/native/package.json +2 -2
- package/packages/native/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.json +1 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
- 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/package.json +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.json +1 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
- 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 +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/tsconfig.json +1 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.json +1 -0
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
- package/src/resources/extensions/gsd/activity-log.ts +21 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
- package/src/resources/extensions/gsd/auto/loop.ts +159 -10
- package/src/resources/extensions/gsd/auto/phases.ts +261 -10
- 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 +238 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
- 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 +41 -2
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +5 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
- 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 +31 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +5 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
- package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
- package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
- package/src/resources/extensions/gsd/commands-do.ts +109 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
- package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
- package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +58 -4
- package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
- package/src/resources/extensions/gsd/commands-ship.ts +219 -0
- package/src/resources/extensions/gsd/db-writer.ts +3 -5
- 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 +212 -0
- package/src/resources/extensions/gsd/gsd-db.ts +788 -3
- package/src/resources/extensions/gsd/guided-flow.ts +36 -2
- package/src/resources/extensions/gsd/index.ts +18 -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/md-importer.ts +3 -5
- package/src/resources/extensions/gsd/memory-store.ts +31 -62
- package/src/resources/extensions/gsd/metrics.ts +26 -0
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
- package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
- 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/prompts/add-tests.md +35 -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/state.ts +9 -2
- 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-backlog.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
- package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -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/extension-bootstrap-isolation.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
- package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
- 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 +71 -4
- 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/native-git-bridge-exec-fallback.test.ts +140 -0
- 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/single-writer-invariant.test.ts +180 -0
- 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/tests/workflow-logger-wiring.test.ts +223 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
- package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
- 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/gsd/workflow-manifest.ts +9 -104
- package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
- package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
- package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
- 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/{YzIEI9sxJy4t5xgClF08g → Es_JWCfFZjIvYZShmjyye}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → Es_JWCfFZjIvYZShmjyye}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -141,6 +141,91 @@ if (cliFlags.messages[0] === 'update') {
|
|
|
141
141
|
await runUpdate();
|
|
142
142
|
process.exit(0);
|
|
143
143
|
}
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// Graph subcommand — `gsd graph build|status|query|diff`
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
if (cliFlags.messages[0] === 'graph') {
|
|
148
|
+
const sub = cliFlags.messages[1];
|
|
149
|
+
const { buildGraph, writeGraph, graphStatus, graphQuery, graphDiff, resolveGsdRoot } = await import('@gsd-build/mcp-server');
|
|
150
|
+
const projectDir = process.cwd();
|
|
151
|
+
const gsdRoot = resolveGsdRoot(projectDir);
|
|
152
|
+
if (!sub || sub === 'build') {
|
|
153
|
+
try {
|
|
154
|
+
const graph = await buildGraph(projectDir);
|
|
155
|
+
await writeGraph(gsdRoot, graph);
|
|
156
|
+
process.stdout.write(`Graph built: ${graph.nodes.length} nodes, ${graph.edges.length} edges\n`);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
process.stderr.write(`[gsd] graph build failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else if (sub === 'status') {
|
|
164
|
+
try {
|
|
165
|
+
const result = await graphStatus(projectDir);
|
|
166
|
+
if (!result.exists) {
|
|
167
|
+
process.stdout.write('Graph: not built yet. Run: gsd graph build\n');
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
process.stdout.write(`Graph status:\n`);
|
|
171
|
+
process.stdout.write(` exists: ${result.exists}\n`);
|
|
172
|
+
process.stdout.write(` nodes: ${result.nodeCount}\n`);
|
|
173
|
+
process.stdout.write(` edges: ${result.edgeCount}\n`);
|
|
174
|
+
process.stdout.write(` stale: ${result.stale}\n`);
|
|
175
|
+
process.stdout.write(` ageHours: ${result.ageHours !== undefined ? result.ageHours.toFixed(2) : 'n/a'}\n`);
|
|
176
|
+
process.stdout.write(` lastBuild: ${result.lastBuild ?? 'n/a'}\n`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
process.stderr.write(`[gsd] graph status failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else if (sub === 'query') {
|
|
185
|
+
const term = cliFlags.messages[2];
|
|
186
|
+
if (!term) {
|
|
187
|
+
process.stderr.write('Usage: gsd graph query <term>\n');
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
const result = await graphQuery(projectDir, term);
|
|
192
|
+
if (result.nodes.length === 0) {
|
|
193
|
+
process.stdout.write(`No nodes found for term: "${term}"\n`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
process.stdout.write(`Query results for "${term}" (${result.nodes.length} nodes, ${result.edges.length} edges):\n`);
|
|
197
|
+
for (const node of result.nodes) {
|
|
198
|
+
process.stdout.write(` [${node.type}] ${node.label} (${node.confidence})\n`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
process.stderr.write(`[gsd] graph query failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else if (sub === 'diff') {
|
|
208
|
+
try {
|
|
209
|
+
const result = await graphDiff(projectDir);
|
|
210
|
+
process.stdout.write(`Graph diff:\n`);
|
|
211
|
+
process.stdout.write(` nodes added: ${result.nodes.added.length}\n`);
|
|
212
|
+
process.stdout.write(` nodes removed: ${result.nodes.removed.length}\n`);
|
|
213
|
+
process.stdout.write(` nodes changed: ${result.nodes.changed.length}\n`);
|
|
214
|
+
process.stdout.write(` edges added: ${result.edges.added.length}\n`);
|
|
215
|
+
process.stdout.write(` edges removed: ${result.edges.removed.length}\n`);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
process.stderr.write(`[gsd] graph diff failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
process.stderr.write(`Unknown graph command: ${sub}\n`);
|
|
224
|
+
process.stderr.write('Commands: build, status, query <term>, diff\n');
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
process.exit(0);
|
|
228
|
+
}
|
|
144
229
|
exitIfManagedResourcesAreNewer(agentDir);
|
|
145
230
|
// Early TTY check — must come before heavy initialization to avoid dangling
|
|
146
231
|
// handles that prevent process.exit() from completing promptly.
|
package/dist/headless-query.js
CHANGED
|
@@ -33,7 +33,9 @@ async function loadExtensionModules() {
|
|
|
33
33
|
const dispatchModule = await jiti.import(gsdExtensionPath('auto-dispatch.ts'), {});
|
|
34
34
|
const sessionModule = await jiti.import(gsdExtensionPath('session-status-io.ts'), {});
|
|
35
35
|
const prefsModule = await jiti.import(gsdExtensionPath('preferences.ts'), {});
|
|
36
|
+
const autoStartModule = await jiti.import(gsdExtensionPath('auto-start.ts'), {});
|
|
36
37
|
return {
|
|
38
|
+
openProjectDbIfPresent: autoStartModule.openProjectDbIfPresent,
|
|
37
39
|
deriveState: stateModule.deriveState,
|
|
38
40
|
resolveDispatch: dispatchModule.resolveDispatch,
|
|
39
41
|
readAllSessionStatuses: sessionModule.readAllSessionStatuses,
|
|
@@ -42,7 +44,8 @@ async function loadExtensionModules() {
|
|
|
42
44
|
}
|
|
43
45
|
// ─── Implementation ─────────────────────────────────────────────────────────
|
|
44
46
|
export async function handleQuery(basePath) {
|
|
45
|
-
const { deriveState, resolveDispatch, readAllSessionStatuses, loadEffectiveGSDPreferences } = await loadExtensionModules();
|
|
47
|
+
const { openProjectDbIfPresent, deriveState, resolveDispatch, readAllSessionStatuses, loadEffectiveGSDPreferences, } = await loadExtensionModules();
|
|
48
|
+
await openProjectDbIfPresent(basePath);
|
|
46
49
|
const state = await deriveState(basePath);
|
|
47
50
|
// Derive next dispatch action
|
|
48
51
|
let next;
|
package/dist/help-text.js
CHANGED
|
@@ -84,6 +84,28 @@ const SUBCOMMAND_HELP = {
|
|
|
84
84
|
' gsd worktree remove old-branch Remove a specific worktree',
|
|
85
85
|
' gsd worktree remove old-branch --force Remove even with unmerged changes',
|
|
86
86
|
].join('\n'),
|
|
87
|
+
graph: [
|
|
88
|
+
'Usage: gsd graph <subcommand> [options]',
|
|
89
|
+
'',
|
|
90
|
+
'Manage the GSD project knowledge graph. Reads .gsd/ artifacts and builds',
|
|
91
|
+
'a queryable graph of milestones, slices, tasks, rules, patterns, and lessons.',
|
|
92
|
+
'',
|
|
93
|
+
'Subcommands:',
|
|
94
|
+
' build Parse .gsd/ artifacts (STATE.md, milestone ROADMAPs, slice PLANs,',
|
|
95
|
+
' KNOWLEDGE.md) and write .gsd/graphs/graph.json atomically.',
|
|
96
|
+
' query Search graph nodes by term (BFS from seed matches, budget-trimmed).',
|
|
97
|
+
' Returns matching nodes and reachable edges within the token budget.',
|
|
98
|
+
' status Show whether graph.json exists, its age, node/edge counts, and',
|
|
99
|
+
' whether it is stale (built more than 24 hours ago).',
|
|
100
|
+
' diff Compare current graph.json with .last-build-snapshot.json.',
|
|
101
|
+
' Returns added, removed, and changed nodes and edges.',
|
|
102
|
+
'',
|
|
103
|
+
'Examples:',
|
|
104
|
+
' gsd graph build Build the graph from .gsd/ artifacts',
|
|
105
|
+
' gsd graph status Check graph age and node/edge counts',
|
|
106
|
+
' gsd graph query auth Find nodes related to "auth"',
|
|
107
|
+
' gsd graph diff Show changes since last snapshot',
|
|
108
|
+
].join('\n'),
|
|
87
109
|
headless: [
|
|
88
110
|
'Usage: gsd headless [flags] [command] [args...]',
|
|
89
111
|
'',
|
|
@@ -165,6 +187,7 @@ export function printHelp(version) {
|
|
|
165
187
|
process.stdout.write(' worktree <cmd> Manage worktrees (list, merge, clean, remove)\n');
|
|
166
188
|
process.stdout.write(' auto [args] Run auto-mode without TUI (pipeable)\n');
|
|
167
189
|
process.stdout.write(' headless [cmd] [args] Run /gsd commands without TUI (default: auto)\n');
|
|
190
|
+
process.stdout.write(' graph <subcommand> Manage knowledge graph (build, query, status, diff)\n');
|
|
168
191
|
process.stdout.write('\nRun gsd <subcommand> --help for subcommand-specific help.\n');
|
|
169
192
|
}
|
|
170
193
|
export function printSubcommandHelp(subcommand, version) {
|
|
@@ -13,6 +13,8 @@ import { join } from "node:path";
|
|
|
13
13
|
import { GSDError, GSD_IO_ERROR } from "./errors.js";
|
|
14
14
|
const SEQ_PREFIX_RE = /^(\d+)-/;
|
|
15
15
|
import { gsdRoot } from "./paths.js";
|
|
16
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
17
|
+
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
16
18
|
const activityLogState = new Map();
|
|
17
19
|
/**
|
|
18
20
|
* Clear accumulated activity log state (#611).
|
|
@@ -110,6 +112,20 @@ export function saveActivityLog(ctx, basePath, unitType, unitId) {
|
|
|
110
112
|
}
|
|
111
113
|
state.nextSeq += 1;
|
|
112
114
|
state.lastSnapshotKeyByUnit.set(unitKey, key);
|
|
115
|
+
if (isUnifiedAuditEnabled()) {
|
|
116
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
117
|
+
traceId: `activity:${unitType}:${unitId}`,
|
|
118
|
+
turnId: unitId,
|
|
119
|
+
category: "execution",
|
|
120
|
+
type: "activity-log-saved",
|
|
121
|
+
payload: {
|
|
122
|
+
unitType,
|
|
123
|
+
unitId,
|
|
124
|
+
filePath,
|
|
125
|
+
entryCount: entries.length,
|
|
126
|
+
},
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
113
129
|
return filePath;
|
|
114
130
|
}
|
|
115
131
|
catch (e) {
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Leaf node in the import DAG.
|
|
5
5
|
*/
|
|
6
|
+
import { summarizeLogs } from "../workflow-logger.js";
|
|
6
7
|
/**
|
|
7
8
|
* Pattern matching ENOENT errors with a file path.
|
|
8
9
|
* Matches: "ENOENT: no such file or directory, access '/path/to/file'"
|
|
@@ -22,13 +23,19 @@ const ENOENT_PATH_RE = /ENOENT[^']*'([^']+)'/;
|
|
|
22
23
|
export function detectStuck(window) {
|
|
23
24
|
if (window.length < 2)
|
|
24
25
|
return null;
|
|
26
|
+
// Peek (not drain) the workflow-logger buffer so stuck reasons can surface
|
|
27
|
+
// the underlying diagnostic context (projection failures, DB degradations,
|
|
28
|
+
// reconcile warnings) that usually explains *why* the loop is stuck. The
|
|
29
|
+
// auto-loop's finalize step owns the buffer lifecycle — this is read-only.
|
|
30
|
+
const loggerSummary = summarizeLogs();
|
|
31
|
+
const suffix = loggerSummary ? ` — ${loggerSummary}` : "";
|
|
25
32
|
const last = window[window.length - 1];
|
|
26
33
|
const prev = window[window.length - 2];
|
|
27
34
|
// Rule 1: Same error repeated consecutively
|
|
28
35
|
if (last.error && prev.error && last.error === prev.error) {
|
|
29
36
|
return {
|
|
30
37
|
stuck: true,
|
|
31
|
-
reason: `Same error repeated: ${last.error.slice(0, 200)}`,
|
|
38
|
+
reason: `Same error repeated: ${last.error.slice(0, 200)}${suffix}`,
|
|
32
39
|
};
|
|
33
40
|
}
|
|
34
41
|
// Rule 2: Same unit 3+ consecutive times
|
|
@@ -37,7 +44,7 @@ export function detectStuck(window) {
|
|
|
37
44
|
if (lastThree.every((u) => u.key === last.key)) {
|
|
38
45
|
return {
|
|
39
46
|
stuck: true,
|
|
40
|
-
reason: `${last.key} derived 3 consecutive times without progress`,
|
|
47
|
+
reason: `${last.key} derived 3 consecutive times without progress${suffix}`,
|
|
41
48
|
};
|
|
42
49
|
}
|
|
43
50
|
}
|
|
@@ -49,7 +56,7 @@ export function detectStuck(window) {
|
|
|
49
56
|
w[0].key !== w[1].key) {
|
|
50
57
|
return {
|
|
51
58
|
stuck: true,
|
|
52
|
-
reason: `Oscillation detected: ${w[0].key} ↔ ${w[1].key}`,
|
|
59
|
+
reason: `Oscillation detected: ${w[0].key} ↔ ${w[1].key}${suffix}`,
|
|
53
60
|
};
|
|
54
61
|
}
|
|
55
62
|
}
|
|
@@ -67,7 +74,7 @@ export function detectStuck(window) {
|
|
|
67
74
|
if (count >= 2) {
|
|
68
75
|
return {
|
|
69
76
|
stuck: true,
|
|
70
|
-
reason: `Missing file referenced twice: ${filePath} (ENOENT)`,
|
|
77
|
+
reason: `Missing file referenced twice: ${filePath} (ENOENT)${suffix}`,
|
|
71
78
|
};
|
|
72
79
|
}
|
|
73
80
|
enoentPaths.set(filePath, count);
|
|
@@ -15,6 +15,8 @@ import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterM
|
|
|
15
15
|
import { resolveEngine } from "../engine-resolver.js";
|
|
16
16
|
import { logWarning } from "../workflow-logger.js";
|
|
17
17
|
import { gsdRoot } from "../paths.js";
|
|
18
|
+
import { resolveUokFlags } from "../uok/flags.js";
|
|
19
|
+
import { scheduleSidecarQueue } from "../uok/execution-graph.js";
|
|
18
20
|
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
19
21
|
import { join } from "node:path";
|
|
20
22
|
// ── Stuck detection persistence (#3704) ──────────────────────────────────
|
|
@@ -104,6 +106,40 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
104
106
|
const flowId = randomUUID();
|
|
105
107
|
let seqCounter = 0;
|
|
106
108
|
const nextSeq = () => ++seqCounter;
|
|
109
|
+
const turnId = randomUUID();
|
|
110
|
+
s.currentTraceId = flowId;
|
|
111
|
+
s.currentTurnId = turnId;
|
|
112
|
+
const turnStartedAt = new Date().toISOString();
|
|
113
|
+
let observedUnitType;
|
|
114
|
+
let observedUnitId;
|
|
115
|
+
let turnFinished = false;
|
|
116
|
+
const finishTurn = (status, failureClass = "none", error) => {
|
|
117
|
+
if (turnFinished)
|
|
118
|
+
return;
|
|
119
|
+
turnFinished = true;
|
|
120
|
+
deps.uokObserver?.onTurnResult({
|
|
121
|
+
traceId: flowId,
|
|
122
|
+
turnId,
|
|
123
|
+
iteration,
|
|
124
|
+
unitType: observedUnitType,
|
|
125
|
+
unitId: observedUnitId,
|
|
126
|
+
status,
|
|
127
|
+
failureClass,
|
|
128
|
+
phaseResults: [],
|
|
129
|
+
error,
|
|
130
|
+
startedAt: turnStartedAt,
|
|
131
|
+
finishedAt: new Date().toISOString(),
|
|
132
|
+
});
|
|
133
|
+
s.currentTraceId = null;
|
|
134
|
+
s.currentTurnId = null;
|
|
135
|
+
};
|
|
136
|
+
deps.uokObserver?.onTurnStart({
|
|
137
|
+
traceId: flowId,
|
|
138
|
+
turnId,
|
|
139
|
+
iteration,
|
|
140
|
+
basePath: s.basePath,
|
|
141
|
+
startedAt: turnStartedAt,
|
|
142
|
+
});
|
|
107
143
|
if (iteration > MAX_LOOP_ITERATIONS) {
|
|
108
144
|
debugLog("autoLoop", {
|
|
109
145
|
phase: "exit",
|
|
@@ -111,6 +147,7 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
111
147
|
iteration,
|
|
112
148
|
});
|
|
113
149
|
await deps.stopAuto(ctx, pi, `Safety: loop exceeded ${MAX_LOOP_ITERATIONS} iterations — possible runaway`);
|
|
150
|
+
finishTurn("stopped", "manual-attention", "max-iterations");
|
|
114
151
|
break;
|
|
115
152
|
}
|
|
116
153
|
// ── Memory pressure check (#3331) ──
|
|
@@ -123,19 +160,30 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
123
160
|
await deps.stopAuto(ctx, pi, `Memory pressure: heap at ${mem.heapMB}MB / ${mem.limitMB}MB (${Math.round(mem.pct * 100)}%). ` +
|
|
124
161
|
`Stopping gracefully to prevent OOM kill after ${iteration} iterations. ` +
|
|
125
162
|
`Resume with /gsd auto to continue from where you left off.`);
|
|
163
|
+
finishTurn("stopped", "timeout", "memory-pressure");
|
|
126
164
|
break;
|
|
127
165
|
}
|
|
128
166
|
}
|
|
129
167
|
if (!s.cmdCtx) {
|
|
130
168
|
debugLog("autoLoop", { phase: "exit", reason: "no-cmdCtx" });
|
|
169
|
+
finishTurn("stopped", "manual-attention", "missing-command-context");
|
|
131
170
|
break;
|
|
132
171
|
}
|
|
133
172
|
try {
|
|
134
173
|
// ── Blanket try/catch: one bad iteration must not kill the session
|
|
135
174
|
const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
|
|
175
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
136
176
|
// ── Check sidecar queue before deriveState ──
|
|
137
177
|
let sidecarItem;
|
|
138
178
|
if (s.sidecarQueue.length > 0) {
|
|
179
|
+
if (uokFlags.executionGraph && s.sidecarQueue.length > 1) {
|
|
180
|
+
try {
|
|
181
|
+
s.sidecarQueue = await scheduleSidecarQueue(s.sidecarQueue);
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
logWarning("dispatch", `sidecar queue scheduling failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
139
187
|
sidecarItem = s.sidecarQueue.shift();
|
|
140
188
|
debugLog("autoLoop", {
|
|
141
189
|
phase: "sidecar-dequeue",
|
|
@@ -210,25 +258,49 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
210
258
|
isRetry: false,
|
|
211
259
|
previousTier: undefined,
|
|
212
260
|
};
|
|
261
|
+
observedUnitType = iterData.unitType;
|
|
262
|
+
observedUnitId = iterData.unitId;
|
|
213
263
|
// ── Progress widget (mirrors dev path in runDispatch) ──
|
|
214
264
|
deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state);
|
|
215
265
|
// ── Guards (shared with dev path) ──
|
|
216
266
|
const guardsResult = await runGuards(ic, s.currentMilestoneId ?? "workflow");
|
|
217
|
-
|
|
267
|
+
deps.uokObserver?.onPhaseResult("guard", guardsResult.action, {
|
|
268
|
+
unitType: iterData.unitType,
|
|
269
|
+
unitId: iterData.unitId,
|
|
270
|
+
});
|
|
271
|
+
if (guardsResult.action === "break") {
|
|
272
|
+
finishTurn("stopped", "manual-attention", "guard-break");
|
|
218
273
|
break;
|
|
274
|
+
}
|
|
219
275
|
// ── Unit execution (shared with dev path) ──
|
|
220
276
|
const unitPhaseResult = await runUnitPhase(ic, iterData, loopState);
|
|
221
|
-
|
|
277
|
+
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
278
|
+
unitType: iterData.unitType,
|
|
279
|
+
unitId: iterData.unitId,
|
|
280
|
+
});
|
|
281
|
+
if (unitPhaseResult.action === "break") {
|
|
282
|
+
finishTurn("stopped", "execution", "unit-break");
|
|
222
283
|
break;
|
|
284
|
+
}
|
|
223
285
|
// ── Verify first, then reconcile (only mark complete on pass) ──
|
|
224
286
|
debugLog("autoLoop", { phase: "custom-engine-verify", iteration, unitId: iterData.unitId });
|
|
225
287
|
const verifyResult = await policy.verify(iterData.unitType, iterData.unitId, { basePath: s.basePath });
|
|
226
288
|
if (verifyResult === "pause") {
|
|
227
289
|
await deps.pauseAuto(ctx, pi);
|
|
290
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
|
|
291
|
+
unitType: iterData.unitType,
|
|
292
|
+
unitId: iterData.unitId,
|
|
293
|
+
});
|
|
294
|
+
finishTurn("paused", "manual-attention", "custom-engine-verify-pause");
|
|
228
295
|
break;
|
|
229
296
|
}
|
|
230
297
|
if (verifyResult === "retry") {
|
|
231
298
|
debugLog("autoLoop", { phase: "custom-engine-verify-retry", iteration, unitId: iterData.unitId });
|
|
299
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "retry", {
|
|
300
|
+
unitType: iterData.unitType,
|
|
301
|
+
unitId: iterData.unitId,
|
|
302
|
+
});
|
|
303
|
+
finishTurn("retry");
|
|
232
304
|
continue;
|
|
233
305
|
}
|
|
234
306
|
// Verification passed — mark step complete
|
|
@@ -248,37 +320,73 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
248
320
|
debugLog("autoLoop", { phase: "iteration-complete", iteration });
|
|
249
321
|
if (reconcileResult.outcome === "milestone-complete") {
|
|
250
322
|
await deps.stopAuto(ctx, pi, "Workflow complete");
|
|
323
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "milestone-complete", {
|
|
324
|
+
unitType: iterData.unitType,
|
|
325
|
+
unitId: iterData.unitId,
|
|
326
|
+
});
|
|
327
|
+
finishTurn("completed");
|
|
251
328
|
break;
|
|
252
329
|
}
|
|
253
330
|
if (reconcileResult.outcome === "pause") {
|
|
254
331
|
await deps.pauseAuto(ctx, pi);
|
|
332
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
|
|
333
|
+
unitType: iterData.unitType,
|
|
334
|
+
unitId: iterData.unitId,
|
|
335
|
+
});
|
|
336
|
+
finishTurn("paused", "manual-attention");
|
|
255
337
|
break;
|
|
256
338
|
}
|
|
257
339
|
if (reconcileResult.outcome === "stop") {
|
|
258
340
|
await deps.stopAuto(ctx, pi, reconcileResult.reason ?? "Engine stopped");
|
|
341
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "stop", {
|
|
342
|
+
unitType: iterData.unitType,
|
|
343
|
+
unitId: iterData.unitId,
|
|
344
|
+
reason: reconcileResult.reason,
|
|
345
|
+
});
|
|
346
|
+
finishTurn("stopped", "manual-attention", reconcileResult.reason);
|
|
259
347
|
break;
|
|
260
348
|
}
|
|
349
|
+
deps.uokObserver?.onPhaseResult("custom-engine", "continue", {
|
|
350
|
+
unitType: iterData.unitType,
|
|
351
|
+
unitId: iterData.unitId,
|
|
352
|
+
});
|
|
353
|
+
finishTurn("completed");
|
|
261
354
|
continue;
|
|
262
355
|
}
|
|
263
356
|
if (!sidecarItem) {
|
|
264
357
|
// ── Phase 1: Pre-dispatch ─────────────────────────────────────────
|
|
265
358
|
const preDispatchResult = await runPreDispatch(ic, loopState);
|
|
266
|
-
|
|
359
|
+
deps.uokObserver?.onPhaseResult("pre-dispatch", preDispatchResult.action);
|
|
360
|
+
if (preDispatchResult.action === "break") {
|
|
361
|
+
finishTurn("stopped", "manual-attention", "pre-dispatch-break");
|
|
267
362
|
break;
|
|
268
|
-
|
|
363
|
+
}
|
|
364
|
+
if (preDispatchResult.action === "continue") {
|
|
365
|
+
finishTurn("skipped");
|
|
269
366
|
continue;
|
|
367
|
+
}
|
|
270
368
|
const preData = preDispatchResult.data;
|
|
271
369
|
// ── Phase 2: Guards ───────────────────────────────────────────────
|
|
272
370
|
const guardsResult = await runGuards(ic, preData.mid);
|
|
273
|
-
|
|
371
|
+
deps.uokObserver?.onPhaseResult("guard", guardsResult.action);
|
|
372
|
+
if (guardsResult.action === "break") {
|
|
373
|
+
finishTurn("stopped", "manual-attention", "guard-break");
|
|
274
374
|
break;
|
|
375
|
+
}
|
|
275
376
|
// ── Phase 3: Dispatch ─────────────────────────────────────────────
|
|
276
377
|
const dispatchResult = await runDispatch(ic, preData, loopState);
|
|
277
|
-
|
|
378
|
+
deps.uokObserver?.onPhaseResult("dispatch", dispatchResult.action);
|
|
379
|
+
if (dispatchResult.action === "break") {
|
|
380
|
+
finishTurn("stopped", "manual-attention", "dispatch-break");
|
|
278
381
|
break;
|
|
279
|
-
|
|
382
|
+
}
|
|
383
|
+
if (dispatchResult.action === "continue") {
|
|
384
|
+
finishTurn("skipped");
|
|
280
385
|
continue;
|
|
386
|
+
}
|
|
281
387
|
iterData = dispatchResult.data;
|
|
388
|
+
observedUnitType = iterData.unitType;
|
|
389
|
+
observedUnitId = iterData.unitId;
|
|
282
390
|
}
|
|
283
391
|
else {
|
|
284
392
|
// ── Sidecar path: use values from the sidecar item directly ──
|
|
@@ -294,21 +402,46 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
294
402
|
midTitle: sidecarState.activeMilestone?.title,
|
|
295
403
|
isRetry: false, previousTier: undefined,
|
|
296
404
|
};
|
|
405
|
+
observedUnitType = iterData.unitType;
|
|
406
|
+
observedUnitId = iterData.unitId;
|
|
407
|
+
deps.uokObserver?.onPhaseResult("dispatch", "sidecar", {
|
|
408
|
+
unitType: iterData.unitType,
|
|
409
|
+
unitId: iterData.unitId,
|
|
410
|
+
sidecarKind: sidecarItem.kind,
|
|
411
|
+
});
|
|
297
412
|
}
|
|
298
413
|
const unitPhaseResult = await runUnitPhase(ic, iterData, loopState, sidecarItem);
|
|
299
|
-
|
|
414
|
+
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
415
|
+
unitType: iterData.unitType,
|
|
416
|
+
unitId: iterData.unitId,
|
|
417
|
+
});
|
|
418
|
+
if (unitPhaseResult.action === "break") {
|
|
419
|
+
finishTurn("stopped", "execution", "unit-break");
|
|
300
420
|
break;
|
|
421
|
+
}
|
|
301
422
|
// ── Phase 5: Finalize ───────────────────────────────────────────────
|
|
302
423
|
const finalizeResult = await runFinalize(ic, iterData, loopState, sidecarItem);
|
|
303
|
-
|
|
424
|
+
deps.uokObserver?.onPhaseResult("finalize", finalizeResult.action, {
|
|
425
|
+
unitType: iterData.unitType,
|
|
426
|
+
unitId: iterData.unitId,
|
|
427
|
+
});
|
|
428
|
+
if (finalizeResult.action === "break") {
|
|
429
|
+
const finalizeFailureClass = finalizeResult.reason === "git-closeout-failure"
|
|
430
|
+
? "git"
|
|
431
|
+
: "closeout";
|
|
432
|
+
finishTurn("stopped", finalizeFailureClass, "finalize-break");
|
|
304
433
|
break;
|
|
305
|
-
|
|
434
|
+
}
|
|
435
|
+
if (finalizeResult.action === "continue") {
|
|
436
|
+
finishTurn("retry");
|
|
306
437
|
continue;
|
|
438
|
+
}
|
|
307
439
|
consecutiveErrors = 0; // Iteration completed successfully
|
|
308
440
|
consecutiveCooldowns = 0;
|
|
309
441
|
recentErrorMessages.length = 0;
|
|
310
442
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId, seq: nextSeq(), eventType: "iteration-end", data: { iteration } });
|
|
311
443
|
debugLog("autoLoop", { phase: "iteration-complete", iteration });
|
|
444
|
+
finishTurn("completed");
|
|
312
445
|
}
|
|
313
446
|
catch (loopErr) {
|
|
314
447
|
// ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
|
|
@@ -330,6 +463,7 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
330
463
|
});
|
|
331
464
|
ctx.ui.notify(`Auto-mode stopped: infrastructure error ${infraCode} — ${msg}`, "error");
|
|
332
465
|
await deps.stopAuto(ctx, pi, `Infrastructure error (${infraCode}): not recoverable by retry`);
|
|
466
|
+
finishTurn("failed", "execution", msg);
|
|
333
467
|
break;
|
|
334
468
|
}
|
|
335
469
|
// ── Credential cooldown: wait and retry with bounded budget ──
|
|
@@ -358,6 +492,7 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
358
492
|
: COOLDOWN_FALLBACK_WAIT_MS;
|
|
359
493
|
ctx.ui.notify(`Credentials in cooldown (${consecutiveCooldowns}/${MAX_COOLDOWN_RETRIES}) — waiting ${Math.round(waitMs / 1000)}s before retrying.`, "warning");
|
|
360
494
|
await new Promise(resolve => setTimeout(resolve, waitMs));
|
|
495
|
+
finishTurn("retry", "timeout", msg);
|
|
361
496
|
continue; // Retry iteration without incrementing consecutiveErrors
|
|
362
497
|
}
|
|
363
498
|
consecutiveErrors++;
|
|
@@ -375,6 +510,7 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
375
510
|
.join("\n");
|
|
376
511
|
ctx.ui.notify(`Auto-mode stopped: ${consecutiveErrors} consecutive iteration failures:\n${errorHistory}`, "error");
|
|
377
512
|
await deps.stopAuto(ctx, pi, `${consecutiveErrors} consecutive iteration failures`);
|
|
513
|
+
finishTurn("failed", "execution", msg);
|
|
378
514
|
break;
|
|
379
515
|
}
|
|
380
516
|
else if (consecutiveErrors === 2) {
|
|
@@ -386,6 +522,7 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
386
522
|
// 1st error: log and retry — transient failures happen
|
|
387
523
|
ctx.ui.notify(`Iteration error: ${msg}. Retrying.`, "warning");
|
|
388
524
|
}
|
|
525
|
+
finishTurn("retry", "execution", msg);
|
|
389
526
|
}
|
|
390
527
|
}
|
|
391
528
|
_clearCurrentResolve();
|