@opengsd/gsd-pi 1.5.0 → 1.6.0-dev.aa7f94e8
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 +10 -10
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +114 -36
- package/dist/resources/extensions/gsd/activity-log.js +1 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +97 -5
- package/dist/resources/extensions/gsd/auto/orchestrator.js +20 -13
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -5
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +69 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +28 -1
- package/dist/resources/extensions/gsd/auto-post-unit.js +23 -6
- package/dist/resources/extensions/gsd/auto-prompts.js +49 -117
- package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
- package/dist/resources/extensions/gsd/auto-start.js +57 -33
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +12 -2
- package/dist/resources/extensions/gsd/auto-timers.js +9 -2
- package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
- package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
- package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
- package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
- package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
- package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
- package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +20 -2073
- package/dist/resources/extensions/gsd/auto.js +118 -34
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +20 -2
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +185 -27
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +68 -2
- package/dist/resources/extensions/gsd/codebase-generator.js +7 -1
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
- package/dist/resources/extensions/gsd/compat/compat-marker.js +44 -0
- package/dist/resources/extensions/gsd/config-overlay.js +7 -2
- package/dist/resources/extensions/gsd/db/engine.js +33 -0
- package/dist/resources/extensions/gsd/db/queries.js +9 -9
- package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
- package/dist/resources/extensions/gsd/db-adapter.js +30 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +3 -3
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +93 -11
- package/dist/resources/extensions/gsd/flat-phase-migration.js +32 -3
- package/dist/resources/extensions/gsd/forensics.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
- package/dist/resources/extensions/gsd/git-service.js +45 -0
- package/dist/resources/extensions/gsd/gsd-db.js +23 -11
- package/dist/resources/extensions/gsd/guided-flow.js +22 -17
- package/dist/resources/extensions/gsd/journal.js +1 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +34 -79
- package/dist/resources/extensions/gsd/md-importer.js +89 -23
- package/dist/resources/extensions/gsd/metrics.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +11 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
- package/dist/resources/extensions/gsd/paths.js +87 -52
- package/dist/resources/extensions/gsd/post-unit-hooks.js +27 -0
- package/dist/resources/extensions/gsd/preferences-models.js +66 -15
- package/dist/resources/extensions/gsd/preferences-skills.js +10 -16
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +148 -10
- package/dist/resources/extensions/gsd/preferences.js +20 -0
- package/dist/resources/extensions/gsd/prompts/system.md +6 -6
- package/dist/resources/extensions/gsd/quick.js +12 -3
- package/dist/resources/extensions/gsd/reopen-reason.js +98 -0
- package/dist/resources/extensions/gsd/rule-registry.js +106 -10
- package/dist/resources/extensions/gsd/session-status-io.js +31 -0
- package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
- package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +1 -10
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +3 -24
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +10 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -5
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +16 -10
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +28 -5
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -8
- package/dist/resources/extensions/gsd/uat-dispatch.js +94 -0
- package/dist/resources/extensions/gsd/unit-registry.js +12 -2
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit-toggle.js +31 -2
- package/dist/resources/extensions/gsd/uok/audit.js +3 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +22 -30
- package/dist/resources/extensions/gsd/uok/gitops.js +18 -15
- package/dist/resources/extensions/gsd/uok/kernel.js +120 -46
- package/dist/resources/extensions/gsd/uok/model-policy.js +17 -14
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +1 -1
- package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +9 -26
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
- package/dist/resources/extensions/gsd/workspace.js +5 -14
- package/dist/resources/extensions/gsd/worktree-command.js +1 -1
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +14 -9
- package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +51 -5
- package/dist/resources/extensions/shared/interview-ui.js +62 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- 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/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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/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/boot/route_client-reference-manifest.js +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/input/route_client-reference-manifest.js +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/resize/route_client-reference-manifest.js +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/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +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/captures/route_client-reference-manifest.js +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/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +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/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +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/export-data/route_client-reference-manifest.js +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/files/route_client-reference-manifest.js +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/forensics/route_client-reference-manifest.js +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/git/route_client-reference-manifest.js +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/history/route_client-reference-manifest.js +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/hooks/route_client-reference-manifest.js +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/inspect/route_client-reference-manifest.js +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/knowledge/route_client-reference-manifest.js +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/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +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/notifications/route_client-reference-manifest.js +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/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +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/projects/route_client-reference-manifest.js +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/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +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/browser/route_client-reference-manifest.js +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/command/route_client-reference-manifest.js +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/events/route_client-reference-manifest.js +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/session/manage/route_client-reference-manifest.js +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/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +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/skill-health/route_client-reference-manifest.js +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/steer/route_client-reference-manifest.js +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/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +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/undo/route_client-reference-manifest.js +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_client-reference-manifest.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/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +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 +6 -6
- package/dist/web/standalone/.next/server/chunks/{1128.js → 1991.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- 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/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/worktree-cli-create.d.ts +10 -0
- package/dist/worktree-cli-create.js +11 -0
- package/dist/worktree-cli-format.d.ts +12 -0
- package/dist/worktree-cli-format.js +38 -0
- package/dist/worktree-cli-plan.d.ts +16 -0
- package/dist/worktree-cli-plan.js +19 -0
- package/dist/worktree-cli-session.d.ts +13 -0
- package/dist/worktree-cli-session.js +18 -0
- package/dist/worktree-cli-status.d.ts +35 -0
- package/dist/worktree-cli-status.js +54 -0
- package/dist/worktree-cli.d.ts +1 -16
- package/dist/worktree-cli.js +28 -122
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +25 -36
- package/integrations/hermes/pyproject.toml +1 -1
- package/integrations/hermes/tests/test_gsd_client_timeout.py +4 -4
- package/package.json +6 -6
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-cli.d.ts +1 -1
- package/packages/daemon/dist/cloud-cli.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-cli.js +42 -2
- package/packages/daemon/dist/cloud-cli.js.map +1 -1
- package/packages/daemon/dist/cloud-config.d.ts +1 -0
- package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-config.js +1 -1
- package/packages/daemon/dist/cloud-config.js.map +1 -1
- package/packages/daemon/dist/device-flow.d.ts +24 -0
- package/packages/daemon/dist/device-flow.d.ts.map +1 -0
- package/packages/daemon/dist/device-flow.js +128 -0
- package/packages/daemon/dist/device-flow.js.map +1 -0
- package/packages/daemon/dist/device-flow.test.d.ts +2 -0
- package/packages/daemon/dist/device-flow.test.d.ts.map +1 -0
- package/packages/daemon/dist/device-flow.test.js +172 -0
- package/packages/daemon/dist/device-flow.test.js.map +1 -0
- package/packages/daemon/dist/orchestrator-agent.d.ts +21 -0
- package/packages/daemon/dist/orchestrator-agent.d.ts.map +1 -0
- package/packages/daemon/dist/orchestrator-agent.js +113 -0
- package/packages/daemon/dist/orchestrator-agent.js.map +1 -0
- package/packages/daemon/dist/orchestrator-tools.d.ts +12 -0
- package/packages/daemon/dist/orchestrator-tools.d.ts.map +1 -0
- package/packages/daemon/dist/orchestrator-tools.js +137 -0
- package/packages/daemon/dist/orchestrator-tools.js.map +1 -0
- package/packages/daemon/dist/orchestrator.d.ts +4 -56
- package/packages/daemon/dist/orchestrator.d.ts.map +1 -1
- package/packages/daemon/dist/orchestrator.js +13 -303
- package/packages/daemon/dist/orchestrator.js.map +1 -1
- package/packages/daemon/dist/orchestrator.test.js +11 -1
- package/packages/daemon/dist/orchestrator.test.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
- package/packages/gsd-agent-core/package.json +5 -5
- 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 +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/gsd-cloud/README.md +34 -0
- package/packages/gsd-cloud/bin/gsd-cloud.js +27 -0
- package/packages/gsd-cloud/package.json +38 -0
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +14 -9
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
- package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
- package/packages/pi-ai/dist/tool-result-content.js +62 -0
- package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
- package/packages/pi-ai/dist/types.d.ts +8 -20
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-directories.d.ts +66 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +4 -1
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/core/export-html/template.js +53 -4
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +1 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +146 -33
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +44 -0
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +93 -0
- package/src/resources/extensions/gsd/activity-log.ts +1 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +114 -7
- package/src/resources/extensions/gsd/auto/orchestrator.ts +21 -14
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
- package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -4
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +77 -16
- package/src/resources/extensions/gsd/auto-model-selection.ts +33 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +26 -5
- package/src/resources/extensions/gsd/auto-prompts.ts +73 -113
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
- package/src/resources/extensions/gsd/auto-start.ts +62 -31
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -2
- package/src/resources/extensions/gsd/auto-timers.ts +9 -2
- package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
- package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
- package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
- package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
- package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
- package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
- package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
- package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
- package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
- package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +69 -2429
- package/src/resources/extensions/gsd/auto.ts +126 -47
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -2
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +218 -27
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +77 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +7 -1
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
- package/src/resources/extensions/gsd/compat/compat-marker.ts +47 -0
- package/src/resources/extensions/gsd/config-overlay.ts +7 -1
- package/src/resources/extensions/gsd/db/engine.ts +36 -0
- package/src/resources/extensions/gsd/db/queries.ts +9 -9
- package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
- package/src/resources/extensions/gsd/db-adapter.ts +29 -3
- package/src/resources/extensions/gsd/docs/preferences-reference.md +3 -3
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +109 -10
- package/src/resources/extensions/gsd/flat-phase-migration.ts +34 -3
- package/src/resources/extensions/gsd/forensics.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
- package/src/resources/extensions/gsd/git-service.ts +53 -0
- package/src/resources/extensions/gsd/gsd-db.ts +33 -11
- package/src/resources/extensions/gsd/guided-flow.ts +26 -18
- package/src/resources/extensions/gsd/journal.ts +1 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +52 -91
- package/src/resources/extensions/gsd/md-importer.ts +93 -22
- package/src/resources/extensions/gsd/metrics.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +15 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/paths.ts +108 -51
- package/src/resources/extensions/gsd/post-unit-hooks.ts +32 -0
- package/src/resources/extensions/gsd/preferences-models.ts +74 -20
- package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
- package/src/resources/extensions/gsd/preferences-types.ts +54 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +146 -9
- package/src/resources/extensions/gsd/preferences.ts +20 -0
- package/src/resources/extensions/gsd/prompts/system.md +6 -6
- package/src/resources/extensions/gsd/quick.ts +11 -3
- package/src/resources/extensions/gsd/reopen-reason.ts +109 -0
- package/src/resources/extensions/gsd/rule-registry.ts +111 -9
- package/src/resources/extensions/gsd/session-status-io.ts +34 -0
- package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +1 -9
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +2 -22
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +14 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-supervisor-inflight-guard.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-writable-probe.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +71 -1
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +46 -1
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +72 -32
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/import-completion-lost-update.test.ts +196 -0
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
- package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +88 -1
- package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -15
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +269 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/preferences.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/reopen-reason.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +95 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/sibling-model-fallbacks.test.ts +189 -0
- package/src/resources/extensions/gsd/tests/single-field-model-thinking.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/supervisor-model-swap-inflight-guard.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/supervisor-model-swap-thinking-clamp.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +196 -0
- package/src/resources/extensions/gsd/tests/uat-dispatch.test.ts +211 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +226 -2
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/worker-resume-wait.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +213 -2
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
- package/src/resources/extensions/gsd/tool-contract.ts +29 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +9 -5
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +19 -8
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +28 -5
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +13 -9
- package/src/resources/extensions/gsd/types.ts +23 -4
- package/src/resources/extensions/gsd/uat-dispatch.ts +176 -0
- package/src/resources/extensions/gsd/unit-registry.ts +16 -2
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +32 -2
- package/src/resources/extensions/gsd/uok/audit.ts +2 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +26 -36
- package/src/resources/extensions/gsd/uok/gitops.ts +21 -18
- package/src/resources/extensions/gsd/uok/kernel.ts +169 -48
- package/src/resources/extensions/gsd/uok/model-policy.ts +20 -17
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +1 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +9 -24
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
- package/src/resources/extensions/gsd/workspace.ts +5 -21
- package/src/resources/extensions/gsd/worktree-command.ts +1 -1
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +19 -15
- package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
- package/src/resources/extensions/shared/gsd-browser-cli.ts +64 -7
- package/src/resources/extensions/shared/interview-ui.ts +58 -11
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → XFuMvz26Zb_lrrR-8dvkd}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → XFuMvz26Zb_lrrR-8dvkd}/_ssgManifest.js +0 -0
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
import { loadFile, parseContinue, parseSummary, loadActiveOverrides, formatOverridesSection, parseTaskPlanFile } from "./files.js";
|
|
13
13
|
import type { Override } from "./files.js";
|
|
14
|
-
import {
|
|
14
|
+
import { extractVerdict } from "./verdict-parser.js";
|
|
15
15
|
import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
|
|
16
16
|
import {
|
|
17
17
|
resolveMilestoneFile, resolveSliceFile, resolveSlicePath,
|
|
@@ -60,11 +60,8 @@ import { debugLog } from "./debug-logger.js";
|
|
|
60
60
|
import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
|
|
61
61
|
import { findMilestoneIds } from "./milestone-ids.js";
|
|
62
62
|
import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
|
|
63
|
-
import {
|
|
64
|
-
|
|
65
|
-
shouldDispatchUatForContent,
|
|
66
|
-
type UatType,
|
|
67
|
-
} from "./uat-policy.js";
|
|
63
|
+
import { classifyUatContentForRun } from "./uat-policy.js";
|
|
64
|
+
import { checkNeedsRunUat as resolveNeedsRunUat, type UatDispatchCandidate } from "./uat-dispatch.js";
|
|
68
65
|
import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
|
|
69
66
|
|
|
70
67
|
export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
@@ -1514,116 +1511,43 @@ export async function checkNeedsReassessment(
|
|
|
1514
1511
|
return { sliceId: lastDone };
|
|
1515
1512
|
}
|
|
1516
1513
|
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
* `buildRunUatPrompt` does: classify the UAT body with the slice's SUMMARY as
|
|
1530
|
-
* supplemental context, so a `browser-executable` UAT whose slice references a
|
|
1531
|
-
* self-contained harness (`npm run test:uat`, `search-uat.mjs`, `npx
|
|
1532
|
-
* playwright test`) is promoted to `runtime-executable` for the gate too.
|
|
1533
|
-
*
|
|
1534
|
-
* Without this, `checkNeedsRunUat` returns `browser-executable` while the
|
|
1535
|
-
* prompt instructs runtime-only execution, causing the dispatch gate to
|
|
1536
|
-
* require browser tools / warm up the browser daemon (or stop dispatch when
|
|
1537
|
-
* browser MCP is unavailable) for UAT runs that never touch the browser. See
|
|
1538
|
-
* cursor[bot] review on PR #696 for the M007/S01 regression.
|
|
1539
|
-
*/
|
|
1540
|
-
async function resolveRunUatEffectiveType(
|
|
1514
|
+
|
|
1515
|
+
export function getRoadmapCompletedSliceCandidates(
|
|
1516
|
+
roadmapContent: string,
|
|
1517
|
+
): UatDispatchCandidate[] {
|
|
1518
|
+
return parseRoadmap(roadmapContent)
|
|
1519
|
+
.slices.filter((slice) => slice.done)
|
|
1520
|
+
.map((slice) => ({ sliceId: slice.id }))
|
|
1521
|
+
.reverse();
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
|
|
1525
|
+
export async function loadRoadmapCompletedSliceCandidates(
|
|
1541
1526
|
base: string,
|
|
1542
1527
|
mid: string,
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
):
|
|
1546
|
-
|
|
1547
|
-
try {
|
|
1548
|
-
const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
|
|
1549
|
-
if (summaryPath) {
|
|
1550
|
-
summaryContent = (await loadFile(summaryPath)) ?? "";
|
|
1551
|
-
}
|
|
1552
|
-
} catch (err) {
|
|
1553
|
-
logWarning(
|
|
1554
|
-
"prompt",
|
|
1555
|
-
`resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
1556
|
-
);
|
|
1557
|
-
}
|
|
1558
|
-
return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
|
|
1528
|
+
): Promise<UatDispatchCandidate[]> {
|
|
1529
|
+
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
1530
|
+
const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
|
|
1531
|
+
return roadmapContent ? getRoadmapCompletedSliceCandidates(roadmapContent) : [];
|
|
1559
1532
|
}
|
|
1560
1533
|
|
|
1534
|
+
/**
|
|
1535
|
+
* Back-compat wrapper for callers that import UAT dispatch checks from the
|
|
1536
|
+
* prompt module. UAT dispatch architecture lives in `uat-dispatch.ts`; the
|
|
1537
|
+
* `state` parameter is intentionally ignored because DB/roadmap artifacts are
|
|
1538
|
+
* the source of truth for completed-slice discovery.
|
|
1539
|
+
*/
|
|
1561
1540
|
export async function checkNeedsRunUat(
|
|
1562
1541
|
base: string, mid: string, state: GSDState, prefs: GSDPreferences | undefined,
|
|
1563
|
-
): Promise<
|
|
1564
|
-
|
|
1565
|
-
try {
|
|
1566
|
-
const { isDbAvailable, getMilestoneSlices } = await import("./gsd-db.js");
|
|
1567
|
-
if (isDbAvailable()) {
|
|
1568
|
-
const slices = getMilestoneSlices(mid);
|
|
1569
|
-
if (slices.length > 0) {
|
|
1570
|
-
const completedSlices = slices.filter(s => s.status === "complete");
|
|
1571
|
-
if (completedSlices.length === 0) return null;
|
|
1572
|
-
for (const completed of [...completedSlices].reverse()) {
|
|
1573
|
-
const sid = completed.id;
|
|
1574
|
-
const uatFile = resolveSliceFile(base, mid, sid, "UAT");
|
|
1575
|
-
if (!uatFile) continue;
|
|
1576
|
-
const uatContent = await loadFile(uatFile);
|
|
1577
|
-
if (!uatContent) continue;
|
|
1578
|
-
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
1579
|
-
if (hasVerdict(uatContent)) continue;
|
|
1580
|
-
// Also check the ASSESSMENT file — the run-uat prompt writes the verdict
|
|
1581
|
-
// there (via gsd_uat_result_save), not into the
|
|
1582
|
-
// UAT spec file. Without this check the unit re-dispatches indefinitely.
|
|
1583
|
-
const assessmentFile = resolveSliceFile(base, mid, sid, "ASSESSMENT");
|
|
1584
|
-
if (assessmentFile) {
|
|
1585
|
-
const assessmentContent = await loadFile(assessmentFile);
|
|
1586
|
-
if (assessmentContent && hasVerdict(assessmentContent)) continue;
|
|
1587
|
-
}
|
|
1588
|
-
if (!shouldDispatchUatForContent(uatContent, prefs)) continue;
|
|
1589
|
-
const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
|
|
1590
|
-
return { sliceId: sid, uatType };
|
|
1591
|
-
}
|
|
1592
|
-
return null;
|
|
1593
|
-
}
|
|
1594
|
-
}
|
|
1595
|
-
} catch (err) {
|
|
1596
|
-
logWarning("prompt", `checkNeedsRunUat DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1597
|
-
}
|
|
1542
|
+
): Promise<Awaited<ReturnType<typeof resolveNeedsRunUat>>> {
|
|
1543
|
+
void state;
|
|
1598
1544
|
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
const completedFileSlices = parsed.slices.filter(s => s.done);
|
|
1606
|
-
if (completedFileSlices.length === 0) return null;
|
|
1607
|
-
for (const completed of [...completedFileSlices].reverse()) {
|
|
1608
|
-
const uatSid = completed.id;
|
|
1609
|
-
const uatFileFb = resolveSliceFile(base, mid, uatSid, "UAT");
|
|
1610
|
-
if (!uatFileFb) continue;
|
|
1611
|
-
const uatContentFb = await loadFile(uatFileFb);
|
|
1612
|
-
if (!uatContentFb) continue;
|
|
1613
|
-
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
1614
|
-
if (hasVerdict(uatContentFb)) continue;
|
|
1615
|
-
// Also check the ASSESSMENT file for the file-based fallback path (same
|
|
1616
|
-
// reason as the DB path above — verdict lives in ASSESSMENT, not UAT).
|
|
1617
|
-
const assessmentFileFb = resolveSliceFile(base, mid, uatSid, "ASSESSMENT");
|
|
1618
|
-
if (assessmentFileFb) {
|
|
1619
|
-
const assessmentContentFb = await loadFile(assessmentFileFb);
|
|
1620
|
-
if (assessmentContentFb && hasVerdict(assessmentContentFb)) continue;
|
|
1621
|
-
}
|
|
1622
|
-
if (!shouldDispatchUatForContent(uatContentFb, prefs)) continue;
|
|
1623
|
-
const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
|
|
1624
|
-
return { sliceId: uatSid, uatType };
|
|
1625
|
-
}
|
|
1626
|
-
return null;
|
|
1545
|
+
return resolveNeedsRunUat(
|
|
1546
|
+
base,
|
|
1547
|
+
mid,
|
|
1548
|
+
prefs,
|
|
1549
|
+
await loadRoadmapCompletedSliceCandidates(base, mid),
|
|
1550
|
+
);
|
|
1627
1551
|
}
|
|
1628
1552
|
|
|
1629
1553
|
// ─── Prompt Builders ──────────────────────────────────────────────────────
|
|
@@ -2801,6 +2725,26 @@ export async function buildExecuteTaskPrompt(
|
|
|
2801
2725
|
let phaseAnchorSection = planAnchor ? formatAnchorForPrompt(planAnchor) : "";
|
|
2802
2726
|
trackPromptContext(contextTelemetry, "plan-anchor", phaseAnchorSection ? "inline" : "skipped", phaseAnchorSection, phaseAnchorSection ? undefined : "missing");
|
|
2803
2727
|
|
|
2728
|
+
// #1272: inject a pending reopen reason into this task's prompt. When a gate
|
|
2729
|
+
// (e.g. complete-slice's full-suite run) reopened the task via gsd_task_reopen
|
|
2730
|
+
// with a diagnosis, surface it here so the re-dispatched executor fixes the
|
|
2731
|
+
// regression instead of re-running the original (green) scoped verify. Claim
|
|
2732
|
+
// is one-shot (artifact deleted on read). Not feature-gated — a reopened task
|
|
2733
|
+
// must always know why. Prepended so it sits above the plan anchor.
|
|
2734
|
+
try {
|
|
2735
|
+
const { claimReopenReasonForInjection } = await import("./reopen-reason.js");
|
|
2736
|
+
const reopenClaimed = claimReopenReasonForInjection(base, mid, sid, tid);
|
|
2737
|
+
if (reopenClaimed) {
|
|
2738
|
+
const block = reopenClaimed.injectionBlock + "\n\n---\n\n";
|
|
2739
|
+
phaseAnchorSection = phaseAnchorSection
|
|
2740
|
+
? `${block}${phaseAnchorSection}`
|
|
2741
|
+
: block;
|
|
2742
|
+
trackPromptContext(contextTelemetry, "reopen-reason", "inline", reopenClaimed.injectionBlock);
|
|
2743
|
+
}
|
|
2744
|
+
} catch (reopenErr) {
|
|
2745
|
+
logWarning("prompt", `reopen reason injection failed: ${(reopenErr as Error).message}`);
|
|
2746
|
+
}
|
|
2747
|
+
|
|
2804
2748
|
// ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
|
|
2805
2749
|
// into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
|
|
2806
2750
|
// if a parallel build already injected it, we skip. Feature-gated by
|
|
@@ -3909,9 +3853,15 @@ export async function buildReassessRoadmapPrompt(
|
|
|
3909
3853
|
* that instructs the coordinator how to dispatch a `subagent` call. Either or
|
|
3910
3854
|
* both may be absent (ADR-026 / #508).
|
|
3911
3855
|
*/
|
|
3912
|
-
function subagentCallSuffix(model?: string, thinking?: string): string {
|
|
3856
|
+
function subagentCallSuffix(model?: string, thinking?: string, fallbacks?: string[]): string {
|
|
3913
3857
|
const parts: string[] = [];
|
|
3914
|
-
if (model)
|
|
3858
|
+
if (model) {
|
|
3859
|
+
let modelHint = `model: "${model}"`;
|
|
3860
|
+
if (fallbacks && fallbacks.length > 0) {
|
|
3861
|
+
modelHint += ` (fallbacks, in order: ${fallbacks.map((f) => `"${f}"`).join(", ")})`;
|
|
3862
|
+
}
|
|
3863
|
+
parts.push(modelHint);
|
|
3864
|
+
}
|
|
3915
3865
|
if (thinking) parts.push(`thinking: "${thinking}"`);
|
|
3916
3866
|
return parts.length > 0 ? ` with ${parts.join(" and ")}` : "";
|
|
3917
3867
|
}
|
|
@@ -3922,7 +3872,13 @@ export async function buildReactiveExecutePrompt(
|
|
|
3922
3872
|
subagentModel?: string,
|
|
3923
3873
|
// Reasoning effort travels inside opts here (not as a positional param) so
|
|
3924
3874
|
// existing positional `opts` callers don't shift (#508).
|
|
3925
|
-
opts?: {
|
|
3875
|
+
opts?: {
|
|
3876
|
+
sessionContextWindow?: number;
|
|
3877
|
+
modelRegistry?: MinimalModelRegistry;
|
|
3878
|
+
sessionProvider?: string;
|
|
3879
|
+
subagentThinking?: string;
|
|
3880
|
+
subagentModelFallbacks?: string[];
|
|
3881
|
+
},
|
|
3926
3882
|
): Promise<string> {
|
|
3927
3883
|
const { loadSliceTaskIO, deriveTaskGraph, graphMetrics } = await import("./reactive-graph.js");
|
|
3928
3884
|
|
|
@@ -4019,7 +3975,11 @@ export async function buildReactiveExecutePrompt(
|
|
|
4019
3975
|
`When done, say: "Task ${tid} complete."`,
|
|
4020
3976
|
].join("\n");
|
|
4021
3977
|
|
|
4022
|
-
const modelSuffix = subagentCallSuffix(
|
|
3978
|
+
const modelSuffix = subagentCallSuffix(
|
|
3979
|
+
subagentModel,
|
|
3980
|
+
opts?.subagentThinking,
|
|
3981
|
+
opts?.subagentModelFallbacks,
|
|
3982
|
+
);
|
|
4023
3983
|
subagentSections.push([
|
|
4024
3984
|
`### ${tid}: ${tTitle}`,
|
|
4025
3985
|
"",
|
|
@@ -234,12 +234,56 @@ export function refreshRecoveryDbForArtifact(
|
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
if (!isClosedStatus(task.status)) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
237
|
+
// The artifact was already confirmed on disk by verifyExpectedArtifact
|
|
238
|
+
// upstream (Gate 1 accepts a checked disk checkbox as proof of completion),
|
|
239
|
+
// but the DB task row is still open. A bare refreshWorkflowDatabaseFromDisk
|
|
240
|
+
// never promotes the disk checkbox into task status (the checkbox is
|
|
241
|
+
// rendered *from* the DB, never *into* it), so this divergence can never
|
|
242
|
+
// self-heal. Promote the task to align the DB with disk instead of failing
|
|
243
|
+
// shut — otherwise the lowest-pending derivation re-picks the same task
|
|
244
|
+
// forever and execute-task hard-stops with "state did not advance" (#1204).
|
|
245
|
+
// Mirrors the promotion pattern used by the context-exhaustion and
|
|
246
|
+
// reactive-execute-blocker recovery paths.
|
|
247
|
+
const ts = new Date().toISOString();
|
|
248
|
+
// Only the DB promotion is load-bearing: if it throws, nothing advanced
|
|
249
|
+
// and failing shut is correct. The plan checkbox rewrite and cache clears
|
|
250
|
+
// are best-effort follow-ups — a throw there must NOT abort recovery, or
|
|
251
|
+
// the DB is left complete without ever emitting the stuck-artifact-recovery
|
|
252
|
+
// event (#1221), stranding worktree reconciliation.
|
|
253
|
+
try {
|
|
254
|
+
updateTaskStatus(mid, sid, tid, "complete", ts);
|
|
255
|
+
} catch (e) {
|
|
256
|
+
return {
|
|
257
|
+
ok: false,
|
|
258
|
+
fatal: true,
|
|
259
|
+
reason: "execute-task-artifact-db-promote-failed",
|
|
260
|
+
message: `Stuck recovery found execute-task ${unitId} artifacts, but promoting the DB task status from '${task.status}' failed: ${getErrorMessage(e)}`,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
try {
|
|
264
|
+
const artifactBase = resolveArtifactVerificationBase(unitId, basePath);
|
|
265
|
+
const planPath = resolveExpectedArtifactPath("plan-slice", `${mid}/${sid}`, artifactBase);
|
|
266
|
+
if (planPath && existsSync(planPath)) {
|
|
267
|
+
const planContent = readFileSync(planPath, "utf-8");
|
|
268
|
+
const updatedPlan = planContent.replace(
|
|
269
|
+
new RegExp(`^(\\s*-\\s+)\\[ \\]\\s+\\*\\*${tid}:`, "m"),
|
|
270
|
+
`$1[x] **${tid}:`,
|
|
271
|
+
);
|
|
272
|
+
if (updatedPlan !== planContent) {
|
|
273
|
+
atomicWriteSync(planPath, updatedPlan);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
clearPathCache();
|
|
277
|
+
clearParseCache();
|
|
278
|
+
} catch (e) {
|
|
279
|
+
logWarning("recovery", `stuck-artifact plan checkbox sync failed after DB promotion of ${unitId}: ${getErrorMessage(e)}`);
|
|
280
|
+
}
|
|
281
|
+
// Append event so worktree reconciliation can replay this recovery completion.
|
|
282
|
+
try {
|
|
283
|
+
appendEvent(basePath, { cmd: "complete-task", params: { milestoneId: mid, sliceId: sid, taskId: tid }, ts, actor: "system", trigger_reason: "stuck-artifact-recovery" });
|
|
284
|
+
} catch (e) {
|
|
285
|
+
logWarning("recovery", `appendEvent failed for stuck-artifact task promotion: ${getErrorMessage(e)}`);
|
|
286
|
+
}
|
|
243
287
|
}
|
|
244
288
|
|
|
245
289
|
return { ok: true };
|
|
@@ -63,18 +63,20 @@ import {
|
|
|
63
63
|
detectWorktreeName,
|
|
64
64
|
setActiveMilestoneId,
|
|
65
65
|
} from "./worktree.js";
|
|
66
|
-
import {
|
|
66
|
+
import { isInAutoWorktree } from "./auto-worktree-entry.js";
|
|
67
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
67
68
|
import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
|
|
68
|
-
import {
|
|
69
|
+
import { cleanStaleRuntimeUnits } from "./auto-worktree-runtime-cleanup.js";
|
|
70
|
+
import { readResourceVersion } from "./auto-worktree-resource-version.js";
|
|
69
71
|
import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
|
|
70
72
|
import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
|
|
71
73
|
import { queryJournal } from "./journal.js";
|
|
72
74
|
import { initMetrics } from "./metrics.js";
|
|
73
75
|
import { initRoutingHistory } from "./routing-history.js";
|
|
74
|
-
import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
|
|
76
|
+
import { restoreHookState, resetHookState, reconcileRestoredHookDispatch } from "./post-unit-hooks.js";
|
|
75
77
|
import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
|
|
76
78
|
import { snapshotSkills } from "./skill-discovery.js";
|
|
77
|
-
import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, updateMilestoneStatus } from "./gsd-db.js";
|
|
79
|
+
import { isDbAvailable, probeDbWritable, getMilestone, getAllMilestones, insertMilestone, updateMilestoneStatus } from "./gsd-db.js";
|
|
78
80
|
import {
|
|
79
81
|
getWorkflowDatabaseStatus,
|
|
80
82
|
openExistingWorkflowDatabase,
|
|
@@ -203,35 +205,43 @@ export function reconcileProjectMilestonesFromDisk(basePath: string): number {
|
|
|
203
205
|
export function reconcileMergedMilestonesFromJournal(basePath: string): number {
|
|
204
206
|
if (!isDbAvailable()) return 0;
|
|
205
207
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
let closed = 0;
|
|
219
|
-
for (const [milestoneId, completedAt] of mergedAtByMilestone) {
|
|
220
|
-
const existing = getMilestone(milestoneId);
|
|
221
|
-
if (!existing) {
|
|
222
|
-
insertMilestone({ id: milestoneId, title: milestoneId, status: "complete" });
|
|
223
|
-
updateMilestoneStatus(milestoneId, "complete", completedAt);
|
|
224
|
-
closed++;
|
|
225
|
-
continue;
|
|
208
|
+
try {
|
|
209
|
+
const mergedAtByMilestone = new Map<string, string>();
|
|
210
|
+
for (const entry of queryJournal(basePath, { eventType: "worktree-merged" })) {
|
|
211
|
+
const data = entry.data ?? {};
|
|
212
|
+
const milestoneId = typeof data.milestoneId === "string" ? data.milestoneId : null;
|
|
213
|
+
if (!milestoneId) continue;
|
|
214
|
+
if (data.conflict === true) continue;
|
|
215
|
+
|
|
216
|
+
const endedAt = typeof data.endedAt === "string" ? data.endedAt : entry.ts;
|
|
217
|
+
const previous = mergedAtByMilestone.get(milestoneId);
|
|
218
|
+
if (!previous || endedAt > previous) mergedAtByMilestone.set(milestoneId, endedAt);
|
|
226
219
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
220
|
+
|
|
221
|
+
let closed = 0;
|
|
222
|
+
for (const [milestoneId, completedAt] of mergedAtByMilestone) {
|
|
223
|
+
const existing = getMilestone(milestoneId);
|
|
224
|
+
if (!existing) {
|
|
225
|
+
insertMilestone({ id: milestoneId, title: milestoneId, status: "complete" });
|
|
226
|
+
updateMilestoneStatus(milestoneId, "complete", completedAt);
|
|
227
|
+
closed++;
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (!isClosedStatus(existing.status)) {
|
|
231
|
+
updateMilestoneStatus(milestoneId, "complete", completedAt);
|
|
232
|
+
closed++;
|
|
233
|
+
}
|
|
230
234
|
}
|
|
231
|
-
}
|
|
232
235
|
|
|
233
|
-
|
|
234
|
-
|
|
236
|
+
if (closed > 0) invalidateAllCaches();
|
|
237
|
+
return closed;
|
|
238
|
+
} catch (err) {
|
|
239
|
+
logWarning(
|
|
240
|
+
"bootstrap",
|
|
241
|
+
`merged-milestone journal reconciliation failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
242
|
+
);
|
|
243
|
+
return 0;
|
|
244
|
+
}
|
|
235
245
|
}
|
|
236
246
|
|
|
237
247
|
/**
|
|
@@ -1622,6 +1632,10 @@ export async function bootstrapAutoSession(
|
|
|
1622
1632
|
s.unitLifetimeDispatches.clear();
|
|
1623
1633
|
resetHookState();
|
|
1624
1634
|
restoreHookState(base);
|
|
1635
|
+
// A restored activeHook has no live dispatch (the sidecar queue is not
|
|
1636
|
+
// persisted); re-enqueue it so the hook runs instead of blocking the next
|
|
1637
|
+
// unrelated unit's close-out (#1246).
|
|
1638
|
+
reconcileRestoredHookDispatch(base, s.sidecarQueue);
|
|
1625
1639
|
resetProactiveHealing();
|
|
1626
1640
|
// Notify user on health level transitions (green→yellow→red and back)
|
|
1627
1641
|
setLevelChangeCallback((_from, to, summary) => {
|
|
@@ -1776,6 +1790,23 @@ export async function bootstrapAutoSession(
|
|
|
1776
1790
|
return releaseLockAndReturn();
|
|
1777
1791
|
}
|
|
1778
1792
|
|
|
1793
|
+
// Gate: confirm the handle is actually writable, not just open. A
|
|
1794
|
+
// schema-current DB does zero writes during open, so a read-only /
|
|
1795
|
+
// DBMOVED handle otherwise passes the check above and only fails much
|
|
1796
|
+
// later at the first authoritative write (the uok-kernel-enter audit)
|
|
1797
|
+
// with an opaque "readonly database" error (#1234).
|
|
1798
|
+
if (existsSync(gsdDbPath) && isDbAvailable()) {
|
|
1799
|
+
const writable = probeDbWritable();
|
|
1800
|
+
if (!writable.ok) {
|
|
1801
|
+
const detail = writable.detail ? ` (${writable.detail})` : "";
|
|
1802
|
+
ctx.ui.notify(
|
|
1803
|
+
`SQLite database is not writable: ${gsdDbPath}.${detail} Check file/WAL permissions or reopen a stale handle before running auto-mode.`,
|
|
1804
|
+
"error",
|
|
1805
|
+
);
|
|
1806
|
+
return releaseLockAndReturn();
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1809
|
+
|
|
1779
1810
|
// Initialize metrics
|
|
1780
1811
|
initMetrics(s.basePath);
|
|
1781
1812
|
|
|
@@ -1813,7 +1844,7 @@ export async function bootstrapAutoSession(
|
|
|
1813
1844
|
|
|
1814
1845
|
// Snapshot installed skills
|
|
1815
1846
|
if (resolveSkillDiscoveryMode(base) !== "off") {
|
|
1816
|
-
snapshotSkills();
|
|
1847
|
+
snapshotSkills({ cwd: s.basePath });
|
|
1817
1848
|
}
|
|
1818
1849
|
|
|
1819
1850
|
setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
|
|
@@ -21,6 +21,8 @@ import { existsSync } from "node:fs";
|
|
|
21
21
|
|
|
22
22
|
import { bumpAndResolveSynthetic } from "./auto/resolve.js";
|
|
23
23
|
import { finalizeProjectResearchTimeout } from "./project-research-policy.js";
|
|
24
|
+
import { applySupervisorModelIfConfigured } from "./auto-model-selection.js";
|
|
25
|
+
import { getInFlightToolCount } from "./auto-tool-tracking.js";
|
|
24
26
|
|
|
25
27
|
export interface RecoveryContext {
|
|
26
28
|
basePath: string;
|
|
@@ -122,13 +124,17 @@ export async function recoverTimedOutUnit(
|
|
|
122
124
|
"If full completion is impossible, write the partial artifact/state needed for recovery and make the blocker explicit.",
|
|
123
125
|
];
|
|
124
126
|
|
|
127
|
+
const recoveryTrigger = getInFlightToolCount() === 0;
|
|
128
|
+
if (recoveryTrigger) {
|
|
129
|
+
await applySupervisorModelIfConfigured(ctx, pi, basePath);
|
|
130
|
+
}
|
|
125
131
|
pi.sendMessage(
|
|
126
132
|
{
|
|
127
133
|
customType: "gsd-auto-timeout-recovery",
|
|
128
134
|
display: verbose,
|
|
129
135
|
content: steeringLines.join("\n"),
|
|
130
136
|
},
|
|
131
|
-
{ triggerTurn:
|
|
137
|
+
{ triggerTurn: recoveryTrigger, deliverAs: "steer" },
|
|
132
138
|
);
|
|
133
139
|
ctx.ui.notify(
|
|
134
140
|
`${reason === "idle" ? "Idle" : "Timeout"} recovery: steering ${unitType} ${unitId} to finish durable output (attempt ${attemptNumber}, session ${recoveryAttempts + 1}/${maxRecoveryAttempts}).`,
|
|
@@ -249,13 +255,17 @@ export async function recoverTimedOutUnit(
|
|
|
249
255
|
"If blocked, write the partial artifact and explicitly record the blocker instead of going silent.",
|
|
250
256
|
];
|
|
251
257
|
|
|
258
|
+
const recoveryTrigger = getInFlightToolCount() === 0;
|
|
259
|
+
if (recoveryTrigger) {
|
|
260
|
+
await applySupervisorModelIfConfigured(ctx, pi, basePath);
|
|
261
|
+
}
|
|
252
262
|
pi.sendMessage(
|
|
253
263
|
{
|
|
254
264
|
customType: "gsd-auto-timeout-recovery",
|
|
255
265
|
display: verbose,
|
|
256
266
|
content: steeringLines.join("\n"),
|
|
257
267
|
},
|
|
258
|
-
{ triggerTurn:
|
|
268
|
+
{ triggerTurn: recoveryTrigger, deliverAs: "steer" },
|
|
259
269
|
);
|
|
260
270
|
ctx.ui.notify(
|
|
261
271
|
`${reason === "idle" ? "Idle" : "Timeout"} recovery: steering ${unitType} ${unitId} to produce ${expected} (attempt ${attemptNumber}, session ${recoveryAttempts + 1}/${maxRecoveryAttempts}).`,
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
hasInteractiveToolInFlight,
|
|
20
20
|
} from "./auto-tool-tracking.js";
|
|
21
21
|
import { detectWorkingTreeActivity } from "./auto-supervisor.js";
|
|
22
|
+
import { applySupervisorModelIfConfigured } from "./auto-model-selection.js";
|
|
22
23
|
import { closeoutUnit, type CloseoutOptions } from "./auto-unit-closeout.js";
|
|
23
24
|
import { saveActivityLog } from "./activity-log.js";
|
|
24
25
|
import { recoverTimedOutUnit, type RecoveryContext } from "./auto-timeout-recovery.js";
|
|
@@ -158,7 +159,7 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
158
159
|
: idleTimeoutMs;
|
|
159
160
|
|
|
160
161
|
// ── 1. Soft timeout warning ──
|
|
161
|
-
s.wrapupWarningHandle = setTimeout(() => {
|
|
162
|
+
s.wrapupWarningHandle = setTimeout(async () => {
|
|
162
163
|
s.wrapupWarningHandle = null;
|
|
163
164
|
if (!s.active || !s.currentUnit) return;
|
|
164
165
|
writeUnitRuntimeRecord(s.basePath, unitType, unitId, s.currentUnit.startedAt, {
|
|
@@ -169,6 +170,9 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
169
170
|
// Triggering during active tool calls causes tool results to be skipped
|
|
170
171
|
// with "Skipped due to queued user message", leading to provider errors (#3512).
|
|
171
172
|
const softTrigger = getInFlightToolCount() === 0;
|
|
173
|
+
if (softTrigger) {
|
|
174
|
+
await applySupervisorModelIfConfigured(ctx, pi, s.basePath);
|
|
175
|
+
}
|
|
172
176
|
pi.sendMessage(
|
|
173
177
|
{
|
|
174
178
|
customType: "gsd-auto-wrapup",
|
|
@@ -351,7 +355,7 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
351
355
|
ctx.model?.provider,
|
|
352
356
|
);
|
|
353
357
|
const continueHereThreshold = computeBudgets(executorContextWindow).continueThresholdPercent;
|
|
354
|
-
s.continueHereHandle = setInterval(() => {
|
|
358
|
+
s.continueHereHandle = setInterval(async () => {
|
|
355
359
|
if (!s.active || !s.currentUnit || !s.cmdCtx) return;
|
|
356
360
|
const runtime = readUnitRuntimeRecord(s.basePath, unitType, unitId);
|
|
357
361
|
if (runtime?.continueHereFired) return;
|
|
@@ -382,6 +386,9 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
382
386
|
|
|
383
387
|
// Only trigger a new turn if no tools are currently in flight (#3512).
|
|
384
388
|
const contextTrigger = getInFlightToolCount() === 0;
|
|
389
|
+
if (contextTrigger) {
|
|
390
|
+
await applySupervisorModelIfConfigured(ctx, pi, s.basePath);
|
|
391
|
+
}
|
|
385
392
|
pi.sendMessage(
|
|
386
393
|
{
|
|
387
394
|
customType: "gsd-auto-wrapup",
|