@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
|
@@ -51,10 +51,16 @@ import { atomicWriteSync } from "./atomic-write.js";
|
|
|
51
51
|
import { captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, } from "./worktree.js";
|
|
52
52
|
import { GitServiceImpl } from "./git-service.js";
|
|
53
53
|
import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
|
|
54
|
-
import {
|
|
54
|
+
import { autoWorktreeBranch } from "./auto-worktree-branch-lifecycle.js";
|
|
55
|
+
import { createAutoWorktree } from "./auto-worktree-creation.js";
|
|
56
|
+
import { isInAutoWorktree } from "./auto-worktree-entry.js";
|
|
57
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
58
|
+
import { checkResourcesStale } from "./auto-worktree-resource-version.js";
|
|
59
|
+
import { escapeStaleWorktree } from "./auto-worktree-runtime-cleanup.js";
|
|
60
|
+
import { teardownAutoWorktree } from "./auto-worktree-teardown.js";
|
|
55
61
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
56
62
|
import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
|
|
57
|
-
import {
|
|
63
|
+
import { createDefaultMilestoneMergeTransaction } from "./milestone-merge-transaction.js";
|
|
58
64
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
59
65
|
import { reconcileMergeState, verifyExpectedArtifact, } from "./auto-recovery.js";
|
|
60
66
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
@@ -68,7 +74,7 @@ import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
|
68
74
|
import { updateProgressWidget as _updateProgressWidget, setCompletionProgressWidget, setAutoOutcomeWidget, setAutoActiveStatus, updateSliceProgressCache, clearSliceProgressCache, unitVerb, } from "./auto-dashboard.js";
|
|
69
75
|
import { registerSigtermHandler as _registerSigtermHandler, deregisterSigtermHandler as _deregisterSigtermHandler, } from "./auto-supervisor.js";
|
|
70
76
|
import { isDbAvailable, getMilestone, getMilestoneSlices, } from "./gsd-db.js";
|
|
71
|
-
import { closeWorkflowDatabase } from "./db-workspace.js";
|
|
77
|
+
import { checkpointWorkflowDatabase, closeWorkflowDatabase } from "./db-workspace.js";
|
|
72
78
|
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
73
79
|
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
74
80
|
import { countPendingCaptures } from "./captures.js";
|
|
@@ -651,6 +657,11 @@ export function stopAutoRemote(projectRoot) {
|
|
|
651
657
|
* The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
|
|
652
658
|
* this path is only for the explicit "Force start" action.
|
|
653
659
|
*/
|
|
660
|
+
// Grace window between SIGTERM and SIGKILL so the target can run its cleanup
|
|
661
|
+
// handler (lock release, DB snapshot flush, worktree teardown). Polled so a
|
|
662
|
+
// process that exits early is not made to wait the full window.
|
|
663
|
+
const FORCE_STOP_GRACE_MS = 3000;
|
|
664
|
+
const FORCE_STOP_POLL_MS = 100;
|
|
654
665
|
export function forceStopAutoRemote(projectRoot) {
|
|
655
666
|
const lock = readCrashLock(projectRoot);
|
|
656
667
|
if (!lock)
|
|
@@ -665,6 +676,14 @@ export function forceStopAutoRemote(projectRoot) {
|
|
|
665
676
|
}
|
|
666
677
|
try {
|
|
667
678
|
process.kill(lock.pid, "SIGTERM");
|
|
679
|
+
// Poll for graceful exit before escalating. Synchronous sleep keeps this
|
|
680
|
+
// function sync for its callers (Atomics.wait times out with no notify).
|
|
681
|
+
const deadline = Date.now() + FORCE_STOP_GRACE_MS;
|
|
682
|
+
while (Date.now() < deadline) {
|
|
683
|
+
if (!isLockProcessAlive(lock))
|
|
684
|
+
break;
|
|
685
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, FORCE_STOP_POLL_MS);
|
|
686
|
+
}
|
|
668
687
|
if (isLockProcessAlive(lock)) {
|
|
669
688
|
process.kill(lock.pid, "SIGKILL");
|
|
670
689
|
}
|
|
@@ -1089,6 +1108,12 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
|
1089
1108
|
const installTerminalCloseoutOutcome = completionStopRequested && preserveCloseoutTranscript;
|
|
1090
1109
|
const preserveCompletionSurface = completionStopRequested || preserveCloseoutTranscript;
|
|
1091
1110
|
s.completionStopInProgress = preserveCompletionSurface;
|
|
1111
|
+
try {
|
|
1112
|
+
checkpointWorkflowDatabase();
|
|
1113
|
+
}
|
|
1114
|
+
catch (e) {
|
|
1115
|
+
debugLog("stop-checkpoint-failed", { error: e instanceof Error ? e.message : String(e) });
|
|
1116
|
+
}
|
|
1092
1117
|
playNotificationBell("stop", loadedPreferences?.notifications);
|
|
1093
1118
|
// #4764 — telemetry: record the exit reason, isolation mode, whether an auto
|
|
1094
1119
|
// worktree was active, and whether the current milestone was merged before
|
|
@@ -1719,7 +1744,7 @@ export function buildWorktreeLifecycleDeps() {
|
|
|
1719
1744
|
// C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
|
|
1720
1745
|
//
|
|
1721
1746
|
// Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
|
|
1722
|
-
// worktreeProjection,
|
|
1747
|
+
// worktreeProjection, mergeMilestone transaction runner). Down from 18 at slice-7
|
|
1723
1748
|
// closure.
|
|
1724
1749
|
return {
|
|
1725
1750
|
gitServiceFactory: (basePath) => {
|
|
@@ -1727,7 +1752,7 @@ export function buildWorktreeLifecycleDeps() {
|
|
|
1727
1752
|
return new GitServiceImpl(basePath, gitConfig);
|
|
1728
1753
|
},
|
|
1729
1754
|
worktreeProjection: new WorktreeStateProjection(),
|
|
1730
|
-
|
|
1755
|
+
mergeMilestone: createDefaultMilestoneMergeTransaction(),
|
|
1731
1756
|
};
|
|
1732
1757
|
}
|
|
1733
1758
|
function buildLifecycle() {
|
|
@@ -1770,6 +1795,7 @@ function buildLoopDeps(pi, ctx) {
|
|
|
1770
1795
|
stopAuto,
|
|
1771
1796
|
pauseAuto,
|
|
1772
1797
|
clearUnitTimeout,
|
|
1798
|
+
checkpointWorkflowDatabase,
|
|
1773
1799
|
updateProgressWidget,
|
|
1774
1800
|
...cmux,
|
|
1775
1801
|
handleLostSessionLock: (ctx, lockStatus) => {
|
|
@@ -674,12 +674,14 @@ export function registerDbTools(pi) {
|
|
|
674
674
|
inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
|
|
675
675
|
expectedOutput: Type.Array(Type.String(), { description: "Array<string> of files this task creates or overwrites; pass [\"path\"] or [], never prose or a single string" }),
|
|
676
676
|
observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
|
|
677
|
+
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." })),
|
|
677
678
|
}), { description: "Optional full task replacement for the slice. Omit for incremental planning, then call gsd_plan_task once per task." })),
|
|
678
679
|
// ── Enrichment metadata (optional — defaults to empty) ────────────
|
|
679
680
|
successCriteria: Type.Optional(Type.String({ description: "Slice success criteria block" })),
|
|
680
681
|
proofLevel: Type.Optional(Type.String({ description: "Slice proof level" })),
|
|
681
682
|
integrationClosure: Type.Optional(Type.String({ description: "Slice integration closure" })),
|
|
682
683
|
observabilityImpact: Type.Optional(Type.String({ description: "Slice observability impact" })),
|
|
684
|
+
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." })),
|
|
683
685
|
// Single-writer v3 audit trail (Stream 2): caller-provided actor identity + causation.
|
|
684
686
|
actorName: Type.Optional(Type.String({ description: "Caller-provided actor identity for the audit trail (e.g. 'executor-01', 'gsd-orchestrator')" })),
|
|
685
687
|
triggerReason: Type.Optional(Type.String({ description: "Caller-provided reason this action was triggered (e.g. 'plan-phase complete')" })),
|
|
@@ -749,6 +751,7 @@ export function registerDbTools(pi) {
|
|
|
749
751
|
inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
|
|
750
752
|
expectedOutput: Type.Array(Type.String(), { description: "Array<string> of files this task creates or overwrites; pass [\"path\"] or [], never prose or a single string" }),
|
|
751
753
|
observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
|
|
754
|
+
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." })),
|
|
752
755
|
// Single-writer v3 audit trail (Stream 2): caller-provided actor identity + causation.
|
|
753
756
|
actorName: Type.Optional(Type.String({ description: "Caller-provided actor identity for the audit trail (e.g. 'executor-01', 'gsd-orchestrator')" })),
|
|
754
757
|
triggerReason: Type.Optional(Type.String({ description: "Caller-provided reason this action was triggered (e.g. 'plan-phase complete')" })),
|
|
@@ -6,7 +6,7 @@ import { join } from "node:path";
|
|
|
6
6
|
import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
|
|
7
7
|
import { logWarning } from "../workflow-logger.js";
|
|
8
8
|
import { getWorkflowDatabaseStatus, openWorkflowDatabase, } from "../db-workspace.js";
|
|
9
|
-
import { getAutoWorktreePath } from "../auto-worktree.js";
|
|
9
|
+
import { getAutoWorktreePath } from "../auto-worktree-path-resolution.js";
|
|
10
10
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
11
11
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
12
12
|
export function safeWorkspaceCwd() {
|
|
@@ -13,8 +13,9 @@ import { resolveManifest } from "../unit-context-manifest.js";
|
|
|
13
13
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
14
14
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
15
15
|
import { clearAutoCompletionStopInProgress, clearToolInvocationError, getAutoRuntimeSnapshot, getSourceObservationStore, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, isInteractiveElicitationInFlight, markToolEnd, markToolStart, recordAutoToolSurfaceSnapshot, recordToolInvocationError, } from "../auto-runtime-state.js";
|
|
16
|
+
import { isDeterministicPolicyError, isQueuedUserMessageSkip, isToolInvocationError, isToolUnavailableError, } from "../auto-tool-tracking.js";
|
|
16
17
|
import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
|
|
17
|
-
import { checkToolCallLoop, recordToolCallLoopMutation, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
18
|
+
import { checkToolCallLoop, configureToolCallLoopGuard, recordToolCallLoopMutation, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
18
19
|
import { MINIMAL_AUTO_BASE_TOOL_NAMES } from "./core-session-tools.js";
|
|
19
20
|
import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
|
|
20
21
|
import { saveActivityLog } from "../activity-log.js";
|
|
@@ -44,7 +45,14 @@ import { clearPendingAutoStart } from "../pending-auto-start.js";
|
|
|
44
45
|
import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
|
|
45
46
|
import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
|
|
46
47
|
import { flushAllManifests } from "../workflow-manifest.js";
|
|
48
|
+
import { recordUnitHarnessAbort } from "../unit-runtime.js";
|
|
47
49
|
let approvalQuestionAbortInFlight = false;
|
|
50
|
+
function recordCurrentUnitHarnessAbort(abort) {
|
|
51
|
+
const dash = getAutoRuntimeSnapshot();
|
|
52
|
+
if (!dash.active || !dash.basePath || !dash.currentUnit)
|
|
53
|
+
return;
|
|
54
|
+
recordUnitHarnessAbort(dash.basePath, dash.currentUnit.type, dash.currentUnit.id, dash.currentUnit.startedAt, abort);
|
|
55
|
+
}
|
|
48
56
|
async function loadWelcomeScreenModule() {
|
|
49
57
|
const candidates = [];
|
|
50
58
|
const gsdBinPath = process.env.GSD_BIN_PATH;
|
|
@@ -160,9 +168,23 @@ const WORKFLOW_GSD_TOOL_NAMES = [
|
|
|
160
168
|
...MINIMAL_GSD_TOOL_NAMES,
|
|
161
169
|
...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
|
|
162
170
|
].filter(isGsdManagedTool);
|
|
171
|
+
const WORKFLOW_ONLY_AUTO_BASE_TOOL_NAMES = [
|
|
172
|
+
"find",
|
|
173
|
+
"glob",
|
|
174
|
+
"grep",
|
|
175
|
+
"ls",
|
|
176
|
+
"read",
|
|
177
|
+
"subagent",
|
|
178
|
+
];
|
|
163
179
|
function isGsdManagedTool(name) {
|
|
164
180
|
return name.startsWith("gsd_") || name === "memory_query" || name === "capture_thought" || name === "gsd_graph";
|
|
165
181
|
}
|
|
182
|
+
function autoBaseToolNamesForUnit(unitType) {
|
|
183
|
+
const manifest = unitType ? resolveManifest(unitType) : null;
|
|
184
|
+
return manifest?.tools.mode === "workflow-only"
|
|
185
|
+
? WORKFLOW_ONLY_AUTO_BASE_TOOL_NAMES
|
|
186
|
+
: MINIMAL_AUTO_BASE_TOOL_NAMES;
|
|
187
|
+
}
|
|
166
188
|
/**
|
|
167
189
|
* Resolves requested tool names against active tools using exact and MCP-scoped matches.
|
|
168
190
|
*
|
|
@@ -213,7 +235,7 @@ export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registered
|
|
|
213
235
|
return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
|
|
214
236
|
}
|
|
215
237
|
const unitTools = unitType ? AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [] : [];
|
|
216
|
-
const autoBaseTools = new Set(
|
|
238
|
+
const autoBaseTools = new Set(autoBaseToolNamesForUnit(unitType));
|
|
217
239
|
const availableBaseTools = registeredToolNames.filter((name) => autoBaseTools.has(name));
|
|
218
240
|
const preserved = [...new Set([
|
|
219
241
|
...activeToolNames.filter((name) => autoBaseTools.has(name)),
|
|
@@ -410,6 +432,22 @@ async function applyCompactionThresholdOverride(ctx) {
|
|
|
410
432
|
ctx.setCompactionThresholdOverride?.(0.6);
|
|
411
433
|
}
|
|
412
434
|
}
|
|
435
|
+
/**
|
|
436
|
+
* Apply user-tunable tool-call loop guard thresholds (#1198) from GSD
|
|
437
|
+
* preferences plus GSD_TOOL_LOOP_* env overrides. Runs at session boundaries
|
|
438
|
+
* so both interactive sessions and `/gsd auto` pick up the configuration.
|
|
439
|
+
* Non-fatal: falls back to built-in defaults when preferences cannot be loaded.
|
|
440
|
+
*/
|
|
441
|
+
async function applyToolCallLoopGuardConfig(basePath) {
|
|
442
|
+
try {
|
|
443
|
+
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
444
|
+
const prefs = loadEffectiveGSDPreferences(basePath);
|
|
445
|
+
configureToolCallLoopGuard(prefs?.preferences.tool_call_loop_guard);
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
configureToolCallLoopGuard(null);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
413
451
|
function clearDeferredApprovalGate(basePath) {
|
|
414
452
|
if (!basePath) {
|
|
415
453
|
deferredApprovalGates.clear();
|
|
@@ -446,6 +484,75 @@ function formatLoopGuardBlockReason(reason) {
|
|
|
446
484
|
return reason;
|
|
447
485
|
return LOOP_GUARD_INTERACTIVE_INSTRUCTIONS.reduce((formatted, instruction) => formatted.replace(instruction, LOOP_GUARD_AUTO_INSTRUCTION), reason);
|
|
448
486
|
}
|
|
487
|
+
function isGateResultPersistenceTool(toolName) {
|
|
488
|
+
return toolName === "gsd_save_gate_result" || toolName === "gsd_uat_result_save";
|
|
489
|
+
}
|
|
490
|
+
function resultDetails(result) {
|
|
491
|
+
if (!result || typeof result !== "object")
|
|
492
|
+
return {};
|
|
493
|
+
const details = result.details;
|
|
494
|
+
return details && typeof details === "object" ? details : {};
|
|
495
|
+
}
|
|
496
|
+
function isAbortedExecutionToolResult(toolName, result) {
|
|
497
|
+
if (toolName !== "gsd_exec" && toolName !== "gsd_uat_exec")
|
|
498
|
+
return false;
|
|
499
|
+
const details = resultDetails(result);
|
|
500
|
+
return details.aborted === true || details.force_resolved === true || details.timed_out === true;
|
|
501
|
+
}
|
|
502
|
+
function isRetryableHarnessToolError(toolName, result, errorText) {
|
|
503
|
+
if (isGateResultPersistenceTool(toolName))
|
|
504
|
+
return false;
|
|
505
|
+
if (isDeterministicPolicyError(errorText))
|
|
506
|
+
return false;
|
|
507
|
+
if (toolName === "gsd_exec" || toolName === "gsd_uat_exec") {
|
|
508
|
+
if (isAbortedExecutionToolResult(toolName, result))
|
|
509
|
+
return true;
|
|
510
|
+
if (isToolUnavailableError(errorText))
|
|
511
|
+
return true;
|
|
512
|
+
if (isQueuedUserMessageSkip(errorText))
|
|
513
|
+
return true;
|
|
514
|
+
return isToolInvocationError(errorText);
|
|
515
|
+
}
|
|
516
|
+
if (isToolUnavailableError(errorText))
|
|
517
|
+
return true;
|
|
518
|
+
if (isQueuedUserMessageSkip(errorText))
|
|
519
|
+
return true;
|
|
520
|
+
return false;
|
|
521
|
+
}
|
|
522
|
+
function recordRetryableHarnessToolError(toolName, result, errorText) {
|
|
523
|
+
if (!isRetryableHarnessToolError(toolName, result, errorText))
|
|
524
|
+
return;
|
|
525
|
+
recordCurrentUnitHarnessAbort({
|
|
526
|
+
kind: "tool-error",
|
|
527
|
+
reason: errorText || "Tool execution failed before the unit could complete its gate evaluation.",
|
|
528
|
+
toolName,
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
function recordRetryableTurnAbort(event) {
|
|
532
|
+
const origin = typeof event.abortOrigin === "string" ? event.abortOrigin : undefined;
|
|
533
|
+
if (origin === "session-transition")
|
|
534
|
+
return;
|
|
535
|
+
const messages = Array.isArray(event.messages) ? event.messages : [];
|
|
536
|
+
const lastMsg = messages[messages.length - 1];
|
|
537
|
+
const stopReason = lastMsg && typeof lastMsg === "object"
|
|
538
|
+
? lastMsg.stopReason
|
|
539
|
+
: undefined;
|
|
540
|
+
if (stopReason !== "aborted" && stopReason !== "error")
|
|
541
|
+
return;
|
|
542
|
+
const errorMessage = lastMsg && typeof lastMsg === "object"
|
|
543
|
+
? lastMsg.errorMessage
|
|
544
|
+
: undefined;
|
|
545
|
+
const reason = [
|
|
546
|
+
"Agent turn aborted before the unit could complete its gate evaluation.",
|
|
547
|
+
origin ? `origin=${origin}` : undefined,
|
|
548
|
+
typeof stopReason === "string" ? `stopReason=${stopReason}` : undefined,
|
|
549
|
+
typeof errorMessage === "string" && errorMessage.trim() ? `error=${errorMessage.trim()}` : undefined,
|
|
550
|
+
].filter(Boolean).join(" ");
|
|
551
|
+
recordCurrentUnitHarnessAbort({
|
|
552
|
+
kind: "turn-abort",
|
|
553
|
+
reason,
|
|
554
|
+
});
|
|
555
|
+
}
|
|
449
556
|
function beginSourceObservationStoreForCurrentUnit(ctx) {
|
|
450
557
|
if (!isAutoActive())
|
|
451
558
|
return null;
|
|
@@ -688,6 +795,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
688
795
|
}
|
|
689
796
|
resetWriteGateState(basePath);
|
|
690
797
|
resetToolCallLoopGuard();
|
|
798
|
+
await applyToolCallLoopGuardConfig(basePath);
|
|
691
799
|
approvalQuestionAbortInFlight = false;
|
|
692
800
|
clearDeferredApprovalGate();
|
|
693
801
|
await resetAskUserQuestionsTurnCache();
|
|
@@ -696,8 +804,8 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
696
804
|
await applyCompactionThresholdOverride(ctx);
|
|
697
805
|
await prepareWorkflowMcpForHookContext(ctx, basePath);
|
|
698
806
|
// Migrate legacy .gsd/milestones/ to flat-phase .gsd/phases/ when detected.
|
|
699
|
-
//
|
|
700
|
-
//
|
|
807
|
+
// Fail closed on migration errors: resolvers assume flat-phase paths after
|
|
808
|
+
// startup, so continuing with nested disk state corrupts later checks.
|
|
701
809
|
try {
|
|
702
810
|
const { isInAutoWorktree } = await import("../auto-worktree.js");
|
|
703
811
|
if (!isInAutoWorktree(basePath)) {
|
|
@@ -710,10 +818,18 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
710
818
|
await migrateToFlatPhase(basePath);
|
|
711
819
|
}
|
|
712
820
|
else {
|
|
713
|
-
safetyLogWarning("bootstrap", "flat-phase migration
|
|
821
|
+
safetyLogWarning("bootstrap", "flat-phase migration required: legacy .gsd/milestones/ layout detected but the workflow database could not be opened — fix database access before starting GSD");
|
|
822
|
+
throw new Error("flat-phase migration required but the workflow database could not be opened; fix database access before starting GSD");
|
|
714
823
|
}
|
|
715
824
|
}
|
|
716
825
|
}
|
|
826
|
+
}
|
|
827
|
+
catch (err) {
|
|
828
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
829
|
+
safetyLogWarning("bootstrap", `flat-phase migration failed: ${message}`);
|
|
830
|
+
throw new Error(`flat-phase migration failed: ${message}`);
|
|
831
|
+
}
|
|
832
|
+
try {
|
|
717
833
|
const projectRoot = resolveWorktreeProjectRoot(basePath);
|
|
718
834
|
const { pruneStaleFlatPhaseBackups } = await import("../flat-phase-migration.js");
|
|
719
835
|
const pruned = pruneStaleFlatPhaseBackups(projectRoot);
|
|
@@ -722,7 +838,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
722
838
|
}
|
|
723
839
|
}
|
|
724
840
|
catch (err) {
|
|
725
|
-
safetyLogWarning("bootstrap", `flat-phase
|
|
841
|
+
safetyLogWarning("bootstrap", `flat-phase backup pruning: ${err instanceof Error ? err.message : String(err)}`);
|
|
726
842
|
}
|
|
727
843
|
// Apply show_token_cost preference (#1515)
|
|
728
844
|
try {
|
|
@@ -765,6 +881,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
765
881
|
initSessionNotifications(ctx);
|
|
766
882
|
resetWriteGateState(basePath);
|
|
767
883
|
resetToolCallLoopGuard();
|
|
884
|
+
await applyToolCallLoopGuardConfig(basePath);
|
|
768
885
|
clearDeferredApprovalGate();
|
|
769
886
|
await resetAskUserQuestionsTurnCache();
|
|
770
887
|
clearDiscussionFlowState(basePath);
|
|
@@ -871,6 +988,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
871
988
|
});
|
|
872
989
|
pi.on("agent_end", async (event, ctx) => {
|
|
873
990
|
approvalQuestionAbortInFlight = false;
|
|
991
|
+
recordRetryableTurnAbort(event);
|
|
874
992
|
resetToolCallLoopGuard();
|
|
875
993
|
resetPendingGatePauseGuard();
|
|
876
994
|
await resetAskUserQuestionsTurnCache();
|
|
@@ -1077,6 +1195,12 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1077
1195
|
// ── Loop guard: block repeated identical tool calls ──
|
|
1078
1196
|
const loopCheck = checkToolCallLoop(toolName, event.input);
|
|
1079
1197
|
if (loopCheck.block) {
|
|
1198
|
+
recordCurrentUnitHarnessAbort({
|
|
1199
|
+
kind: "tool-loop-guard",
|
|
1200
|
+
reason: loopCheck.reason ?? "Tool-call loop guard blocked a repeated tool call.",
|
|
1201
|
+
toolName,
|
|
1202
|
+
count: loopCheck.count,
|
|
1203
|
+
});
|
|
1080
1204
|
return { block: true, reason: formatLoopGuardBlockReason(loopCheck.reason) };
|
|
1081
1205
|
}
|
|
1082
1206
|
const deferredGateGuard = shouldBlockDeferredApprovalTool(toolName, event.input, discussionBasePath);
|
|
@@ -1283,7 +1407,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1283
1407
|
}
|
|
1284
1408
|
}
|
|
1285
1409
|
if (!event.isError) {
|
|
1286
|
-
recordToolCallLoopMutation(toolName);
|
|
1410
|
+
recordToolCallLoopMutation(toolName, event.details);
|
|
1287
1411
|
refreshSourceObservationAfterMutation(toolName, event.input, ctx);
|
|
1288
1412
|
clearSourceObservationsAfterShell(toolName);
|
|
1289
1413
|
}
|
|
@@ -1299,6 +1423,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1299
1423
|
// Let recordToolInvocationError classify the failure so non-gsd_ harness
|
|
1300
1424
|
// errors and deterministic policy rejections are handled consistently.
|
|
1301
1425
|
recordToolInvocationError(event.toolName, errorText);
|
|
1426
|
+
recordRetryableHarnessToolError(toolName, resultPayload, errorText);
|
|
1302
1427
|
}
|
|
1303
1428
|
else if (isAutoActive()) {
|
|
1304
1429
|
clearToolInvocationError();
|
|
@@ -1466,6 +1591,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1466
1591
|
// for every finalized tool call on every engine, so error classification
|
|
1467
1592
|
// and evidence persistence here cover external engines that skip tool_result.
|
|
1468
1593
|
pi.on("tool_execution_end", async (event) => {
|
|
1594
|
+
const toolName = canonicalToolName(event.toolName);
|
|
1469
1595
|
markToolEnd(event.toolCallId);
|
|
1470
1596
|
// #2883/#4974: Capture deterministic invocation/policy errors
|
|
1471
1597
|
// so postUnitPreVerification can break the retry loop instead of re-dispatching.
|
|
@@ -1476,6 +1602,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1476
1602
|
// Let recordToolInvocationError classify the failure so non-gsd_ harness
|
|
1477
1603
|
// errors and deterministic policy rejections are handled consistently.
|
|
1478
1604
|
recordToolInvocationError(event.toolName, errorText);
|
|
1605
|
+
recordRetryableHarnessToolError(toolName, event.result, errorText);
|
|
1479
1606
|
}
|
|
1480
1607
|
else if (isAutoActive()) {
|
|
1481
1608
|
clearToolInvocationError();
|
|
@@ -3,19 +3,63 @@
|
|
|
3
3
|
import { Type } from "@sinclair/typebox";
|
|
4
4
|
import { getAutoRuntimeSnapshot } from "../auto-runtime-state.js";
|
|
5
5
|
import { scheduleAutoWakeup } from "../auto/schedule-wakeup.js";
|
|
6
|
+
import { logWarning } from "../workflow-logger.js";
|
|
6
7
|
import { resolveCtxCwd } from "./dynamic-tools.js";
|
|
7
8
|
const MAX_WAKEUP_DELAY_SECONDS = 24 * 60 * 60;
|
|
9
|
+
const INTERACTIVE_WAKEUP_CUSTOM_TYPE = "gsd-schedule-wakeup";
|
|
10
|
+
// One pending interactive wakeup per session, keyed by base path — the same
|
|
11
|
+
// scoping auto-mode uses for its wakeup map (see `wakeupKey`). Re-arming cancels
|
|
12
|
+
// only that session's prior timer, so repeated polling never stacks overlapping
|
|
13
|
+
// wakeups, and concurrent projects in one host process don't cancel each other.
|
|
14
|
+
const pendingInteractiveWakeups = new Map();
|
|
15
|
+
function scheduleInteractiveWakeup(pi, key, delaySeconds, prompt, reason) {
|
|
16
|
+
const existing = pendingInteractiveWakeups.get(key);
|
|
17
|
+
if (existing)
|
|
18
|
+
clearTimeout(existing);
|
|
19
|
+
const handle = setTimeout(() => {
|
|
20
|
+
if (pendingInteractiveWakeups.get(key) === handle) {
|
|
21
|
+
pendingInteractiveWakeups.delete(key);
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
void Promise.resolve(pi.sendMessage({
|
|
25
|
+
customType: INTERACTIVE_WAKEUP_CUSTOM_TYPE,
|
|
26
|
+
content: prompt,
|
|
27
|
+
display: true,
|
|
28
|
+
details: { delaySeconds, reason },
|
|
29
|
+
}, { triggerTurn: true })).catch((error) => {
|
|
30
|
+
logWarning("bootstrap", `ScheduleWakeup interactive dispatch failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
logWarning("bootstrap", `ScheduleWakeup interactive dispatch failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
35
|
+
}
|
|
36
|
+
}, delaySeconds * 1000);
|
|
37
|
+
pendingInteractiveWakeups.set(key, handle);
|
|
38
|
+
if (typeof handle === "object" &&
|
|
39
|
+
handle !== null &&
|
|
40
|
+
"unref" in handle &&
|
|
41
|
+
typeof handle.unref === "function") {
|
|
42
|
+
handle.unref();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function _resetInteractiveWakeupsForTest() {
|
|
46
|
+
for (const handle of pendingInteractiveWakeups.values()) {
|
|
47
|
+
clearTimeout(handle);
|
|
48
|
+
}
|
|
49
|
+
pendingInteractiveWakeups.clear();
|
|
50
|
+
}
|
|
8
51
|
export function registerScheduleWakeupTool(pi) {
|
|
9
52
|
pi.registerTool({
|
|
10
53
|
name: "ScheduleWakeup",
|
|
11
54
|
label: "Schedule Wakeup",
|
|
12
|
-
description: "In GSD auto-mode,
|
|
13
|
-
"
|
|
14
|
-
promptSnippet: "Schedule a
|
|
55
|
+
description: "Schedule a delayed continuation turn. In GSD auto-mode, continue the current unit in the same session; " +
|
|
56
|
+
"outside auto-mode, start a new triggered turn with the supplied wakeup prompt.",
|
|
57
|
+
promptSnippet: "Schedule a wakeup prompt after a delay.",
|
|
15
58
|
promptGuidelines: [
|
|
16
59
|
"Use ScheduleWakeup at the end of an execute-task turn when waiting for a long external process.",
|
|
17
60
|
"Include a prompt that says exactly what external state to check next and what artifact to write when done.",
|
|
18
61
|
"Re-arm ScheduleWakeup on each polling turn if the external process is still running.",
|
|
62
|
+
"Outside auto-mode, use ScheduleWakeup when the user asks you to check back or poll later.",
|
|
19
63
|
],
|
|
20
64
|
parameters: Type.Object({
|
|
21
65
|
delaySeconds: Type.Number({
|
|
@@ -34,22 +78,27 @@ export function registerScheduleWakeupTool(pi) {
|
|
|
34
78
|
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
35
79
|
const dash = getAutoRuntimeSnapshot();
|
|
36
80
|
const currentUnit = dash.currentUnit;
|
|
37
|
-
const
|
|
81
|
+
const delaySeconds = Math.max(1, Math.min(MAX_WAKEUP_DELAY_SECONDS, Math.floor(params.delaySeconds)));
|
|
82
|
+
const reason = params.reason ?? "";
|
|
38
83
|
if (!dash.active || !currentUnit) {
|
|
84
|
+
const interactiveKey = dash.basePath || resolveCtxCwd(ctx);
|
|
85
|
+
scheduleInteractiveWakeup(pi, interactiveKey, delaySeconds, params.prompt, reason);
|
|
39
86
|
return {
|
|
40
|
-
content: [{
|
|
41
|
-
|
|
42
|
-
|
|
87
|
+
content: [{
|
|
88
|
+
type: "text",
|
|
89
|
+
text: `Wakeup scheduled for ${delaySeconds}s. GSD will start a new turn with the wakeup prompt.`,
|
|
90
|
+
}],
|
|
91
|
+
details: { operation: "schedule_wakeup", delaySeconds, mode: "interactive" },
|
|
43
92
|
};
|
|
44
93
|
}
|
|
45
|
-
const
|
|
94
|
+
const basePath = dash.basePath || resolveCtxCwd(ctx);
|
|
46
95
|
scheduleAutoWakeup({
|
|
47
96
|
basePath,
|
|
48
97
|
unitType: currentUnit.type,
|
|
49
98
|
unitId: currentUnit.id,
|
|
50
99
|
delayMs: delaySeconds * 1000,
|
|
51
100
|
prompt: params.prompt,
|
|
52
|
-
reason
|
|
101
|
+
reason,
|
|
53
102
|
createdAt: Date.now(),
|
|
54
103
|
});
|
|
55
104
|
return {
|
|
@@ -11,7 +11,7 @@ import { resolveModelWithFallbacksForUnit } from "../preferences-models.js";
|
|
|
11
11
|
import { resolveGsdRootFile, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTaskFiles, resolveTasksDir, relSliceFile, relSlicePath, relTaskFile } from "../paths.js";
|
|
12
12
|
import { extractIntroAndRules } from "../knowledge-parser.js";
|
|
13
13
|
import { ensureCodebaseMapFresh, readCodebaseMap } from "../codebase-generator.js";
|
|
14
|
-
import { getActiveAutoWorktreeContext } from "../auto-worktree.js";
|
|
14
|
+
import { getActiveAutoWorktreeContext } from "../auto-worktree-session-registry.js";
|
|
15
15
|
import { getActiveWorktreeName, getWorktreeOriginalCwd } from "../worktree-session-state.js";
|
|
16
16
|
import { deriveState } from "../state.js";
|
|
17
17
|
import { formatOverridesSection, formatShortcut, loadActiveOverrides, loadFile, parseContinue, parseSummary } from "../files.js";
|