@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
|
@@ -25,7 +25,7 @@ import { clearActivityLogState } from "./activity-log.js";
|
|
|
25
25
|
import { synthesizeCrashRecovery, getDeepDiagnostic, readActiveMilestoneId, } from "./session-forensics.js";
|
|
26
26
|
import { writeLock, clearLock, clearStaleWorkerLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
|
|
27
27
|
import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
|
|
28
|
-
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, resolveEffectiveUnitIsolationMode, } from "./preferences.js";
|
|
28
|
+
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, loadEffectiveGSDPreferencesWithRegistry, resolveProfileAnchorProvider, getIsolationMode, resolveEffectiveUnitIsolationMode, } from "./preferences.js";
|
|
29
29
|
import { playNotificationBell, sendDesktopNotification } from "./notifications.js";
|
|
30
30
|
import { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, } from "./auto-budget.js";
|
|
31
31
|
import { markToolStart as _markToolStart, markToolEnd as _markToolEnd, getOldestInFlightToolAgeMs as _getOldestInFlightToolAgeMs, clearInFlightTools, isToolInvocationError, isQueuedUserMessageSkip, isDeterministicPolicyError, } from "./auto-tool-tracking.js";
|
|
@@ -507,11 +507,27 @@ export function _setAutoActiveForTest(active) {
|
|
|
507
507
|
*/
|
|
508
508
|
export function _warnIfWorktreeMissingForTest(worktreePath, milestoneId) {
|
|
509
509
|
if (worktreePath && !existsSync(worktreePath)) {
|
|
510
|
-
logWarning("session", `Worktree was expected at ${worktreePath} but is missing.
|
|
510
|
+
logWarning("session", `Worktree was expected at ${worktreePath} but is missing. Resuming from project root; /gsd next will recreate the worktree when isolation is enabled.`, { file: "auto.ts", milestoneId });
|
|
511
511
|
return true;
|
|
512
512
|
}
|
|
513
513
|
return false;
|
|
514
514
|
}
|
|
515
|
+
export function anchorProcessCwdForAutoResume(basePath, fallbackPaths = []) {
|
|
516
|
+
const candidates = [basePath, ...fallbackPaths].filter((candidate, index, all) => Boolean(candidate) && all.indexOf(candidate) === index);
|
|
517
|
+
for (const candidate of candidates) {
|
|
518
|
+
if (!existsSync(candidate))
|
|
519
|
+
continue;
|
|
520
|
+
try {
|
|
521
|
+
process.chdir(candidate);
|
|
522
|
+
return true;
|
|
523
|
+
}
|
|
524
|
+
catch (err) {
|
|
525
|
+
logWarning("session", `resume cwd anchor failed for ${candidate}: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts", basePath: candidate });
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
logWarning("session", `resume cwd anchor failed: no usable directory among ${candidates.join(", ")}`, { file: "auto.ts" });
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
515
531
|
export function isAutoPaused() {
|
|
516
532
|
return s.paused;
|
|
517
533
|
}
|
|
@@ -751,6 +767,42 @@ function pauseAutoUnitIdentityMatches(expected) {
|
|
|
751
767
|
s.currentUnit.id === expected.id &&
|
|
752
768
|
s.currentUnit.startedAt === expected.startedAt;
|
|
753
769
|
}
|
|
770
|
+
function shouldPreserveCoordinationForPause(errorContext) {
|
|
771
|
+
return errorContext?.category === "provider" && errorContext.isTransient === true;
|
|
772
|
+
}
|
|
773
|
+
function resolvePauseLifecyclePresentation(errorContext) {
|
|
774
|
+
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
775
|
+
const modeLabel = s.stepMode ? "Step" : "Auto";
|
|
776
|
+
const defaultPresentation = {
|
|
777
|
+
status: "paused",
|
|
778
|
+
title: `${modeLabel}-mode paused`,
|
|
779
|
+
detail: errorContext?.message ?? "Paused by user request.",
|
|
780
|
+
nextAction: `Type to steer, or run ${resumeCmd} to resume.`,
|
|
781
|
+
commands: [resumeCmd, "/gsd status for overview", "/gsd notifications for history"],
|
|
782
|
+
notifyLevel: "info",
|
|
783
|
+
notifyPrefix: `${modeLabel}-mode paused`,
|
|
784
|
+
};
|
|
785
|
+
const message = errorContext?.message ?? "";
|
|
786
|
+
if (message.includes("completed closeout dispatch history") ||
|
|
787
|
+
message.includes("completed complete-milestone dispatch history")) {
|
|
788
|
+
const milestoneMatch = message.match(/Milestone (M\d+[A-Z0-9-]*)/);
|
|
789
|
+
const milestoneId = milestoneMatch?.[1] ?? "this milestone";
|
|
790
|
+
return {
|
|
791
|
+
status: "blocked",
|
|
792
|
+
title: `${modeLabel}-mode blocked`,
|
|
793
|
+
detail: message,
|
|
794
|
+
nextAction: `Run \`/gsd dispatch complete-milestone ${milestoneId}\` to finish closeout, then ${resumeCmd}.`,
|
|
795
|
+
commands: [
|
|
796
|
+
`/gsd dispatch complete-milestone ${milestoneId}`,
|
|
797
|
+
`/gsd status ${milestoneId}`,
|
|
798
|
+
resumeCmd,
|
|
799
|
+
],
|
|
800
|
+
notifyLevel: "warning",
|
|
801
|
+
notifyPrefix: `${modeLabel}-mode blocked`,
|
|
802
|
+
};
|
|
803
|
+
}
|
|
804
|
+
return defaultPresentation;
|
|
805
|
+
}
|
|
754
806
|
function setLifecycleOutcome(ctx, input) {
|
|
755
807
|
if (!ctx?.hasUI)
|
|
756
808
|
return;
|
|
@@ -783,11 +835,15 @@ function setTerminalCloseoutOutcome(ctx, input) {
|
|
|
783
835
|
invalidate() { },
|
|
784
836
|
}));
|
|
785
837
|
ctx.ui.setStatus?.("gsd-step", undefined);
|
|
838
|
+
ctx.ui?.setGsdProgress?.(undefined);
|
|
786
839
|
ctx.ui.setWidget?.("gsd-progress", undefined);
|
|
840
|
+
const detail = input.allMilestonesComplete && input.milestoneTitle
|
|
841
|
+
? `${input.milestoneTitle}. All milestones complete`
|
|
842
|
+
: `${titleLine}${input.reason ?? "Milestone closeout finished."}`;
|
|
787
843
|
setLifecycleOutcome(ctx, {
|
|
788
844
|
status: "complete",
|
|
789
845
|
title,
|
|
790
|
-
detail
|
|
846
|
+
detail,
|
|
791
847
|
nextAction,
|
|
792
848
|
commands: TERMINAL_CLOSEOUT_COMMANDS,
|
|
793
849
|
unitLabel: input.milestoneId ? `complete-milestone ${input.milestoneId}` : null,
|
|
@@ -1502,6 +1558,10 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
|
1502
1558
|
});
|
|
1503
1559
|
return;
|
|
1504
1560
|
}
|
|
1561
|
+
anchorProcessCwdForAutoResume(s.basePath || s.originalBasePath || "", [
|
|
1562
|
+
s.originalBasePath,
|
|
1563
|
+
lockBase(),
|
|
1564
|
+
].filter((path) => Boolean(path)));
|
|
1505
1565
|
s.active = false;
|
|
1506
1566
|
s.paused = true;
|
|
1507
1567
|
clearUnitTimeout();
|
|
@@ -1585,7 +1645,7 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
|
1585
1645
|
releaseSessionLock(lockBase());
|
|
1586
1646
|
clearLock(lockBase());
|
|
1587
1647
|
}
|
|
1588
|
-
if (s.workerId) {
|
|
1648
|
+
if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
|
|
1589
1649
|
try {
|
|
1590
1650
|
if (s.currentMilestoneId && s.milestoneLeaseToken) {
|
|
1591
1651
|
releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
|
|
@@ -1611,21 +1671,21 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
|
1611
1671
|
s.pendingVerificationRetry = null;
|
|
1612
1672
|
ctx?.ui.setStatus("gsd-auto", "paused");
|
|
1613
1673
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1614
|
-
const
|
|
1674
|
+
const lifecycle = resolvePauseLifecyclePresentation(_errorContext);
|
|
1615
1675
|
setLifecycleOutcome(ctx, {
|
|
1616
|
-
status:
|
|
1617
|
-
title:
|
|
1618
|
-
detail:
|
|
1619
|
-
nextAction:
|
|
1620
|
-
commands:
|
|
1676
|
+
status: lifecycle.status,
|
|
1677
|
+
title: lifecycle.title,
|
|
1678
|
+
detail: lifecycle.detail,
|
|
1679
|
+
nextAction: lifecycle.nextAction,
|
|
1680
|
+
commands: lifecycle.commands,
|
|
1621
1681
|
unitLabel: pausedUnitLabel,
|
|
1622
1682
|
});
|
|
1623
1683
|
if (ctx)
|
|
1624
1684
|
initHealthWidget(ctx);
|
|
1625
1685
|
const pauseMessage = _errorContext?.message
|
|
1626
|
-
? `${
|
|
1627
|
-
: `${
|
|
1628
|
-
ctx?.ui.notify(pauseMessage,
|
|
1686
|
+
? `${lifecycle.notifyPrefix}: ${_errorContext.message}`
|
|
1687
|
+
: `${lifecycle.notifyPrefix} (Escape). Type to interact, or ${lifecycle.commands[0] ?? (s.stepMode ? "/gsd next" : "/gsd auto")} to resume.`;
|
|
1688
|
+
ctx?.ui.notify(pauseMessage, lifecycle.notifyLevel);
|
|
1629
1689
|
}
|
|
1630
1690
|
/**
|
|
1631
1691
|
* Build a WorktreeLifecycle Module wrapping the current session.
|
|
@@ -1688,7 +1748,7 @@ function ensureOrchestrationModule(ctx, pi, basePath) {
|
|
|
1688
1748
|
* Build the LoopDeps object from auto.ts private scope.
|
|
1689
1749
|
* This bundles all private functions that autoLoop needs without exporting them.
|
|
1690
1750
|
*/
|
|
1691
|
-
function buildLoopDeps(pi) {
|
|
1751
|
+
function buildLoopDeps(pi, ctx) {
|
|
1692
1752
|
// Initialize the unified rule registry with converted dispatch rules.
|
|
1693
1753
|
// Must happen before LoopDeps is assembled so facade functions
|
|
1694
1754
|
// (resolveDispatch, runPreDispatchHooks, etc.) delegate to the registry.
|
|
@@ -1711,7 +1771,7 @@ function buildLoopDeps(pi) {
|
|
|
1711
1771
|
invalidateAllCaches,
|
|
1712
1772
|
deriveState,
|
|
1713
1773
|
rebuildState,
|
|
1714
|
-
loadEffectiveGSDPreferences,
|
|
1774
|
+
loadEffectiveGSDPreferences: () => loadEffectiveGSDPreferencesWithRegistry(ctx.modelRegistry, s.basePath || undefined, resolveProfileAnchorProvider(ctx.model?.provider, s.autoModeStartModel?.provider)),
|
|
1715
1775
|
// Pre-dispatch health gate
|
|
1716
1776
|
preDispatchHealthGate,
|
|
1717
1777
|
// Worktree state projection (ADR-016 — single Module Interface)
|
|
@@ -1944,7 +2004,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1944
2004
|
{
|
|
1945
2005
|
const persistedWorktreePath = meta.worktreePath ?? null;
|
|
1946
2006
|
if (persistedWorktreePath && !existsSync(persistedWorktreePath)) {
|
|
1947
|
-
logWarning("session", `Worktree was expected at ${persistedWorktreePath} but is missing.
|
|
2007
|
+
logWarning("session", `Worktree was expected at ${persistedWorktreePath} but is missing. Resuming from project root; /gsd next will recreate the worktree when isolation is enabled.`, { file: "auto.ts", milestoneId: meta.milestoneId ?? "" });
|
|
1948
2008
|
}
|
|
1949
2009
|
const rawForScope = (persistedWorktreePath && existsSync(persistedWorktreePath))
|
|
1950
2010
|
? persistedWorktreePath
|
|
@@ -2026,10 +2086,14 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
2026
2086
|
// worktree directory safely falls back to the project root.
|
|
2027
2087
|
const resumeWorktreePath = freshStartAssessment.pausedSession?.worktreePath ?? null;
|
|
2028
2088
|
if (resumeWorktreePath && !existsSync(resumeWorktreePath)) {
|
|
2029
|
-
logWarning("session", `Worktree was expected at ${resumeWorktreePath} but is missing.
|
|
2089
|
+
logWarning("session", `Worktree was expected at ${resumeWorktreePath} but is missing. Resuming from project root; /gsd next will recreate the worktree when isolation is enabled.`, { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" });
|
|
2030
2090
|
}
|
|
2031
2091
|
// ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
|
|
2032
2092
|
buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
|
|
2093
|
+
anchorProcessCwdForAutoResume(s.basePath || base, [
|
|
2094
|
+
base,
|
|
2095
|
+
s.originalBasePath || base,
|
|
2096
|
+
]);
|
|
2033
2097
|
// Rebuild scope now that s.basePath reflects the actual worktree (or project root).
|
|
2034
2098
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2035
2099
|
// Ensure the workflow-logger audit log is pinned to the project root
|
|
@@ -2069,7 +2133,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
2069
2133
|
// s.basePath may have been updated to a worktree path by enterMilestone.
|
|
2070
2134
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2071
2135
|
}
|
|
2072
|
-
const loopDeps = buildLoopDeps(pi);
|
|
2136
|
+
const loopDeps = buildLoopDeps(pi, ctx);
|
|
2073
2137
|
ensureOrchestrationModule(ctx, pi, s.basePath || base);
|
|
2074
2138
|
registerSigtermHandler(lockBase());
|
|
2075
2139
|
setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
|
|
@@ -2158,7 +2222,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
2158
2222
|
// Build scope after bootstrap has populated s.basePath / s.originalBasePath /
|
|
2159
2223
|
// s.currentMilestoneId (including worktree setup inside bootstrapAutoSession).
|
|
2160
2224
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2161
|
-
const loopDeps = buildLoopDeps(pi);
|
|
2225
|
+
const loopDeps = buildLoopDeps(pi, ctx);
|
|
2162
2226
|
ensureOrchestrationModule(ctx, pi, s.basePath || base);
|
|
2163
2227
|
captureProjectRootEnv(s.originalBasePath || s.basePath);
|
|
2164
2228
|
registerAutoWorkerForSession(s);
|
|
@@ -531,11 +531,13 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
531
531
|
});
|
|
532
532
|
return;
|
|
533
533
|
}
|
|
534
|
-
// Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli)
|
|
534
|
+
// Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli, google-antigravity)
|
|
535
535
|
// which use per-user quotas with shorter windows (#2922).
|
|
536
536
|
if (cls.kind === "rate-limit") {
|
|
537
537
|
const currentProvider = ctx.model?.provider;
|
|
538
|
-
if (currentProvider === "openai-codex"
|
|
538
|
+
if (currentProvider === "openai-codex"
|
|
539
|
+
|| currentProvider === "google-gemini-cli"
|
|
540
|
+
|| currentProvider === "google-antigravity") {
|
|
539
541
|
cls.retryAfterMs = Math.min(cls.retryAfterMs, 30_000);
|
|
540
542
|
}
|
|
541
543
|
const dash = getAutoDashboardData();
|
|
@@ -5,7 +5,7 @@ import { homedir } from "node:os";
|
|
|
5
5
|
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
|
-
import { openWorkflowDatabase } from "../db-workspace.js";
|
|
8
|
+
import { getWorkflowDatabaseStatus, openWorkflowDatabase, } from "../db-workspace.js";
|
|
9
9
|
import { getAutoWorktreePath } from "../auto-worktree.js";
|
|
10
10
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
11
11
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
@@ -61,16 +61,46 @@ export function resolveWorkflowToolBasePath(ctx, scope) {
|
|
|
61
61
|
return cwd;
|
|
62
62
|
}
|
|
63
63
|
export { resolveProjectRootDbPath } from "../db-workspace.js";
|
|
64
|
+
function sqliteProviderHint(status, nodeVersion) {
|
|
65
|
+
if (status.provider)
|
|
66
|
+
return `Provider: ${status.provider}.`;
|
|
67
|
+
const major = Number.parseInt(nodeVersion.split(".")[0] ?? "", 10);
|
|
68
|
+
if (Number.isFinite(major) && major < 22) {
|
|
69
|
+
return (`No SQLite provider available. Upgrade Node to >= 22.0.0 (current: v${nodeVersion}), ` +
|
|
70
|
+
"use the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
|
|
71
|
+
}
|
|
72
|
+
return ("No SQLite provider available. Use a Node build with node:sqlite enabled, " +
|
|
73
|
+
"run the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
|
|
74
|
+
}
|
|
75
|
+
function dbOpenPhaseHint(status) {
|
|
76
|
+
if (status.lastPhase === "open")
|
|
77
|
+
return "The database file could not be opened";
|
|
78
|
+
if (status.lastPhase === "initSchema")
|
|
79
|
+
return "The database schema could not be initialized";
|
|
80
|
+
if (status.lastPhase === "vacuum-recovery")
|
|
81
|
+
return "Corruption recovery (VACUUM) failed";
|
|
82
|
+
if (status.attempted)
|
|
83
|
+
return "The database could not be opened";
|
|
84
|
+
return "The database provider could not be loaded";
|
|
85
|
+
}
|
|
86
|
+
export function formatWorkflowDatabaseOpenFailure(result, status, nodeVersion = process.versions.node) {
|
|
87
|
+
if (result.reason === "missing-gsd-dir") {
|
|
88
|
+
return `ensureDbOpen failed — no .gsd directory found at ${result.location.projectGsd}`;
|
|
89
|
+
}
|
|
90
|
+
if (result.reason === "missing-database") {
|
|
91
|
+
return `ensureDbOpen failed — no GSD database found at ${result.location.projectDb}`;
|
|
92
|
+
}
|
|
93
|
+
const resolvedStatus = status ?? getWorkflowDatabaseStatus();
|
|
94
|
+
const detail = result.error?.message ?? resolvedStatus.lastError?.message ?? "";
|
|
95
|
+
const detailSuffix = detail ? ` (${detail})` : "";
|
|
96
|
+
return (`ensureDbOpen failed for ${result.location.projectDb}: ` +
|
|
97
|
+
`${dbOpenPhaseHint(resolvedStatus)}${detailSuffix}. ${sqliteProviderHint(resolvedStatus, nodeVersion)}`);
|
|
98
|
+
}
|
|
64
99
|
export async function ensureDbOpen(basePath = safeWorkspaceCwd()) {
|
|
65
100
|
const result = openWorkflowDatabase(basePath);
|
|
66
101
|
if (result.ok)
|
|
67
102
|
return true;
|
|
68
|
-
|
|
69
|
-
logWarning("bootstrap", "ensureDbOpen failed — no .gsd directory found");
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
logWarning("bootstrap", `ensureDbOpen failed: ${result.error?.message ?? "open failed"}`);
|
|
73
|
-
}
|
|
103
|
+
logWarning("bootstrap", formatWorkflowDatabaseOpenFailure(result));
|
|
74
104
|
return false;
|
|
75
105
|
}
|
|
76
106
|
export function registerDynamicTools(pi) {
|
|
@@ -12,7 +12,7 @@ import { registerScheduleWakeupTool } from "./schedule-wakeup-tool.js";
|
|
|
12
12
|
import { registerHooks } from "./register-hooks.js";
|
|
13
13
|
import { registerShortcuts } from "./register-shortcuts.js";
|
|
14
14
|
import { writeCrashLog } from "./crash-log.js";
|
|
15
|
-
import { logWarning } from "../workflow-logger.js";
|
|
15
|
+
import { logWarning, isGsdExtensionStderrEnabled } from "../workflow-logger.js";
|
|
16
16
|
import { UNIT_TOOL_CONTRACTS } from "../unit-tool-contracts.js";
|
|
17
17
|
// Static import so cmux event listeners are registered synchronously during
|
|
18
18
|
// extension bootstrap. Prior implementation used `void import().then()` which
|
|
@@ -37,6 +37,8 @@ export const CRITICAL_GSD_WORKFLOW_TOOL_NAMES = [...new Set(Object.values(UNIT_T
|
|
|
37
37
|
/** Write to stderr without ever re-throwing — stderr can EPIPE too, which would
|
|
38
38
|
* re-enter this handler and re-loop. */
|
|
39
39
|
function safeStderr(msg) {
|
|
40
|
+
if (!isGsdExtensionStderrEnabled())
|
|
41
|
+
return;
|
|
40
42
|
try {
|
|
41
43
|
process.stderr.write(msg);
|
|
42
44
|
}
|
|
@@ -7,7 +7,7 @@ import { isToolCallEventType } from "@gsd/pi-coding-agent";
|
|
|
7
7
|
import { ALWAYS_PRESERVED_SHIM_TOOL_NAMES } from "@gsd/pi-ai";
|
|
8
8
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
9
9
|
import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
10
|
-
import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
10
|
+
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";
|
|
11
11
|
import { canonicalToolName } from "../engine-hook-contract.js";
|
|
12
12
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
13
13
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
@@ -21,7 +21,7 @@ import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecor
|
|
|
21
21
|
import { parseUnitId } from "../unit-id.js";
|
|
22
22
|
import { classifyCommand } from "../safety/destructive-guard.js";
|
|
23
23
|
import { confirmDestructiveCommand, consumeDestructiveConfirmation, isDestructiveConfirmGateId, requestDestructiveConfirmation, } from "../safety/destructive-confirmation.js";
|
|
24
|
-
import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
24
|
+
import { logWarning as safetyLogWarning, setStderrLoggingEnabled } from "../workflow-logger.js";
|
|
25
25
|
import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
|
|
26
26
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
27
27
|
import { initNotificationStore } from "../notification-store.js";
|
|
@@ -110,6 +110,15 @@ async function installWelcomeHeader(ctx) {
|
|
|
110
110
|
/* non-fatal */
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
|
+
/** Suppress the startup welcome banner without restoring the built-in pi header. */
|
|
114
|
+
function suppressWelcomeHeader(ctx) {
|
|
115
|
+
if (!ctx.hasUI || typeof ctx.ui?.setHeader !== "function")
|
|
116
|
+
return;
|
|
117
|
+
ctx.ui.setHeader(() => ({
|
|
118
|
+
render() { return []; },
|
|
119
|
+
invalidate() { },
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
113
122
|
/**
|
|
114
123
|
* Approval gates whose durable arming is deferred until tool execution /
|
|
115
124
|
* agent end, keyed by basePath. A Map (not a single slot) so concurrent
|
|
@@ -629,6 +638,9 @@ function initSessionNotifications(ctx) {
|
|
|
629
638
|
installNotifyInterceptor(ctx);
|
|
630
639
|
initNotificationWidget(ctx);
|
|
631
640
|
notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
|
|
641
|
+
if (ctx.hasUI) {
|
|
642
|
+
setStderrLoggingEnabled(false);
|
|
643
|
+
}
|
|
632
644
|
}
|
|
633
645
|
async function prepareWorkflowMcpForHookContext(ctx, basePath) {
|
|
634
646
|
// Skip MCP auto-prep when running inside an auto-worktree. The worktree
|
|
@@ -671,7 +683,15 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
671
683
|
}
|
|
672
684
|
catch { /* non-fatal */ }
|
|
673
685
|
if (!preserveCloseoutSurface) {
|
|
674
|
-
|
|
686
|
+
// Per-unit newSession() during auto/step runs fires session_start again.
|
|
687
|
+
// Keep the welcome banner startup-only — do not overwrite the empty header
|
|
688
|
+
// that updateProgressWidget installs once work begins.
|
|
689
|
+
if (isAutoActive() || isAutoPaused()) {
|
|
690
|
+
suppressWelcomeHeader(ctx);
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
await installWelcomeHeader(ctx);
|
|
694
|
+
}
|
|
675
695
|
}
|
|
676
696
|
await loadToolApiKeysForSession();
|
|
677
697
|
if (isAutoActive() || preserveCloseoutSurface) {
|
|
@@ -818,6 +838,10 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
818
838
|
pi.on("message_end", async (event) => {
|
|
819
839
|
const { suppressTerminalDeletedWorktreeMessageEnd } = await import("./agent-end-recovery.js");
|
|
820
840
|
suppressTerminalDeletedWorktreeMessageEnd(event);
|
|
841
|
+
if (isAutoActive()) {
|
|
842
|
+
const { sanitizePrematureCloseoutMessageEnd } = await import("../auto-closeout-messaging.js");
|
|
843
|
+
sanitizePrematureCloseoutMessageEnd(event);
|
|
844
|
+
}
|
|
821
845
|
});
|
|
822
846
|
// Squash-merge quick-task branch back to the original branch after the
|
|
823
847
|
// agent turn completes (#2668). cleanupQuickBranch is a no-op when no
|
|
@@ -1094,6 +1118,11 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1094
1118
|
if (wtGuard.block)
|
|
1095
1119
|
return wtGuard;
|
|
1096
1120
|
}
|
|
1121
|
+
if (isToolCallEventType("bash", event)) {
|
|
1122
|
+
const wtBashGuard = shouldBlockWorktreeBash(event.input.command, dash.basePath ?? discussionBasePath, isAutoActive(), dash.currentUnit?.type);
|
|
1123
|
+
if (wtBashGuard.block)
|
|
1124
|
+
return wtBashGuard;
|
|
1125
|
+
}
|
|
1097
1126
|
// ── Single-writer engine: block direct writes to STATE.md ──────────
|
|
1098
1127
|
// Covers write, edit, and bash tools to prevent bypass vectors.
|
|
1099
1128
|
if (isToolCallEventType("write", event)) {
|
|
@@ -10,6 +10,7 @@ import { compileSubagentPermissionContract } from "../unit-context-manifest.js";
|
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
11
11
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
12
12
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
13
|
+
import { bashReferencesProjectRootOutsideWorktree } from "../worktree-shell-guard.js";
|
|
13
14
|
import { evaluateGateAnswer } from "../consent-verdict.js";
|
|
14
15
|
/**
|
|
15
16
|
* Regex matching milestone CONTEXT.md file names in both legacy M001
|
|
@@ -1116,6 +1117,30 @@ function isPathContained(target, container) {
|
|
|
1116
1117
|
return true;
|
|
1117
1118
|
return target.startsWith(container.endsWith(sep) ? container : container + sep);
|
|
1118
1119
|
}
|
|
1120
|
+
function formatWorktreeIsolationBlockReason(tool, displayTarget, isAutoLive, effectiveBasePath) {
|
|
1121
|
+
if (isGsdWorktreePath(effectiveBasePath)) {
|
|
1122
|
+
return [
|
|
1123
|
+
`HARD BLOCK: ${tool} target "${displayTarget}" is outside the active milestone worktree`,
|
|
1124
|
+
`while \`git.isolation: worktree\` is configured. Source edits must stay inside`,
|
|
1125
|
+
`\`.gsd-worktrees/<MID>/\` (or \`.gsd/\` planning artifacts) so the auto-mode commit`,
|
|
1126
|
+
`pipeline captures them. Writing to the project root leaks changes that block milestone merge.`,
|
|
1127
|
+
`Use a relative path under the worktree cwd or an absolute path inside the worktree directory.`,
|
|
1128
|
+
...(isAutoLive ? [] : [
|
|
1129
|
+
"This guard also applies to subagent children spawned from the worktree — do not",
|
|
1130
|
+
"`cd` to the project root or reference its paths in shell commands.",
|
|
1131
|
+
]),
|
|
1132
|
+
].join(" ");
|
|
1133
|
+
}
|
|
1134
|
+
return [
|
|
1135
|
+
`HARD BLOCK: Worktree isolation is configured (\`git.isolation: worktree\`) but auto-mode is`,
|
|
1136
|
+
`not running and the target "${displayTarget}" is not inside \`.gsd/worktrees/<MID>/\`.`,
|
|
1137
|
+
`Code edits at the project root would be lost — only the auto-mode commit pipeline`,
|
|
1138
|
+
`(auto-post-unit) commits work, and it never runs outside the loop.`,
|
|
1139
|
+
`Required action: start auto-mode with \`/gsd\` so the milestone worktree is created,`,
|
|
1140
|
+
`then write inside it. To disable this guard for self-hosting development, set`,
|
|
1141
|
+
`GSD_DISABLE_WORKTREE_WRITE_GUARD=1.`,
|
|
1142
|
+
].join(" ");
|
|
1143
|
+
}
|
|
1119
1144
|
/**
|
|
1120
1145
|
* Block planning-write tool calls that would land code at the project root
|
|
1121
1146
|
* while `git.isolation: worktree` is in effect and auto-mode hasn't created
|
|
@@ -1133,10 +1158,9 @@ function isPathContained(target, container) {
|
|
|
1133
1158
|
* 5. Target is inside `<projectRoot>/.gsd/worktrees/` (a real worktree).
|
|
1134
1159
|
* 6. Target is inside `<projectRoot>/.gsd/` and isn't masquerading as a
|
|
1135
1160
|
* worktrees sibling (rejects the `.gsd/worktrees-extra/…` prefix trick).
|
|
1136
|
-
* 7. Auto is live AND `effectiveBasePath` is itself a `.gsd/worktrees/…` path.
|
|
1137
1161
|
*
|
|
1138
|
-
* Otherwise: block with a message that points the agent at
|
|
1139
|
-
* auto-mode.
|
|
1162
|
+
* Otherwise: block with a message that points the agent at the active worktree
|
|
1163
|
+
* or `/gsd` to start auto-mode.
|
|
1140
1164
|
*/
|
|
1141
1165
|
export function shouldBlockWorktreeWrite(toolName, targetPath, effectiveBasePath, isAutoLive, currentUnitType) {
|
|
1142
1166
|
const tool = canonicalToolName(toolName);
|
|
@@ -1180,24 +1204,40 @@ export function shouldBlockWorktreeWrite(toolName, targetPath, effectiveBasePath
|
|
|
1180
1204
|
return { block: false };
|
|
1181
1205
|
// fall through: looks like worktrees<something> sibling — block
|
|
1182
1206
|
}
|
|
1183
|
-
// Auto is live and the caller is operating inside a worktree path —
|
|
1184
|
-
// host tool's write happens in worktree context; let it through.
|
|
1185
|
-
if (isAutoLive && isGsdWorktreePath(effectiveBasePath))
|
|
1186
|
-
return { block: false };
|
|
1187
1207
|
// Block. Provide enough context that the agent can self-correct.
|
|
1188
1208
|
const displayTarget = isPathContained(realTarget, realRoot)
|
|
1189
1209
|
? relative(realRoot, realTarget) || "."
|
|
1190
1210
|
: realTarget;
|
|
1191
1211
|
return {
|
|
1192
1212
|
block: true,
|
|
1193
|
-
reason:
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1213
|
+
reason: formatWorktreeIsolationBlockReason(tool, displayTarget, isAutoLive, effectiveBasePath),
|
|
1214
|
+
};
|
|
1215
|
+
}
|
|
1216
|
+
/**
|
|
1217
|
+
* Block bash commands that reference the project root while executing inside an
|
|
1218
|
+
* active milestone worktree under `git.isolation: worktree`.
|
|
1219
|
+
*
|
|
1220
|
+
* Mirrors the gsd_exec sandbox rule so native bash cannot bypass write/edit gates.
|
|
1221
|
+
*/
|
|
1222
|
+
export function shouldBlockWorktreeBash(command, effectiveBasePath, isAutoLive, currentUnitType) {
|
|
1223
|
+
if (process.env.GSD_DISABLE_WORKTREE_WRITE_GUARD === "1")
|
|
1224
|
+
return { block: false };
|
|
1225
|
+
if (getIsolationMode(effectiveBasePath) !== "worktree")
|
|
1226
|
+
return { block: false };
|
|
1227
|
+
if (currentUnitType && WORKTREE_GATE_BOOTSTRAP_UNITS.has(currentUnitType))
|
|
1228
|
+
return { block: false };
|
|
1229
|
+
// Block whenever the effective cwd is inside a milestone worktree — not only
|
|
1230
|
+
// during live auto-mode. Reactive-execute subagents run as fresh pi children
|
|
1231
|
+
// without an auto session, but still inherit the worktree cwd and must not
|
|
1232
|
+
// shell out to the project root (the native bash bypass that caused root-write leaks).
|
|
1233
|
+
if (!isGsdWorktreePath(effectiveBasePath))
|
|
1234
|
+
return { block: false };
|
|
1235
|
+
if (!command.trim())
|
|
1236
|
+
return { block: false };
|
|
1237
|
+
if (!bashReferencesProjectRootOutsideWorktree(command, effectiveBasePath))
|
|
1238
|
+
return { block: false };
|
|
1239
|
+
return {
|
|
1240
|
+
block: true,
|
|
1241
|
+
reason: formatWorktreeIsolationBlockReason("bash", "project root path reference in shell command", isAutoLive, effectiveBasePath),
|
|
1202
1242
|
};
|
|
1203
1243
|
}
|
|
@@ -13,7 +13,7 @@ import { isClosedStatus } from "./status-guards.js";
|
|
|
13
13
|
import { findUnmergedCompletedMilestones, } from "./unmerged-milestone-guard.js";
|
|
14
14
|
import { appendRequirementsBacklogToSummary } from "./requirements-backlog.js";
|
|
15
15
|
import { nativeBranchList, nativeIsRepo } from "./native-git-bridge.js";
|
|
16
|
-
import { allWorktreesDirs } from "./worktree-manager.js";
|
|
16
|
+
import { allWorktreesDirs, isMilestoneWorktreeResidueCandidate, pruneEphemeralGhostWorktreeDirectories, } from "./worktree-manager.js";
|
|
17
17
|
const MILESTONE_MERGE_CLOSEOUT_COMMANDS = [
|
|
18
18
|
"/gsd status for overview",
|
|
19
19
|
"/gsd visualize to inspect",
|
|
@@ -28,9 +28,13 @@ function listMilestoneWorktreeIds(basePath) {
|
|
|
28
28
|
for (const entry of readdirSync(wtDir)) {
|
|
29
29
|
if (!MILESTONE_ID_RE.test(entry))
|
|
30
30
|
continue;
|
|
31
|
+
const fullPath = join(wtDir, entry);
|
|
31
32
|
try {
|
|
32
|
-
if (statSync(
|
|
33
|
-
|
|
33
|
+
if (!statSync(fullPath).isDirectory())
|
|
34
|
+
continue;
|
|
35
|
+
if (!isMilestoneWorktreeResidueCandidate(basePath, fullPath))
|
|
36
|
+
continue;
|
|
37
|
+
ids.add(entry);
|
|
34
38
|
}
|
|
35
39
|
catch {
|
|
36
40
|
// skip unreadable entries
|
|
@@ -70,6 +74,7 @@ function isStrandedMilestoneId(milestoneId) {
|
|
|
70
74
|
export function detectIdleMilestoneResidueHint(basePath) {
|
|
71
75
|
if (!nativeIsRepo(basePath))
|
|
72
76
|
return null;
|
|
77
|
+
pruneEphemeralGhostWorktreeDirectories(basePath);
|
|
73
78
|
const gsdDir = join(basePath, ".gsd");
|
|
74
79
|
const dbPath = join(gsdDir, "gsd.db");
|
|
75
80
|
if (!existsSync(gsdDir) || !existsSync(dbPath)) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
import { computeProgressScore, formatProgressLine } from "../../progress-score.js";
|
|
3
|
-
import { getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath } from "../../preferences.js";
|
|
3
|
+
import { getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath, modelIdsForProfileResolution, resolveProfileAnchorProvider, resolveDisabledModelProvidersFromPreferences } from "../../preferences.js";
|
|
4
4
|
import { ensurePreferencesFile, handlePrefs, handlePrefsMode, handlePrefsWizard, handleLanguage } from "../../commands-prefs-wizard.js";
|
|
5
5
|
import { runEnvironmentChecks } from "../../doctor-environment.js";
|
|
6
6
|
import { deriveState } from "../../state.js";
|
|
@@ -257,7 +257,10 @@ export async function handleSetup(args, ctx, pi) {
|
|
|
257
257
|
return;
|
|
258
258
|
}
|
|
259
259
|
if (args === "model") {
|
|
260
|
-
|
|
260
|
+
// Default model picker: persist settings.json default only — do not pin the
|
|
261
|
+
// session override that /gsd model uses, or PREFERENCES.md per-phase models
|
|
262
|
+
// are ignored for the rest of this session (#model-prefs-precedence).
|
|
263
|
+
await handleModel("", ctx, pi, { pinSession: false });
|
|
261
264
|
return;
|
|
262
265
|
}
|
|
263
266
|
if (args === "keys") {
|
|
@@ -361,7 +364,7 @@ async function resolveRequestedModel(query, ctx) {
|
|
|
361
364
|
return undefined;
|
|
362
365
|
return selectModelByProvider(`Multiple models match "${query}"`, partialMatches, ctx, ctx.model);
|
|
363
366
|
}
|
|
364
|
-
async function handleModel(trimmedArgs, ctx, pi) {
|
|
367
|
+
async function handleModel(trimmedArgs, ctx, pi, options) {
|
|
365
368
|
const availableModels = ctx.modelRegistry.getAvailable();
|
|
366
369
|
if (availableModels.length === 0) {
|
|
367
370
|
ctx.ui.notify("No available models found. Check provider auth and model discovery.", "warning");
|
|
@@ -395,15 +398,18 @@ async function handleModel(trimmedArgs, ctx, pi) {
|
|
|
395
398
|
}
|
|
396
399
|
// /gsd model is an explicit per-session pin for GSD dispatches.
|
|
397
400
|
// This is captured at auto bootstrap so it survives internal session
|
|
398
|
-
// switches during /gsd auto and /gsd next runs.
|
|
401
|
+
// switches during /gsd auto and /gsd next runs. /gsd setup model skips
|
|
402
|
+
// this pin so PREFERENCES.md per-phase models keep precedence.
|
|
403
|
+
const pinSession = options?.pinSession !== false;
|
|
399
404
|
const sessionId = ctx.sessionManager?.getSessionId?.();
|
|
400
|
-
if (sessionId) {
|
|
405
|
+
if (pinSession && sessionId) {
|
|
401
406
|
setSessionModelOverride(sessionId, {
|
|
402
407
|
provider: targetModel.provider,
|
|
403
408
|
id: targetModel.id,
|
|
404
409
|
});
|
|
405
410
|
}
|
|
406
|
-
|
|
411
|
+
const pinNote = pinSession ? "" : " (default updated; per-phase prefs still apply in auto)";
|
|
412
|
+
ctx.ui.notify(`Model: ${targetModel.provider}/${targetModel.id}${pinNote}`, "info");
|
|
407
413
|
}
|
|
408
414
|
export async function handleCoreCommand(trimmed, ctx, pi) {
|
|
409
415
|
if (trimmed === "help" || trimmed === "h" || trimmed === "?" || trimmed.startsWith("help ")) {
|
|
@@ -470,7 +476,15 @@ export async function handleCoreCommand(trimmed, ctx, pi) {
|
|
|
470
476
|
}
|
|
471
477
|
if (trimmed === "show-config") {
|
|
472
478
|
const { GSDConfigOverlay, formatConfigText } = await import("../../config-overlay.js");
|
|
473
|
-
const
|
|
479
|
+
const basePath = projectRoot();
|
|
480
|
+
const anchorProvider = resolveProfileAnchorProvider(ctx.model?.provider);
|
|
481
|
+
const disabledProviders = resolveDisabledModelProvidersFromPreferences();
|
|
482
|
+
const availableModelIds = modelIdsForProfileResolution(ctx.modelRegistry, anchorProvider, disabledProviders);
|
|
483
|
+
const configOptions = {
|
|
484
|
+
basePath,
|
|
485
|
+
...(availableModelIds && availableModelIds.length > 0 ? { availableModelIds } : {}),
|
|
486
|
+
};
|
|
487
|
+
const result = await ctx.ui.custom((tui, theme, _kb, done) => new GSDConfigOverlay(tui, theme, () => done(true), configOptions), {
|
|
474
488
|
overlay: true,
|
|
475
489
|
overlayOptions: {
|
|
476
490
|
width: "65%",
|
|
@@ -480,7 +494,7 @@ export async function handleCoreCommand(trimmed, ctx, pi) {
|
|
|
480
494
|
},
|
|
481
495
|
});
|
|
482
496
|
if (result === undefined) {
|
|
483
|
-
ctx.ui.notify(formatConfigText(), "info");
|
|
497
|
+
ctx.ui.notify(formatConfigText(configOptions), "info");
|
|
484
498
|
}
|
|
485
499
|
return true;
|
|
486
500
|
}
|
|
@@ -50,7 +50,7 @@ export async function handleOpsCommand(trimmed, ctx, pi) {
|
|
|
50
50
|
["execute-task", "execute"],
|
|
51
51
|
["complete-slice", "complete"],
|
|
52
52
|
["validate-milestone", "validate-milestone"],
|
|
53
|
-
["complete-milestone", "complete"],
|
|
53
|
+
["complete-milestone", "complete-milestone"],
|
|
54
54
|
]);
|
|
55
55
|
const aliasPhase = directDispatchAlias.get(trimmed);
|
|
56
56
|
if (aliasPhase) {
|
|
@@ -230,7 +230,7 @@ Examples:
|
|
|
230
230
|
if (trimmed === "dispatch" || trimmed.startsWith("dispatch ")) {
|
|
231
231
|
const phase = trimmed.replace(/^dispatch\s*/, "").trim();
|
|
232
232
|
if (!phase) {
|
|
233
|
-
ctx.ui.notify("Usage: /gsd dispatch <phase> (research|plan|execute|complete|validate|reassess|uat|replan)", "warning");
|
|
233
|
+
ctx.ui.notify("Usage: /gsd dispatch <phase> (research|plan|execute|complete|complete-milestone|validate|reassess|uat|replan)", "warning");
|
|
234
234
|
return true;
|
|
235
235
|
}
|
|
236
236
|
const basePath = projectRoot();
|
|
@@ -59,7 +59,7 @@ export function formatMcpStatusReport(servers) {
|
|
|
59
59
|
: s.connected
|
|
60
60
|
? `connected — ${s.toolCount} tools`
|
|
61
61
|
: s.available
|
|
62
|
-
? `available — ${s.toolCount} tools`
|
|
62
|
+
? `probe available — ${s.toolCount} tools`
|
|
63
63
|
: "disconnected";
|
|
64
64
|
const warningText = s.envWarnings?.length ? ` — ${s.envWarnings.length} warning(s)` : "";
|
|
65
65
|
lines.push(` ${icon} ${s.name} (${s.transport}) — ${status}${warningText}`);
|
|
@@ -83,7 +83,7 @@ export function formatMcpServerDetail(server) {
|
|
|
83
83
|
lines.push(` Error: ${server.error}`);
|
|
84
84
|
}
|
|
85
85
|
else if (server.connected || server.available) {
|
|
86
|
-
lines.push(` Status: ${server.connected ? "connected" : "available"}`);
|
|
86
|
+
lines.push(` Status: ${server.connected ? "connected" : "probe available"}`);
|
|
87
87
|
lines.push(` Tools: ${server.toolCount}`);
|
|
88
88
|
if (server.tools.length > 0) {
|
|
89
89
|
lines.push("");
|