gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.96d4bb599
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/README.md +186 -149
- package/dist/claude-cli-check.d.ts +10 -0
- package/dist/claude-cli-check.js +13 -3
- package/dist/headless-events.d.ts +1 -1
- package/dist/headless-events.js +5 -2
- package/dist/headless.js +5 -6
- package/dist/loader.js +0 -0
- package/dist/onboarding.d.ts +20 -1
- package/dist/onboarding.js +99 -39
- package/dist/resources/extensions/ask-user-questions.js +17 -5
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
- package/dist/resources/extensions/gsd/auto/loop.js +67 -4
- package/dist/resources/extensions/gsd/auto/phases.js +70 -47
- package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
- package/dist/resources/extensions/gsd/auto/session.js +5 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +112 -6
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +11 -3
- package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +173 -39
- package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
- package/dist/resources/extensions/gsd/auto-start.js +5 -3
- package/dist/resources/extensions/gsd/auto-verification.js +3 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
- package/dist/resources/extensions/gsd/auto.js +57 -25
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +128 -0
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +17 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
- package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
- package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
- package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +21 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
- package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
- package/dist/resources/extensions/gsd/commands-config.js +5 -0
- package/dist/resources/extensions/gsd/commands-debug.js +388 -0
- package/dist/resources/extensions/gsd/commands-do.js +1 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
- package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
- package/dist/resources/extensions/gsd/commands-memory.js +462 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
- package/dist/resources/extensions/gsd/commands-scan.js +94 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
- package/dist/resources/extensions/gsd/db-writer.js +1 -0
- package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
- package/dist/resources/extensions/gsd/definition-loader.js +7 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
- package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
- package/dist/resources/extensions/gsd/doctor.js +7 -1
- package/dist/resources/extensions/gsd/error-classifier.js +6 -3
- package/dist/resources/extensions/gsd/escalation.js +321 -0
- package/dist/resources/extensions/gsd/forensics.js +26 -29
- package/dist/resources/extensions/gsd/git-service.js +0 -1
- package/dist/resources/extensions/gsd/graph.js +26 -2
- package/dist/resources/extensions/gsd/gsd-db.js +490 -32
- package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
- package/dist/resources/extensions/gsd/health-widget.js +7 -4
- package/dist/resources/extensions/gsd/init-wizard.js +86 -45
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
- package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
- package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
- package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
- package/dist/resources/extensions/gsd/memory-relations.js +189 -0
- package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
- package/dist/resources/extensions/gsd/memory-store.js +299 -6
- package/dist/resources/extensions/gsd/metrics.js +1 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
- package/dist/resources/extensions/gsd/model-router.js +16 -6
- package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
- package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
- package/dist/resources/extensions/gsd/notification-widget.js +24 -39
- package/dist/resources/extensions/gsd/notifications.js +4 -0
- package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
- package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
- package/dist/resources/extensions/gsd/preferences-models.js +1 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
- package/dist/resources/extensions/gsd/preferences.js +10 -10
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
- package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/dist/resources/extensions/gsd/python-resolver.js +70 -0
- package/dist/resources/extensions/gsd/run-manager.js +37 -17
- package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
- package/dist/resources/extensions/gsd/state.js +47 -3
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +306 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
- package/dist/resources/extensions/gsd/uok/flags.js +7 -7
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/verification-gate.js +2 -1
- package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
- package/dist/resources/extensions/gsd/workflow-install.js +327 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
- package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
- package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
- package/dist/resources/extensions/remote-questions/commands.js +380 -0
- package/dist/resources/extensions/remote-questions/manager.js +39 -5
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
- package/dist/resources/extensions/shared/interview-ui.js +189 -1
- package/dist/resources/extensions/shared/layout-utils.js +17 -0
- package/dist/resources/extensions/shared/rtk-shared.js +47 -0
- package/dist/resources/extensions/shared/rtk.js +3 -46
- package/dist/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/rtk-shared.d.ts +10 -0
- package/dist/rtk-shared.js +47 -0
- package/dist/rtk.d.ts +2 -6
- package/dist/rtk.js +3 -48
- package/dist/shared/workspace-types.d.ts +52 -0
- package/dist/shared/workspace-types.js +1 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +10 -0
- package/dist/update-check.js +24 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- 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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
- 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/middleware-react-loadable-manifest.js +1 -1
- 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/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
- package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +48 -24
- package/dist/wizard.js +2 -2
- package/dist/worktree-cli.d.ts +6 -5
- package/dist/worktree-cli.js +23 -7
- package/package.json +3 -3
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +12 -10
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +8 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +113 -14
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/mcp-server.test.ts +40 -4
- package/packages/mcp-server/src/server.ts +12 -10
- package/packages/mcp-server/src/session-manager.ts +10 -3
- package/packages/mcp-server/src/workflow-tools.test.ts +91 -1
- package/packages/mcp-server/src/workflow-tools.ts +128 -18
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +3 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.js +0 -153
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +17 -0
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +18 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +50 -0
- package/packages/pi-ai/src/models/capability-patches.ts +5 -2
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
- package/packages/pi-ai/src/models/generated/groq.ts +0 -153
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +17 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
- package/packages/pi-ai/src/providers/anthropic.ts +19 -1
- package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
- 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 +83 -33
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +1 -75
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +192 -24
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/src/resources/extensions/ask-user-questions.ts +24 -6
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/loop.ts +109 -3
- package/src/resources/extensions/gsd/auto/phases.ts +94 -60
- package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
- package/src/resources/extensions/gsd/auto/session.ts +7 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +14 -3
- package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +201 -40
- package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
- package/src/resources/extensions/gsd/auto-start.ts +8 -6
- package/src/resources/extensions/gsd/auto-verification.ts +3 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
- package/src/resources/extensions/gsd/auto.ts +61 -28
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +158 -0
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +20 -4
- package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
- package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
- package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
- package/src/resources/extensions/gsd/commands-config.ts +10 -0
- package/src/resources/extensions/gsd/commands-debug.ts +484 -0
- package/src/resources/extensions/gsd/commands-do.ts +1 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-memory.ts +551 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
- package/src/resources/extensions/gsd/commands-scan.ts +125 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
- package/src/resources/extensions/gsd/db-writer.ts +3 -0
- package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
- package/src/resources/extensions/gsd/definition-loader.ts +7 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
- package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/error-classifier.ts +6 -3
- package/src/resources/extensions/gsd/escalation.ts +367 -0
- package/src/resources/extensions/gsd/forensics.ts +25 -29
- package/src/resources/extensions/gsd/git-service.ts +0 -1
- package/src/resources/extensions/gsd/graph.ts +33 -3
- package/src/resources/extensions/gsd/gsd-db.ts +578 -32
- package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
- package/src/resources/extensions/gsd/health-widget.ts +7 -3
- package/src/resources/extensions/gsd/init-wizard.ts +87 -54
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
- package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
- package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
- package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
- package/src/resources/extensions/gsd/memory-relations.ts +240 -0
- package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
- package/src/resources/extensions/gsd/memory-store.ts +351 -7
- package/src/resources/extensions/gsd/metrics.ts +1 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
- package/src/resources/extensions/gsd/model-router.ts +25 -6
- package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
- package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
- package/src/resources/extensions/gsd/notification-widget.ts +25 -43
- package/src/resources/extensions/gsd/notifications.ts +6 -0
- package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
- package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
- package/src/resources/extensions/gsd/preferences-models.ts +1 -0
- package/src/resources/extensions/gsd/preferences-types.ts +10 -2
- package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
- package/src/resources/extensions/gsd/preferences.ts +10 -10
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/src/resources/extensions/gsd/prompts/scan.md +79 -0
- package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/src/resources/extensions/gsd/python-resolver.ts +76 -0
- package/src/resources/extensions/gsd/run-manager.ts +53 -19
- package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
- package/src/resources/extensions/gsd/state.ts +50 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
- package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
- package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
- package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
- package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
- package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/tools/memory-tools.ts +380 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
- package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
- package/src/resources/extensions/gsd/types.ts +62 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
- package/src/resources/extensions/gsd/uok/flags.ts +7 -7
- package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
- package/src/resources/extensions/gsd/verification-gate.ts +2 -1
- package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
- package/src/resources/extensions/gsd/workflow-install.ts +423 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
- package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
- package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
- package/src/resources/extensions/gsd/workspace-index.ts +9 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
- package/src/resources/extensions/remote-questions/commands.ts +480 -0
- package/src/resources/extensions/remote-questions/manager.ts +49 -4
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
- package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
- package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
- package/src/resources/extensions/shared/interview-ui.ts +195 -1
- package/src/resources/extensions/shared/layout-utils.ts +26 -0
- package/src/resources/extensions/shared/rtk-shared.ts +58 -0
- package/src/resources/extensions/shared/rtk.ts +12 -52
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
- package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
- package/src/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/dist/ps/types.d.ts +0 -5
- package/packages/native/dist/ps/types.js +0 -2
- package/packages/native/src/ps/types.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
- package/packages/pi-ai/oauth.d.ts +0 -1
- package/packages/pi-ai/oauth.js +0 -1
- /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → o61X3klsB6C0UE0X1x3PA}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → o61X3klsB6C0UE0X1x3PA}/_ssgManifest.js +0 -0
|
@@ -16,6 +16,7 @@ const ENOENT_PATH_RE = /ENOENT[^']*'([^']+)'/;
|
|
|
16
16
|
*
|
|
17
17
|
* Rule 1: Same error string twice in a row → stuck immediately.
|
|
18
18
|
* Rule 2: Same unit key 3+ consecutive times → stuck (preserves prior behavior).
|
|
19
|
+
* Rule 2b: Same unit key appears 3+ times anywhere in the active window → stuck.
|
|
19
20
|
* Rule 3: Oscillation A→B→A→B in last 4 entries → stuck.
|
|
20
21
|
* Rule 4: Same ENOENT path in any 2 entries within the window → stuck (#3575).
|
|
21
22
|
* Missing files don't self-heal between retries — retrying wastes budget.
|
|
@@ -48,6 +49,14 @@ export function detectStuck(window) {
|
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
}
|
|
52
|
+
// Rule 2b: Same unit key 3+ times anywhere in the active window
|
|
53
|
+
const countInWindow = window.filter((entry) => entry.key === last.key).length;
|
|
54
|
+
if (countInWindow >= 3) {
|
|
55
|
+
return {
|
|
56
|
+
stuck: true,
|
|
57
|
+
reason: `${last.key} derived ${countInWindow} times in last ${window.length} attempts without progress${suffix}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
51
60
|
// Rule 3: Oscillation (A→B→A→B in last 4)
|
|
52
61
|
if (window.length >= 4) {
|
|
53
62
|
const w = window.slice(-4);
|
|
@@ -17,6 +17,7 @@ import { logWarning } from "../workflow-logger.js";
|
|
|
17
17
|
import { gsdRoot } from "../paths.js";
|
|
18
18
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
19
19
|
import { scheduleSidecarQueue } from "../uok/execution-graph.js";
|
|
20
|
+
import { ExecutionGraphScheduler } from "../uok/execution-graph.js";
|
|
20
21
|
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
21
22
|
import { join } from "node:path";
|
|
22
23
|
// ── Stuck detection persistence (#3704) ──────────────────────────────────
|
|
@@ -78,17 +79,73 @@ function checkMemoryPressure() {
|
|
|
78
79
|
const pct = heapMB / limitMB;
|
|
79
80
|
return { pressured: pct > MEMORY_PRESSURE_THRESHOLD, heapMB, limitMB, pct };
|
|
80
81
|
}
|
|
82
|
+
function resolveDispatchNodeKind(unitType, sidecarItem) {
|
|
83
|
+
if (sidecarItem?.kind === "hook")
|
|
84
|
+
return "hook";
|
|
85
|
+
if (sidecarItem?.kind === "triage")
|
|
86
|
+
return "verification";
|
|
87
|
+
if (sidecarItem?.kind === "quick-task")
|
|
88
|
+
return "team-worker";
|
|
89
|
+
if (unitType.startsWith("hook/"))
|
|
90
|
+
return "hook";
|
|
91
|
+
if (unitType === "reactive-execute")
|
|
92
|
+
return "subagent";
|
|
93
|
+
if (unitType === "gate-evaluate"
|
|
94
|
+
|| unitType === "validate-milestone"
|
|
95
|
+
|| unitType === "run-uat"
|
|
96
|
+
|| unitType === "complete-slice") {
|
|
97
|
+
return "verification";
|
|
98
|
+
}
|
|
99
|
+
if (unitType === "replan-slice" || unitType === "reassess-roadmap") {
|
|
100
|
+
return "reprocess";
|
|
101
|
+
}
|
|
102
|
+
return "unit";
|
|
103
|
+
}
|
|
104
|
+
async function runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem) {
|
|
105
|
+
if (dispatchContract === "legacy-direct") {
|
|
106
|
+
return runUnitPhase(ic, iterData, loopState, sidecarItem);
|
|
107
|
+
}
|
|
108
|
+
const scheduler = new ExecutionGraphScheduler();
|
|
109
|
+
let outcome = null;
|
|
110
|
+
const executeNode = async () => {
|
|
111
|
+
outcome = await runUnitPhase(ic, iterData, loopState, sidecarItem);
|
|
112
|
+
};
|
|
113
|
+
const kinds = [
|
|
114
|
+
"unit",
|
|
115
|
+
"hook",
|
|
116
|
+
"subagent",
|
|
117
|
+
"team-worker",
|
|
118
|
+
"verification",
|
|
119
|
+
"reprocess",
|
|
120
|
+
];
|
|
121
|
+
for (const kind of kinds)
|
|
122
|
+
scheduler.registerHandler(kind, executeNode);
|
|
123
|
+
const nodeId = `dispatch:${ic.iteration}:${iterData.unitType}:${iterData.unitId}`;
|
|
124
|
+
await scheduler.run([
|
|
125
|
+
{
|
|
126
|
+
id: nodeId,
|
|
127
|
+
kind: resolveDispatchNodeKind(iterData.unitType, sidecarItem),
|
|
128
|
+
dependsOn: [],
|
|
129
|
+
metadata: {
|
|
130
|
+
unitType: iterData.unitType,
|
|
131
|
+
unitId: iterData.unitId,
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
], { parallel: false, maxWorkers: 1 });
|
|
135
|
+
return outcome ?? { action: "break", reason: "scheduler-dispatch-missing-result" };
|
|
136
|
+
}
|
|
81
137
|
/**
|
|
82
138
|
* Main auto-mode execution loop. Iterates: derive → dispatch → guards →
|
|
83
139
|
* runUnit → finalize → repeat. Exits when s.active becomes false or a
|
|
84
140
|
* terminal condition is reached.
|
|
85
141
|
*
|
|
86
142
|
* This is the linear replacement for the recursive
|
|
87
|
-
* dispatchNextUnit →
|
|
143
|
+
* dispatchNextUnit → resolveAgentEnd → dispatchNextUnit chain.
|
|
88
144
|
*/
|
|
89
|
-
export async function autoLoop(ctx, pi, s, deps) {
|
|
145
|
+
export async function autoLoop(ctx, pi, s, deps, options) {
|
|
90
146
|
debugLog("autoLoop", { phase: "enter" });
|
|
91
147
|
let iteration = 0;
|
|
148
|
+
const dispatchContract = options?.dispatchContract ?? "legacy-direct";
|
|
92
149
|
// Load persisted stuck state so counters survive session restarts (#3704)
|
|
93
150
|
const persisted = loadStuckState(s.basePath);
|
|
94
151
|
const loopState = {
|
|
@@ -273,7 +330,7 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
273
330
|
break;
|
|
274
331
|
}
|
|
275
332
|
// ── Unit execution (shared with dev path) ──
|
|
276
|
-
const unitPhaseResult = await
|
|
333
|
+
const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState);
|
|
277
334
|
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
278
335
|
unitType: iterData.unitType,
|
|
279
336
|
unitId: iterData.unitId,
|
|
@@ -410,7 +467,7 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
410
467
|
sidecarKind: sidecarItem.kind,
|
|
411
468
|
});
|
|
412
469
|
}
|
|
413
|
-
const unitPhaseResult = await
|
|
470
|
+
const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem);
|
|
414
471
|
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
415
472
|
unitType: iterData.unitType,
|
|
416
473
|
unitId: iterData.unitId,
|
|
@@ -528,3 +585,9 @@ export async function autoLoop(ctx, pi, s, deps) {
|
|
|
528
585
|
_clearCurrentResolve();
|
|
529
586
|
debugLog("autoLoop", { phase: "exit", totalIterations: iteration });
|
|
530
587
|
}
|
|
588
|
+
export async function runUokKernelLoop(ctx, pi, s, deps) {
|
|
589
|
+
return autoLoop(ctx, pi, s, deps, { dispatchContract: "uok-scheduler" });
|
|
590
|
+
}
|
|
591
|
+
export async function runLegacyAutoLoop(ctx, pi, s, deps) {
|
|
592
|
+
return autoLoop(ctx, pi, s, deps, { dispatchContract: "legacy-direct" });
|
|
593
|
+
}
|
|
@@ -33,7 +33,7 @@ import { UokGateRunner } from "../uok/gate-runner.js";
|
|
|
33
33
|
import { resetEvidence } from "../safety/evidence-collector.js";
|
|
34
34
|
import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
|
|
35
35
|
import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
|
|
36
|
-
import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, } from "../workflow-mcp.js";
|
|
36
|
+
import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, supportsStructuredQuestions, } from "../workflow-mcp.js";
|
|
37
37
|
// ─── Session timeout auto-resume state ────────────────────────────────────────
|
|
38
38
|
let consecutiveSessionTimeouts = 0;
|
|
39
39
|
const MAX_SESSION_TIMEOUT_AUTO_RESUMES = 3;
|
|
@@ -136,6 +136,47 @@ async function emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, errorCon
|
|
|
136
136
|
causedBy: { flowId: ic.flowId, seq: unitStartSeq },
|
|
137
137
|
});
|
|
138
138
|
}
|
|
139
|
+
async function failClosedOnFinalizeTimeout(ic, iterData, loopState, stage, startedAt) {
|
|
140
|
+
const { ctx, pi, s, deps } = ic;
|
|
141
|
+
const now = Date.now();
|
|
142
|
+
const unitType = iterData.unitType;
|
|
143
|
+
const unitId = iterData.unitId;
|
|
144
|
+
const timeoutMs = stage === "pre" ? FINALIZE_PRE_TIMEOUT_MS : FINALIZE_POST_TIMEOUT_MS;
|
|
145
|
+
const progressKind = stage === "pre" ? "finalize-pre-timeout" : "finalize-post-timeout";
|
|
146
|
+
writeUnitRuntimeRecord(s.basePath, unitType, unitId, startedAt, {
|
|
147
|
+
phase: "finalize-timeout",
|
|
148
|
+
timeoutAt: now,
|
|
149
|
+
lastProgressAt: now,
|
|
150
|
+
lastProgressKind: progressKind,
|
|
151
|
+
});
|
|
152
|
+
deps.emitJournalEvent({
|
|
153
|
+
ts: new Date(now).toISOString(),
|
|
154
|
+
flowId: ic.flowId,
|
|
155
|
+
seq: ic.nextSeq(),
|
|
156
|
+
eventType: "unit-end",
|
|
157
|
+
data: {
|
|
158
|
+
unitType,
|
|
159
|
+
unitId,
|
|
160
|
+
status: "timed-out-finalize",
|
|
161
|
+
artifactVerified: false,
|
|
162
|
+
finalizeStage: stage,
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
loopState.consecutiveFinalizeTimeouts++;
|
|
166
|
+
debugLog("autoLoop", {
|
|
167
|
+
phase: progressKind,
|
|
168
|
+
iteration: ic.iteration,
|
|
169
|
+
unitType,
|
|
170
|
+
unitId,
|
|
171
|
+
consecutiveTimeouts: loopState.consecutiveFinalizeTimeouts,
|
|
172
|
+
});
|
|
173
|
+
ctx.ui.notify(`${stage === "pre" ? "postUnitPreVerification" : "postUnitPostVerification"} timed out after ${timeoutMs / 1000}s for ${unitType} ${unitId} (${loopState.consecutiveFinalizeTimeouts}/${MAX_FINALIZE_TIMEOUTS}) — pausing auto-mode for recovery.`, "warning");
|
|
174
|
+
await deps.pauseAuto(ctx, pi);
|
|
175
|
+
s.currentUnit = null;
|
|
176
|
+
clearCurrentPhase();
|
|
177
|
+
drainLogs();
|
|
178
|
+
return { action: "break", reason: progressKind };
|
|
179
|
+
}
|
|
139
180
|
// ─── runPreDispatch ───────────────────────────────────────────────────────────
|
|
140
181
|
/**
|
|
141
182
|
* Phase 1: Pre-dispatch — resource guard, health gate, state derivation,
|
|
@@ -548,6 +589,15 @@ export async function runDispatch(ic, preData, loopState) {
|
|
|
548
589
|
const { ctx, pi, s, deps, prefs } = ic;
|
|
549
590
|
const { state, mid, midTitle } = preData;
|
|
550
591
|
const STUCK_WINDOW_SIZE = 6;
|
|
592
|
+
const provider = ctx.model?.provider;
|
|
593
|
+
const authMode = provider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
|
|
594
|
+
? ctx.modelRegistry.getProviderAuthMode(provider)
|
|
595
|
+
: undefined;
|
|
596
|
+
const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
|
|
597
|
+
const structuredQuestionsAvailable = supportsStructuredQuestions(activeTools, {
|
|
598
|
+
authMode,
|
|
599
|
+
baseUrl: ctx.model?.baseUrl,
|
|
600
|
+
}) ? "true" : "false";
|
|
551
601
|
debugLog("autoLoop", { phase: "dispatch-resolve", iteration: ic.iteration });
|
|
552
602
|
const dispatchResult = await deps.resolveDispatch({
|
|
553
603
|
basePath: s.basePath,
|
|
@@ -556,6 +606,7 @@ export async function runDispatch(ic, preData, loopState) {
|
|
|
556
606
|
state,
|
|
557
607
|
prefs,
|
|
558
608
|
session: s,
|
|
609
|
+
structuredQuestionsAvailable,
|
|
559
610
|
});
|
|
560
611
|
if (dispatchResult.action === "stop") {
|
|
561
612
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "dispatch-stop", rule: dispatchResult.matchedRule, data: { reason: dispatchResult.reason } });
|
|
@@ -604,6 +655,18 @@ export async function runDispatch(ic, preData, loopState) {
|
|
|
604
655
|
loopState.stuckRecoveryAttempts++;
|
|
605
656
|
const artifactExists = verifyExpectedArtifact(unitType, unitId, s.basePath);
|
|
606
657
|
if (artifactExists) {
|
|
658
|
+
if (unitType === "complete-milestone") {
|
|
659
|
+
const stuckDiag = diagnoseExpectedArtifact(unitType, unitId, s.basePath);
|
|
660
|
+
const stuckParts = [
|
|
661
|
+
`Detected ${unitType} ${unitId} output on disk, but the same unit is still being derived.`,
|
|
662
|
+
"This usually means the milestone summary exists while the DB row still does not mark the milestone complete.",
|
|
663
|
+
];
|
|
664
|
+
if (stuckDiag)
|
|
665
|
+
stuckParts.push(`Expected: ${stuckDiag}`);
|
|
666
|
+
ctx.ui.notify(stuckParts.join(" "), "warning");
|
|
667
|
+
await deps.pauseAuto(ctx, pi);
|
|
668
|
+
return { action: "break", reason: "complete-milestone-artifact-db-mismatch" };
|
|
669
|
+
}
|
|
607
670
|
debugLog("autoLoop", {
|
|
608
671
|
phase: "stuck-recovery",
|
|
609
672
|
level: 1,
|
|
@@ -908,6 +971,8 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
908
971
|
// per-unit. Without this, the module-level _buffer accumulates across every
|
|
909
972
|
// unit in the same Node process (see workflow-logger.ts module header).
|
|
910
973
|
_resetLogs();
|
|
974
|
+
const dispatchKey = `${unitType}/${unitId}`;
|
|
975
|
+
s.unitDispatchCount.set(dispatchKey, (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1);
|
|
911
976
|
s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
|
|
912
977
|
s.lastGitActionFailure = null;
|
|
913
978
|
s.lastGitActionStatus = null;
|
|
@@ -960,7 +1025,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
960
1025
|
finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
|
|
961
1026
|
s.pendingCrashRecovery = null;
|
|
962
1027
|
}
|
|
963
|
-
else if ((s.unitDispatchCount.get(
|
|
1028
|
+
else if ((s.unitDispatchCount.get(dispatchKey) ?? 0) > 1) {
|
|
964
1029
|
const diagnostic = deps.getDeepDiagnostic(s.basePath);
|
|
965
1030
|
if (diagnostic) {
|
|
966
1031
|
const cappedDiag = diagnostic.length > MAX_RECOVERY_CHARS
|
|
@@ -1214,7 +1279,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
1214
1279
|
const artifactVerified = skipArtifactVerification ||
|
|
1215
1280
|
verifyExpectedArtifact(unitType, unitId, s.basePath);
|
|
1216
1281
|
if (artifactVerified) {
|
|
1217
|
-
s.unitDispatchCount.delete(
|
|
1282
|
+
s.unitDispatchCount.delete(dispatchKey);
|
|
1218
1283
|
s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
|
|
1219
1284
|
}
|
|
1220
1285
|
// Write phase handoff anchor after successful research/planning completion
|
|
@@ -1299,28 +1364,7 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
|
|
|
1299
1364
|
: null;
|
|
1300
1365
|
const preResultGuard = await withTimeout(deps.postUnitPreVerification(postUnitCtx, preVerificationOpts), FINALIZE_PRE_TIMEOUT_MS, "postUnitPreVerification");
|
|
1301
1366
|
if (preResultGuard.timedOut) {
|
|
1302
|
-
|
|
1303
|
-
// cannot mutate state for the next unit (#3757).
|
|
1304
|
-
s.currentUnit = null;
|
|
1305
|
-
clearCurrentPhase();
|
|
1306
|
-
// Drop any logger entries from the timed-out unit so they don't bleed
|
|
1307
|
-
// into the next iteration's drain.
|
|
1308
|
-
drainLogs();
|
|
1309
|
-
loopState.consecutiveFinalizeTimeouts++;
|
|
1310
|
-
debugLog("autoLoop", {
|
|
1311
|
-
phase: "pre-verification-timeout",
|
|
1312
|
-
iteration: ic.iteration,
|
|
1313
|
-
unitType: iterData.unitType,
|
|
1314
|
-
unitId: iterData.unitId,
|
|
1315
|
-
consecutiveTimeouts: loopState.consecutiveFinalizeTimeouts,
|
|
1316
|
-
});
|
|
1317
|
-
if (loopState.consecutiveFinalizeTimeouts >= MAX_FINALIZE_TIMEOUTS) {
|
|
1318
|
-
ctx.ui.notify(`postUnitPreVerification timed out ${loopState.consecutiveFinalizeTimeouts} consecutive times — stopping auto-mode to prevent budget waste`, "error");
|
|
1319
|
-
await deps.stopAuto(ctx, pi, `${loopState.consecutiveFinalizeTimeouts} consecutive finalize timeouts`);
|
|
1320
|
-
return { action: "break", reason: "finalize-timeout-escalation" };
|
|
1321
|
-
}
|
|
1322
|
-
ctx.ui.notify(`postUnitPreVerification timed out after ${FINALIZE_PRE_TIMEOUT_MS / 1000}s for ${iterData.unitType} ${iterData.unitId} (${loopState.consecutiveFinalizeTimeouts}/${MAX_FINALIZE_TIMEOUTS}) — continuing to next iteration`, "warning");
|
|
1323
|
-
return { action: "next", data: undefined };
|
|
1367
|
+
return failClosedOnFinalizeTimeout(ic, iterData, loopState, "pre", preUnitSnapshot?.startedAt ?? Date.now());
|
|
1324
1368
|
}
|
|
1325
1369
|
const preResult = preResultGuard.value;
|
|
1326
1370
|
if (preResult === "dispatched") {
|
|
@@ -1381,28 +1425,7 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
|
|
|
1381
1425
|
// auto-loop is not permanently frozen (#2344).
|
|
1382
1426
|
const postResultGuard = await withTimeout(deps.postUnitPostVerification(postUnitCtx), FINALIZE_POST_TIMEOUT_MS, "postUnitPostVerification");
|
|
1383
1427
|
if (postResultGuard.timedOut) {
|
|
1384
|
-
|
|
1385
|
-
// cannot mutate state for the next unit (#3757).
|
|
1386
|
-
s.currentUnit = null;
|
|
1387
|
-
clearCurrentPhase();
|
|
1388
|
-
// Drop any logger entries from the timed-out unit so they don't bleed
|
|
1389
|
-
// into the next iteration's drain.
|
|
1390
|
-
drainLogs();
|
|
1391
|
-
loopState.consecutiveFinalizeTimeouts++;
|
|
1392
|
-
debugLog("autoLoop", {
|
|
1393
|
-
phase: "post-verification-timeout",
|
|
1394
|
-
iteration: ic.iteration,
|
|
1395
|
-
unitType: iterData.unitType,
|
|
1396
|
-
unitId: iterData.unitId,
|
|
1397
|
-
consecutiveTimeouts: loopState.consecutiveFinalizeTimeouts,
|
|
1398
|
-
});
|
|
1399
|
-
if (loopState.consecutiveFinalizeTimeouts >= MAX_FINALIZE_TIMEOUTS) {
|
|
1400
|
-
ctx.ui.notify(`postUnitPostVerification timed out ${loopState.consecutiveFinalizeTimeouts} consecutive times — stopping auto-mode to prevent budget waste`, "error");
|
|
1401
|
-
await deps.stopAuto(ctx, pi, `${loopState.consecutiveFinalizeTimeouts} consecutive finalize timeouts`);
|
|
1402
|
-
return { action: "break", reason: "finalize-timeout-escalation" };
|
|
1403
|
-
}
|
|
1404
|
-
ctx.ui.notify(`postUnitPostVerification timed out after ${FINALIZE_POST_TIMEOUT_MS / 1000}s for ${iterData.unitType} ${iterData.unitId} (${loopState.consecutiveFinalizeTimeouts}/${MAX_FINALIZE_TIMEOUTS}) — continuing to next iteration`, "warning");
|
|
1405
|
-
return { action: "next", data: undefined };
|
|
1428
|
+
return failClosedOnFinalizeTimeout(ic, iterData, loopState, "post", preUnitSnapshot?.startedAt ?? Date.now());
|
|
1406
1429
|
}
|
|
1407
1430
|
const postResult = postResultGuard.value;
|
|
1408
1431
|
if (postResult === "stopped") {
|
|
@@ -60,7 +60,7 @@ export function isSessionSwitchInFlight() {
|
|
|
60
60
|
/**
|
|
61
61
|
* Force-resolve the pending unit promise with { status: "cancelled" }.
|
|
62
62
|
*
|
|
63
|
-
* Used by pauseAuto
|
|
63
|
+
* Used by pauseAuto and supervision catch
|
|
64
64
|
* blocks to ensure the autoLoop is never stuck awaiting a promise that
|
|
65
65
|
* will never resolve. Safe to call when no resolver is pending (no-op).
|
|
66
66
|
*/
|
|
@@ -62,7 +62,16 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
62
62
|
if (s.currentUnitModel && typeof pi.setModel === "function") {
|
|
63
63
|
const restored = await pi.setModel(s.currentUnitModel, { persist: false });
|
|
64
64
|
if (!restored) {
|
|
65
|
-
|
|
65
|
+
const message = `Failed to restore configured model ${s.currentUnitModel.provider}/${s.currentUnitModel.id} after session creation`;
|
|
66
|
+
ctx.ui.notify(`${message}. Cancelling unit before dispatch.`, "warning");
|
|
67
|
+
return {
|
|
68
|
+
status: "cancelled",
|
|
69
|
+
errorContext: {
|
|
70
|
+
message,
|
|
71
|
+
category: "session-failed",
|
|
72
|
+
isTransient: false,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
66
75
|
}
|
|
67
76
|
}
|
|
68
77
|
// ── Create the agent_end promise (per-unit one-shot) ──
|
|
@@ -107,6 +107,9 @@ export class AutoSession {
|
|
|
107
107
|
checkpointSha = null;
|
|
108
108
|
// ── Signal handler ───────────────────────────────────────────────────────
|
|
109
109
|
sigtermHandler = null;
|
|
110
|
+
// ── Remote command polling ───────────────────────────────────────────────
|
|
111
|
+
/** Cleanup function returned by startCommandPolling(); null when not running. */
|
|
112
|
+
commandPollingCleanup = null;
|
|
110
113
|
// ── Loop promise state ──────────────────────────────────────────────────
|
|
111
114
|
// Per-unit resolve function and session-switch guard live at module level
|
|
112
115
|
// in auto-loop.ts (_currentResolve, _sessionSwitchInFlight).
|
|
@@ -200,6 +203,8 @@ export class AutoSession {
|
|
|
200
203
|
this.checkpointSha = null;
|
|
201
204
|
// Signal handler
|
|
202
205
|
this.sigtermHandler = null;
|
|
206
|
+
// Remote command polling — cleanup must be called before reset (auto.ts stopAuto)
|
|
207
|
+
this.commandPollingCleanup = null;
|
|
203
208
|
// Loop promise state lives in auto-loop.ts module scope
|
|
204
209
|
}
|
|
205
210
|
toJSON() {
|
|
@@ -29,6 +29,16 @@ export function resolveExpectedArtifactPath(unitType, unitId, base) {
|
|
|
29
29
|
return dir ? join(dir, buildMilestoneFileName(mid, "ROADMAP")) : null;
|
|
30
30
|
}
|
|
31
31
|
case "research-slice": {
|
|
32
|
+
// #4414: Sentinel unitId "{mid}/parallel-research" fans out across
|
|
33
|
+
// multiple slices. Resolve to a milestone-level placeholder path so
|
|
34
|
+
// blocker escalation has somewhere to write. Verification for this
|
|
35
|
+
// sentinel is handled directly in verifyExpectedArtifact.
|
|
36
|
+
if (sid === "parallel-research") {
|
|
37
|
+
const mdir = resolveMilestonePath(base, mid);
|
|
38
|
+
return mdir
|
|
39
|
+
? join(mdir, buildMilestoneFileName(mid, "PARALLEL-BLOCKER"))
|
|
40
|
+
: null;
|
|
41
|
+
}
|
|
32
42
|
const dir = resolveSlicePath(base, mid, sid);
|
|
33
43
|
return dir ? join(dir, buildSliceFileName(sid, "RESEARCH")) : null;
|
|
34
44
|
}
|
|
@@ -36,6 +46,11 @@ export function resolveExpectedArtifactPath(unitType, unitId, base) {
|
|
|
36
46
|
const dir = resolveSlicePath(base, mid, sid);
|
|
37
47
|
return dir ? join(dir, buildSliceFileName(sid, "PLAN")) : null;
|
|
38
48
|
}
|
|
49
|
+
case "refine-slice": {
|
|
50
|
+
// ADR-011: refine-slice expands a sketch and writes the same PLAN.md as plan-slice.
|
|
51
|
+
const dir = resolveSlicePath(base, mid, sid);
|
|
52
|
+
return dir ? join(dir, buildSliceFileName(sid, "PLAN")) : null;
|
|
53
|
+
}
|
|
39
54
|
case "reassess-roadmap": {
|
|
40
55
|
const dir = resolveSlicePath(base, mid, sid);
|
|
41
56
|
return dir ? join(dir, buildSliceFileName(sid, "ASSESSMENT")) : null;
|
|
@@ -90,9 +105,14 @@ export function diagnoseExpectedArtifact(unitType, unitId, base) {
|
|
|
90
105
|
case "plan-milestone":
|
|
91
106
|
return `${relMilestoneFile(base, mid, "ROADMAP")} (milestone roadmap)`;
|
|
92
107
|
case "research-slice":
|
|
108
|
+
if (sid === "parallel-research") {
|
|
109
|
+
return `${relMilestoneFile(base, mid, "PARALLEL-BLOCKER")} (parallel slice research sentinel)`;
|
|
110
|
+
}
|
|
93
111
|
return `${relSliceFile(base, mid, sid, "RESEARCH")} (slice research)`;
|
|
94
112
|
case "plan-slice":
|
|
95
113
|
return `${relSliceFile(base, mid, sid, "PLAN")} (slice plan)`;
|
|
114
|
+
case "refine-slice":
|
|
115
|
+
return `${relSliceFile(base, mid, sid, "PLAN")} (refined slice plan from sketch)`;
|
|
96
116
|
case "execute-task": {
|
|
97
117
|
return `Task ${tid} marked [x] in ${relSliceFile(base, mid, sid, "PLAN")} + summary written`;
|
|
98
118
|
}
|
|
@@ -45,6 +45,7 @@ export function unitVerb(unitType) {
|
|
|
45
45
|
case "research-slice": return "researching";
|
|
46
46
|
case "plan-milestone":
|
|
47
47
|
case "plan-slice": return "planning";
|
|
48
|
+
case "refine-slice": return "refining";
|
|
48
49
|
case "execute-task": return "executing";
|
|
49
50
|
case "complete-slice": return "completing";
|
|
50
51
|
case "replan-slice": return "replanning";
|
|
@@ -65,6 +66,7 @@ export function unitPhaseLabel(unitType) {
|
|
|
65
66
|
case "research-slice": return "RESEARCH";
|
|
66
67
|
case "plan-milestone": return "PLAN";
|
|
67
68
|
case "plan-slice": return "PLAN";
|
|
69
|
+
case "refine-slice": return "REFINE";
|
|
68
70
|
case "execute-task": return "EXECUTE";
|
|
69
71
|
case "complete-slice": return "COMPLETE";
|
|
70
72
|
case "replan-slice": return "REPLAN";
|
|
@@ -91,6 +93,7 @@ function peekNext(unitType, state) {
|
|
|
91
93
|
case "plan-milestone": return "plan or execute first slice";
|
|
92
94
|
case "research-slice": return `plan ${sid}`;
|
|
93
95
|
case "plan-slice": return "execute first task";
|
|
96
|
+
case "refine-slice": return "execute first task";
|
|
94
97
|
case "execute-task": return `continue ${sid}`;
|
|
95
98
|
case "complete-slice": return "reassess roadmap";
|
|
96
99
|
case "replan-slice": return `re-execute ${sid}`;
|
|
@@ -753,13 +756,18 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
|
|
|
753
756
|
}
|
|
754
757
|
if (cumulativeCost)
|
|
755
758
|
sp.push(theme.fg("warning", `$${cumulativeCost.toFixed(2)}`));
|
|
756
|
-
const
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
759
|
+
const CX_BAR_WIDTH = 8;
|
|
760
|
+
const cxBarFilled = Math.min(CX_BAR_WIDTH, Math.max(0, Math.round((cxPctVal / 100) * CX_BAR_WIDTH)));
|
|
761
|
+
const cxBarColor = cxPctVal > 90 ? "error" : cxPctVal > 70 ? "warning" : "success";
|
|
762
|
+
const cxBar = theme.fg(cxBarColor, "━".repeat(cxBarFilled)) +
|
|
763
|
+
theme.fg("dim", "─".repeat(CX_BAR_WIDTH - cxBarFilled));
|
|
764
|
+
const cxPctText = `${cxPct}%/${formatWidgetTokens(cxWindow)}`;
|
|
765
|
+
const cxColorized = cxPctVal > 90
|
|
766
|
+
? theme.fg("error", cxPctText)
|
|
767
|
+
: cxPctVal > 70
|
|
768
|
+
? theme.fg("warning", cxPctText)
|
|
769
|
+
: cxPctText;
|
|
770
|
+
sp.push(`${cxBar} ${cxColorized}`);
|
|
763
771
|
const statsLine = sp.map(p => p.includes("\x1b[") ? p : theme.fg("dim", p))
|
|
764
772
|
.join(theme.fg("dim", " "));
|
|
765
773
|
if (statsLine) {
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* without modifying orchestration code.
|
|
10
10
|
*/
|
|
11
11
|
import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
|
|
12
|
-
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone } from "./gsd-db.js";
|
|
12
|
+
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone, updateMilestoneStatus } from "./gsd-db.js";
|
|
13
|
+
import { isClosedStatus } from "./status-guards.js";
|
|
13
14
|
import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
|
|
14
15
|
import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
|
|
15
16
|
import { parseRoadmap } from "./parsers-legacy.js";
|
|
@@ -17,7 +18,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
17
18
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
18
19
|
import { join } from "node:path";
|
|
19
20
|
import { hasImplementationArtifacts } from "./auto-recovery.js";
|
|
20
|
-
import { buildDiscussMilestonePrompt, buildResearchMilestonePrompt, buildPlanMilestonePrompt, buildResearchSlicePrompt, buildPlanSlicePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReplanSlicePrompt, buildRunUatPrompt, buildReassessRoadmapPrompt, buildRewriteDocsPrompt, buildReactiveExecutePrompt, buildGateEvaluatePrompt, buildParallelResearchSlicesPrompt, checkNeedsReassessment, checkNeedsRunUat, } from "./auto-prompts.js";
|
|
21
|
+
import { buildDiscussMilestonePrompt, buildResearchMilestonePrompt, buildPlanMilestonePrompt, buildResearchSlicePrompt, buildPlanSlicePrompt, buildRefineSlicePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReplanSlicePrompt, buildRunUatPrompt, buildReassessRoadmapPrompt, buildRewriteDocsPrompt, buildReactiveExecutePrompt, buildGateEvaluatePrompt, buildParallelResearchSlicesPrompt, checkNeedsReassessment, checkNeedsRunUat, } from "./auto-prompts.js";
|
|
21
22
|
import { resolveModelWithFallbacksForUnit } from "./preferences-models.js";
|
|
22
23
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
23
24
|
import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
|
|
@@ -111,6 +112,26 @@ export function isVerificationNotApplicable(value) {
|
|
|
111
112
|
}
|
|
112
113
|
// ─── Rules ────────────────────────────────────────────────────────────────
|
|
113
114
|
export const DISPATCH_RULES = [
|
|
115
|
+
{
|
|
116
|
+
// ADR-011 Phase 2: pause-for-escalation must evaluate FIRST so phase-
|
|
117
|
+
// agnostic rules (rewrite-docs gate, UAT checks, reassess) cannot bypass
|
|
118
|
+
// the user's pending decision. Only fires for continueWithDefault=false
|
|
119
|
+
// escalations (those set escalation_pending=1); awaiting-review artifacts
|
|
120
|
+
// never enter the 'escalating-task' phase.
|
|
121
|
+
name: "escalating-task → pause-for-escalation",
|
|
122
|
+
match: async ({ state, mid }) => {
|
|
123
|
+
if (state.phase !== "escalating-task")
|
|
124
|
+
return null;
|
|
125
|
+
if (!state.activeSlice)
|
|
126
|
+
return missingSliceStop(mid, state.phase);
|
|
127
|
+
return {
|
|
128
|
+
action: "stop",
|
|
129
|
+
reason: state.nextAction ||
|
|
130
|
+
`${mid}: task escalation awaits user resolution. Run /gsd escalate list to see pending items.`,
|
|
131
|
+
level: "info",
|
|
132
|
+
};
|
|
133
|
+
},
|
|
134
|
+
},
|
|
114
135
|
{
|
|
115
136
|
name: "rewrite-docs (override gate)",
|
|
116
137
|
match: async ({ mid, midTitle, state, basePath, session }) => {
|
|
@@ -238,20 +259,20 @@ export const DISPATCH_RULES = [
|
|
|
238
259
|
},
|
|
239
260
|
{
|
|
240
261
|
name: "needs-discussion → discuss-milestone",
|
|
241
|
-
match: async ({ state, mid, midTitle, basePath }) => {
|
|
262
|
+
match: async ({ state, mid, midTitle, basePath, structuredQuestionsAvailable }) => {
|
|
242
263
|
if (state.phase !== "needs-discussion")
|
|
243
264
|
return null;
|
|
244
265
|
return {
|
|
245
266
|
action: "dispatch",
|
|
246
267
|
unitType: "discuss-milestone",
|
|
247
268
|
unitId: mid,
|
|
248
|
-
prompt: await buildDiscussMilestonePrompt(mid, midTitle, basePath),
|
|
269
|
+
prompt: await buildDiscussMilestonePrompt(mid, midTitle, basePath, structuredQuestionsAvailable),
|
|
249
270
|
};
|
|
250
271
|
},
|
|
251
272
|
},
|
|
252
273
|
{
|
|
253
274
|
name: "pre-planning (no context) → discuss-milestone",
|
|
254
|
-
match: async ({ state, mid, midTitle, basePath }) => {
|
|
275
|
+
match: async ({ state, mid, midTitle, basePath, structuredQuestionsAvailable }) => {
|
|
255
276
|
if (state.phase !== "pre-planning")
|
|
256
277
|
return null;
|
|
257
278
|
const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
@@ -262,7 +283,7 @@ export const DISPATCH_RULES = [
|
|
|
262
283
|
action: "dispatch",
|
|
263
284
|
unitType: "discuss-milestone",
|
|
264
285
|
unitId: mid,
|
|
265
|
-
prompt: await buildDiscussMilestonePrompt(mid, midTitle, basePath),
|
|
286
|
+
prompt: await buildDiscussMilestonePrompt(mid, midTitle, basePath, structuredQuestionsAvailable),
|
|
266
287
|
};
|
|
267
288
|
},
|
|
268
289
|
},
|
|
@@ -334,6 +355,12 @@ export const DISPATCH_RULES = [
|
|
|
334
355
|
// Only dispatch parallel if 2+ slices are ready
|
|
335
356
|
if (researchReadySlices.length < 2)
|
|
336
357
|
return null;
|
|
358
|
+
// #4414: If a previous parallel-research attempt escalated to a blocker
|
|
359
|
+
// placeholder, skip this rule and fall through to per-slice research
|
|
360
|
+
// (or other rules) rather than re-dispatching the same failing unit.
|
|
361
|
+
const parallelBlocker = resolveMilestoneFile(basePath, mid, "PARALLEL-BLOCKER");
|
|
362
|
+
if (parallelBlocker)
|
|
363
|
+
return null;
|
|
337
364
|
return {
|
|
338
365
|
action: "dispatch",
|
|
339
366
|
unitType: "research-slice",
|
|
@@ -370,6 +397,58 @@ export const DISPATCH_RULES = [
|
|
|
370
397
|
};
|
|
371
398
|
},
|
|
372
399
|
},
|
|
400
|
+
{
|
|
401
|
+
// ADR-011: sketch-then-refine. When `refining` phase fires, expand the
|
|
402
|
+
// sketch into a full plan using the prior slice's SUMMARY and the current
|
|
403
|
+
// codebase. If the user flipped `progressive_planning` off mid-milestone
|
|
404
|
+
// while a slice is still `is_sketch=1`, fall through to a standard
|
|
405
|
+
// plan-slice so the loop doesn't dead-end.
|
|
406
|
+
//
|
|
407
|
+
// Note on the flag-OFF downgrade: plan-slice does not explicitly clear
|
|
408
|
+
// `is_sketch`. After it writes PLAN.md, the auto-heal in state.ts's
|
|
409
|
+
// `deriveStateFromDb` (via `autoHealSketchFlags`) flips the flag on the
|
|
410
|
+
// next iteration. That implicit coupling is the sole mechanism that
|
|
411
|
+
// reconciles `is_sketch=1` on the plan-slice path — do not remove the
|
|
412
|
+
// auto-heal without either adding an explicit `setSliceSketchFlag(..., false)`
|
|
413
|
+
// call here or doing so inside the plan-slice tool handler.
|
|
414
|
+
name: "refining → refine-slice",
|
|
415
|
+
match: async ({ state, mid, midTitle, basePath, prefs }) => {
|
|
416
|
+
if (state.phase !== "refining")
|
|
417
|
+
return null;
|
|
418
|
+
if (!state.activeSlice)
|
|
419
|
+
return missingSliceStop(mid, state.phase);
|
|
420
|
+
const sid = state.activeSlice.id;
|
|
421
|
+
const sTitle = state.activeSlice.title;
|
|
422
|
+
const progressiveOn = prefs?.phases?.progressive_planning === true;
|
|
423
|
+
if (!progressiveOn) {
|
|
424
|
+
// Graceful downgrade: treat the sketch as a normal slice needing a plan,
|
|
425
|
+
// but forward the stored sketch_scope as a SOFT hint so the scope
|
|
426
|
+
// signal isn't silently lost. The planner may expand beyond it.
|
|
427
|
+
let softScopeHint = "";
|
|
428
|
+
try {
|
|
429
|
+
const { isDbAvailable, getSlice } = await import("./gsd-db.js");
|
|
430
|
+
if (isDbAvailable()) {
|
|
431
|
+
softScopeHint = getSlice(mid, sid)?.sketch_scope ?? "";
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
softScopeHint = "";
|
|
436
|
+
}
|
|
437
|
+
return {
|
|
438
|
+
action: "dispatch",
|
|
439
|
+
unitType: "plan-slice",
|
|
440
|
+
unitId: `${mid}/${sid}`,
|
|
441
|
+
prompt: await buildPlanSlicePrompt(mid, midTitle, sid, sTitle, basePath, undefined, softScopeHint ? { softScopeHint } : undefined),
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
return {
|
|
445
|
+
action: "dispatch",
|
|
446
|
+
unitType: "refine-slice",
|
|
447
|
+
unitId: `${mid}/${sid}`,
|
|
448
|
+
prompt: await buildRefineSlicePrompt(mid, midTitle, sid, sTitle, basePath),
|
|
449
|
+
};
|
|
450
|
+
},
|
|
451
|
+
},
|
|
373
452
|
{
|
|
374
453
|
name: "planning → plan-slice",
|
|
375
454
|
match: async ({ state, mid, midTitle, basePath }) => {
|
|
@@ -600,6 +679,33 @@ export const DISPATCH_RULES = [
|
|
|
600
679
|
match: async ({ state, mid, midTitle, basePath }) => {
|
|
601
680
|
if (state.phase !== "completing-milestone")
|
|
602
681
|
return null;
|
|
682
|
+
// Defense-in-depth (#4324): skip dispatch if the DB already marks
|
|
683
|
+
// this milestone as complete. Prevents re-enqueue when the legacy
|
|
684
|
+
// filesystem state-derivation path runs (e.g. transient DB
|
|
685
|
+
// unavailability) and produces a stale completing-milestone phase.
|
|
686
|
+
if (isDbAvailable()) {
|
|
687
|
+
const milestone = getMilestone(mid);
|
|
688
|
+
if (milestone && isClosedStatus(milestone.status)) {
|
|
689
|
+
return { action: "skip" };
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
// Reconciliation guard (#4324): when the SUMMARY file already exists
|
|
693
|
+
// on disk but the DB says the milestone is not complete, the DB is
|
|
694
|
+
// out of sync (e.g. journal reset, partial merge, crash recovery).
|
|
695
|
+
// Reconcile the DB status directly instead of re-dispatching the
|
|
696
|
+
// tool, which would overwrite the richer on-disk SUMMARY with a
|
|
697
|
+
// thinner regenerated version — causing silent data loss.
|
|
698
|
+
const existingSummary = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
699
|
+
if (existingSummary && isDbAvailable()) {
|
|
700
|
+
try {
|
|
701
|
+
updateMilestoneStatus(mid, "complete", new Date().toISOString());
|
|
702
|
+
logWarning("dispatch", `Milestone ${mid} has SUMMARY on disk but DB status was not complete — reconciled DB to complete (#4324)`);
|
|
703
|
+
}
|
|
704
|
+
catch (err) {
|
|
705
|
+
logWarning("dispatch", `Failed to reconcile milestone ${mid} status: ${err instanceof Error ? err.message : String(err)}`);
|
|
706
|
+
}
|
|
707
|
+
return { action: "skip" };
|
|
708
|
+
}
|
|
603
709
|
// Safety guard (#2675): block completion when VALIDATION verdict is
|
|
604
710
|
// needs-remediation. The state machine treats needs-remediation as
|
|
605
711
|
// terminal (to prevent validate-milestone loops per #832), but
|