@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +3 -0
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +456 -198
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
- package/dist/resources/extensions/gsd/auto.js +56 -15
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +4 -6
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +258 -131
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +110 -6
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +12 -22
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +367 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- 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 +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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- 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/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -50
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +178 -82
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +3 -0
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +537 -202
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
- package/src/resources/extensions/gsd/auto.ts +72 -17
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +4 -6
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +269 -149
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +161 -26
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +16 -22
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -58
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +442 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -22,7 +22,7 @@ type BlockedAdvanceResult = Extract<AutoAdvanceResult, { kind: "blocked" }>;
|
|
|
22
22
|
import { debugCount, debugLog, debugTime } from "../debug-logger.js";
|
|
23
23
|
import { reconcileBeforeDispatch } from "../state-reconciliation.js";
|
|
24
24
|
import { isLegalEdge, IllegalPhaseTransitionError } from "../state-transition-matrix.js";
|
|
25
|
-
import { resolveDispatch } from "../auto-dispatch.js";
|
|
25
|
+
import { hasPendingDeepStage, resolveDispatch } from "../auto-dispatch.js";
|
|
26
26
|
import { classifyFailure } from "../recovery-classification.js";
|
|
27
27
|
import { verifyExpectedArtifact, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
|
|
28
28
|
import { invalidateAllCaches } from "../cache.js";
|
|
@@ -64,24 +64,22 @@ import {
|
|
|
64
64
|
import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
|
|
65
65
|
import { getErrorMessage } from "../error-utils.js";
|
|
66
66
|
import { logWarning } from "../workflow-logger.js";
|
|
67
|
+
import { normalizeRealPath } from "../paths.js";
|
|
68
|
+
import {
|
|
69
|
+
buildDispatchKey,
|
|
70
|
+
createDispatchHistory,
|
|
71
|
+
STUCK_WINDOW_SIZE,
|
|
72
|
+
type DispatchHistory,
|
|
73
|
+
} from "./dispatch-history.js";
|
|
67
74
|
import { existsSync, readFileSync } from "node:fs";
|
|
68
75
|
import { join } from "node:path";
|
|
69
76
|
import { evaluateAllCompleteSettlement } from "../milestone-settlement.js";
|
|
77
|
+
import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
|
|
70
78
|
|
|
71
79
|
function now(): number {
|
|
72
80
|
return Date.now();
|
|
73
81
|
}
|
|
74
82
|
|
|
75
|
-
/**
|
|
76
|
-
* Size of the dispatch-decision ring buffer used by the Auto Orchestration
|
|
77
|
-
* module's stuck-loop detector. When the same `${unitType}:${unitId}` key
|
|
78
|
-
* fills the window, advance() blocks with `action: "stop"`.
|
|
79
|
-
*
|
|
80
|
-
* Mirrors the legacy `STUCK_WINDOW_SIZE` in auto/phases.ts so behaviour is
|
|
81
|
-
* preserved across the eventual cutover (issue #5791).
|
|
82
|
-
*/
|
|
83
|
-
export const STUCK_WINDOW_SIZE = 6;
|
|
84
|
-
|
|
85
83
|
function noRemainingUnitsOutcome(stateSnapshot: GSDState): AutoTerminalOutcome {
|
|
86
84
|
if (stateSnapshot.phase === "complete") {
|
|
87
85
|
return {
|
|
@@ -196,14 +194,26 @@ export async function decideOrchestratorDispatch(
|
|
|
196
194
|
): Promise<DispatchDecision> {
|
|
197
195
|
const state = input.stateSnapshot;
|
|
198
196
|
const active = state.activeMilestone;
|
|
199
|
-
if (!active) return null;
|
|
200
|
-
|
|
201
197
|
const activeSession = input.session ?? session;
|
|
202
198
|
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
203
|
-
|
|
199
|
+
const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
|
|
200
|
+
if (!active) {
|
|
201
|
+
if (state.phase !== "pre-planning") return null;
|
|
202
|
+
if (!hasPendingDeepStage(prefs, activeDispatchBasePath)) {
|
|
203
|
+
return {
|
|
204
|
+
kind: "blocked",
|
|
205
|
+
reason: state.nextAction || "No active milestone. Run /gsd unpark <id> or create a new milestone.",
|
|
206
|
+
action: "stop",
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (active && activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
|
|
204
212
|
activeSession.currentMilestoneId = active.id;
|
|
213
|
+
activeSession.milestoneLeaseToken = null;
|
|
205
214
|
}
|
|
206
|
-
const
|
|
215
|
+
const dispatchMid = active?.id ?? activeSession?.currentMilestoneId ?? "";
|
|
216
|
+
const dispatchMidTitle = active?.title ?? "";
|
|
207
217
|
|
|
208
218
|
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
209
219
|
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
@@ -235,8 +245,15 @@ export async function decideOrchestratorDispatch(
|
|
|
235
245
|
? "true"
|
|
236
246
|
: "false");
|
|
237
247
|
|
|
248
|
+
// Only replay a milestone-scoped verification retry when a milestone is
|
|
249
|
+
// active. Pre-PR (#712 fix), `!active` returned null before reaching this
|
|
250
|
+
// block, so the retry was preserved for a future tick. The new
|
|
251
|
+
// pre-planning + deep-pending fall-through must keep that contract:
|
|
252
|
+
// otherwise a stale execute-task / complete-slice / complete-milestone
|
|
253
|
+
// retry whose target milestone has since been parked would preempt
|
|
254
|
+
// project-level deep rules like `discuss-project`.
|
|
238
255
|
const pendingRetry = session?.pendingVerificationRetryDispatch;
|
|
239
|
-
if (session && pendingRetry) {
|
|
256
|
+
if (session && pendingRetry && active) {
|
|
240
257
|
session.pendingVerificationRetryDispatch = null;
|
|
241
258
|
const alreadyClosedReason = getAlreadyClosedDispatchReason(
|
|
242
259
|
pendingRetry.unitType,
|
|
@@ -258,8 +275,8 @@ export async function decideOrchestratorDispatch(
|
|
|
258
275
|
|
|
259
276
|
const action = await resolveDispatch({
|
|
260
277
|
basePath: activeDispatchBasePath,
|
|
261
|
-
mid:
|
|
262
|
-
midTitle:
|
|
278
|
+
mid: dispatchMid,
|
|
279
|
+
midTitle: dispatchMidTitle,
|
|
263
280
|
state,
|
|
264
281
|
prefs,
|
|
265
282
|
session: activeSession,
|
|
@@ -303,8 +320,8 @@ export async function decideOrchestratorDispatch(
|
|
|
303
320
|
prompt: action.prompt,
|
|
304
321
|
pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
|
|
305
322
|
state,
|
|
306
|
-
mid:
|
|
307
|
-
midTitle:
|
|
323
|
+
mid: dispatchMid,
|
|
324
|
+
midTitle: dispatchMidTitle,
|
|
308
325
|
};
|
|
309
326
|
session.pendingOrchestrationDispatch = pending;
|
|
310
327
|
}
|
|
@@ -330,7 +347,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
330
347
|
private seq = 0;
|
|
331
348
|
private lastAdvanceKey: string | null = null;
|
|
332
349
|
private lastFinalizedUnitKey: string | null = null;
|
|
333
|
-
|
|
350
|
+
// Dispatch History module (#482): the dispatch-decision window with
|
|
351
|
+
// cross-session DB rehydration and full detect-stuck rules.
|
|
352
|
+
private readonly dispatchHistory: DispatchHistory;
|
|
334
353
|
// ADR-030 Phase Transition Invariant: the prior advance's reconciled Phase,
|
|
335
354
|
// the "from" endpoint of the edge check. In-memory; reset on start/resume/stop
|
|
336
355
|
// so the first advance of a session has no edge to assert.
|
|
@@ -347,6 +366,16 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
347
366
|
this.runtimeBasePath = context.runtimeBasePath;
|
|
348
367
|
this.s = context.session;
|
|
349
368
|
this.flowId = `auto-orchestrator-${Date.now()}`;
|
|
369
|
+
this.dispatchHistory = createDispatchHistory({
|
|
370
|
+
windowSize: STUCK_WINDOW_SIZE,
|
|
371
|
+
// Same stable scope the auto-loop uses for stuck-state persistence so
|
|
372
|
+
// rehydration reads the rows the dispatch ledger wrote for this project.
|
|
373
|
+
resolveScopeId: () =>
|
|
374
|
+
normalizeRealPath(
|
|
375
|
+
this.s.scope?.workspace.projectRoot ??
|
|
376
|
+
(this.s.originalBasePath || this.s.basePath || this.runtimeBasePath),
|
|
377
|
+
) || null,
|
|
378
|
+
});
|
|
350
379
|
}
|
|
351
380
|
|
|
352
381
|
// ── Live base-path resolution (was the wiring factory's getLiveDispatchBasePath) ──
|
|
@@ -582,6 +611,37 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
582
611
|
};
|
|
583
612
|
}
|
|
584
613
|
|
|
614
|
+
private async mergePendingCompleteMilestone(milestoneId: string): Promise<{ ok: true } | { ok: false; reason: string }> {
|
|
615
|
+
const result = this.buildLifecycle().exitMilestone(
|
|
616
|
+
milestoneId,
|
|
617
|
+
{ merge: true },
|
|
618
|
+
this.ctx.ui,
|
|
619
|
+
);
|
|
620
|
+
if (!result.ok) {
|
|
621
|
+
const detail = result.cause instanceof Error
|
|
622
|
+
? result.cause.message
|
|
623
|
+
: result.reason;
|
|
624
|
+
return {
|
|
625
|
+
ok: false,
|
|
626
|
+
reason: `Milestone ${milestoneId} is complete, but the system-owned merge failed: ${detail}`,
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
this.s.milestoneMergedInPhases = true;
|
|
631
|
+
this.s.milestoneSettlement = { ok: true, reason: "settled" };
|
|
632
|
+
try {
|
|
633
|
+
const projectRoot = this.s.originalBasePath || this.s.canonicalProjectRoot || this.runtimeBasePath;
|
|
634
|
+
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
635
|
+
await rebuildMarkdownProjectionsFromDb(projectRoot);
|
|
636
|
+
} catch (err) {
|
|
637
|
+
logWarning(
|
|
638
|
+
"engine",
|
|
639
|
+
`markdown projection rebuild after settlement merge failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
640
|
+
);
|
|
641
|
+
}
|
|
642
|
+
return { ok: true };
|
|
643
|
+
}
|
|
644
|
+
|
|
585
645
|
private clearPendingDispatch(): void {
|
|
586
646
|
this.s.pendingOrchestrationDispatch = null;
|
|
587
647
|
}
|
|
@@ -661,9 +721,6 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
661
721
|
reason: `No Unit manifest is registered for ${unitType}`,
|
|
662
722
|
};
|
|
663
723
|
}
|
|
664
|
-
if (isolationMode !== "worktree") {
|
|
665
|
-
return { ok: true, reason: "not-required" };
|
|
666
|
-
}
|
|
667
724
|
const writeScope =
|
|
668
725
|
manifest.tools.mode === "all" || manifest.tools.mode === "docs"
|
|
669
726
|
? "source-writing"
|
|
@@ -672,7 +729,23 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
672
729
|
const activeBasePath = this.getLiveDispatchBasePath();
|
|
673
730
|
const snapshot = await deriveState(activeBasePath);
|
|
674
731
|
const milestoneId = snapshot.activeMilestone?.id ?? null;
|
|
675
|
-
const
|
|
732
|
+
const buildExpectedBranch = (mode: ReturnType<typeof getIsolationMode>) =>
|
|
733
|
+
mode !== "none" && milestoneId ? autoWorktreeBranch(milestoneId) : null;
|
|
734
|
+
// The milestone lease coordinates concurrent workers on an isolated
|
|
735
|
+
// milestone worktree/branch. `none` mode has no per-milestone isolation
|
|
736
|
+
// and does not reliably claim a lease, so requiring one there would
|
|
737
|
+
// falsely fail dispatch; enforce it only in isolated modes.
|
|
738
|
+
const buildLease = (mode: ReturnType<typeof getIsolationMode>) =>
|
|
739
|
+
milestoneId && this.s.workerId
|
|
740
|
+
? {
|
|
741
|
+
required: writeScope === "source-writing" && mode !== "none",
|
|
742
|
+
held: hasHeldMilestoneLease(this.s, milestoneId),
|
|
743
|
+
owner: this.s.workerId,
|
|
744
|
+
}
|
|
745
|
+
: undefined;
|
|
746
|
+
if (writeScope === "source-writing") {
|
|
747
|
+
reclaimMissingMilestoneLease(this.s, milestoneId, isolationMode, "orchestrator");
|
|
748
|
+
}
|
|
676
749
|
let result = safety.validateUnitRoot({
|
|
677
750
|
unitType,
|
|
678
751
|
unitId,
|
|
@@ -681,7 +754,8 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
681
754
|
unitRoot: activeBasePath,
|
|
682
755
|
milestoneId,
|
|
683
756
|
isolationMode,
|
|
684
|
-
expectedBranch,
|
|
757
|
+
expectedBranch: buildExpectedBranch(isolationMode),
|
|
758
|
+
lease: buildLease(isolationMode),
|
|
685
759
|
});
|
|
686
760
|
if (!result.ok) {
|
|
687
761
|
const repaired = await repairAutoWorktreeSafetyFailure({
|
|
@@ -698,16 +772,20 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
698
772
|
this.rebuildScope(this.s.basePath, this.s.currentMilestoneId);
|
|
699
773
|
return { ok: true };
|
|
700
774
|
},
|
|
701
|
-
revalidate: () =>
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
775
|
+
revalidate: () => {
|
|
776
|
+
const revalidatedMode = this.getEffectiveUnitIsolationMode(this.runtimeBasePath);
|
|
777
|
+
return safety.validateUnitRoot({
|
|
778
|
+
unitType,
|
|
779
|
+
unitId,
|
|
780
|
+
writeScope,
|
|
781
|
+
projectRoot: this.runtimeBasePath,
|
|
782
|
+
unitRoot: this.getLiveDispatchBasePath(),
|
|
783
|
+
milestoneId,
|
|
784
|
+
isolationMode: revalidatedMode,
|
|
785
|
+
expectedBranch: buildExpectedBranch(revalidatedMode),
|
|
786
|
+
lease: buildLease(revalidatedMode),
|
|
787
|
+
});
|
|
788
|
+
},
|
|
711
789
|
});
|
|
712
790
|
result = repaired.result;
|
|
713
791
|
if (result.ok) {
|
|
@@ -765,7 +843,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
765
843
|
* skipped result) instead of stopping.
|
|
766
844
|
*/
|
|
767
845
|
private tryStuckArtifactRecovery(unitType: string, unitId: string): boolean {
|
|
768
|
-
const key =
|
|
846
|
+
const key = buildDispatchKey(unitType, unitId);
|
|
769
847
|
if (this.lastStuckRecoveryKey === key) return false; // already tried this episode
|
|
770
848
|
const basePath = this.getLiveDispatchBasePath();
|
|
771
849
|
if (!verifyExpectedArtifact(unitType, unitId, basePath)) return false;
|
|
@@ -777,7 +855,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
777
855
|
if (!refreshed.ok && refreshed.fatal) return false;
|
|
778
856
|
this.lastStuckRecoveryKey = key;
|
|
779
857
|
invalidateAllCaches();
|
|
780
|
-
this.
|
|
858
|
+
this.dispatchHistory.clearOnRecovery();
|
|
781
859
|
this.lastAdvanceKey = null;
|
|
782
860
|
this.lastFinalizedUnitKey = null;
|
|
783
861
|
return true;
|
|
@@ -808,7 +886,12 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
808
886
|
public async start(_sessionContext: AutoSessionContext): Promise<AutoAdvanceResult> {
|
|
809
887
|
this.lastAdvanceKey = null;
|
|
810
888
|
this.lastFinalizedUnitKey = null;
|
|
811
|
-
|
|
889
|
+
// #482: the DB dispatch ledger is the source of truth across sessions.
|
|
890
|
+
// Discard any in-memory window and rebuild it from the ledger so a unit
|
|
891
|
+
// that was re-dispatched in previous sessions is detected as stuck here
|
|
892
|
+
// instead of silently re-dispatching forever.
|
|
893
|
+
this.dispatchHistory.clearOnRecovery();
|
|
894
|
+
this.dispatchHistory.rehydrate();
|
|
812
895
|
this.lastStuckRecoveryKey = null;
|
|
813
896
|
this.lastDerivedPhase = null;
|
|
814
897
|
this.status.phase = "running";
|
|
@@ -910,10 +993,39 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
910
993
|
if (!decision) {
|
|
911
994
|
const settlementBlock = this.evaluateNoRemainingUnitsSettlement(reconciliation.stateSnapshot);
|
|
912
995
|
if (settlementBlock) {
|
|
996
|
+
const settlement = this.s.milestoneSettlement;
|
|
997
|
+
if (settlement && !settlement.ok && settlement.reason === "merge-pending") {
|
|
998
|
+
const merged = await this.mergePendingCompleteMilestone(settlement.milestoneId);
|
|
999
|
+
if (merged.ok) {
|
|
1000
|
+
const terminalOutcome = noRemainingUnitsOutcome(reconciliation.stateSnapshot);
|
|
1001
|
+
const stopped: AutoAdvanceResult = {
|
|
1002
|
+
kind: "stopped",
|
|
1003
|
+
reason: terminalOutcome.displayReason,
|
|
1004
|
+
stateSnapshot: reconciliation.stateSnapshot,
|
|
1005
|
+
terminalOutcome,
|
|
1006
|
+
};
|
|
1007
|
+
this.status.phase = "stopped";
|
|
1008
|
+
this.status.activeUnit = undefined;
|
|
1009
|
+
this.lastAdvanceKey = null;
|
|
1010
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1011
|
+
this.bumpTransition();
|
|
1012
|
+
this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
|
|
1013
|
+
this.postAdvanceRecord(stopped);
|
|
1014
|
+
return stopped;
|
|
1015
|
+
}
|
|
1016
|
+
settlementBlock.reason = merged.reason;
|
|
1017
|
+
settlementBlock.terminalOutcome = {
|
|
1018
|
+
code: "settlement-blocked",
|
|
1019
|
+
displayReason: merged.reason,
|
|
1020
|
+
nextAction: `Fix the merge failure, then retry \`/gsd dispatch complete-milestone ${settlement.milestoneId}\`.`,
|
|
1021
|
+
milestoneId: settlement.milestoneId,
|
|
1022
|
+
allMilestonesComplete: false,
|
|
1023
|
+
};
|
|
1024
|
+
}
|
|
913
1025
|
this.status.phase = "paused";
|
|
914
1026
|
this.status.activeUnit = undefined;
|
|
915
1027
|
this.lastAdvanceKey = null;
|
|
916
|
-
this.
|
|
1028
|
+
this.dispatchHistory.clearOnRecovery();
|
|
917
1029
|
this.bumpTransition();
|
|
918
1030
|
this.journalTransition({ name: "advance-blocked", reason: settlementBlock.reason });
|
|
919
1031
|
this.postAdvanceRecord(settlementBlock);
|
|
@@ -929,7 +1041,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
929
1041
|
this.status.phase = "stopped";
|
|
930
1042
|
this.status.activeUnit = undefined;
|
|
931
1043
|
this.lastAdvanceKey = null;
|
|
932
|
-
this.
|
|
1044
|
+
this.dispatchHistory.clearOnRecovery();
|
|
933
1045
|
this.bumpTransition();
|
|
934
1046
|
this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
|
|
935
1047
|
this.postAdvanceRecord(stopped);
|
|
@@ -979,18 +1091,13 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
979
1091
|
return blocked;
|
|
980
1092
|
}
|
|
981
1093
|
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
// Record every dispatch decision in the ring buffer before pre-flight
|
|
1094
|
+
// Record every dispatch decision in the history window before pre-flight
|
|
985
1095
|
// checks so the stuck-loop detector observes the full decision history
|
|
986
1096
|
// (including decisions that idempotency would otherwise short-circuit).
|
|
987
|
-
// The
|
|
988
|
-
this.
|
|
989
|
-
if (this.dispatchKeyWindow.length > STUCK_WINDOW_SIZE) {
|
|
990
|
-
this.dispatchKeyWindow.shift();
|
|
991
|
-
}
|
|
1097
|
+
// The window is capped at STUCK_WINDOW_SIZE and evicts oldest-first.
|
|
1098
|
+
const nextKey = this.dispatchHistory.recordDispatch(decision.unitType, decision.unitId);
|
|
992
1099
|
|
|
993
|
-
const matchingCount = this.
|
|
1100
|
+
const matchingCount = this.dispatchHistory.countMatching(nextKey);
|
|
994
1101
|
if (this.lastFinalizedUnitKey === nextKey) {
|
|
995
1102
|
// #442: the unit re-dispatched immediately after finalizing may have
|
|
996
1103
|
// actually completed on disk with a stale DB. Verify + recover before
|
|
@@ -1023,23 +1130,32 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1023
1130
|
// checks coexist: idempotency for the common immediate-repeat case,
|
|
1024
1131
|
// stuck-loop for the saturated-window case.
|
|
1025
1132
|
if (this.lastAdvanceKey === nextKey && matchingCount < STUCK_WINDOW_SIZE) {
|
|
1133
|
+
// Unit already active — benign no-op. Return skipped so the loop re-polls
|
|
1134
|
+
// without cancelling the in-flight unit (blocked+pause would force-cancel it).
|
|
1026
1135
|
this.clearPendingDispatch();
|
|
1027
|
-
const
|
|
1136
|
+
const skipped: AutoAdvanceResult = { kind: "skipped", reason: "idempotent advance: unit already active" };
|
|
1028
1137
|
this.journalTransition({
|
|
1029
|
-
name: "advance-
|
|
1030
|
-
reason:
|
|
1138
|
+
name: "advance-skipped",
|
|
1139
|
+
reason: skipped.reason,
|
|
1031
1140
|
unitType: decision.unitType,
|
|
1032
1141
|
unitId: decision.unitId,
|
|
1033
1142
|
});
|
|
1034
|
-
this.postAdvanceRecord(
|
|
1035
|
-
return
|
|
1143
|
+
this.postAdvanceRecord(skipped);
|
|
1144
|
+
return skipped;
|
|
1036
1145
|
}
|
|
1037
1146
|
|
|
1038
|
-
// Stuck-loop detection: when the
|
|
1039
|
-
// `nextKey` (count >= STUCK_WINDOW_SIZE), the
|
|
1040
|
-
//
|
|
1041
|
-
//
|
|
1042
|
-
|
|
1147
|
+
// Stuck-loop detection: when the window is saturated with copies of
|
|
1148
|
+
// `nextKey` (count >= STUCK_WINDOW_SIZE), consult the Dispatch History
|
|
1149
|
+
// module's full detect-stuck rule set for the verdict instead of the old
|
|
1150
|
+
// bare saturation count. This keeps the saturation threshold (the window
|
|
1151
|
+
// deliberately records benign idempotent repeats, so earlier-firing
|
|
1152
|
+
// rules would false-positive on pause/resume re-advances) while gaining
|
|
1153
|
+
// retry-budget suppression and diagnosable rule reasons. A saturated
|
|
1154
|
+
// window with no verdict means the dispatch ledger says we are inside
|
|
1155
|
+
// the unit's retry-backoff budget — let the retry proceed.
|
|
1156
|
+
const stuckVerdict =
|
|
1157
|
+
matchingCount >= STUCK_WINDOW_SIZE ? this.dispatchHistory.detectStuck() : null;
|
|
1158
|
+
if (stuckVerdict) {
|
|
1043
1159
|
// #442: before declaring a stuck loop, verify the unit didn't actually
|
|
1044
1160
|
// complete on disk (stale DB) and recover if so — legacy graduated
|
|
1045
1161
|
// stuck-recovery parity. Otherwise hard-stop with a diagnosable reason.
|
|
@@ -1050,7 +1166,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1050
1166
|
this.clearPendingDispatch();
|
|
1051
1167
|
const blocked: AutoAdvanceResult = {
|
|
1052
1168
|
kind: "blocked",
|
|
1053
|
-
reason: `stuck-loop: ${
|
|
1169
|
+
reason: `stuck-loop: ${stuckVerdict.reason}`,
|
|
1054
1170
|
action: "stop",
|
|
1055
1171
|
};
|
|
1056
1172
|
this.journalTransition({
|
|
@@ -1144,7 +1260,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1144
1260
|
if (result.kind === "stopped") {
|
|
1145
1261
|
this.lastAdvanceKey = null;
|
|
1146
1262
|
this.lastFinalizedUnitKey = null;
|
|
1147
|
-
this.
|
|
1263
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1148
1264
|
this.status.activeUnit = undefined;
|
|
1149
1265
|
}
|
|
1150
1266
|
this.bumpTransition();
|
|
@@ -1173,8 +1289,14 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1173
1289
|
public async resume(): Promise<AutoAdvanceResult> {
|
|
1174
1290
|
this.lastAdvanceKey = null;
|
|
1175
1291
|
this.lastFinalizedUnitKey = null;
|
|
1176
|
-
// Preserve
|
|
1177
|
-
// accumulates across pause/resume cycles rather than
|
|
1292
|
+
// Preserve the dispatch-history window across an in-process resume so
|
|
1293
|
+
// stuck-loop detection accumulates across pause/resume cycles rather than
|
|
1294
|
+
// resetting each time (#572 regression). When the window is empty (fresh
|
|
1295
|
+
// orchestrator resuming a prior session), rehydrate it from the DB
|
|
1296
|
+
// dispatch ledger so cross-session re-dispatch loops are detected (#482).
|
|
1297
|
+
if (this.dispatchHistory.getRecentWindow().length === 0) {
|
|
1298
|
+
this.dispatchHistory.rehydrate();
|
|
1299
|
+
}
|
|
1178
1300
|
this.lastStuckRecoveryKey = null;
|
|
1179
1301
|
// ADR-030: drop the prior "from" — the first advance after resume has no
|
|
1180
1302
|
// edge to assert (avoids a false illegal-edge across the pause boundary).
|
|
@@ -1196,10 +1318,10 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1196
1318
|
this.lastAdvanceKey = null;
|
|
1197
1319
|
this.lastFinalizedUnitKey = null;
|
|
1198
1320
|
this.lastDerivedPhase = null;
|
|
1199
|
-
// Preserve
|
|
1200
|
-
// across pause/resume cycles. Only clear on a hard stop.
|
|
1321
|
+
// Preserve the dispatch-history window on pause so stuck-loop detection
|
|
1322
|
+
// accumulates across pause/resume cycles. Only clear on a hard stop.
|
|
1201
1323
|
if (reason !== "pause") {
|
|
1202
|
-
this.
|
|
1324
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1203
1325
|
}
|
|
1204
1326
|
this.lastStuckRecoveryKey = null;
|
|
1205
1327
|
this.bumpTransition();
|
|
@@ -1213,9 +1335,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1213
1335
|
}
|
|
1214
1336
|
|
|
1215
1337
|
public async completeActiveUnit(unit: { unitType: string; unitId: string }): Promise<void> {
|
|
1216
|
-
const unitKey =
|
|
1338
|
+
const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
|
|
1217
1339
|
const activeUnitKey = this.status.activeUnit
|
|
1218
|
-
?
|
|
1340
|
+
? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
|
|
1219
1341
|
: null;
|
|
1220
1342
|
if (activeUnitKey !== unitKey) return;
|
|
1221
1343
|
|
|
@@ -1233,9 +1355,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1233
1355
|
}
|
|
1234
1356
|
|
|
1235
1357
|
public async retryActiveUnit(unit: { unitType: string; unitId: string }): Promise<void> {
|
|
1236
|
-
const unitKey =
|
|
1358
|
+
const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
|
|
1237
1359
|
const activeUnitKey = this.status.activeUnit
|
|
1238
|
-
?
|
|
1360
|
+
? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
|
|
1239
1361
|
: null;
|
|
1240
1362
|
if (activeUnitKey !== unitKey && this.lastFinalizedUnitKey !== unitKey) return;
|
|
1241
1363
|
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Shared helpers used across auto-loop phase modules.
|
|
3
|
+
|
|
4
|
+
import { setRuntimeKv } from "../db/runtime-kv.js";
|
|
5
|
+
import { debugLog } from "../debug-logger.js";
|
|
6
|
+
import { normalizeRealPath } from "../paths.js";
|
|
7
|
+
import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "../worktree-root.js";
|
|
8
|
+
import { decideVerificationRetry, verificationRetryKey } from "./verification-retry-policy.js";
|
|
9
|
+
import type { AutoSession } from "./session.js";
|
|
10
|
+
import type { IterationContext, IterationData, LoopState, PhaseResult } from "./types.js";
|
|
11
|
+
import type { Phase } from "../types.js";
|
|
12
|
+
|
|
13
|
+
const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
|
|
14
|
+
|
|
15
|
+
/** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
|
|
16
|
+
export function isSamePathLocal(a: string, b: string): boolean {
|
|
17
|
+
return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function isIsolatedWorktreeSession(s: AutoSession): boolean {
|
|
21
|
+
return Boolean(s.originalBasePath)
|
|
22
|
+
&& Boolean(s.basePath)
|
|
23
|
+
&& !isSamePathLocal(s.originalBasePath, s.basePath);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function persistStuckRecoveryAttempts(s: AutoSession, loopState: LoopState): void {
|
|
27
|
+
const scopeId = normalizeRealPath(
|
|
28
|
+
s.scope?.workspace.projectRoot ?? (s.originalBasePath || s.basePath),
|
|
29
|
+
);
|
|
30
|
+
if (!scopeId) return;
|
|
31
|
+
try {
|
|
32
|
+
setRuntimeKv("global", scopeId, STUCK_RECOVERY_ATTEMPTS_KEY, loopState.stuckRecoveryAttempts);
|
|
33
|
+
} catch (err) {
|
|
34
|
+
debugLog("autoLoop", {
|
|
35
|
+
phase: "save-stuck-state-failed",
|
|
36
|
+
error: err instanceof Error ? err.message : String(err),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function applyVerificationRetryPolicy(
|
|
42
|
+
ic: IterationContext,
|
|
43
|
+
unitType: string | undefined,
|
|
44
|
+
phase: "artifact-verification-retry" | "verification-retry" | "pre-execution-retry",
|
|
45
|
+
): Promise<PhaseResult | null> {
|
|
46
|
+
const { ctx, pi, s, deps } = ic;
|
|
47
|
+
const retryInfo = s.pendingVerificationRetry;
|
|
48
|
+
const key = unitType && retryInfo
|
|
49
|
+
? verificationRetryKey(unitType, retryInfo.unitId)
|
|
50
|
+
: undefined;
|
|
51
|
+
const decision = decideVerificationRetry({
|
|
52
|
+
unitType,
|
|
53
|
+
retryInfo,
|
|
54
|
+
previousFailureHash: key ? s.verificationRetryFailureHashes.get(key) : undefined,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
if (decision.action === "pause") {
|
|
58
|
+
s.pendingVerificationRetry = null;
|
|
59
|
+
debugLog("autoLoop", {
|
|
60
|
+
phase: `${phase}-paused`,
|
|
61
|
+
reason: decision.reason,
|
|
62
|
+
unitType,
|
|
63
|
+
unitId: retryInfo?.unitId,
|
|
64
|
+
failureHash: decision.failureHash,
|
|
65
|
+
});
|
|
66
|
+
ctx.ui.notify(
|
|
67
|
+
decision.reason === "duplicate-failure-context"
|
|
68
|
+
? `Verification retry for ${unitType ?? "unit"} ${retryInfo?.unitId ?? "unknown"} produced the same failure context. Pausing auto-mode instead of re-dispatching.`
|
|
69
|
+
: "Verification retry requested without retry context. Pausing auto-mode instead of re-dispatching.",
|
|
70
|
+
"warning",
|
|
71
|
+
);
|
|
72
|
+
await deps.pauseAuto(ctx, pi);
|
|
73
|
+
return { action: "break", reason: decision.reason };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
s.verificationRetryFailureHashes.set(decision.key, decision.failureHash);
|
|
77
|
+
debugLog("autoLoop", {
|
|
78
|
+
phase: `${phase}-backoff`,
|
|
79
|
+
iteration: ic.iteration,
|
|
80
|
+
unitType,
|
|
81
|
+
unitId: retryInfo?.unitId,
|
|
82
|
+
attempt: retryInfo?.attempt,
|
|
83
|
+
delayMs: decision.delayMs,
|
|
84
|
+
baseDelayMs: decision.baseDelayMs,
|
|
85
|
+
failureHash: decision.failureHash,
|
|
86
|
+
});
|
|
87
|
+
await new Promise<void>((resolve) => setTimeout(resolve, decision.delayMs));
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function rememberRetryDispatch(
|
|
92
|
+
s: AutoSession,
|
|
93
|
+
unit: { type: string; id: string } | null,
|
|
94
|
+
iterData: IterationData,
|
|
95
|
+
): void {
|
|
96
|
+
if (!unit) return;
|
|
97
|
+
s.pendingVerificationRetryDispatch = {
|
|
98
|
+
unitType: unit.type,
|
|
99
|
+
unitId: unit.id,
|
|
100
|
+
prompt: iterData.prompt,
|
|
101
|
+
pauseAfterUatDispatch: iterData.pauseAfterUatDispatch,
|
|
102
|
+
state: iterData.state,
|
|
103
|
+
mid: iterData.mid,
|
|
104
|
+
midTitle: iterData.midTitle,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Resolve the base path for milestone reports.
|
|
110
|
+
* Prefers originalBasePath (project root) over basePath (which may be a worktree).
|
|
111
|
+
*/
|
|
112
|
+
export function _resolveReportBasePath(s: Pick<AutoSession, "originalBasePath" | "basePath">): string {
|
|
113
|
+
return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Resolve the authoritative project base for dispatch guards.
|
|
118
|
+
* Prior-milestone completion lives at the project root, even when the active
|
|
119
|
+
* unit is running inside an auto worktree.
|
|
120
|
+
*/
|
|
121
|
+
export function _resolveDispatchGuardBasePath(
|
|
122
|
+
s: Pick<AutoSession, "originalBasePath" | "basePath">,
|
|
123
|
+
): string {
|
|
124
|
+
return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
|
|
128
|
+
"executing",
|
|
129
|
+
"summarizing",
|
|
130
|
+
"validating-milestone",
|
|
131
|
+
"completing-milestone",
|
|
132
|
+
]);
|
|
133
|
+
|
|
134
|
+
export function shouldRunPlanV2Gate(phase: Phase): boolean {
|
|
135
|
+
return PLAN_V2_GATE_PHASES.has(phase);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function _resolveCurrentUnitStartedAtForTest(
|
|
139
|
+
currentUnit: { startedAt: number } | null | undefined,
|
|
140
|
+
): number | undefined {
|
|
141
|
+
return currentUnit?.startedAt;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export async function emitCancelledUnitEnd(
|
|
145
|
+
ic: IterationContext,
|
|
146
|
+
unitType: string,
|
|
147
|
+
unitId: string,
|
|
148
|
+
unitStartSeq: number,
|
|
149
|
+
errorContext?: { message: string; category: string; stopReason?: string; isTransient?: boolean; retryAfterMs?: number },
|
|
150
|
+
): Promise<void> {
|
|
151
|
+
ic.deps.emitJournalEvent({
|
|
152
|
+
ts: new Date().toISOString(),
|
|
153
|
+
flowId: ic.flowId,
|
|
154
|
+
seq: ic.nextSeq(),
|
|
155
|
+
eventType: "unit-end",
|
|
156
|
+
data: {
|
|
157
|
+
unitType,
|
|
158
|
+
unitId,
|
|
159
|
+
status: "cancelled",
|
|
160
|
+
artifactVerified: false,
|
|
161
|
+
...(errorContext ? { errorContext } : {}),
|
|
162
|
+
},
|
|
163
|
+
causedBy: { flowId: ic.flowId, seq: unitStartSeq },
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function _buildCancelledUnitStopReason(
|
|
168
|
+
unitType: string,
|
|
169
|
+
unitId: string,
|
|
170
|
+
errorContext?: { message: string; category: string },
|
|
171
|
+
): {
|
|
172
|
+
notifyMessage: string;
|
|
173
|
+
stopReason: string;
|
|
174
|
+
loopReason: "session-failed" | "unit-aborted";
|
|
175
|
+
} {
|
|
176
|
+
const cancellationMessage = errorContext?.message ?? "unknown";
|
|
177
|
+
const isSessionCreationFailure = errorContext?.category === "session-failed";
|
|
178
|
+
|
|
179
|
+
if (isSessionCreationFailure) {
|
|
180
|
+
return {
|
|
181
|
+
notifyMessage: `Session creation failed for ${unitType} ${unitId}: ${cancellationMessage}. Stopping auto-mode.`,
|
|
182
|
+
stopReason: `Session creation failed: ${cancellationMessage}`,
|
|
183
|
+
loopReason: "session-failed",
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
notifyMessage: `Unit ${unitType} ${unitId} aborted after dispatch: ${cancellationMessage}. Stopping auto-mode.`,
|
|
189
|
+
stopReason: `Unit aborted: ${cancellationMessage}`,
|
|
190
|
+
loopReason: "unit-aborted",
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export function _isPauseOriginCancelledResult(
|
|
195
|
+
isPaused: boolean,
|
|
196
|
+
errorContext?: { message: string; category: string },
|
|
197
|
+
): boolean {
|
|
198
|
+
return isPaused && !errorContext;
|
|
199
|
+
}
|