@opengsd/gsd-pi 1.4.0 → 1.5.0-dev.4fb2d460
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 +11 -11
- package/dist/onboarding.js +11 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +20 -25
- package/dist/resources/extensions/ask-user-questions.js +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +118 -53
- package/dist/resources/extensions/cursor-cli/index.js +16 -0
- package/dist/resources/extensions/cursor-cli/models.js +63 -0
- package/dist/resources/extensions/cursor-cli/package.json +11 -0
- package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
- package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
- package/dist/resources/extensions/gsd/activity-log.js +4 -1
- package/dist/resources/extensions/gsd/artifact-verification.js +25 -9
- package/dist/resources/extensions/gsd/auto/closeout.js +137 -42
- package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -3
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
- package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +12 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +31 -7
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
- package/dist/resources/extensions/gsd/auto-prompts.js +76 -2
- package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
- package/dist/resources/extensions/gsd/auto-start.js +8 -6
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -0
- 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 -2046
- package/dist/resources/extensions/gsd/auto.js +31 -5
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -0
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +134 -7
- package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +194 -28
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +14 -1
- package/dist/resources/extensions/gsd/codebase-generator.js +164 -20
- package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +153 -1
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
- package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
- package/dist/resources/extensions/gsd/db/queries.js +48 -9
- package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
- package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +292 -18
- package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
- package/dist/resources/extensions/gsd/doctor.js +93 -3
- package/dist/resources/extensions/gsd/exec-sandbox.js +6 -2
- package/dist/resources/extensions/gsd/flat-phase-migration.js +106 -26
- 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 +59 -18
- package/dist/resources/extensions/gsd/gsd-db.js +75 -11
- package/dist/resources/extensions/gsd/guidance.js +1 -0
- package/dist/resources/extensions/gsd/guided-flow.js +62 -19
- package/dist/resources/extensions/gsd/key-manager.js +1 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +40 -11
- package/dist/resources/extensions/gsd/md-importer.js +89 -23
- package/dist/resources/extensions/gsd/migrate-external.js +24 -7
- package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +14 -3
- 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 +17 -3
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- 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 +107 -2
- package/dist/resources/extensions/gsd/preferences.js +49 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/dist/resources/extensions/gsd/prompts/system.md +6 -6
- package/dist/resources/extensions/gsd/quick.js +12 -3
- package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
- package/dist/resources/extensions/gsd/repo-identity.js +16 -0
- package/dist/resources/extensions/gsd/repository-registry.js +6 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +4 -2
- package/dist/resources/extensions/gsd/safe-fs.js +23 -2
- package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
- 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/tool-contract.js +14 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +76 -8
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +13 -5
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
- package/dist/resources/extensions/gsd/unit-registry.js +37 -2
- package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
- package/dist/resources/extensions/gsd/workspace.js +26 -8
- package/dist/resources/extensions/gsd/worktree-command.js +1 -1
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +81 -14
- package/dist/resources/extensions/gsd/worktree-manager.js +97 -4
- package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
- 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 +9 -9
- 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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 +9 -9
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- 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.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/wizard.d.ts +8 -0
- package/dist/wizard.js +8 -1
- package/integrations/hermes/CONTEXT.md +47 -0
- package/integrations/hermes/README.md +21 -0
- package/integrations/hermes/__init__.py +31 -0
- package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
- package/integrations/hermes/docs/setup.md +4 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +141 -0
- package/integrations/hermes/open_gsd_hermes/config.py +2 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +591 -39
- package/integrations/hermes/open_gsd_hermes/notifications.py +10 -1
- package/integrations/hermes/plugin.yaml +4 -0
- package/integrations/hermes/tests/test_config.py +6 -0
- package/integrations/hermes/tests/test_directory_loader.py +37 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +3 -0
- package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
- package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
- package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
- package/integrations/hermes/tests/test_milestone_client.py +447 -0
- package/integrations/hermes/tests/test_new_milestone_command.py +313 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +40 -0
- package/package.json +8 -8
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
- package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-runtime.js +25 -1
- package/packages/daemon/dist/cloud-runtime.js.map +1 -1
- package/packages/daemon/dist/cloud-runtime.test.js +51 -0
- package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
- package/packages/daemon/dist/message-batcher.d.ts +7 -0
- package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
- package/packages/daemon/dist/message-batcher.js +13 -0
- package/packages/daemon/dist/message-batcher.js.map +1 -1
- package/packages/daemon/dist/message-batcher.test.js +48 -0
- package/packages/daemon/dist/message-batcher.test.js.map +1 -1
- package/packages/daemon/dist/session-manager.js +1 -1
- package/packages/daemon/dist/session-manager.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
- 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/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +18 -5
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +46 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- 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/env-api-keys.d.ts.map +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +3 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +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 +10 -22
- 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/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +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/session-manager-types.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +3 -0
- package/packages/pi-coding-agent/dist/core/session-manager.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/dist/rpc-client.js +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- 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/scripts/link-workspace-packages.cjs +14 -4
- package/src/resources/GSD-WORKFLOW.md +20 -25
- package/src/resources/extensions/ask-user-questions.ts +1 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +130 -51
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +371 -39
- package/src/resources/extensions/cursor-cli/index.ts +18 -0
- package/src/resources/extensions/cursor-cli/models.ts +65 -0
- package/src/resources/extensions/cursor-cli/package.json +11 -0
- package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
- package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
- package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
- package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
- package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
- package/src/resources/extensions/gsd/activity-log.ts +4 -1
- package/src/resources/extensions/gsd/artifact-verification.ts +25 -9
- package/src/resources/extensions/gsd/auto/closeout.ts +163 -58
- package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -3
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
- package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +12 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +35 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +73 -2
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
- package/src/resources/extensions/gsd/auto-start.ts +9 -6
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +4 -0
- 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 -2390
- package/src/resources/extensions/gsd/auto.ts +32 -19
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -0
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +148 -7
- package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +229 -28
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +23 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +186 -19
- package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +135 -1
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
- package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
- package/src/resources/extensions/gsd/db/queries.ts +49 -9
- package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
- package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +372 -22
- package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
- package/src/resources/extensions/gsd/doctor-types.ts +5 -1
- package/src/resources/extensions/gsd/doctor.ts +95 -3
- package/src/resources/extensions/gsd/exec-sandbox.ts +6 -2
- package/src/resources/extensions/gsd/flat-phase-migration.ts +132 -25
- 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 +67 -17
- package/src/resources/extensions/gsd/gsd-db.ts +105 -11
- package/src/resources/extensions/gsd/guidance.ts +2 -0
- package/src/resources/extensions/gsd/guided-flow.ts +71 -20
- package/src/resources/extensions/gsd/key-manager.ts +1 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +40 -10
- package/src/resources/extensions/gsd/md-importer.ts +93 -22
- package/src/resources/extensions/gsd/migrate-external.ts +23 -6
- package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +19 -4
- package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
- package/src/resources/extensions/gsd/model-router.ts +4 -5
- 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 +21 -3
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -3
- package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
- package/src/resources/extensions/gsd/preferences-types.ts +30 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +97 -2
- package/src/resources/extensions/gsd/preferences.ts +58 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/src/resources/extensions/gsd/prompts/system.md +6 -6
- package/src/resources/extensions/gsd/quick.ts +11 -3
- package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
- package/src/resources/extensions/gsd/repo-identity.ts +17 -0
- package/src/resources/extensions/gsd/repository-registry.ts +7 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +3 -2
- package/src/resources/extensions/gsd/safe-fs.ts +22 -2
- package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
- 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/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-loop.test.ts +131 -5
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +111 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +10 -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/batch-task-query.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +571 -5
- package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -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 +109 -2
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -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/state-machine-edge-cases.test.ts +4 -2
- 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/markdown-renderer.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
- 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/migrate-external-worktree.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +592 -23
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +25 -1
- 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/pending-autostart-scope.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +264 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/preferences.test.ts +169 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +31 -9
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -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/state-corruption-2945.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
- 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/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +259 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +208 -1
- package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
- 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-journal-events.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
- 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 +36 -3
- 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/tests/worktree-teardown-safety.test.ts +32 -0
- package/src/resources/extensions/gsd/tool-contract.ts +29 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +107 -9
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +13 -5
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
- package/src/resources/extensions/gsd/unit-registry.ts +48 -2
- package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
- package/src/resources/extensions/gsd/workspace.ts +42 -8
- package/src/resources/extensions/gsd/worktree-command.ts +1 -1
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +154 -26
- package/src/resources/extensions/gsd/worktree-manager.ts +143 -5
- package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
- 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/{zQLcXm0Za8lexoXtgDpMG → gXoWec4UNqcR0tkuHwYCr}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → gXoWec4UNqcR0tkuHwYCr}/_ssgManifest.js +0 -0
|
@@ -177,24 +177,18 @@ import {
|
|
|
177
177
|
import { GitServiceImpl } from "./git-service.js";
|
|
178
178
|
import { nativeCheckoutBranch } from "./native-git-bridge.js";
|
|
179
179
|
import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
|
|
180
|
-
import {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
autoWorktreeBranch,
|
|
190
|
-
syncWorktreeStateBack,
|
|
191
|
-
readResourceVersion,
|
|
192
|
-
checkResourcesStale,
|
|
193
|
-
escapeStaleWorktree,
|
|
194
|
-
} from "./auto-worktree.js";
|
|
180
|
+
import { autoWorktreeBranch, enterBranchModeForMilestone } from "./auto-worktree-branch-lifecycle.js";
|
|
181
|
+
import { createAutoWorktree } from "./auto-worktree-creation.js";
|
|
182
|
+
import { enterAutoWorktree, isInAutoWorktree } from "./auto-worktree-entry.js";
|
|
183
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
184
|
+
import { checkResourcesStale, readResourceVersion } from "./auto-worktree-resource-version.js";
|
|
185
|
+
import { escapeStaleWorktree } from "./auto-worktree-runtime-cleanup.js";
|
|
186
|
+
import { getAutoWorktreeOriginalBase } from "./auto-worktree-session-registry.js";
|
|
187
|
+
import { syncWorktreeStateBack } from "./auto-worktree-sync.js";
|
|
188
|
+
import { teardownAutoWorktree } from "./auto-worktree-teardown.js";
|
|
195
189
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
196
190
|
import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
|
|
197
|
-
import {
|
|
191
|
+
import { createDefaultMilestoneMergeTransaction } from "./milestone-merge-transaction.js";
|
|
198
192
|
|
|
199
193
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
200
194
|
import {
|
|
@@ -236,7 +230,7 @@ import {
|
|
|
236
230
|
getSlice,
|
|
237
231
|
getTask,
|
|
238
232
|
} from "./gsd-db.js";
|
|
239
|
-
import { closeWorkflowDatabase } from "./db-workspace.js";
|
|
233
|
+
import { checkpointWorkflowDatabase, closeWorkflowDatabase } from "./db-workspace.js";
|
|
240
234
|
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
241
235
|
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
242
236
|
import { countPendingCaptures } from "./captures.js";
|
|
@@ -1051,6 +1045,12 @@ export function stopAutoRemote(projectRoot: string): {
|
|
|
1051
1045
|
* The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
|
|
1052
1046
|
* this path is only for the explicit "Force start" action.
|
|
1053
1047
|
*/
|
|
1048
|
+
// Grace window between SIGTERM and SIGKILL so the target can run its cleanup
|
|
1049
|
+
// handler (lock release, DB snapshot flush, worktree teardown). Polled so a
|
|
1050
|
+
// process that exits early is not made to wait the full window.
|
|
1051
|
+
const FORCE_STOP_GRACE_MS = 3000;
|
|
1052
|
+
const FORCE_STOP_POLL_MS = 100;
|
|
1053
|
+
|
|
1054
1054
|
export function forceStopAutoRemote(projectRoot: string): {
|
|
1055
1055
|
found: boolean;
|
|
1056
1056
|
pid?: number;
|
|
@@ -1071,6 +1071,13 @@ export function forceStopAutoRemote(projectRoot: string): {
|
|
|
1071
1071
|
|
|
1072
1072
|
try {
|
|
1073
1073
|
process.kill(lock.pid, "SIGTERM");
|
|
1074
|
+
// Poll for graceful exit before escalating. Synchronous sleep keeps this
|
|
1075
|
+
// function sync for its callers (Atomics.wait times out with no notify).
|
|
1076
|
+
const deadline = Date.now() + FORCE_STOP_GRACE_MS;
|
|
1077
|
+
while (Date.now() < deadline) {
|
|
1078
|
+
if (!isLockProcessAlive(lock)) break;
|
|
1079
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, FORCE_STOP_POLL_MS);
|
|
1080
|
+
}
|
|
1074
1081
|
if (isLockProcessAlive(lock)) {
|
|
1075
1082
|
process.kill(lock.pid, "SIGKILL");
|
|
1076
1083
|
}
|
|
@@ -1615,6 +1622,11 @@ export async function stopAuto(
|
|
|
1615
1622
|
const installTerminalCloseoutOutcome = completionStopRequested && preserveCloseoutTranscript;
|
|
1616
1623
|
const preserveCompletionSurface = completionStopRequested || preserveCloseoutTranscript;
|
|
1617
1624
|
s.completionStopInProgress = preserveCompletionSurface;
|
|
1625
|
+
try {
|
|
1626
|
+
checkpointWorkflowDatabase();
|
|
1627
|
+
} catch (e) {
|
|
1628
|
+
debugLog("stop-checkpoint-failed", { error: e instanceof Error ? e.message : String(e) });
|
|
1629
|
+
}
|
|
1618
1630
|
playNotificationBell("stop", loadedPreferences?.notifications);
|
|
1619
1631
|
|
|
1620
1632
|
// #4764 — telemetry: record the exit reason, isolation mode, whether an auto
|
|
@@ -2299,7 +2311,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
|
|
|
2299
2311
|
// C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
|
|
2300
2312
|
//
|
|
2301
2313
|
// Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
|
|
2302
|
-
// worktreeProjection,
|
|
2314
|
+
// worktreeProjection, mergeMilestone transaction runner). Down from 18 at slice-7
|
|
2303
2315
|
// closure.
|
|
2304
2316
|
return {
|
|
2305
2317
|
gitServiceFactory: (basePath: string) => {
|
|
@@ -2308,7 +2320,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
|
|
|
2308
2320
|
return new GitServiceImpl(basePath, gitConfig);
|
|
2309
2321
|
},
|
|
2310
2322
|
worktreeProjection: new WorktreeStateProjection(),
|
|
2311
|
-
|
|
2323
|
+
mergeMilestone: createDefaultMilestoneMergeTransaction(),
|
|
2312
2324
|
};
|
|
2313
2325
|
}
|
|
2314
2326
|
|
|
@@ -2357,6 +2369,7 @@ function buildLoopDeps(pi: ExtensionAPI, ctx: ExtensionContext): LoopDeps {
|
|
|
2357
2369
|
stopAuto,
|
|
2358
2370
|
pauseAuto,
|
|
2359
2371
|
clearUnitTimeout,
|
|
2372
|
+
checkpointWorkflowDatabase,
|
|
2360
2373
|
updateProgressWidget,
|
|
2361
2374
|
...cmux,
|
|
2362
2375
|
handleLostSessionLock: (ctx: ExtensionContext | undefined, lockStatus: SessionLockStatus | undefined) => {
|
|
@@ -710,12 +710,14 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
710
710
|
inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
|
|
711
711
|
expectedOutput: Type.Array(Type.String(), { description: "Array<string> of files this task creates or overwrites; pass [\"path\"] or [], never prose or a single string" }),
|
|
712
712
|
observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
|
|
713
|
+
targetRepositories: Type.Optional(Type.Array(Type.String(), { description: "Repository id(s) this task touches (parent workspace); must match a Declared Repository. Omit for single-repo projects." })),
|
|
713
714
|
}), { description: "Optional full task replacement for the slice. Omit for incremental planning, then call gsd_plan_task once per task." })),
|
|
714
715
|
// ── Enrichment metadata (optional — defaults to empty) ────────────
|
|
715
716
|
successCriteria: Type.Optional(Type.String({ description: "Slice success criteria block" })),
|
|
716
717
|
proofLevel: Type.Optional(Type.String({ description: "Slice proof level" })),
|
|
717
718
|
integrationClosure: Type.Optional(Type.String({ description: "Slice integration closure" })),
|
|
718
719
|
observabilityImpact: Type.Optional(Type.String({ description: "Slice observability impact" })),
|
|
720
|
+
targetRepositories: Type.Optional(Type.Array(Type.String(), { description: "Slice-wide default repository id(s) (parent workspace); must match a Declared Repository. Omit for single-repo projects." })),
|
|
719
721
|
// Single-writer v3 audit trail (Stream 2): caller-provided actor identity + causation.
|
|
720
722
|
actorName: Type.Optional(Type.String({ description: "Caller-provided actor identity for the audit trail (e.g. 'executor-01', 'gsd-orchestrator')" })),
|
|
721
723
|
triggerReason: Type.Optional(Type.String({ description: "Caller-provided reason this action was triggered (e.g. 'plan-phase complete')" })),
|
|
@@ -789,6 +791,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
789
791
|
inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
|
|
790
792
|
expectedOutput: Type.Array(Type.String(), { description: "Array<string> of files this task creates or overwrites; pass [\"path\"] or [], never prose or a single string" }),
|
|
791
793
|
observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
|
|
794
|
+
targetRepositories: Type.Optional(Type.Array(Type.String(), { description: "Repository id(s) this task touches (parent workspace); must match a Declared Repository. Omit for single-repo projects." })),
|
|
792
795
|
// Single-writer v3 audit trail (Stream 2): caller-provided actor identity + causation.
|
|
793
796
|
actorName: Type.Optional(Type.String({ description: "Caller-provided actor identity for the audit trail (e.g. 'executor-01', 'gsd-orchestrator')" })),
|
|
794
797
|
triggerReason: Type.Optional(Type.String({ description: "Caller-provided reason this action was triggered (e.g. 'plan-phase complete')" })),
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
type WorkflowDatabaseOpenResult,
|
|
15
15
|
type WorkflowDatabaseStatus,
|
|
16
16
|
} from "../db-workspace.js";
|
|
17
|
-
import { getAutoWorktreePath } from "../auto-worktree.js";
|
|
17
|
+
import { getAutoWorktreePath } from "../auto-worktree-path-resolution.js";
|
|
18
18
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
19
19
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
20
20
|
|
|
@@ -32,9 +32,15 @@ import {
|
|
|
32
32
|
recordAutoToolSurfaceSnapshot,
|
|
33
33
|
recordToolInvocationError,
|
|
34
34
|
} from "../auto-runtime-state.js";
|
|
35
|
+
import {
|
|
36
|
+
isDeterministicPolicyError,
|
|
37
|
+
isQueuedUserMessageSkip,
|
|
38
|
+
isToolInvocationError,
|
|
39
|
+
isToolUnavailableError,
|
|
40
|
+
} from "../auto-tool-tracking.js";
|
|
35
41
|
import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
|
|
36
42
|
|
|
37
|
-
import { checkToolCallLoop, recordToolCallLoopMutation, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
43
|
+
import { checkToolCallLoop, configureToolCallLoopGuard, recordToolCallLoopMutation, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
38
44
|
import { MINIMAL_AUTO_BASE_TOOL_NAMES } from "./core-session-tools.js";
|
|
39
45
|
import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
|
|
40
46
|
import { saveActivityLog } from "../activity-log.js";
|
|
@@ -77,9 +83,24 @@ import { clearPendingAutoStart } from "../pending-auto-start.js";
|
|
|
77
83
|
import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
|
|
78
84
|
import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
|
|
79
85
|
import { flushAllManifests } from "../workflow-manifest.js";
|
|
86
|
+
import { recordUnitHarnessAbort, type UnitHarnessAbortRecord } from "../unit-runtime.js";
|
|
80
87
|
|
|
81
88
|
let approvalQuestionAbortInFlight = false;
|
|
82
89
|
|
|
90
|
+
function recordCurrentUnitHarnessAbort(
|
|
91
|
+
abort: Omit<UnitHarnessAbortRecord, "recordedAt"> & { recordedAt?: number },
|
|
92
|
+
): void {
|
|
93
|
+
const dash = getAutoRuntimeSnapshot();
|
|
94
|
+
if (!dash.active || !dash.basePath || !dash.currentUnit) return;
|
|
95
|
+
recordUnitHarnessAbort(
|
|
96
|
+
dash.basePath,
|
|
97
|
+
dash.currentUnit.type,
|
|
98
|
+
dash.currentUnit.id,
|
|
99
|
+
dash.currentUnit.startedAt,
|
|
100
|
+
abort,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
83
104
|
type WelcomeScreenModule = {
|
|
84
105
|
buildWelcomeScreenLines(opts: { version: string; remoteChannel?: string; width?: number }): string[];
|
|
85
106
|
};
|
|
@@ -209,10 +230,26 @@ const WORKFLOW_GSD_TOOL_NAMES = [
|
|
|
209
230
|
...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
|
|
210
231
|
].filter(isGsdManagedTool);
|
|
211
232
|
|
|
233
|
+
const WORKFLOW_ONLY_AUTO_BASE_TOOL_NAMES = [
|
|
234
|
+
"find",
|
|
235
|
+
"glob",
|
|
236
|
+
"grep",
|
|
237
|
+
"ls",
|
|
238
|
+
"read",
|
|
239
|
+
"subagent",
|
|
240
|
+
] as const;
|
|
241
|
+
|
|
212
242
|
function isGsdManagedTool(name: string): boolean {
|
|
213
243
|
return name.startsWith("gsd_") || name === "memory_query" || name === "capture_thought" || name === "gsd_graph";
|
|
214
244
|
}
|
|
215
245
|
|
|
246
|
+
function autoBaseToolNamesForUnit(unitType: string | undefined): readonly string[] {
|
|
247
|
+
const manifest = unitType ? resolveManifest(unitType) : null;
|
|
248
|
+
return manifest?.tools.mode === "workflow-only"
|
|
249
|
+
? WORKFLOW_ONLY_AUTO_BASE_TOOL_NAMES
|
|
250
|
+
: MINIMAL_AUTO_BASE_TOOL_NAMES;
|
|
251
|
+
}
|
|
252
|
+
|
|
216
253
|
/**
|
|
217
254
|
* Resolves requested tool names against active tools using exact and MCP-scoped matches.
|
|
218
255
|
*
|
|
@@ -275,7 +312,7 @@ export function buildMinimalAutoGsdToolSet(
|
|
|
275
312
|
return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
|
|
276
313
|
}
|
|
277
314
|
const unitTools = unitType ? AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [] : [];
|
|
278
|
-
const autoBaseTools = new Set<string>(
|
|
315
|
+
const autoBaseTools = new Set<string>(autoBaseToolNamesForUnit(unitType));
|
|
279
316
|
const availableBaseTools = registeredToolNames.filter((name) => autoBaseTools.has(name));
|
|
280
317
|
const preserved = [...new Set([
|
|
281
318
|
...activeToolNames.filter((name) => autoBaseTools.has(name)),
|
|
@@ -557,6 +594,22 @@ async function applyCompactionThresholdOverride(ctx: ExtensionContext): Promise<
|
|
|
557
594
|
}
|
|
558
595
|
}
|
|
559
596
|
|
|
597
|
+
/**
|
|
598
|
+
* Apply user-tunable tool-call loop guard thresholds (#1198) from GSD
|
|
599
|
+
* preferences plus GSD_TOOL_LOOP_* env overrides. Runs at session boundaries
|
|
600
|
+
* so both interactive sessions and `/gsd auto` pick up the configuration.
|
|
601
|
+
* Non-fatal: falls back to built-in defaults when preferences cannot be loaded.
|
|
602
|
+
*/
|
|
603
|
+
async function applyToolCallLoopGuardConfig(basePath: string): Promise<void> {
|
|
604
|
+
try {
|
|
605
|
+
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
606
|
+
const prefs = loadEffectiveGSDPreferences(basePath);
|
|
607
|
+
configureToolCallLoopGuard(prefs?.preferences.tool_call_loop_guard);
|
|
608
|
+
} catch {
|
|
609
|
+
configureToolCallLoopGuard(null);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
|
|
560
613
|
function clearDeferredApprovalGate(basePath?: string): void {
|
|
561
614
|
if (!basePath) {
|
|
562
615
|
deferredApprovalGates.clear();
|
|
@@ -599,6 +652,72 @@ function formatLoopGuardBlockReason(reason: string | undefined): string | undefi
|
|
|
599
652
|
);
|
|
600
653
|
}
|
|
601
654
|
|
|
655
|
+
function isGateResultPersistenceTool(toolName: string): boolean {
|
|
656
|
+
return toolName === "gsd_save_gate_result" || toolName === "gsd_uat_result_save";
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
function resultDetails(result: unknown): Record<string, unknown> {
|
|
660
|
+
if (!result || typeof result !== "object") return {};
|
|
661
|
+
const details = (result as { details?: unknown }).details;
|
|
662
|
+
return details && typeof details === "object" ? details as Record<string, unknown> : {};
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
function isAbortedExecutionToolResult(toolName: string, result: unknown): boolean {
|
|
666
|
+
if (toolName !== "gsd_exec" && toolName !== "gsd_uat_exec") return false;
|
|
667
|
+
const details = resultDetails(result);
|
|
668
|
+
return details.aborted === true || details.force_resolved === true || details.timed_out === true;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
function isRetryableHarnessToolError(toolName: string, result: unknown, errorText: string): boolean {
|
|
672
|
+
if (isGateResultPersistenceTool(toolName)) return false;
|
|
673
|
+
if (isDeterministicPolicyError(errorText)) return false;
|
|
674
|
+
if (toolName === "gsd_exec" || toolName === "gsd_uat_exec") {
|
|
675
|
+
if (isAbortedExecutionToolResult(toolName, result)) return true;
|
|
676
|
+
if (isToolUnavailableError(errorText)) return true;
|
|
677
|
+
if (isQueuedUserMessageSkip(errorText)) return true;
|
|
678
|
+
return isToolInvocationError(errorText);
|
|
679
|
+
}
|
|
680
|
+
if (isToolUnavailableError(errorText)) return true;
|
|
681
|
+
if (isQueuedUserMessageSkip(errorText)) return true;
|
|
682
|
+
return false;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
function recordRetryableHarnessToolError(toolName: string, result: unknown, errorText: string): void {
|
|
686
|
+
if (!isRetryableHarnessToolError(toolName, result, errorText)) return;
|
|
687
|
+
recordCurrentUnitHarnessAbort({
|
|
688
|
+
kind: "tool-error",
|
|
689
|
+
reason: errorText || "Tool execution failed before the unit could complete its gate evaluation.",
|
|
690
|
+
toolName,
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
function recordRetryableTurnAbort(event: { abortOrigin?: unknown; messages?: unknown[] }): void {
|
|
695
|
+
const origin = typeof event.abortOrigin === "string" ? event.abortOrigin : undefined;
|
|
696
|
+
if (origin === "session-transition") return;
|
|
697
|
+
|
|
698
|
+
const messages = Array.isArray(event.messages) ? event.messages : [];
|
|
699
|
+
const lastMsg = messages[messages.length - 1];
|
|
700
|
+
const stopReason = lastMsg && typeof lastMsg === "object"
|
|
701
|
+
? (lastMsg as { stopReason?: unknown }).stopReason
|
|
702
|
+
: undefined;
|
|
703
|
+
if (stopReason !== "aborted" && stopReason !== "error") return;
|
|
704
|
+
|
|
705
|
+
const errorMessage = lastMsg && typeof lastMsg === "object"
|
|
706
|
+
? (lastMsg as { errorMessage?: unknown }).errorMessage
|
|
707
|
+
: undefined;
|
|
708
|
+
const reason = [
|
|
709
|
+
"Agent turn aborted before the unit could complete its gate evaluation.",
|
|
710
|
+
origin ? `origin=${origin}` : undefined,
|
|
711
|
+
typeof stopReason === "string" ? `stopReason=${stopReason}` : undefined,
|
|
712
|
+
typeof errorMessage === "string" && errorMessage.trim() ? `error=${errorMessage.trim()}` : undefined,
|
|
713
|
+
].filter(Boolean).join(" ");
|
|
714
|
+
|
|
715
|
+
recordCurrentUnitHarnessAbort({
|
|
716
|
+
kind: "turn-abort",
|
|
717
|
+
reason,
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
|
|
602
721
|
function beginSourceObservationStoreForCurrentUnit(
|
|
603
722
|
ctx?: { cwd?: string },
|
|
604
723
|
): ReturnType<typeof getSourceObservationStore> | null {
|
|
@@ -893,6 +1012,7 @@ export function registerHooks(
|
|
|
893
1012
|
}
|
|
894
1013
|
resetWriteGateState(basePath);
|
|
895
1014
|
resetToolCallLoopGuard();
|
|
1015
|
+
await applyToolCallLoopGuardConfig(basePath);
|
|
896
1016
|
approvalQuestionAbortInFlight = false;
|
|
897
1017
|
clearDeferredApprovalGate();
|
|
898
1018
|
await resetAskUserQuestionsTurnCache();
|
|
@@ -902,8 +1022,8 @@ export function registerHooks(
|
|
|
902
1022
|
await prepareWorkflowMcpForHookContext(ctx, basePath);
|
|
903
1023
|
|
|
904
1024
|
// Migrate legacy .gsd/milestones/ to flat-phase .gsd/phases/ when detected.
|
|
905
|
-
//
|
|
906
|
-
//
|
|
1025
|
+
// Fail closed on migration errors: resolvers assume flat-phase paths after
|
|
1026
|
+
// startup, so continuing with nested disk state corrupts later checks.
|
|
907
1027
|
try {
|
|
908
1028
|
const { isInAutoWorktree } = await import("../auto-worktree.js");
|
|
909
1029
|
if (!isInAutoWorktree(basePath)) {
|
|
@@ -917,11 +1037,21 @@ export function registerHooks(
|
|
|
917
1037
|
} else {
|
|
918
1038
|
safetyLogWarning(
|
|
919
1039
|
"bootstrap",
|
|
920
|
-
"flat-phase migration
|
|
1040
|
+
"flat-phase migration required: legacy .gsd/milestones/ layout detected but the workflow database could not be opened — fix database access before starting GSD",
|
|
1041
|
+
);
|
|
1042
|
+
throw new Error(
|
|
1043
|
+
"flat-phase migration required but the workflow database could not be opened; fix database access before starting GSD",
|
|
921
1044
|
);
|
|
922
1045
|
}
|
|
923
1046
|
}
|
|
924
1047
|
}
|
|
1048
|
+
} catch (err) {
|
|
1049
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1050
|
+
safetyLogWarning("bootstrap", `flat-phase migration failed: ${message}`);
|
|
1051
|
+
throw new Error(`flat-phase migration failed: ${message}`);
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
try {
|
|
925
1055
|
const projectRoot = resolveWorktreeProjectRoot(basePath);
|
|
926
1056
|
const { pruneStaleFlatPhaseBackups } = await import("../flat-phase-migration.js");
|
|
927
1057
|
const pruned = pruneStaleFlatPhaseBackups(projectRoot);
|
|
@@ -932,7 +1062,7 @@ export function registerHooks(
|
|
|
932
1062
|
);
|
|
933
1063
|
}
|
|
934
1064
|
} catch (err) {
|
|
935
|
-
safetyLogWarning("bootstrap", `flat-phase
|
|
1065
|
+
safetyLogWarning("bootstrap", `flat-phase backup pruning: ${err instanceof Error ? err.message : String(err)}`);
|
|
936
1066
|
}
|
|
937
1067
|
|
|
938
1068
|
// Apply show_token_cost preference (#1515)
|
|
@@ -974,6 +1104,7 @@ export function registerHooks(
|
|
|
974
1104
|
initSessionNotifications(ctx);
|
|
975
1105
|
resetWriteGateState(basePath);
|
|
976
1106
|
resetToolCallLoopGuard();
|
|
1107
|
+
await applyToolCallLoopGuardConfig(basePath);
|
|
977
1108
|
clearDeferredApprovalGate();
|
|
978
1109
|
await resetAskUserQuestionsTurnCache();
|
|
979
1110
|
clearDiscussionFlowState(basePath);
|
|
@@ -1090,6 +1221,7 @@ export function registerHooks(
|
|
|
1090
1221
|
|
|
1091
1222
|
pi.on("agent_end", async (event, ctx: ExtensionContext) => {
|
|
1092
1223
|
approvalQuestionAbortInFlight = false;
|
|
1224
|
+
recordRetryableTurnAbort(event);
|
|
1093
1225
|
resetToolCallLoopGuard();
|
|
1094
1226
|
resetPendingGatePauseGuard();
|
|
1095
1227
|
await resetAskUserQuestionsTurnCache();
|
|
@@ -1315,6 +1447,12 @@ export function registerHooks(
|
|
|
1315
1447
|
// ── Loop guard: block repeated identical tool calls ──
|
|
1316
1448
|
const loopCheck = checkToolCallLoop(toolName, event.input as Record<string, unknown>);
|
|
1317
1449
|
if (loopCheck.block) {
|
|
1450
|
+
recordCurrentUnitHarnessAbort({
|
|
1451
|
+
kind: "tool-loop-guard",
|
|
1452
|
+
reason: loopCheck.reason ?? "Tool-call loop guard blocked a repeated tool call.",
|
|
1453
|
+
toolName,
|
|
1454
|
+
count: loopCheck.count,
|
|
1455
|
+
});
|
|
1318
1456
|
return { block: true, reason: formatLoopGuardBlockReason(loopCheck.reason) };
|
|
1319
1457
|
}
|
|
1320
1458
|
|
|
@@ -1587,7 +1725,7 @@ export function registerHooks(
|
|
|
1587
1725
|
}
|
|
1588
1726
|
}
|
|
1589
1727
|
if (!event.isError) {
|
|
1590
|
-
recordToolCallLoopMutation(toolName);
|
|
1728
|
+
recordToolCallLoopMutation(toolName, event.details);
|
|
1591
1729
|
refreshSourceObservationAfterMutation(toolName, event.input, ctx);
|
|
1592
1730
|
clearSourceObservationsAfterShell(toolName);
|
|
1593
1731
|
}
|
|
@@ -1603,6 +1741,7 @@ export function registerHooks(
|
|
|
1603
1741
|
// Let recordToolInvocationError classify the failure so non-gsd_ harness
|
|
1604
1742
|
// errors and deterministic policy rejections are handled consistently.
|
|
1605
1743
|
recordToolInvocationError(event.toolName, errorText);
|
|
1744
|
+
recordRetryableHarnessToolError(toolName, resultPayload, errorText);
|
|
1606
1745
|
} else if (isAutoActive()) {
|
|
1607
1746
|
clearToolInvocationError();
|
|
1608
1747
|
}
|
|
@@ -1799,6 +1938,7 @@ export function registerHooks(
|
|
|
1799
1938
|
// for every finalized tool call on every engine, so error classification
|
|
1800
1939
|
// and evidence persistence here cover external engines that skip tool_result.
|
|
1801
1940
|
pi.on("tool_execution_end", async (event) => {
|
|
1941
|
+
const toolName = canonicalToolName(event.toolName);
|
|
1802
1942
|
markToolEnd(event.toolCallId);
|
|
1803
1943
|
// #2883/#4974: Capture deterministic invocation/policy errors
|
|
1804
1944
|
// so postUnitPreVerification can break the retry loop instead of re-dispatching.
|
|
@@ -1809,6 +1949,7 @@ export function registerHooks(
|
|
|
1809
1949
|
// Let recordToolInvocationError classify the failure so non-gsd_ harness
|
|
1810
1950
|
// errors and deterministic policy rejections are handled consistently.
|
|
1811
1951
|
recordToolInvocationError(event.toolName, errorText);
|
|
1952
|
+
recordRetryableHarnessToolError(toolName, event.result, errorText);
|
|
1812
1953
|
} else if (isAutoActive()) {
|
|
1813
1954
|
clearToolInvocationError();
|
|
1814
1955
|
}
|
|
@@ -6,22 +6,85 @@ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
|
6
6
|
|
|
7
7
|
import { getAutoRuntimeSnapshot } from "../auto-runtime-state.js";
|
|
8
8
|
import { scheduleAutoWakeup } from "../auto/schedule-wakeup.js";
|
|
9
|
+
import { logWarning } from "../workflow-logger.js";
|
|
9
10
|
import { resolveCtxCwd } from "./dynamic-tools.js";
|
|
10
11
|
|
|
11
12
|
const MAX_WAKEUP_DELAY_SECONDS = 24 * 60 * 60;
|
|
13
|
+
const INTERACTIVE_WAKEUP_CUSTOM_TYPE = "gsd-schedule-wakeup";
|
|
14
|
+
|
|
15
|
+
// One pending interactive wakeup per session, keyed by base path — the same
|
|
16
|
+
// scoping auto-mode uses for its wakeup map (see `wakeupKey`). Re-arming cancels
|
|
17
|
+
// only that session's prior timer, so repeated polling never stacks overlapping
|
|
18
|
+
// wakeups, and concurrent projects in one host process don't cancel each other.
|
|
19
|
+
const pendingInteractiveWakeups = new Map<string, ReturnType<typeof setTimeout>>();
|
|
20
|
+
|
|
21
|
+
function scheduleInteractiveWakeup(
|
|
22
|
+
pi: ExtensionAPI,
|
|
23
|
+
key: string,
|
|
24
|
+
delaySeconds: number,
|
|
25
|
+
prompt: string,
|
|
26
|
+
reason: string,
|
|
27
|
+
): void {
|
|
28
|
+
const existing = pendingInteractiveWakeups.get(key);
|
|
29
|
+
if (existing) clearTimeout(existing);
|
|
30
|
+
|
|
31
|
+
const handle = setTimeout(() => {
|
|
32
|
+
if (pendingInteractiveWakeups.get(key) === handle) {
|
|
33
|
+
pendingInteractiveWakeups.delete(key);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
void Promise.resolve(pi.sendMessage(
|
|
37
|
+
{
|
|
38
|
+
customType: INTERACTIVE_WAKEUP_CUSTOM_TYPE,
|
|
39
|
+
content: prompt,
|
|
40
|
+
display: true,
|
|
41
|
+
details: { delaySeconds, reason },
|
|
42
|
+
},
|
|
43
|
+
{ triggerTurn: true },
|
|
44
|
+
)).catch((error) => {
|
|
45
|
+
logWarning(
|
|
46
|
+
"bootstrap",
|
|
47
|
+
`ScheduleWakeup interactive dispatch failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
} catch (error) {
|
|
51
|
+
logWarning(
|
|
52
|
+
"bootstrap",
|
|
53
|
+
`ScheduleWakeup interactive dispatch failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
}, delaySeconds * 1000);
|
|
57
|
+
pendingInteractiveWakeups.set(key, handle);
|
|
58
|
+
if (
|
|
59
|
+
typeof handle === "object" &&
|
|
60
|
+
handle !== null &&
|
|
61
|
+
"unref" in handle &&
|
|
62
|
+
typeof handle.unref === "function"
|
|
63
|
+
) {
|
|
64
|
+
handle.unref();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function _resetInteractiveWakeupsForTest(): void {
|
|
69
|
+
for (const handle of pendingInteractiveWakeups.values()) {
|
|
70
|
+
clearTimeout(handle);
|
|
71
|
+
}
|
|
72
|
+
pendingInteractiveWakeups.clear();
|
|
73
|
+
}
|
|
12
74
|
|
|
13
75
|
export function registerScheduleWakeupTool(pi: ExtensionAPI): void {
|
|
14
76
|
pi.registerTool({
|
|
15
77
|
name: "ScheduleWakeup",
|
|
16
78
|
label: "Schedule Wakeup",
|
|
17
79
|
description:
|
|
18
|
-
"In GSD auto-mode,
|
|
19
|
-
"
|
|
20
|
-
promptSnippet: "Schedule a
|
|
80
|
+
"Schedule a delayed continuation turn. In GSD auto-mode, continue the current unit in the same session; " +
|
|
81
|
+
"outside auto-mode, start a new triggered turn with the supplied wakeup prompt.",
|
|
82
|
+
promptSnippet: "Schedule a wakeup prompt after a delay.",
|
|
21
83
|
promptGuidelines: [
|
|
22
84
|
"Use ScheduleWakeup at the end of an execute-task turn when waiting for a long external process.",
|
|
23
85
|
"Include a prompt that says exactly what external state to check next and what artifact to write when done.",
|
|
24
86
|
"Re-arm ScheduleWakeup on each polling turn if the external process is still running.",
|
|
87
|
+
"Outside auto-mode, use ScheduleWakeup when the user asks you to check back or poll later.",
|
|
25
88
|
],
|
|
26
89
|
parameters: Type.Object({
|
|
27
90
|
delaySeconds: Type.Number({
|
|
@@ -40,27 +103,32 @@ export function registerScheduleWakeupTool(pi: ExtensionAPI): void {
|
|
|
40
103
|
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
41
104
|
const dash = getAutoRuntimeSnapshot();
|
|
42
105
|
const currentUnit = dash.currentUnit;
|
|
43
|
-
const
|
|
106
|
+
const delaySeconds = Math.max(
|
|
107
|
+
1,
|
|
108
|
+
Math.min(MAX_WAKEUP_DELAY_SECONDS, Math.floor(params.delaySeconds)),
|
|
109
|
+
);
|
|
110
|
+
const reason = params.reason ?? "";
|
|
44
111
|
|
|
45
112
|
if (!dash.active || !currentUnit) {
|
|
113
|
+
const interactiveKey = dash.basePath || resolveCtxCwd(ctx);
|
|
114
|
+
scheduleInteractiveWakeup(pi, interactiveKey, delaySeconds, params.prompt, reason);
|
|
46
115
|
return {
|
|
47
|
-
content: [{
|
|
48
|
-
|
|
49
|
-
|
|
116
|
+
content: [{
|
|
117
|
+
type: "text",
|
|
118
|
+
text: `Wakeup scheduled for ${delaySeconds}s. GSD will start a new turn with the wakeup prompt.`,
|
|
119
|
+
}],
|
|
120
|
+
details: { operation: "schedule_wakeup", delaySeconds, mode: "interactive" },
|
|
50
121
|
};
|
|
51
122
|
}
|
|
52
123
|
|
|
53
|
-
const
|
|
54
|
-
1,
|
|
55
|
-
Math.min(MAX_WAKEUP_DELAY_SECONDS, Math.floor(params.delaySeconds)),
|
|
56
|
-
);
|
|
124
|
+
const basePath = dash.basePath || resolveCtxCwd(ctx);
|
|
57
125
|
scheduleAutoWakeup({
|
|
58
126
|
basePath,
|
|
59
127
|
unitType: currentUnit.type,
|
|
60
128
|
unitId: currentUnit.id,
|
|
61
129
|
delayMs: delaySeconds * 1000,
|
|
62
130
|
prompt: params.prompt,
|
|
63
|
-
reason
|
|
131
|
+
reason,
|
|
64
132
|
createdAt: Date.now(),
|
|
65
133
|
});
|
|
66
134
|
|
|
@@ -14,7 +14,7 @@ import { resolveModelWithFallbacksForUnit } from "../preferences-models.js";
|
|
|
14
14
|
import { resolveGsdRootFile, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTaskFiles, resolveTasksDir, relSliceFile, relSlicePath, relTaskFile } from "../paths.js";
|
|
15
15
|
import { extractIntroAndRules } from "../knowledge-parser.js";
|
|
16
16
|
import { ensureCodebaseMapFresh, readCodebaseMap } from "../codebase-generator.js";
|
|
17
|
-
import { getActiveAutoWorktreeContext } from "../auto-worktree.js";
|
|
17
|
+
import { getActiveAutoWorktreeContext } from "../auto-worktree-session-registry.js";
|
|
18
18
|
import { getActiveWorktreeName, getWorktreeOriginalCwd } from "../worktree-session-state.js";
|
|
19
19
|
import { deriveState } from "../state.js";
|
|
20
20
|
import { formatOverridesSection, formatShortcut, loadActiveOverrides, loadFile, parseContinue, parseSummary } from "../files.js";
|