@opengsd/gsd-pi 1.2.0-dev.0b870afa → 1.2.0-dev.23d85b63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +14 -19
- package/dist/headless-events.d.ts +16 -1
- package/dist/headless-events.js +19 -2
- package/dist/headless.js +8 -1
- package/dist/loader.js +6 -4
- package/dist/onboarding.js +9 -4
- package/dist/provider-migrations.d.ts +23 -0
- package/dist/provider-migrations.js +41 -0
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +119 -18
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +542 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +19 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +9 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +12 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +5 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +52 -6
- package/dist/resources/extensions/gsd/auto-start.js +28 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +48 -3
- package/dist/resources/extensions/gsd/auto.js +83 -19
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +4 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +32 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +56 -16
- package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
- package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -8
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +8 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/config-overlay.js +11 -8
- package/dist/resources/extensions/gsd/db/engine.js +24 -6
- package/dist/resources/extensions/gsd/db/queries.js +30 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
- package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
- package/dist/resources/extensions/gsd/db-transaction.js +27 -23
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +11 -9
- package/dist/resources/extensions/gsd/gsd-db.js +15 -20
- package/dist/resources/extensions/gsd/guided-flow.js +88 -2
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/preferences-models.js +17 -9
- package/dist/resources/extensions/gsd/preferences.js +91 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +6 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +7 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
- package/dist/resources/extensions/gsd/session-lock.js +4 -3
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +13 -6
- package/dist/resources/extensions/gsd/state.js +6 -2
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
- package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +101 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/index.js +41 -9
- package/dist/resources/extensions/search-the-web/native-search.js +18 -4
- package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
- package/dist/resources/extensions/subagent/index.js +20 -15
- package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- 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 +10 -10
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +4 -4
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +12 -6
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +11 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +85 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +71 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +257 -37
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
- 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 +26 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +48 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -58
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +459 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +62 -43
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +52 -2
- 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/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +8 -8
- package/packages/pi-tui/README.md +15 -0
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +6 -1
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +1 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/select-list.js +8 -2
- package/packages/pi-tui/dist/components/select-list.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +2 -2
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -2
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +12 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +70 -25
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +15 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -21
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +140 -18
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +716 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +24 -2
- package/src/resources/extensions/gsd/auto-model-selection.ts +20 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +16 -9
- package/src/resources/extensions/gsd/auto-prompts.ts +5 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +62 -8
- package/src/resources/extensions/gsd/auto-start.ts +44 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +51 -3
- package/src/resources/extensions/gsd/auto.ts +118 -18
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +6 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +36 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +69 -16
- package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
- package/src/resources/extensions/gsd/commands/handlers/core.ts +27 -8
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/config-overlay.ts +22 -9
- package/src/resources/extensions/gsd/db/engine.ts +26 -6
- package/src/resources/extensions/gsd/db/queries.ts +29 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
- package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
- package/src/resources/extensions/gsd/db-transaction.ts +37 -20
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -10
- package/src/resources/extensions/gsd/gsd-db.ts +15 -19
- package/src/resources/extensions/gsd/guided-flow.ts +128 -2
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/preferences-models.ts +26 -8
- package/src/resources/extensions/gsd/preferences.ts +111 -5
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/src/resources/extensions/gsd/prompts/complete-slice.md +6 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +7 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
- package/src/resources/extensions/gsd/session-lock.ts +8 -7
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +23 -10
- package/src/resources/extensions/gsd/state.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
- package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +89 -22
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +97 -4
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +335 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
- package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
- package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +97 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/index.ts +45 -9
- package/src/resources/extensions/search-the-web/native-search.ts +16 -4
- package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
- package/src/resources/extensions/subagent/index.ts +20 -15
- package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
- package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_ssgManifest.js +0 -0
|
@@ -80,6 +80,8 @@ import type { SessionLockStatus } from "./session-lock.js";
|
|
|
80
80
|
import {
|
|
81
81
|
resolveAutoSupervisorConfig,
|
|
82
82
|
loadEffectiveGSDPreferences,
|
|
83
|
+
loadEffectiveGSDPreferencesWithRegistry,
|
|
84
|
+
resolveProfileAnchorProvider,
|
|
83
85
|
getIsolationMode,
|
|
84
86
|
resolveEffectiveUnitIsolationMode,
|
|
85
87
|
} from "./preferences.js";
|
|
@@ -851,7 +853,7 @@ export function _warnIfWorktreeMissingForTest(
|
|
|
851
853
|
if (worktreePath && !existsSync(worktreePath)) {
|
|
852
854
|
logWarning(
|
|
853
855
|
"session",
|
|
854
|
-
`Worktree was expected at ${worktreePath} but is missing.
|
|
856
|
+
`Worktree was expected at ${worktreePath} but is missing. Resuming from project root; /gsd next will recreate the worktree when isolation is enabled.`,
|
|
855
857
|
{ file: "auto.ts", milestoneId },
|
|
856
858
|
);
|
|
857
859
|
return true;
|
|
@@ -859,6 +861,35 @@ export function _warnIfWorktreeMissingForTest(
|
|
|
859
861
|
return false;
|
|
860
862
|
}
|
|
861
863
|
|
|
864
|
+
export function anchorProcessCwdForAutoResume(
|
|
865
|
+
basePath: string,
|
|
866
|
+
fallbackPaths: string[] = [],
|
|
867
|
+
): boolean {
|
|
868
|
+
const candidates = [basePath, ...fallbackPaths].filter(
|
|
869
|
+
(candidate, index, all) =>
|
|
870
|
+
Boolean(candidate) && all.indexOf(candidate) === index,
|
|
871
|
+
);
|
|
872
|
+
for (const candidate of candidates) {
|
|
873
|
+
if (!existsSync(candidate)) continue;
|
|
874
|
+
try {
|
|
875
|
+
process.chdir(candidate);
|
|
876
|
+
return true;
|
|
877
|
+
} catch (err) {
|
|
878
|
+
logWarning(
|
|
879
|
+
"session",
|
|
880
|
+
`resume cwd anchor failed for ${candidate}: ${err instanceof Error ? err.message : String(err)}`,
|
|
881
|
+
{ file: "auto.ts", basePath: candidate },
|
|
882
|
+
);
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
logWarning(
|
|
886
|
+
"session",
|
|
887
|
+
`resume cwd anchor failed: no usable directory among ${candidates.join(", ")}`,
|
|
888
|
+
{ file: "auto.ts" },
|
|
889
|
+
);
|
|
890
|
+
return false;
|
|
891
|
+
}
|
|
892
|
+
|
|
862
893
|
export function isAutoPaused(): boolean {
|
|
863
894
|
return s.paused;
|
|
864
895
|
}
|
|
@@ -1160,6 +1191,56 @@ function pauseAutoUnitIdentityMatches(expected: PauseAutoUnitIdentity | null): b
|
|
|
1160
1191
|
s.currentUnit.startedAt === expected.startedAt;
|
|
1161
1192
|
}
|
|
1162
1193
|
|
|
1194
|
+
function shouldPreserveCoordinationForPause(errorContext?: ErrorContext): boolean {
|
|
1195
|
+
return errorContext?.category === "provider" && errorContext.isTransient === true;
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
function resolvePauseLifecyclePresentation(errorContext?: ErrorContext): {
|
|
1199
|
+
status: "paused" | "blocked";
|
|
1200
|
+
title: string;
|
|
1201
|
+
detail: string;
|
|
1202
|
+
nextAction: string;
|
|
1203
|
+
commands: string[];
|
|
1204
|
+
notifyLevel: "info" | "warning";
|
|
1205
|
+
notifyPrefix: string;
|
|
1206
|
+
} {
|
|
1207
|
+
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
1208
|
+
const modeLabel = s.stepMode ? "Step" : "Auto";
|
|
1209
|
+
const defaultPresentation = {
|
|
1210
|
+
status: "paused" as const,
|
|
1211
|
+
title: `${modeLabel}-mode paused`,
|
|
1212
|
+
detail: errorContext?.message ?? "Paused by user request.",
|
|
1213
|
+
nextAction: `Type to steer, or run ${resumeCmd} to resume.`,
|
|
1214
|
+
commands: [resumeCmd, "/gsd status for overview", "/gsd notifications for history"],
|
|
1215
|
+
notifyLevel: "info" as const,
|
|
1216
|
+
notifyPrefix: `${modeLabel}-mode paused`,
|
|
1217
|
+
};
|
|
1218
|
+
|
|
1219
|
+
const message = errorContext?.message ?? "";
|
|
1220
|
+
if (
|
|
1221
|
+
message.includes("completed closeout dispatch history") ||
|
|
1222
|
+
message.includes("completed complete-milestone dispatch history")
|
|
1223
|
+
) {
|
|
1224
|
+
const milestoneMatch = message.match(/Milestone (M\d+[A-Z0-9-]*)/);
|
|
1225
|
+
const milestoneId = milestoneMatch?.[1] ?? "this milestone";
|
|
1226
|
+
return {
|
|
1227
|
+
status: "blocked",
|
|
1228
|
+
title: `${modeLabel}-mode blocked`,
|
|
1229
|
+
detail: message,
|
|
1230
|
+
nextAction: `Run \`/gsd dispatch complete-milestone ${milestoneId}\` to finish closeout, then ${resumeCmd}.`,
|
|
1231
|
+
commands: [
|
|
1232
|
+
`/gsd dispatch complete-milestone ${milestoneId}`,
|
|
1233
|
+
`/gsd status ${milestoneId}`,
|
|
1234
|
+
resumeCmd,
|
|
1235
|
+
],
|
|
1236
|
+
notifyLevel: "warning",
|
|
1237
|
+
notifyPrefix: `${modeLabel}-mode blocked`,
|
|
1238
|
+
};
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1241
|
+
return defaultPresentation;
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1163
1244
|
function setLifecycleOutcome(
|
|
1164
1245
|
ctx: ExtensionContext | undefined,
|
|
1165
1246
|
input: {
|
|
@@ -1211,11 +1292,15 @@ function setTerminalCloseoutOutcome(
|
|
|
1211
1292
|
invalidate(): void {},
|
|
1212
1293
|
}));
|
|
1213
1294
|
ctx.ui.setStatus?.("gsd-step", undefined);
|
|
1295
|
+
ctx.ui?.setGsdProgress?.(undefined);
|
|
1214
1296
|
ctx.ui.setWidget?.("gsd-progress", undefined);
|
|
1297
|
+
const detail = input.allMilestonesComplete && input.milestoneTitle
|
|
1298
|
+
? `${input.milestoneTitle}. All milestones complete`
|
|
1299
|
+
: `${titleLine}${input.reason ?? "Milestone closeout finished."}`;
|
|
1215
1300
|
setLifecycleOutcome(ctx, {
|
|
1216
1301
|
status: "complete",
|
|
1217
1302
|
title,
|
|
1218
|
-
detail
|
|
1303
|
+
detail,
|
|
1219
1304
|
nextAction,
|
|
1220
1305
|
commands: TERMINAL_CLOSEOUT_COMMANDS,
|
|
1221
1306
|
unitLabel: input.milestoneId ? `complete-milestone ${input.milestoneId}` : null,
|
|
@@ -2032,6 +2117,12 @@ export async function pauseAuto(
|
|
|
2032
2117
|
});
|
|
2033
2118
|
return;
|
|
2034
2119
|
}
|
|
2120
|
+
|
|
2121
|
+
anchorProcessCwdForAutoResume(s.basePath || s.originalBasePath || "", [
|
|
2122
|
+
s.originalBasePath,
|
|
2123
|
+
lockBase(),
|
|
2124
|
+
].filter((path): path is string => Boolean(path)));
|
|
2125
|
+
|
|
2035
2126
|
s.active = false;
|
|
2036
2127
|
s.paused = true;
|
|
2037
2128
|
clearUnitTimeout();
|
|
@@ -2120,7 +2211,7 @@ export async function pauseAuto(
|
|
|
2120
2211
|
clearLock(lockBase());
|
|
2121
2212
|
}
|
|
2122
2213
|
|
|
2123
|
-
if (s.workerId) {
|
|
2214
|
+
if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
|
|
2124
2215
|
try {
|
|
2125
2216
|
if (s.currentMilestoneId && s.milestoneLeaseToken) {
|
|
2126
2217
|
releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
|
|
@@ -2147,22 +2238,22 @@ export async function pauseAuto(
|
|
|
2147
2238
|
s.pendingVerificationRetry = null;
|
|
2148
2239
|
ctx?.ui.setStatus("gsd-auto", "paused");
|
|
2149
2240
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
2150
|
-
const
|
|
2241
|
+
const lifecycle = resolvePauseLifecyclePresentation(_errorContext);
|
|
2151
2242
|
setLifecycleOutcome(ctx, {
|
|
2152
|
-
status:
|
|
2153
|
-
title:
|
|
2154
|
-
detail:
|
|
2155
|
-
nextAction:
|
|
2156
|
-
commands:
|
|
2243
|
+
status: lifecycle.status,
|
|
2244
|
+
title: lifecycle.title,
|
|
2245
|
+
detail: lifecycle.detail,
|
|
2246
|
+
nextAction: lifecycle.nextAction,
|
|
2247
|
+
commands: lifecycle.commands,
|
|
2157
2248
|
unitLabel: pausedUnitLabel,
|
|
2158
2249
|
});
|
|
2159
2250
|
if (ctx) initHealthWidget(ctx);
|
|
2160
2251
|
const pauseMessage = _errorContext?.message
|
|
2161
|
-
? `${
|
|
2162
|
-
: `${
|
|
2252
|
+
? `${lifecycle.notifyPrefix}: ${_errorContext.message}`
|
|
2253
|
+
: `${lifecycle.notifyPrefix} (Escape). Type to interact, or ${lifecycle.commands[0] ?? (s.stepMode ? "/gsd next" : "/gsd auto")} to resume.`;
|
|
2163
2254
|
ctx?.ui.notify(
|
|
2164
2255
|
pauseMessage,
|
|
2165
|
-
|
|
2256
|
+
lifecycle.notifyLevel,
|
|
2166
2257
|
);
|
|
2167
2258
|
}
|
|
2168
2259
|
|
|
@@ -2232,7 +2323,7 @@ function ensureOrchestrationModule(ctx: ExtensionContext, pi: ExtensionAPI, base
|
|
|
2232
2323
|
* Build the LoopDeps object from auto.ts private scope.
|
|
2233
2324
|
* This bundles all private functions that autoLoop needs without exporting them.
|
|
2234
2325
|
*/
|
|
2235
|
-
function buildLoopDeps(pi: ExtensionAPI): LoopDeps {
|
|
2326
|
+
function buildLoopDeps(pi: ExtensionAPI, ctx: ExtensionContext): LoopDeps {
|
|
2236
2327
|
// Initialize the unified rule registry with converted dispatch rules.
|
|
2237
2328
|
// Must happen before LoopDeps is assembled so facade functions
|
|
2238
2329
|
// (resolveDispatch, runPreDispatchHooks, etc.) delegate to the registry.
|
|
@@ -2258,7 +2349,12 @@ function buildLoopDeps(pi: ExtensionAPI): LoopDeps {
|
|
|
2258
2349
|
invalidateAllCaches,
|
|
2259
2350
|
deriveState,
|
|
2260
2351
|
rebuildState,
|
|
2261
|
-
loadEffectiveGSDPreferences
|
|
2352
|
+
loadEffectiveGSDPreferences: () =>
|
|
2353
|
+
loadEffectiveGSDPreferencesWithRegistry(
|
|
2354
|
+
ctx.modelRegistry,
|
|
2355
|
+
s.basePath || undefined,
|
|
2356
|
+
resolveProfileAnchorProvider(ctx.model?.provider, s.autoModeStartModel?.provider),
|
|
2357
|
+
),
|
|
2262
2358
|
|
|
2263
2359
|
// Pre-dispatch health gate
|
|
2264
2360
|
preDispatchHealthGate,
|
|
@@ -2537,7 +2633,7 @@ export async function startAuto(
|
|
|
2537
2633
|
if (persistedWorktreePath && !existsSync(persistedWorktreePath)) {
|
|
2538
2634
|
logWarning(
|
|
2539
2635
|
"session",
|
|
2540
|
-
`Worktree was expected at ${persistedWorktreePath} but is missing.
|
|
2636
|
+
`Worktree was expected at ${persistedWorktreePath} but is missing. Resuming from project root; /gsd next will recreate the worktree when isolation is enabled.`,
|
|
2541
2637
|
{ file: "auto.ts", milestoneId: meta.milestoneId ?? "" },
|
|
2542
2638
|
);
|
|
2543
2639
|
}
|
|
@@ -2632,12 +2728,16 @@ export async function startAuto(
|
|
|
2632
2728
|
if (resumeWorktreePath && !existsSync(resumeWorktreePath)) {
|
|
2633
2729
|
logWarning(
|
|
2634
2730
|
"session",
|
|
2635
|
-
`Worktree was expected at ${resumeWorktreePath} but is missing.
|
|
2731
|
+
`Worktree was expected at ${resumeWorktreePath} but is missing. Resuming from project root; /gsd next will recreate the worktree when isolation is enabled.`,
|
|
2636
2732
|
{ file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" },
|
|
2637
2733
|
);
|
|
2638
2734
|
}
|
|
2639
2735
|
// ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
|
|
2640
2736
|
buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
|
|
2737
|
+
anchorProcessCwdForAutoResume(s.basePath || base, [
|
|
2738
|
+
base,
|
|
2739
|
+
s.originalBasePath || base,
|
|
2740
|
+
]);
|
|
2641
2741
|
// Rebuild scope now that s.basePath reflects the actual worktree (or project root).
|
|
2642
2742
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2643
2743
|
// Ensure the workflow-logger audit log is pinned to the project root
|
|
@@ -2683,7 +2783,7 @@ export async function startAuto(
|
|
|
2683
2783
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2684
2784
|
}
|
|
2685
2785
|
|
|
2686
|
-
const loopDeps = buildLoopDeps(pi);
|
|
2786
|
+
const loopDeps = buildLoopDeps(pi, ctx);
|
|
2687
2787
|
ensureOrchestrationModule(ctx, pi, s.basePath || base);
|
|
2688
2788
|
registerSigtermHandler(lockBase());
|
|
2689
2789
|
|
|
@@ -2803,7 +2903,7 @@ export async function startAuto(
|
|
|
2803
2903
|
// Build scope after bootstrap has populated s.basePath / s.originalBasePath /
|
|
2804
2904
|
// s.currentMilestoneId (including worktree setup inside bootstrapAutoSession).
|
|
2805
2905
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2806
|
-
const loopDeps = buildLoopDeps(pi);
|
|
2906
|
+
const loopDeps = buildLoopDeps(pi, ctx);
|
|
2807
2907
|
ensureOrchestrationModule(ctx, pi, s.basePath || base);
|
|
2808
2908
|
captureProjectRootEnv(s.originalBasePath || s.basePath);
|
|
2809
2909
|
registerAutoWorkerForSession(s);
|
|
@@ -677,11 +677,15 @@ export async function handleAgentEnd(
|
|
|
677
677
|
return;
|
|
678
678
|
}
|
|
679
679
|
|
|
680
|
-
// Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli)
|
|
680
|
+
// Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli, google-antigravity)
|
|
681
681
|
// which use per-user quotas with shorter windows (#2922).
|
|
682
682
|
if (cls.kind === "rate-limit") {
|
|
683
683
|
const currentProvider = ctx.model?.provider;
|
|
684
|
-
if (
|
|
684
|
+
if (
|
|
685
|
+
currentProvider === "openai-codex"
|
|
686
|
+
|| currentProvider === "google-gemini-cli"
|
|
687
|
+
|| currentProvider === "google-antigravity"
|
|
688
|
+
) {
|
|
685
689
|
cls.retryAfterMs = Math.min(cls.retryAfterMs, 30_000);
|
|
686
690
|
}
|
|
687
691
|
const dash = getAutoDashboardData();
|
|
@@ -8,7 +8,12 @@ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
|
8
8
|
import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
|
|
9
9
|
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
getWorkflowDatabaseStatus,
|
|
13
|
+
openWorkflowDatabase,
|
|
14
|
+
type WorkflowDatabaseOpenResult,
|
|
15
|
+
type WorkflowDatabaseStatus,
|
|
16
|
+
} from "../db-workspace.js";
|
|
12
17
|
import { getAutoWorktreePath } from "../auto-worktree.js";
|
|
13
18
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
14
19
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
@@ -69,15 +74,60 @@ export function resolveWorkflowToolBasePath(
|
|
|
69
74
|
|
|
70
75
|
export { resolveProjectRootDbPath } from "../db-workspace.js";
|
|
71
76
|
|
|
77
|
+
type WorkflowDatabaseOpenFailure = Extract<WorkflowDatabaseOpenResult, { ok: false }>;
|
|
78
|
+
|
|
79
|
+
function sqliteProviderHint(status: WorkflowDatabaseStatus, nodeVersion: string): string {
|
|
80
|
+
if (status.provider) return `Provider: ${status.provider}.`;
|
|
81
|
+
|
|
82
|
+
const major = Number.parseInt(nodeVersion.split(".")[0] ?? "", 10);
|
|
83
|
+
if (Number.isFinite(major) && major < 22) {
|
|
84
|
+
return (
|
|
85
|
+
`No SQLite provider available. Upgrade Node to >= 22.0.0 (current: v${nodeVersion}), ` +
|
|
86
|
+
"use the packaged GSD runtime, or install/restore better-sqlite3 in this runtime."
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return (
|
|
91
|
+
"No SQLite provider available. Use a Node build with node:sqlite enabled, " +
|
|
92
|
+
"run the packaged GSD runtime, or install/restore better-sqlite3 in this runtime."
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function dbOpenPhaseHint(status: WorkflowDatabaseStatus): string {
|
|
97
|
+
if (status.lastPhase === "open") return "The database file could not be opened";
|
|
98
|
+
if (status.lastPhase === "initSchema") return "The database schema could not be initialized";
|
|
99
|
+
if (status.lastPhase === "vacuum-recovery") return "Corruption recovery (VACUUM) failed";
|
|
100
|
+
if (status.attempted) return "The database could not be opened";
|
|
101
|
+
return "The database provider could not be loaded";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function formatWorkflowDatabaseOpenFailure(
|
|
105
|
+
result: WorkflowDatabaseOpenFailure,
|
|
106
|
+
status?: WorkflowDatabaseStatus,
|
|
107
|
+
nodeVersion: string = process.versions.node,
|
|
108
|
+
): string {
|
|
109
|
+
if (result.reason === "missing-gsd-dir") {
|
|
110
|
+
return `ensureDbOpen failed — no .gsd directory found at ${result.location.projectGsd}`;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (result.reason === "missing-database") {
|
|
114
|
+
return `ensureDbOpen failed — no GSD database found at ${result.location.projectDb}`;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const resolvedStatus = status ?? getWorkflowDatabaseStatus();
|
|
118
|
+
const detail = result.error?.message ?? resolvedStatus.lastError?.message ?? "";
|
|
119
|
+
const detailSuffix = detail ? ` (${detail})` : "";
|
|
120
|
+
return (
|
|
121
|
+
`ensureDbOpen failed for ${result.location.projectDb}: ` +
|
|
122
|
+
`${dbOpenPhaseHint(resolvedStatus)}${detailSuffix}. ${sqliteProviderHint(resolvedStatus, nodeVersion)}`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
72
126
|
export async function ensureDbOpen(basePath: string = safeWorkspaceCwd()): Promise<boolean> {
|
|
73
127
|
const result = openWorkflowDatabase(basePath);
|
|
74
128
|
if (result.ok) return true;
|
|
75
129
|
|
|
76
|
-
|
|
77
|
-
logWarning("bootstrap", "ensureDbOpen failed — no .gsd directory found");
|
|
78
|
-
} else {
|
|
79
|
-
logWarning("bootstrap", `ensureDbOpen failed: ${result.error?.message ?? "open failed"}`);
|
|
80
|
-
}
|
|
130
|
+
logWarning("bootstrap", formatWorkflowDatabaseOpenFailure(result));
|
|
81
131
|
return false;
|
|
82
132
|
}
|
|
83
133
|
|
|
@@ -16,7 +16,7 @@ import { registerScheduleWakeupTool } from "./schedule-wakeup-tool.js";
|
|
|
16
16
|
import { registerHooks } from "./register-hooks.js";
|
|
17
17
|
import { registerShortcuts } from "./register-shortcuts.js";
|
|
18
18
|
import { writeCrashLog } from "./crash-log.js";
|
|
19
|
-
import { logWarning } from "../workflow-logger.js";
|
|
19
|
+
import { logWarning, isGsdExtensionStderrEnabled } from "../workflow-logger.js";
|
|
20
20
|
import { UNIT_TOOL_CONTRACTS } from "../unit-tool-contracts.js";
|
|
21
21
|
// Static import so cmux event listeners are registered synchronously during
|
|
22
22
|
// extension bootstrap. Prior implementation used `void import().then()` which
|
|
@@ -47,6 +47,7 @@ export const CRITICAL_GSD_WORKFLOW_TOOL_NAMES = [...new Set(
|
|
|
47
47
|
/** Write to stderr without ever re-throwing — stderr can EPIPE too, which would
|
|
48
48
|
* re-enter this handler and re-loop. */
|
|
49
49
|
function safeStderr(msg: string): void {
|
|
50
|
+
if (!isGsdExtensionStderrEnabled()) return;
|
|
50
51
|
try {
|
|
51
52
|
process.stderr.write(msg);
|
|
52
53
|
} catch { /* stderr is also broken; nothing we can do */ }
|
|
@@ -13,7 +13,7 @@ import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-exten
|
|
|
13
13
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
14
14
|
|
|
15
15
|
import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
16
|
-
import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
16
|
+
import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeBash, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
17
17
|
import { canonicalToolName } from "../engine-hook-contract.js";
|
|
18
18
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
19
19
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
@@ -46,7 +46,7 @@ import {
|
|
|
46
46
|
isDestructiveConfirmGateId,
|
|
47
47
|
requestDestructiveConfirmation,
|
|
48
48
|
} from "../safety/destructive-confirmation.js";
|
|
49
|
-
import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
49
|
+
import { logWarning as safetyLogWarning, setStderrLoggingEnabled } from "../workflow-logger.js";
|
|
50
50
|
import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
|
|
51
51
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
52
52
|
import { initNotificationStore } from "../notification-store.js";
|
|
@@ -148,6 +148,15 @@ async function installWelcomeHeader(ctx: ExtensionContext): Promise<void> {
|
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
+
/** Suppress the startup welcome banner without restoring the built-in pi header. */
|
|
152
|
+
function suppressWelcomeHeader(ctx: ExtensionContext): void {
|
|
153
|
+
if (!ctx.hasUI || typeof ctx.ui?.setHeader !== "function") return;
|
|
154
|
+
ctx.ui.setHeader(() => ({
|
|
155
|
+
render(): string[] { return []; },
|
|
156
|
+
invalidate(): void {},
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
|
|
151
160
|
/**
|
|
152
161
|
* Approval gates whose durable arming is deferred until tool execution /
|
|
153
162
|
* agent end, keyed by basePath. A Map (not a single slot) so concurrent
|
|
@@ -819,6 +828,9 @@ function initSessionNotifications(ctx: ExtensionContext): void {
|
|
|
819
828
|
installNotifyInterceptor(ctx);
|
|
820
829
|
initNotificationWidget(ctx);
|
|
821
830
|
notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
|
|
831
|
+
if (ctx.hasUI) {
|
|
832
|
+
setStderrLoggingEnabled(false);
|
|
833
|
+
}
|
|
822
834
|
}
|
|
823
835
|
|
|
824
836
|
async function prepareWorkflowMcpForHookContext(
|
|
@@ -871,7 +883,14 @@ export function registerHooks(
|
|
|
871
883
|
process.env.GSD_SHOW_TOKEN_COST = prefs?.preferences.show_token_cost ? "1" : "";
|
|
872
884
|
} catch { /* non-fatal */ }
|
|
873
885
|
if (!preserveCloseoutSurface) {
|
|
874
|
-
|
|
886
|
+
// Per-unit newSession() during auto/step runs fires session_start again.
|
|
887
|
+
// Keep the welcome banner startup-only — do not overwrite the empty header
|
|
888
|
+
// that updateProgressWidget installs once work begins.
|
|
889
|
+
if (isAutoActive() || isAutoPaused()) {
|
|
890
|
+
suppressWelcomeHeader(ctx);
|
|
891
|
+
} else {
|
|
892
|
+
await installWelcomeHeader(ctx);
|
|
893
|
+
}
|
|
875
894
|
}
|
|
876
895
|
await loadToolApiKeysForSession();
|
|
877
896
|
if (isAutoActive() || preserveCloseoutSurface) {
|
|
@@ -1033,6 +1052,10 @@ export function registerHooks(
|
|
|
1033
1052
|
pi.on("message_end", async (event) => {
|
|
1034
1053
|
const { suppressTerminalDeletedWorktreeMessageEnd } = await import("./agent-end-recovery.js");
|
|
1035
1054
|
suppressTerminalDeletedWorktreeMessageEnd(event);
|
|
1055
|
+
if (isAutoActive()) {
|
|
1056
|
+
const { sanitizePrematureCloseoutMessageEnd } = await import("../auto-closeout-messaging.js");
|
|
1057
|
+
sanitizePrematureCloseoutMessageEnd(event);
|
|
1058
|
+
}
|
|
1036
1059
|
});
|
|
1037
1060
|
|
|
1038
1061
|
// Squash-merge quick-task branch back to the original branch after the
|
|
@@ -1364,6 +1387,16 @@ export function registerHooks(
|
|
|
1364
1387
|
if (wtGuard.block) return wtGuard;
|
|
1365
1388
|
}
|
|
1366
1389
|
|
|
1390
|
+
if (isToolCallEventType("bash", event)) {
|
|
1391
|
+
const wtBashGuard = shouldBlockWorktreeBash(
|
|
1392
|
+
event.input.command,
|
|
1393
|
+
dash.basePath ?? discussionBasePath,
|
|
1394
|
+
isAutoActive(),
|
|
1395
|
+
dash.currentUnit?.type,
|
|
1396
|
+
);
|
|
1397
|
+
if (wtBashGuard.block) return wtBashGuard;
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1367
1400
|
// ── Single-writer engine: block direct writes to STATE.md ──────────
|
|
1368
1401
|
// Covers write, edit, and bash tools to prevent bypass vectors.
|
|
1369
1402
|
if (isToolCallEventType("write", event)) {
|
|
@@ -12,6 +12,7 @@ import { compileSubagentPermissionContract, type ToolsPolicy } from "../unit-con
|
|
|
12
12
|
import { logWarning } from "../workflow-logger.js";
|
|
13
13
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
14
14
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
15
|
+
import { bashReferencesProjectRootOutsideWorktree } from "../worktree-shell-guard.js";
|
|
15
16
|
import { evaluateGateAnswer } from "../consent-verdict.js";
|
|
16
17
|
|
|
17
18
|
/**
|
|
@@ -1373,6 +1374,37 @@ function isPathContained(target: string, container: string): boolean {
|
|
|
1373
1374
|
return target.startsWith(container.endsWith(sep) ? container : container + sep);
|
|
1374
1375
|
}
|
|
1375
1376
|
|
|
1377
|
+
function formatWorktreeIsolationBlockReason(
|
|
1378
|
+
tool: string,
|
|
1379
|
+
displayTarget: string,
|
|
1380
|
+
isAutoLive: boolean,
|
|
1381
|
+
effectiveBasePath: string,
|
|
1382
|
+
): string {
|
|
1383
|
+
if (isGsdWorktreePath(effectiveBasePath)) {
|
|
1384
|
+
return [
|
|
1385
|
+
`HARD BLOCK: ${tool} target "${displayTarget}" is outside the active milestone worktree`,
|
|
1386
|
+
`while \`git.isolation: worktree\` is configured. Source edits must stay inside`,
|
|
1387
|
+
`\`.gsd-worktrees/<MID>/\` (or \`.gsd/\` planning artifacts) so the auto-mode commit`,
|
|
1388
|
+
`pipeline captures them. Writing to the project root leaks changes that block milestone merge.`,
|
|
1389
|
+
`Use a relative path under the worktree cwd or an absolute path inside the worktree directory.`,
|
|
1390
|
+
...(isAutoLive ? [] : [
|
|
1391
|
+
"This guard also applies to subagent children spawned from the worktree — do not",
|
|
1392
|
+
"`cd` to the project root or reference its paths in shell commands.",
|
|
1393
|
+
]),
|
|
1394
|
+
].join(" ");
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
return [
|
|
1398
|
+
`HARD BLOCK: Worktree isolation is configured (\`git.isolation: worktree\`) but auto-mode is`,
|
|
1399
|
+
`not running and the target "${displayTarget}" is not inside \`.gsd/worktrees/<MID>/\`.`,
|
|
1400
|
+
`Code edits at the project root would be lost — only the auto-mode commit pipeline`,
|
|
1401
|
+
`(auto-post-unit) commits work, and it never runs outside the loop.`,
|
|
1402
|
+
`Required action: start auto-mode with \`/gsd\` so the milestone worktree is created,`,
|
|
1403
|
+
`then write inside it. To disable this guard for self-hosting development, set`,
|
|
1404
|
+
`GSD_DISABLE_WORKTREE_WRITE_GUARD=1.`,
|
|
1405
|
+
].join(" ");
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1376
1408
|
/**
|
|
1377
1409
|
* Block planning-write tool calls that would land code at the project root
|
|
1378
1410
|
* while `git.isolation: worktree` is in effect and auto-mode hasn't created
|
|
@@ -1390,10 +1422,9 @@ function isPathContained(target: string, container: string): boolean {
|
|
|
1390
1422
|
* 5. Target is inside `<projectRoot>/.gsd/worktrees/` (a real worktree).
|
|
1391
1423
|
* 6. Target is inside `<projectRoot>/.gsd/` and isn't masquerading as a
|
|
1392
1424
|
* worktrees sibling (rejects the `.gsd/worktrees-extra/…` prefix trick).
|
|
1393
|
-
* 7. Auto is live AND `effectiveBasePath` is itself a `.gsd/worktrees/…` path.
|
|
1394
1425
|
*
|
|
1395
|
-
* Otherwise: block with a message that points the agent at
|
|
1396
|
-
* auto-mode.
|
|
1426
|
+
* Otherwise: block with a message that points the agent at the active worktree
|
|
1427
|
+
* or `/gsd` to start auto-mode.
|
|
1397
1428
|
*/
|
|
1398
1429
|
export function shouldBlockWorktreeWrite(
|
|
1399
1430
|
toolName: string,
|
|
@@ -1442,24 +1473,46 @@ export function shouldBlockWorktreeWrite(
|
|
|
1442
1473
|
// fall through: looks like worktrees<something> sibling — block
|
|
1443
1474
|
}
|
|
1444
1475
|
|
|
1445
|
-
// Auto is live and the caller is operating inside a worktree path —
|
|
1446
|
-
// host tool's write happens in worktree context; let it through.
|
|
1447
|
-
if (isAutoLive && isGsdWorktreePath(effectiveBasePath)) return { block: false };
|
|
1448
|
-
|
|
1449
1476
|
// Block. Provide enough context that the agent can self-correct.
|
|
1450
1477
|
const displayTarget = isPathContained(realTarget, realRoot)
|
|
1451
1478
|
? relative(realRoot, realTarget) || "."
|
|
1452
1479
|
: realTarget;
|
|
1453
1480
|
return {
|
|
1454
1481
|
block: true,
|
|
1455
|
-
reason:
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1482
|
+
reason: formatWorktreeIsolationBlockReason(tool, displayTarget, isAutoLive, effectiveBasePath),
|
|
1483
|
+
};
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1486
|
+
/**
|
|
1487
|
+
* Block bash commands that reference the project root while executing inside an
|
|
1488
|
+
* active milestone worktree under `git.isolation: worktree`.
|
|
1489
|
+
*
|
|
1490
|
+
* Mirrors the gsd_exec sandbox rule so native bash cannot bypass write/edit gates.
|
|
1491
|
+
*/
|
|
1492
|
+
export function shouldBlockWorktreeBash(
|
|
1493
|
+
command: string,
|
|
1494
|
+
effectiveBasePath: string,
|
|
1495
|
+
isAutoLive: boolean,
|
|
1496
|
+
currentUnitType?: string | null,
|
|
1497
|
+
): { block: boolean; reason?: string } {
|
|
1498
|
+
if (process.env.GSD_DISABLE_WORKTREE_WRITE_GUARD === "1") return { block: false };
|
|
1499
|
+
if (getIsolationMode(effectiveBasePath) !== "worktree") return { block: false };
|
|
1500
|
+
if (currentUnitType && WORKTREE_GATE_BOOTSTRAP_UNITS.has(currentUnitType)) return { block: false };
|
|
1501
|
+
// Block whenever the effective cwd is inside a milestone worktree — not only
|
|
1502
|
+
// during live auto-mode. Reactive-execute subagents run as fresh pi children
|
|
1503
|
+
// without an auto session, but still inherit the worktree cwd and must not
|
|
1504
|
+
// shell out to the project root (the native bash bypass that caused root-write leaks).
|
|
1505
|
+
if (!isGsdWorktreePath(effectiveBasePath)) return { block: false };
|
|
1506
|
+
if (!command.trim()) return { block: false };
|
|
1507
|
+
if (!bashReferencesProjectRootOutsideWorktree(command, effectiveBasePath)) return { block: false };
|
|
1508
|
+
|
|
1509
|
+
return {
|
|
1510
|
+
block: true,
|
|
1511
|
+
reason: formatWorktreeIsolationBlockReason(
|
|
1512
|
+
"bash",
|
|
1513
|
+
"project root path reference in shell command",
|
|
1514
|
+
isAutoLive,
|
|
1515
|
+
effectiveBasePath,
|
|
1516
|
+
),
|
|
1464
1517
|
};
|
|
1465
1518
|
}
|
|
@@ -22,7 +22,11 @@ import {
|
|
|
22
22
|
} from "./unmerged-milestone-guard.js";
|
|
23
23
|
import { appendRequirementsBacklogToSummary } from "./requirements-backlog.js";
|
|
24
24
|
import { nativeBranchList, nativeIsRepo } from "./native-git-bridge.js";
|
|
25
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
allWorktreesDirs,
|
|
27
|
+
isMilestoneWorktreeResidueCandidate,
|
|
28
|
+
pruneEphemeralGhostWorktreeDirectories,
|
|
29
|
+
} from "./worktree-manager.js";
|
|
26
30
|
|
|
27
31
|
export type CloseoutActionId = "finish_quick" | "finish_milestone";
|
|
28
32
|
|
|
@@ -50,8 +54,11 @@ function listMilestoneWorktreeIds(basePath: string): string[] {
|
|
|
50
54
|
if (!existsSync(wtDir)) continue;
|
|
51
55
|
for (const entry of readdirSync(wtDir)) {
|
|
52
56
|
if (!MILESTONE_ID_RE.test(entry)) continue;
|
|
57
|
+
const fullPath = join(wtDir, entry);
|
|
53
58
|
try {
|
|
54
|
-
if (statSync(
|
|
59
|
+
if (!statSync(fullPath).isDirectory()) continue;
|
|
60
|
+
if (!isMilestoneWorktreeResidueCandidate(basePath, fullPath)) continue;
|
|
61
|
+
ids.add(entry);
|
|
55
62
|
} catch {
|
|
56
63
|
// skip unreadable entries
|
|
57
64
|
}
|
|
@@ -90,6 +97,8 @@ function isStrandedMilestoneId(milestoneId: string): boolean {
|
|
|
90
97
|
export function detectIdleMilestoneResidueHint(basePath: string): IdleMilestoneResidueHint | null {
|
|
91
98
|
if (!nativeIsRepo(basePath)) return null;
|
|
92
99
|
|
|
100
|
+
pruneEphemeralGhostWorktreeDirectories(basePath);
|
|
101
|
+
|
|
93
102
|
const gsdDir = join(basePath, ".gsd");
|
|
94
103
|
const dbPath = join(gsdDir, "gsd.db");
|
|
95
104
|
if (!existsSync(gsdDir) || !existsSync(dbPath)) {
|