gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.4ea7d80e7
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/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/github-sync/templates.js +90 -74
- package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
- package/dist/resources/extensions/gsd/auto/loop.js +365 -522
- package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +55 -6
- package/dist/resources/extensions/gsd/auto/run-unit.js +19 -15
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
- package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
- package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +54 -15
- package/dist/resources/extensions/gsd/auto-dispatch.js +10 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +168 -3
- package/dist/resources/extensions/gsd/auto-recovery.js +198 -59
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
- package/dist/resources/extensions/gsd/auto-start.js +2 -3
- package/dist/resources/extensions/gsd/auto-verification.js +2 -11
- package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
- package/dist/resources/extensions/gsd/auto.js +168 -3
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +24 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -6
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
- package/dist/resources/extensions/gsd/commands-ship.js +23 -46
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
- package/dist/resources/extensions/gsd/component-loader.js +5 -11
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +25 -1
- package/dist/resources/extensions/gsd/db-adapter.js +47 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +351 -0
- package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
- package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
- package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
- package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
- package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +410 -0
- package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
- package/dist/resources/extensions/gsd/db-open-state.js +32 -0
- package/dist/resources/extensions/gsd/db-provider.js +108 -0
- package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
- package/dist/resources/extensions/gsd/db-transaction.js +63 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
- package/dist/resources/extensions/gsd/escalation.js +2 -0
- package/dist/resources/extensions/gsd/graph.js +9 -3
- package/dist/resources/extensions/gsd/gsd-db.js +316 -1520
- package/dist/resources/extensions/gsd/guided-flow.js +2 -2
- package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +9 -6
- package/dist/resources/extensions/gsd/notification-widget.js +21 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
- package/dist/resources/extensions/gsd/pr-evidence.js +117 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
- package/dist/resources/extensions/gsd/process-task-path.js +61 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/dist/resources/extensions/gsd/prompts/system.md +65 -107
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/dist/resources/extensions/gsd/state.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
- package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +6 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
- package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
- package/dist/resources/extensions/shared/interview-ui.js +15 -4
- 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 +14 -14
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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/notifications/route.js +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 +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 +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 +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 +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 +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 +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 +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 +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/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +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 +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 +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 +14 -14
- package/dist/web/standalone/.next/server/chunks/167.js +2 -0
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-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/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
- package/dist/web/standalone/package.json +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/package.json +18 -7
- package/packages/contracts/dist/index.d.ts +3 -0
- package/packages/contracts/dist/index.d.ts.map +1 -0
- package/packages/contracts/dist/index.js +5 -0
- package/packages/contracts/dist/index.js.map +1 -0
- package/packages/contracts/dist/rpc.d.ts +549 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.js +53 -0
- package/packages/contracts/dist/rpc.js.map +1 -0
- package/packages/contracts/dist/rpc.test.d.ts +2 -0
- package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.test.js +47 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -0
- package/packages/contracts/dist/workflow.d.ts +180 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -0
- package/packages/contracts/dist/workflow.js +201 -0
- package/packages/contracts/dist/workflow.js.map +1 -0
- package/packages/contracts/package.json +39 -0
- package/packages/contracts/src/index.ts +5 -0
- package/packages/contracts/src/rpc.test.ts +72 -0
- package/packages/contracts/src/rpc.ts +286 -0
- package/packages/contracts/src/workflow.ts +213 -0
- package/packages/contracts/tsconfig.json +25 -0
- package/packages/daemon/package.json +3 -2
- package/packages/daemon/src/event-bridge.test.ts +2 -1
- package/packages/daemon/src/event-bridge.ts +1 -1
- package/packages/daemon/src/event-formatter.test.ts +1 -2
- package/packages/daemon/src/event-formatter.ts +1 -2
- package/packages/daemon/src/session-manager.ts +2 -2
- package/packages/daemon/src/types.ts +3 -18
- package/packages/mcp-server/dist/server.d.ts +13 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +77 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/types.d.ts +3 -11
- package/packages/mcp-server/dist/types.d.ts.map +1 -1
- package/packages/mcp-server/dist/types.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -40
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -2
- package/packages/mcp-server/src/mcp-server.test.ts +138 -0
- package/packages/mcp-server/src/server.ts +99 -1
- package/packages/mcp-server/src/session-manager.ts +2 -2
- package/packages/mcp-server/src/types.ts +7 -18
- package/packages/mcp-server/src/workflow-tools.ts +2 -40
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
- package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/fake-model.js +27 -0
- package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/index.js +8 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
- package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/fake.js +319 -0
- package/packages/pi-ai/dist/providers/fake.js.map +1 -0
- package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
- package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/models/fake-model.ts +30 -0
- package/packages/pi-ai/src/models/index.ts +9 -0
- package/packages/pi-ai/src/providers/fake.ts +376 -0
- package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +74 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +14 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +97 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +4 -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 +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +67 -14
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +10 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +27 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +16 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +112 -18
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +60 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +40 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +12 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +54 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +48 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/package.json +2 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +87 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +108 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +16 -1
- package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
- package/packages/pi-coding-agent/src/core/settings-manager.ts +12 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +100 -16
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +10 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +124 -18
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +43 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +75 -9
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +65 -0
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
- package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +1 -0
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -0
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/style.d.ts +41 -0
- package/packages/pi-tui/dist/style.d.ts.map +1 -0
- package/packages/pi-tui/dist/style.js +158 -0
- package/packages/pi-tui/dist/style.js.map +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +1 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
- package/packages/pi-tui/src/index.ts +9 -0
- package/packages/pi-tui/src/style.ts +225 -0
- package/packages/pi-tui/src/tui.ts +1 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +3 -3
- package/packages/rpc-client/dist/index.d.ts +1 -1
- package/packages/rpc-client/dist/index.d.ts.map +1 -1
- package/packages/rpc-client/dist/index.js.map +1 -1
- package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
- package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
- package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-types.js +3 -11
- package/packages/rpc-client/dist/rpc-types.js.map +1 -1
- package/packages/rpc-client/package.json +4 -1
- package/packages/rpc-client/src/index.ts +1 -1
- package/packages/rpc-client/src/rpc-client.ts +3 -6
- package/packages/rpc-client/src/rpc-types.ts +3 -398
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +18 -1
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +36 -27
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/github-sync/templates.ts +93 -88
- package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
- package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
- package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
- package/src/resources/extensions/gsd/auto/loop.ts +416 -596
- package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
- package/src/resources/extensions/gsd/auto/phases.ts +82 -8
- package/src/resources/extensions/gsd/auto/run-unit.ts +24 -14
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
- package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
- package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
- package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +61 -8
- package/src/resources/extensions/gsd/auto-dispatch.ts +17 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +170 -3
- package/src/resources/extensions/gsd/auto-recovery.ts +194 -56
- package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
- package/src/resources/extensions/gsd/auto-start.ts +7 -6
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
- package/src/resources/extensions/gsd/auto.ts +179 -2
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +30 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +30 -6
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
- package/src/resources/extensions/gsd/commands-ship.ts +24 -51
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
- package/src/resources/extensions/gsd/component-loader.ts +5 -11
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
- package/src/resources/extensions/gsd/db-adapter.ts +75 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +383 -0
- package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
- package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
- package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
- package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
- package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +451 -0
- package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
- package/src/resources/extensions/gsd/db-open-state.ts +47 -0
- package/src/resources/extensions/gsd/db-provider.ts +148 -0
- package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
- package/src/resources/extensions/gsd/db-transaction.ts +76 -0
- package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
- package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
- package/src/resources/extensions/gsd/escalation.ts +3 -1
- package/src/resources/extensions/gsd/graph.ts +12 -5
- package/src/resources/extensions/gsd/gsd-db.ts +379 -1660
- package/src/resources/extensions/gsd/guided-flow.ts +2 -2
- package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
- package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
- package/src/resources/extensions/gsd/model-router.ts +10 -6
- package/src/resources/extensions/gsd/notification-widget.ts +25 -4
- package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
- package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
- package/src/resources/extensions/gsd/process-task-path.ts +81 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/src/resources/extensions/gsd/prompts/queue.md +46 -53
- package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/src/resources/extensions/gsd/prompts/system.md +65 -107
- package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/src/resources/extensions/gsd/state.ts +6 -3
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +170 -1
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
- package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +46 -2
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +6 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
- package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
- package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
- package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
- package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
- package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
- package/src/resources/extensions/shared/interview-ui.ts +18 -5
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
- package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → vIAZSyxIuvqNkCvXt9oqb}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → vIAZSyxIuvqNkCvXt9oqb}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import { readFile, readdir } from 'node:fs/promises';
|
|
|
14
14
|
import { join, resolve } from 'node:path';
|
|
15
15
|
import { spawn } from 'node:child_process';
|
|
16
16
|
import { createRequire } from 'node:module';
|
|
17
|
+
import { pathToFileURL } from 'node:url';
|
|
17
18
|
import { z } from 'zod';
|
|
18
19
|
import { isRemoteConfigured, tryRemoteQuestions } from './remote-questions.js';
|
|
19
20
|
import { readProgress } from './readers/state.js';
|
|
@@ -326,6 +327,79 @@ export function buildAskUserQuestionsRoundResult(questions, result) {
|
|
|
326
327
|
// identical payloads regardless of channel. See peer review #5267-Q2.
|
|
327
328
|
return { endInterview: false, answers };
|
|
328
329
|
}
|
|
330
|
+
let askUserQuestionsWriteGateModulePromise = null;
|
|
331
|
+
function isAskUserQuestionsWriteGateModule(value) {
|
|
332
|
+
if (!value || typeof value !== 'object')
|
|
333
|
+
return false;
|
|
334
|
+
const module = value;
|
|
335
|
+
return (typeof module['isGateQuestionId'] === 'function' &&
|
|
336
|
+
typeof module['isDepthConfirmationAnswer'] === 'function' &&
|
|
337
|
+
typeof module['setPendingGate'] === 'function' &&
|
|
338
|
+
typeof module['markApprovalGateVerified'] === 'function' &&
|
|
339
|
+
typeof module['markDepthVerified'] === 'function' &&
|
|
340
|
+
typeof module['clearPendingGate'] === 'function' &&
|
|
341
|
+
typeof module['extractDepthVerificationMilestoneId'] === 'function');
|
|
342
|
+
}
|
|
343
|
+
async function loadAskUserQuestionsWriteGateModule() {
|
|
344
|
+
if (!askUserQuestionsWriteGateModulePromise) {
|
|
345
|
+
askUserQuestionsWriteGateModulePromise = (async () => {
|
|
346
|
+
const modulePath = process.env.GSD_WORKFLOW_WRITE_GATE_MODULE?.trim();
|
|
347
|
+
if (!modulePath)
|
|
348
|
+
return null;
|
|
349
|
+
try {
|
|
350
|
+
if (/^[a-z]{2,}:/i.test(modulePath) && !modulePath.startsWith('file:')) {
|
|
351
|
+
throw new Error('GSD_WORKFLOW_WRITE_GATE_MODULE only supports file: URLs or filesystem paths.');
|
|
352
|
+
}
|
|
353
|
+
const baseRoot = process.env.GSD_WORKFLOW_PROJECT_ROOT?.trim() || process.cwd();
|
|
354
|
+
const specifier = modulePath.startsWith('file:') ? modulePath : pathToFileURL(resolve(baseRoot, modulePath)).href;
|
|
355
|
+
const loaded = await import(specifier);
|
|
356
|
+
return isAskUserQuestionsWriteGateModule(loaded) ? loaded : null;
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
console.warn(`[gsd:mcp] ask_user_questions write-gate integration unavailable: ${formatErrorMessage(err)}`);
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
})();
|
|
363
|
+
}
|
|
364
|
+
return askUserQuestionsWriteGateModulePromise;
|
|
365
|
+
}
|
|
366
|
+
function askUserQuestionsWriteGateBasePath(deps) {
|
|
367
|
+
return deps.writeGateBasePath ?? process.env.GSD_WORKFLOW_PROJECT_ROOT?.trim() ?? process.cwd();
|
|
368
|
+
}
|
|
369
|
+
async function resolveAskUserQuestionsWriteGate(deps) {
|
|
370
|
+
if (deps.writeGate !== undefined)
|
|
371
|
+
return deps.writeGate;
|
|
372
|
+
return loadAskUserQuestionsWriteGateModule();
|
|
373
|
+
}
|
|
374
|
+
async function recordAskUserQuestionsPendingGate(questions, deps) {
|
|
375
|
+
const writeGate = await resolveAskUserQuestionsWriteGate(deps);
|
|
376
|
+
if (!writeGate)
|
|
377
|
+
return;
|
|
378
|
+
const basePath = askUserQuestionsWriteGateBasePath(deps);
|
|
379
|
+
for (const question of questions) {
|
|
380
|
+
if (writeGate.isGateQuestionId(question.id)) {
|
|
381
|
+
writeGate.setPendingGate(question.id, basePath);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
async function recordAskUserQuestionsGateResult(structured, deps) {
|
|
386
|
+
if (structured.cancelled || !structured.response)
|
|
387
|
+
return;
|
|
388
|
+
const writeGate = await resolveAskUserQuestionsWriteGate(deps);
|
|
389
|
+
if (!writeGate)
|
|
390
|
+
return;
|
|
391
|
+
const basePath = askUserQuestionsWriteGateBasePath(deps);
|
|
392
|
+
for (const question of structured.questions) {
|
|
393
|
+
if (!writeGate.isGateQuestionId(question.id))
|
|
394
|
+
continue;
|
|
395
|
+
const selected = structured.response.answers[question.id]?.selected;
|
|
396
|
+
if (!writeGate.isDepthConfirmationAnswer(selected, question.options))
|
|
397
|
+
continue;
|
|
398
|
+
writeGate.markApprovalGateVerified(question.id, basePath);
|
|
399
|
+
writeGate.markDepthVerified(writeGate.extractDepthVerificationMilestoneId(question.id), basePath);
|
|
400
|
+
writeGate.clearPendingGate(basePath);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
329
403
|
function isLocalElicitFallbackError(err) {
|
|
330
404
|
if (!(err instanceof Error))
|
|
331
405
|
return false;
|
|
@@ -358,6 +432,7 @@ export async function askUserQuestionsHandler(questions, extra, deps) {
|
|
|
358
432
|
const validationError = validateAskUserQuestionsPayload(questions);
|
|
359
433
|
if (validationError)
|
|
360
434
|
return errorContent(validationError);
|
|
435
|
+
await recordAskUserQuestionsPendingGate(questions, deps);
|
|
361
436
|
// Local-first: try the MCP host's elicitation channel (Claude Code,
|
|
362
437
|
// Cursor, etc.) before any configured remote channel. A misconfigured
|
|
363
438
|
// remote (e.g. expired Discord token returning 401) must not block the
|
|
@@ -371,6 +446,7 @@ export async function askUserQuestionsHandler(questions, extra, deps) {
|
|
|
371
446
|
response: buildAskUserQuestionsRoundResult(questions, elicitation),
|
|
372
447
|
cancelled: false,
|
|
373
448
|
};
|
|
449
|
+
await recordAskUserQuestionsGateResult(structured, deps);
|
|
374
450
|
return {
|
|
375
451
|
content: [{ type: 'text', text: formatAskUserQuestionsElicitResult(questions, elicitation) }],
|
|
376
452
|
structuredContent: structured,
|
|
@@ -432,6 +508,7 @@ export async function askUserQuestionsHandler(questions, extra, deps) {
|
|
|
432
508
|
response: null,
|
|
433
509
|
cancelled: true,
|
|
434
510
|
};
|
|
511
|
+
await recordAskUserQuestionsGateResult(acceptedStructured, deps);
|
|
435
512
|
return {
|
|
436
513
|
content: [{ type: 'text', text: remoteResult.content[0]?.text ?? '' }],
|
|
437
514
|
structuredContent: acceptedStructured,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Server — registers GSD orchestration, project-state, and workflow tools.\n *\n * Session tools (6): gsd_execute, gsd_status, gsd_result, gsd_cancel, gsd_query, gsd_resolve_blocker\n * Interactive tools (2): ask_user_questions, secure_env_collect via MCP form elicitation\n * Read-only tools (6): gsd_progress, gsd_roadmap, gsd_history, gsd_doctor, gsd_captures, gsd_knowledge\n * Workflow tools (29): headless-safe planning, metadata persistence, replanning, completion, validation, reassessment, gate result, status, and journal tools\n *\n * Uses dynamic imports for @modelcontextprotocol/sdk because TS Node16\n * cannot resolve the SDK's subpath exports statically (same pattern as\n * src/mcp-server.ts in the main package).\n */\n\nimport { readFile, readdir } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport { z } from 'zod';\nimport type { SessionManager } from './session-manager.js';\nimport { isRemoteConfigured, tryRemoteQuestions } from './remote-questions.js';\nimport type { RemoteToolResult } from './remote-questions.js';\nimport { readProgress } from './readers/state.js';\nimport { readRoadmap } from './readers/roadmap.js';\nimport { readHistory } from './readers/metrics.js';\nimport { readCaptures } from './readers/captures.js';\nimport { readKnowledge } from './readers/knowledge.js';\nimport { buildGraph, writeGraph, writeSnapshot, graphStatus, graphQuery, graphDiff } from './readers/graph.js';\nimport { resolveGsdRoot, resolveMilestoneFile } from './readers/paths.js';\nimport { runDoctorLite } from './readers/doctor-lite.js';\nimport { registerWorkflowTools, validateProjectDir } from './workflow-tools.js';\nimport { applySecrets, checkExistingEnvKeys, detectDestination, resolveProjectEnvFilePath } from './env-writer.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MCP_PKG = '@modelcontextprotocol/sdk';\nconst SERVER_NAME = 'gsd';\n\n/**\n * Read the version from this package's package.json so the MCP handshake\n * always advertises the deployed artifact's version. Falls back to '0.0.0'\n * if package.json can't be located (e.g. unusual bundling); the fallback\n * is loud-ish but won't crash the server.\n */\nconst SERVER_VERSION: string = (() => {\n try {\n const require = createRequire(import.meta.url);\n const pkg = require('../package.json') as { version?: unknown };\n if (typeof pkg.version === 'string' && pkg.version.length > 0) return pkg.version;\n } catch { /* fall through */ }\n return '0.0.0';\n})();\n\n/** User-interaction timeout — generous but bounded so elicitation can't hang indefinitely (#4586). */\nconst ELICIT_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes\n\n/**\n * Default child-process runner used by secure_env_collect to push secrets\n * into `vercel env add` / `npx convex env set`. Previously `applySecrets`\n * was called without an `execFn`, so vercel/convex destinations silently\n * dropped every collected key. This restores the write path.\n */\nfunction defaultExecFn(\n cmd: string,\n args: string[],\n opts?: { stdin?: string },\n): Promise<{ code: number; stderr: string }> {\n return new Promise((res) => {\n // stdin: pipe only when a caller explicitly supplies input; otherwise\n // ignore it to avoid hanging if the child ever prompts interactively.\n // stdout: ignore — consumer only cares about stderr + exit code, and an\n // un-drained pipe deadlocks once the kernel buffer (~64KB) fills.\n // stderr: pipe — captured below for error surfacing.\n const child = spawn(resolveShellCommand(cmd), args, {\n shell: process.platform === 'win32',\n stdio: [opts?.stdin === undefined ? 'ignore' : 'pipe', 'ignore', 'pipe'],\n windowsHide: true,\n });\n let stderr = '';\n child.stdin?.on('error', () => {\n // Child exited before consuming stdin; close/error handling below will\n // surface the real process result.\n });\n if (opts?.stdin !== undefined) {\n child.stdin?.end(opts.stdin, 'utf8');\n }\n child.stderr?.on('data', (chunk) => {\n stderr += chunk.toString('utf8');\n });\n child.on('error', (err) => res({ code: 1, stderr: err.message }));\n child.on('close', (code) => res({ code: code ?? 1, stderr }));\n });\n}\n\nfunction resolveShellCommand(cmd: string): string {\n if (process.platform !== 'win32') return cmd;\n if (cmd === 'vercel') return 'vercel.cmd';\n if (cmd === 'npx') return 'npx.cmd';\n return cmd;\n}\n\n/**\n * Race a promise against a timeout. Rejects with a typed error on timeout so\n * callers can return a specific MCP error response rather than hanging.\n * If a parent AbortSignal is provided, an abort also rejects the race so\n * client-side cancellation propagates instead of being absorbed by the\n * 10-minute elicitation hold.\n *\n * @param timeoutMs - override for testing; defaults to ELICIT_TIMEOUT_MS\n */\nexport async function withElicitTimeout<T>(\n promise: Promise<T>,\n label: string,\n timeoutMs = ELICIT_TIMEOUT_MS,\n signal?: AbortSignal,\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const racers: Promise<T>[] = [promise];\n racers.push(\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`${label} timed out after ${timeoutMs / 60000} minutes — no user response received`)),\n timeoutMs,\n );\n }),\n );\n let abortListener: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) {\n clearTimeout(timer);\n throw new Error(`${label} cancelled by client`);\n }\n racers.push(\n new Promise<never>((_, reject) => {\n abortListener = () => reject(new Error(`${label} cancelled by client`));\n signal.addEventListener('abort', abortListener, { once: true });\n }),\n );\n }\n try {\n return await Promise.race(racers);\n } finally {\n clearTimeout(timer);\n if (signal && abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tool result helpers\n// ---------------------------------------------------------------------------\n\n/** Wrap a JSON-serializable value as MCP tool content. */\nfunction jsonContent(data: unknown): { content: Array<{ type: 'text'; text: string }> } {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] };\n}\n\n/** Return an MCP error response. */\nfunction errorContent(message: string): { isError: true; content: Array<{ type: 'text'; text: string }> } {\n return { isError: true, content: [{ type: 'text' as const, text: message }] };\n}\n\n/** Return raw text content without JSON wrapping. */\nfunction textContent(text: string): { content: Array<{ type: 'text'; text: string }> } {\n return { content: [{ type: 'text' as const, text }] };\n}\n\n// ---------------------------------------------------------------------------\n// gsd_query filesystem reader\n// ---------------------------------------------------------------------------\n\n/**\n * Normalized query categories for {@link readProjectState}.\n *\n * Maps user-supplied query strings (or empty) to the set of fields we return.\n * Accepts common synonyms so the MCP client can pass intuitive values.\n */\nconst QUERY_FIELDS = {\n all: ['state', 'project', 'requirements', 'milestones'] as const,\n state: ['state'] as const,\n status: ['state'] as const,\n project: ['project'] as const,\n requirements: ['requirements'] as const,\n milestones: ['milestones'] as const,\n} as const;\n\ntype QueryCategory = keyof typeof QUERY_FIELDS;\ntype ProjectStateField = (typeof QUERY_FIELDS)[QueryCategory][number];\n\nfunction normalizeQuery(query: string | undefined): QueryCategory {\n const key = (query ?? 'all').trim().toLowerCase();\n if (key in QUERY_FIELDS) return key as QueryCategory;\n return 'all';\n}\n\nasync function readProjectState(projectDir: string, query: string | undefined): Promise<Record<string, unknown>> {\n const gsdDir = join(resolve(projectDir), '.gsd');\n const category = normalizeQuery(query);\n const wanted = new Set<ProjectStateField>(QUERY_FIELDS[category]);\n\n const result: Record<string, unknown> = {\n projectDir: resolve(projectDir),\n query: category,\n };\n\n if (wanted.has('state')) {\n try {\n result.state = await readFile(join(gsdDir, 'STATE.md'), 'utf-8');\n } catch {\n result.state = null;\n }\n }\n\n if (wanted.has('project')) {\n try {\n result.project = await readFile(join(gsdDir, 'PROJECT.md'), 'utf-8');\n } catch {\n result.project = null;\n }\n }\n\n if (wanted.has('requirements')) {\n try {\n result.requirements = await readFile(join(gsdDir, 'REQUIREMENTS.md'), 'utf-8');\n } catch {\n result.requirements = null;\n }\n }\n\n if (wanted.has('milestones')) {\n const milestonesDir = join(gsdDir, 'milestones');\n try {\n const entries = await readdir(milestonesDir, { withFileTypes: true });\n const milestones: Array<{ id: string; hasRoadmap: boolean; hasSummary: boolean }> = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const hasRoadmap = !!resolveMilestoneFile(gsdDir, entry.name, 'ROADMAP');\n const hasSummary = !!resolveMilestoneFile(gsdDir, entry.name, 'SUMMARY');\n milestones.push({ id: entry.name, hasRoadmap, hasSummary });\n }\n result.milestones = milestones;\n } catch {\n result.milestones = [];\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// MCP Server type — minimal interface for the dynamically-imported McpServer\n// ---------------------------------------------------------------------------\n\ninterface ElicitResult {\n action: 'accept' | 'decline' | 'cancel';\n content?: Record<string, string | number | boolean | string[]>;\n}\n\ninterface ElicitRequestFormParams {\n mode?: 'form';\n message: string;\n requestedSchema: {\n type: 'object';\n properties: Record<string, Record<string, unknown>>;\n required?: string[];\n };\n}\n\n/**\n * Handler extra — the second argument passed by McpServer.tool handlers.\n * Contains an AbortSignal scoped to the JSON-RPC request (cancelled when\n * the client cancels the `tools/call`) plus other per-request metadata.\n * Tools that can actually be stopped mid-flight should honour `signal`.\n */\nexport interface McpToolExtra {\n signal?: AbortSignal;\n requestId?: string | number;\n sendNotification?: (notification: unknown) => void | Promise<void>;\n}\n\ninterface McpServerInstance {\n tool(\n name: string,\n description: string,\n params: Record<string, unknown>,\n handler: (args: Record<string, unknown>, extra?: McpToolExtra) => Promise<unknown>,\n ): unknown;\n server: {\n elicitInput(\n params: AskUserQuestionsElicitRequest | ElicitRequestFormParams,\n options?: unknown,\n ): Promise<AskUserQuestionsElicitResult>;\n };\n connect(transport: unknown): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface AskUserQuestionOption {\n label: string;\n description: string;\n}\n\ninterface AskUserQuestion {\n id: string;\n header: string;\n question: string;\n options: AskUserQuestionOption[];\n allowMultiple?: boolean;\n}\n\ninterface AskUserQuestionsParams {\n questions: AskUserQuestion[];\n}\n\ntype AskUserQuestionsContentValue = string | number | boolean | string[];\n\ninterface AskUserQuestionsElicitResult {\n action: 'accept' | 'decline' | 'cancel';\n content?: Record<string, AskUserQuestionsContentValue>;\n}\n\ninterface AskUserQuestionsElicitRequest {\n mode: 'form';\n message: string;\n requestedSchema: {\n type: 'object';\n properties: Record<string, Record<string, unknown>>;\n required?: string[];\n };\n}\n\n/**\n * Structured payload mirrored to the MCP `structuredContent` field on\n * `ask_user_questions` results. Mirrors the `LocalResultDetails` shape that\n * src/resources/extensions/ask-user-questions.ts already produces, so the\n * GSD discussion-gate hook in register-hooks.ts can treat the MCP path\n * identically to the in-process extension path. Without this, the bridge\n * surfaces `details = undefined` and the gate hook's\n * `if (details?.cancelled || !details?.response)` branch HARD-BLOCKs every\n * user answer, including successful confirmations. See #5267.\n */\ninterface AskUserQuestionsRoundResultAnswer {\n selected: string | string[];\n notes: string;\n}\n\ninterface AskUserQuestionsRoundResult {\n endInterview: false;\n answers: Record<string, AskUserQuestionsRoundResultAnswer>;\n}\n\ninterface AskUserQuestionsStructuredContent {\n questions: AskUserQuestion[];\n response: AskUserQuestionsRoundResult | null;\n cancelled: boolean;\n}\n\nconst OTHER_OPTION_LABEL = 'None of the above';\n\nfunction normalizeAskUserQuestionsNote(value: AskUserQuestionsContentValue | undefined): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction normalizeAskUserQuestionsAnswers(\n value: AskUserQuestionsContentValue | undefined,\n allowMultiple: boolean,\n): string[] {\n if (allowMultiple) {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [];\n }\n\n return typeof value === 'string' && value.length > 0 ? [value] : [];\n}\n\nfunction validateAskUserQuestionsPayload(questions: AskUserQuestion[]): string | null {\n if (questions.length === 0 || questions.length > 3) {\n return 'Error: questions must contain 1-3 items';\n }\n\n for (const question of questions) {\n if (!question.options || question.options.length === 0) {\n return `Error: ask_user_questions requires non-empty options for every question (question \"${question.id}\" has none)`;\n }\n }\n\n return null;\n}\n\nexport function buildAskUserQuestionsElicitRequest(questions: AskUserQuestion[]): AskUserQuestionsElicitRequest {\n const properties: Record<string, Record<string, unknown>> = {};\n const required = questions.map((question) => question.id);\n\n for (const question of questions) {\n if (question.allowMultiple) {\n properties[question.id] = {\n type: 'array',\n title: question.header,\n description: question.question,\n minItems: 1,\n maxItems: question.options.length,\n items: {\n anyOf: question.options.map((option) => ({\n const: option.label,\n title: option.label,\n })),\n },\n };\n continue;\n }\n\n properties[question.id] = {\n type: 'string',\n title: question.header,\n description: question.question,\n oneOf: [...question.options, { label: OTHER_OPTION_LABEL, description: 'Choose this when the listed options do not fit.' }].map((option) => ({\n const: option.label,\n title: option.label,\n })),\n };\n\n properties[`${question.id}__note`] = {\n type: 'string',\n title: `${question.header} Note`,\n description: `Optional note for \"${OTHER_OPTION_LABEL}\".`,\n maxLength: 500,\n };\n }\n\n return {\n mode: 'form',\n message: 'Please answer the following question(s). For single-select questions, choose \"None of the above\" and add a note if the provided options do not fit.',\n requestedSchema: {\n type: 'object',\n properties,\n required,\n },\n };\n}\n\nexport function formatAskUserQuestionsElicitResult(\n questions: AskUserQuestion[],\n result: AskUserQuestionsElicitResult,\n): string {\n const answers: Record<string, { answers: string[] }> = {};\n const content = result.content ?? {};\n\n for (const question of questions) {\n const answerList = normalizeAskUserQuestionsAnswers(content[question.id], !!question.allowMultiple);\n\n if (!question.allowMultiple && answerList[0] === OTHER_OPTION_LABEL) {\n const note = normalizeAskUserQuestionsNote(content[`${question.id}__note`]);\n if (note) {\n answerList.push(`user_note: ${note}`);\n }\n }\n\n answers[question.id] = { answers: answerList };\n }\n\n return JSON.stringify({ answers });\n}\n\n/**\n * Normalize an MCP elicitation form result into the `RoundResult` shape the\n * GSD discussion-gate hook reads from `tool_result` `details.response`. The\n * elicitation `content` map carries `{ [id]: label, [id]__note?: string }`;\n * the hook expects `{ answers: { [id]: { selected, notes } } }`. Mirrored into\n * `structuredContent` by `askUserQuestionsHandler`. See #5267.\n */\nexport function buildAskUserQuestionsRoundResult(\n questions: AskUserQuestion[],\n result: AskUserQuestionsElicitResult,\n): AskUserQuestionsRoundResult {\n const answers: Record<string, AskUserQuestionsRoundResultAnswer> = {};\n const content = result.content ?? {};\n\n for (const question of questions) {\n if (question.allowMultiple) {\n const list = normalizeAskUserQuestionsAnswers(content[question.id], true);\n answers[question.id] = { selected: list, notes: '' };\n continue;\n }\n\n const list = normalizeAskUserQuestionsAnswers(content[question.id], false);\n const selected = list[0] ?? '';\n const notes = selected === OTHER_OPTION_LABEL\n ? normalizeAskUserQuestionsNote(content[`${question.id}__note`])\n : '';\n answers[question.id] = { selected, notes };\n }\n\n // `endInterview: false` mirrors the local extension's `RoundResult` shape and\n // matches the remote path's `toRoundResultResponse` so register-hooks reads\n // identical payloads regardless of channel. See peer review #5267-Q2.\n return { endInterview: false, answers };\n}\n\ninterface AskUserQuestionsHandlerDeps {\n elicitInput(params: AskUserQuestionsElicitRequest): Promise<AskUserQuestionsElicitResult>;\n isRemoteConfigured(): boolean;\n tryRemoteQuestions(questions: AskUserQuestion[], signal?: AbortSignal): Promise<RemoteToolResult | null>;\n}\n\nfunction isLocalElicitFallbackError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const message = err.message.toLowerCase();\n return (\n message.includes('timed out after') ||\n message.includes('elicit') ||\n message.includes('elicitation') ||\n message.includes('host') ||\n message.includes('not supported') ||\n message.includes('method not found') ||\n message.includes('-32601')\n );\n}\n\nfunction formatErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/**\n * Defensive guard for the `details.response` payload from `tryRemoteQuestions`.\n * Accepts only an object with a plain `answers` map; anything else (null,\n * stringified JSON, missing) falls back to `null` so the gate hook routes\n * the cancel branch instead of crashing on `details.response.answers[id]`.\n */\nfunction isRoundResultLike(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false;\n const answers = (value as Record<string, unknown>)['answers'];\n return !!answers && typeof answers === 'object' && !Array.isArray(answers);\n}\n\nexport async function askUserQuestionsHandler(\n questions: AskUserQuestion[],\n extra: McpToolExtra | undefined,\n deps: AskUserQuestionsHandlerDeps,\n): Promise<ToolContent> {\n try {\n const validationError = validateAskUserQuestionsPayload(questions);\n if (validationError) return errorContent(validationError);\n\n // Local-first: try the MCP host's elicitation channel (Claude Code,\n // Cursor, etc.) before any configured remote channel. A misconfigured\n // remote (e.g. expired Discord token returning 401) must not block the\n // depth-verification gate when the user is sitting in front of the host.\n let localElicitError: unknown;\n try {\n const elicitation = await withElicitTimeout(\n deps.elicitInput(buildAskUserQuestionsElicitRequest(questions)),\n 'ask_user_questions',\n );\n if (elicitation.action === 'accept' && elicitation.content) {\n const structured: AskUserQuestionsStructuredContent = {\n questions,\n response: buildAskUserQuestionsRoundResult(questions, elicitation),\n cancelled: false,\n };\n return {\n content: [{ type: 'text' as const, text: formatAskUserQuestionsElicitResult(questions, elicitation) }],\n structuredContent: structured as unknown as Record<string, unknown>,\n };\n }\n } catch (err) {\n if (!isLocalElicitFallbackError(err)) throw err;\n localElicitError = err;\n console.warn(`[gsd:mcp] ask_user_questions local elicitation unavailable; trying remote fallback: ${formatErrorMessage(err)}`);\n }\n\n // Local cancelled / unavailable — fall back to the configured remote\n // channel (Discord, Slack, Telegram) if one is set.\n if (deps.isRemoteConfigured()) {\n let remoteResult: RemoteToolResult | null;\n try {\n remoteResult = await deps.tryRemoteQuestions(questions, extra?.signal);\n } catch (err) {\n if (localElicitError) {\n throw new Error(\n `Local elicitation failed (${formatErrorMessage(localElicitError)}); remote fallback failed (${formatErrorMessage(err)})`,\n );\n }\n throw err;\n }\n if (remoteResult) {\n const details = remoteResult.details as Record<string, unknown> | undefined;\n if (details?.['timed_out'] || details?.['error']) {\n // Mirror the timeout/error into structuredContent so the gate hook's\n // `details?.cancelled || !details?.response` branch fires correctly\n // (gate stays pending, model re-asks) instead of silently dropping\n // because no `details` made it across the MCP wire. See #5267.\n const failedStructured: AskUserQuestionsStructuredContent = {\n questions,\n response: null,\n cancelled: true,\n };\n return {\n content: [{ type: 'text' as const, text: remoteResult.content[0]?.text ?? 'Remote questions timed out or failed' }],\n structuredContent: failedStructured as unknown as Record<string, unknown>,\n };\n }\n // Successful remote answer — surface the normalized RoundResult that\n // remote-questions.ts attached to `details.response` so the gate hook\n // sees `details.response.answers[id].selected` on this path too.\n // A malformed `response` (failing isRoundResultLike) is reported as\n // an explicit cancellation rather than a silent `cancelled: false`\n // with `response: null` — the latter would lie to any consumer that\n // reads `structuredContent.cancelled` independently of `.response`.\n const hasValidResponse = isRoundResultLike(details?.['response']);\n const acceptedStructured: AskUserQuestionsStructuredContent = hasValidResponse\n ? {\n questions,\n response: details!['response'] as AskUserQuestionsRoundResult,\n cancelled: false,\n }\n : {\n questions,\n response: null,\n cancelled: true,\n };\n return {\n content: [{ type: 'text' as const, text: remoteResult.content[0]?.text ?? '' }],\n structuredContent: acceptedStructured as unknown as Record<string, unknown>,\n };\n }\n }\n\n if (localElicitError) throw localElicitError;\n\n const cancelledStructured: AskUserQuestionsStructuredContent = {\n questions,\n response: null,\n cancelled: true,\n };\n return {\n content: [{ type: 'text' as const, text: 'ask_user_questions was cancelled before receiving a response' }],\n structuredContent: cancelledStructured as unknown as Record<string, unknown>,\n };\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n}\n\n// ---------------------------------------------------------------------------\n// secure_env_collect handler (extracted so tests can drive it directly)\n// ---------------------------------------------------------------------------\n\nexport type ElicitInputFn = (params: {\n message: string;\n requestedSchema: { type: 'object'; properties: Record<string, unknown>; required: string[] };\n}) => Promise<{ action: 'accept' | 'cancel' | 'decline'; content?: Record<string, unknown> }>;\n\ntype ToolContent =\n | { content: Array<{ type: 'text'; text: string }>; structuredContent?: Record<string, unknown> }\n | { isError: true; content: Array<{ type: 'text'; text: string }>; structuredContent?: Record<string, unknown> };\n\nexport async function secureEnvCollectHandler(\n args: Record<string, unknown>,\n elicitInput: ElicitInputFn,\n): Promise<ToolContent> {\n const { projectDir, keys, destination, envFilePath, environment } = args as {\n projectDir: string;\n keys: Array<{ key: string; hint?: string; guidance?: string[] }>;\n destination?: 'dotenv' | 'vercel' | 'convex';\n envFilePath?: string;\n environment?: 'development' | 'preview' | 'production';\n };\n\n try {\n const resolvedProjectDir = validateProjectDir(projectDir);\n const resolvedEnvPath = resolveProjectEnvFilePath(resolvedProjectDir, envFilePath ?? '.env');\n\n // (1) Check which keys already exist\n const allKeyNames = keys.map((k) => k.key);\n const existingKeys = await checkExistingEnvKeys(allKeyNames, resolvedEnvPath);\n const existingSet = new Set(existingKeys);\n const pendingKeys = keys.filter((k) => !existingSet.has(k.key));\n\n // If all keys already exist, return immediately\n if (pendingKeys.length === 0) {\n const lines = existingKeys.map((k) => `• ${k}: already set`);\n return textContent(`All ${existingKeys.length} key(s) already set.\\n${lines.join('\\n')}`);\n }\n\n // (2) Build elicitation form — one string field per pending key\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n\n for (const item of pendingKeys) {\n const descParts: string[] = [];\n if (item.hint) descParts.push(`Format: ${item.hint}`);\n if (item.guidance && item.guidance.length > 0) {\n descParts.push('How to get this:');\n item.guidance.forEach((step, i) => descParts.push(`${i + 1}. ${step}`));\n }\n descParts.push('Leave empty to skip.');\n\n properties[item.key] = {\n type: 'string',\n title: item.key,\n description: descParts.join('\\n'),\n };\n // Don't mark as required — empty string = skip\n }\n\n // (3) Elicit input from the MCP client\n const elicitation = await withElicitTimeout(\n elicitInput({\n message: `Enter values for ${pendingKeys.length} environment variable(s). Values are written directly to the project and never shown to the AI.`,\n requestedSchema: {\n type: 'object',\n properties,\n required,\n },\n }),\n 'secure_env_collect',\n );\n\n if (elicitation.action !== 'accept' || !elicitation.content) {\n return textContent('secure_env_collect was cancelled by user.');\n }\n\n // (4) Separate provided vs skipped from form response\n const provided: Array<{ key: string; value: string }> = [];\n const skipped: string[] = [];\n\n for (const item of pendingKeys) {\n const raw = elicitation.content[item.key];\n const value = typeof raw === 'string' ? raw.trim() : '';\n if (value.length > 0) {\n provided.push({ key: item.key, value });\n } else {\n skipped.push(item.key);\n }\n }\n\n // (5) Auto-detect destination if not specified\n const resolvedDestination = destination ?? detectDestination(resolvedProjectDir);\n\n // (6) Write secrets to destination\n const { applied, errors } = await applySecrets(provided, resolvedDestination, {\n envFilePath: resolvedEnvPath,\n environment,\n execFn: defaultExecFn,\n });\n\n // (7) Build result — NEVER include secret values\n const lines: string[] = [\n `destination: ${resolvedDestination}${!destination ? ' (auto-detected)' : ''}${environment ? ` (${environment})` : ''}`,\n ];\n for (const k of applied) lines.push(`✓ ${k}: applied`);\n for (const k of skipped) lines.push(`• ${k}: skipped`);\n for (const k of existingKeys) lines.push(`• ${k}: already set`);\n for (const e of errors) lines.push(`✗ ${e}`);\n\n return errors.length > 0 && applied.length === 0\n ? errorContent(lines.join('\\n'))\n : textContent(lines.join('\\n'));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n}\n\n// ---------------------------------------------------------------------------\n// createMcpServer\n// ---------------------------------------------------------------------------\n\n/**\n * Create and configure an MCP server with session, read-only, and workflow tools.\n *\n * Returns the McpServer instance — call `connect(transport)` to start serving.\n * Uses dynamic imports for the MCP SDK to avoid TS subpath resolution issues.\n */\nexport async function createMcpServer(\n sessionManager: SessionManager,\n): Promise<{\n server: McpServerInstance;\n}> {\n // Dynamic import — same workaround as src/mcp-server.ts\n const mcpMod = await import(`${MCP_PKG}/server/mcp.js`);\n const McpServer = mcpMod.McpServer as new (\n info: { name: string; version: string },\n opts: { capabilities: Record<string, unknown> },\n ) => McpServerInstance;\n\n const server: McpServerInstance = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, elicitation: {} } },\n );\n\n // -----------------------------------------------------------------------\n // gsd_execute — start a new GSD auto-mode session.\n //\n // If the JSON-RPC request is aborted while the session is starting (or\n // immediately after), we cancel the session so we don't leak a background\n // RpcClient process. Once the session is running the caller should use\n // `gsd_cancel` to stop it via sessionId.\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_execute',\n 'Start a GSD auto-mode session for a project directory. Returns a sessionId for tracking.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n command: z.string().optional().describe('Command to send (default: \"/gsd auto\")'),\n model: z.string().optional().describe('Model ID override'),\n bare: z.boolean().optional().describe('Run in bare mode (skip user config)'),\n },\n async (args: Record<string, unknown>, extra?: McpToolExtra) => {\n const { projectDir, command, model, bare } = args as {\n projectDir: string; command?: string; model?: string; bare?: boolean;\n };\n try {\n const sessionId = await sessionManager.startSession(projectDir, { command, model, bare });\n\n // If the client aborted while startSession was running, cancel the\n // newly-created session rather than leaving an orphaned process.\n if (extra?.signal?.aborted) {\n await sessionManager.cancelSession(sessionId).catch(() => { /* swallow */ });\n return errorContent('gsd_execute aborted by client before returning');\n }\n\n return jsonContent({ sessionId, status: 'started' });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_status — poll session status\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_status',\n 'Get the current status of a GSD session including progress, recent events, and pending blockers.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n const session = sessionManager.getSession(sessionId);\n if (!session) return errorContent(`Session not found: ${sessionId}`);\n\n const durationMs = Date.now() - session.startTime;\n const toolCallCount = session.events.filter(\n (e) => (e as Record<string, unknown>).type === 'tool_use' ||\n (e as Record<string, unknown>).type === 'tool_execution_start'\n ).length;\n\n return jsonContent({\n status: session.status,\n progress: {\n eventCount: session.events.length,\n toolCalls: toolCallCount,\n },\n recentEvents: session.events.slice(-10),\n pendingBlocker: session.pendingBlocker\n ? {\n id: session.pendingBlocker.id,\n method: session.pendingBlocker.method,\n message: session.pendingBlocker.message,\n }\n : null,\n cost: session.cost,\n durationMs,\n });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_result — get accumulated session result\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_result',\n 'Get the result of a GSD session. Returns partial results if the session is still running.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n const result = sessionManager.getResult(sessionId);\n return jsonContent(result);\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_cancel — cancel a running session\n //\n // Supports two lookup strategies:\n // 1. sessionId — the ID returned from gsd_execute (primary)\n // 2. projectDir — absolute path to the project directory (fallback)\n //\n // The projectDir fallback handles interactive sessions (started via\n // `/gsd auto` in the terminal) and post-restart MCP sessions that were\n // never registered with a sessionId in this server instance.\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_cancel',\n 'Cancel a running GSD session. Aborts the current operation and stops the process. Provide sessionId (from gsd_execute) or projectDir as a fallback for interactive/restarted sessions.',\n {\n sessionId: z.string().optional().describe('Session ID returned from gsd_execute'),\n projectDir: z.string().optional().describe('Absolute path to the project directory (fallback when sessionId is unavailable)'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId, projectDir } = args as { sessionId?: string; projectDir?: string };\n try {\n if (!sessionId && !projectDir) {\n return errorContent('Either sessionId or projectDir must be provided');\n }\n if (sessionId) {\n try {\n await sessionManager.cancelSession(sessionId);\n } catch (err) {\n if (!projectDir || !(err instanceof Error) || !err.message.includes('Session not found')) {\n throw err;\n }\n await sessionManager.cancelSessionByDir(projectDir);\n }\n } else if (projectDir) {\n await sessionManager.cancelSessionByDir(projectDir);\n }\n return jsonContent({ cancelled: true });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_query — read project state from filesystem (no session needed).\n //\n // `query` is optional: when omitted the tool returns all fields (STATE.md,\n // PROJECT.md, requirements, milestone listing). Accepted narrow values:\n // \"state\" / \"status\", \"project\", \"requirements\", \"milestones\", \"all\".\n // Unknown values fall back to \"all\" for forward-compatibility.\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_query',\n 'Query GSD project state from the filesystem. By default returns STATE.md, PROJECT.md, requirements, and milestone listing. Pass `query` to narrow the response (accepted: \"state\"/\"status\", \"project\", \"requirements\", \"milestones\", \"all\"). Does not require an active session.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n query: z\n .enum(['all', 'state', 'status', 'project', 'requirements', 'milestones'])\n .optional()\n .describe('Narrow the response to a single field (default: \"all\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, query } = args as { projectDir: string; query?: string };\n try {\n const validated = validateProjectDir(projectDir);\n const state = await readProjectState(validated, query);\n return jsonContent(state);\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_resolve_blocker — resolve a pending blocker\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_resolve_blocker',\n 'Resolve a pending blocker in a GSD session by sending a response to the UI request.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n response: z.string().describe('Response to send for the pending blocker'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId, response } = args as { sessionId: string; response: string };\n try {\n await sessionManager.resolveBlocker(sessionId, response);\n return jsonContent({ resolved: true });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // ask_user_questions — structured user input via MCP form elicitation\n // -----------------------------------------------------------------------\n server.tool(\n 'ask_user_questions',\n 'Request user input for one to three short questions and wait for the response. Single-select questions include a free-form \"None of the above\" path. Multi-select questions allow multiple choices.',\n {\n questions: z.array(z.object({\n id: z.string().describe('Stable identifier for mapping answers (snake_case)'),\n header: z.string().describe('Short header label shown in the UI (12 or fewer chars)'),\n question: z.string().describe('Single-sentence prompt shown to the user'),\n options: z.array(z.object({\n label: z.string().describe('User-facing label (1-5 words)'),\n description: z.string().describe('One short sentence explaining impact/tradeoff if selected'),\n })).describe('Provide 2-3 mutually exclusive choices. Put the recommended option first and suffix its label with \"(Recommended)\". Do not include an \"Other\" option for single-select questions.'),\n allowMultiple: z.boolean().optional().describe('If true, the user can select multiple options. No \"None of the above\" option is added.'),\n })).describe('Questions to show the user. Prefer 1 and do not exceed 3.'),\n },\n async (args: Record<string, unknown>, extra?: McpToolExtra) => {\n const { questions } = args as unknown as AskUserQuestionsParams;\n return askUserQuestionsHandler(questions, extra, {\n elicitInput: (params) => server.server.elicitInput(params),\n isRemoteConfigured,\n tryRemoteQuestions,\n });\n },\n );\n\n // -----------------------------------------------------------------------\n // secure_env_collect — collect secrets via MCP form elicitation\n // -----------------------------------------------------------------------\n server.tool(\n 'secure_env_collect',\n 'Collect environment variables securely via form input. Values are written directly to .env (or Vercel/Convex) and NEVER appear in tool output — only key names and applied/skipped status are returned. Use this instead of asking users to manually edit .env files or paste secrets into chat.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n keys: z.array(z.object({\n key: z.string().describe('Env var name, e.g. OPENAI_API_KEY'),\n hint: z.string().optional().describe('Format hint shown to user, e.g. \"starts with sk-\"'),\n guidance: z.array(z.string()).optional().describe('Step-by-step instructions for obtaining this key'),\n })).min(1).describe('Environment variables to collect'),\n destination: z.enum(['dotenv', 'vercel', 'convex']).optional().describe('Where to write secrets. Auto-detected from project files if omitted.'),\n envFilePath: z.string().optional().describe('Path to .env file (dotenv only). Defaults to .env in projectDir.'),\n environment: z.enum(['development', 'preview', 'production']).optional().describe('Target environment (vercel/convex only)'),\n },\n async (args: Record<string, unknown>) =>\n secureEnvCollectHandler(args, (params) =>\n server.server.elicitInput(params as ElicitRequestFormParams),\n ),\n );\n\n // =======================================================================\n // READ-ONLY TOOLS — no session required, pure filesystem reads\n // =======================================================================\n\n // -----------------------------------------------------------------------\n // gsd_progress — structured project progress metrics\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_progress',\n 'Get structured project progress: active milestone/slice/task, phase, completion counts, blockers, and next action. No session required — reads directly from .gsd/ on disk.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir } = args as { projectDir: string };\n try {\n return jsonContent(readProgress(validateProjectDir(projectDir)));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_roadmap — milestone/slice/task structure with status\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_roadmap',\n 'Get the full project roadmap structure: milestones with their slices, tasks, status, risk, and dependencies. Optionally filter to a single milestone. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n milestoneId: z.string().optional().describe('Filter to a specific milestone (e.g. \"M001\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, milestoneId } = args as { projectDir: string; milestoneId?: string };\n try {\n return jsonContent(readRoadmap(validateProjectDir(projectDir), milestoneId));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_history — execution history with cost/token metrics\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_history',\n 'Get execution history with cost, token usage, model, and duration per unit. Returns totals across all units. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n limit: z.number().optional().describe('Max entries to return (most recent first). Default: all.'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, limit } = args as { projectDir: string; limit?: number };\n try {\n return jsonContent(readHistory(validateProjectDir(projectDir), limit));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_doctor — lightweight structural health check\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_doctor',\n 'Run a lightweight structural health check on the .gsd/ directory. Checks for missing files, status inconsistencies, and orphaned state. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n scope: z.string().optional().describe('Limit checks to a specific milestone (e.g. \"M001\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, scope } = args as { projectDir: string; scope?: string };\n try {\n return jsonContent(runDoctorLite(validateProjectDir(projectDir), scope));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_captures — pending captures and ideas\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_captures',\n 'Get captured ideas and thoughts from CAPTURES.md with triage status. Filter by pending, actionable, or all. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n filter: z.enum(['all', 'pending', 'actionable']).optional().describe('Filter captures (default: \"all\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, filter } = args as { projectDir: string; filter?: 'all' | 'pending' | 'actionable' };\n try {\n return jsonContent(readCaptures(validateProjectDir(projectDir), filter ?? 'all'));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_knowledge — project knowledge base\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_knowledge',\n 'Get the project knowledge base: rules, patterns, and lessons learned accumulated during development. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir } = args as { projectDir: string };\n try {\n return jsonContent(readKnowledge(validateProjectDir(projectDir)));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_graph — knowledge graph for GSD projects\n //\n // Modes:\n // build Parse .gsd/ artifacts and write graph.json atomically.\n // query Search the graph for nodes matching a term (BFS, budget-trimmed).\n // status Check whether graph.json exists and whether it is stale (>24h).\n // diff Compare graph.json with the last build snapshot.\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_graph',\n [\n 'Manage the GSD project knowledge graph. No session required.',\n '',\n 'Modes:',\n ' build Parse .gsd/ artifacts (STATE.md, milestone ROADMAPs, slice PLANs,',\n ' KNOWLEDGE.md) and write .gsd/graphs/graph.json atomically.',\n ' query Search graph nodes by term (BFS from seed matches, budget-trimmed).',\n ' Returns matching nodes and reachable edges within the token budget.',\n ' status Show whether graph.json exists, its age, node/edge counts, and',\n ' whether it is stale (built more than 24 hours ago).',\n ' diff Compare current graph.json with .last-build-snapshot.json.',\n ' Returns added, removed, and changed nodes and edges.',\n ].join('\\n'),\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n mode: z.enum(['build', 'query', 'status', 'diff']).describe(\n 'Operation: build | query | status | diff',\n ),\n term: z.string().optional().describe('Search term for query mode (case-insensitive)'),\n budget: z.number().optional().describe('Token budget for query mode (default: 4000)'),\n snapshot: z.boolean().optional().describe('Write snapshot before build (for future diff)'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir: rawProjectDir, mode, term, budget, snapshot } = args as {\n projectDir: string;\n mode: 'build' | 'query' | 'status' | 'diff';\n term?: string;\n budget?: number;\n snapshot?: boolean;\n };\n\n try {\n const projectDir = validateProjectDir(rawProjectDir);\n const gsdRoot = resolveGsdRoot(projectDir);\n\n switch (mode) {\n case 'build': {\n if (snapshot) {\n await writeSnapshot(gsdRoot).catch(() => { /* best-effort */ });\n }\n const graph = await buildGraph(projectDir);\n await writeGraph(gsdRoot, graph);\n return jsonContent({\n built: true,\n nodeCount: graph.nodes.length,\n edgeCount: graph.edges.length,\n builtAt: graph.builtAt,\n });\n }\n\n case 'query': {\n const result = await graphQuery(projectDir, term ?? '', budget);\n return jsonContent(result);\n }\n\n case 'status': {\n const result = await graphStatus(projectDir);\n return jsonContent(result);\n }\n\n case 'diff': {\n const result = await graphDiff(projectDir);\n return jsonContent(result);\n }\n }\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n registerWorkflowTools(server);\n\n return { server };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Server — registers GSD orchestration, project-state, and workflow tools.\n *\n * Session tools (6): gsd_execute, gsd_status, gsd_result, gsd_cancel, gsd_query, gsd_resolve_blocker\n * Interactive tools (2): ask_user_questions, secure_env_collect via MCP form elicitation\n * Read-only tools (6): gsd_progress, gsd_roadmap, gsd_history, gsd_doctor, gsd_captures, gsd_knowledge\n * Workflow tools (29): headless-safe planning, metadata persistence, replanning, completion, validation, reassessment, gate result, status, and journal tools\n *\n * Uses dynamic imports for @modelcontextprotocol/sdk because TS Node16\n * cannot resolve the SDK's subpath exports statically (same pattern as\n * src/mcp-server.ts in the main package).\n */\n\nimport { readFile, readdir } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport { z } from 'zod';\nimport type { SessionManager } from './session-manager.js';\nimport { isRemoteConfigured, tryRemoteQuestions } from './remote-questions.js';\nimport type { RemoteToolResult } from './remote-questions.js';\nimport { readProgress } from './readers/state.js';\nimport { readRoadmap } from './readers/roadmap.js';\nimport { readHistory } from './readers/metrics.js';\nimport { readCaptures } from './readers/captures.js';\nimport { readKnowledge } from './readers/knowledge.js';\nimport { buildGraph, writeGraph, writeSnapshot, graphStatus, graphQuery, graphDiff } from './readers/graph.js';\nimport { resolveGsdRoot, resolveMilestoneFile } from './readers/paths.js';\nimport { runDoctorLite } from './readers/doctor-lite.js';\nimport { registerWorkflowTools, validateProjectDir } from './workflow-tools.js';\nimport { applySecrets, checkExistingEnvKeys, detectDestination, resolveProjectEnvFilePath } from './env-writer.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MCP_PKG = '@modelcontextprotocol/sdk';\nconst SERVER_NAME = 'gsd';\n\n/**\n * Read the version from this package's package.json so the MCP handshake\n * always advertises the deployed artifact's version. Falls back to '0.0.0'\n * if package.json can't be located (e.g. unusual bundling); the fallback\n * is loud-ish but won't crash the server.\n */\nconst SERVER_VERSION: string = (() => {\n try {\n const require = createRequire(import.meta.url);\n const pkg = require('../package.json') as { version?: unknown };\n if (typeof pkg.version === 'string' && pkg.version.length > 0) return pkg.version;\n } catch { /* fall through */ }\n return '0.0.0';\n})();\n\n/** User-interaction timeout — generous but bounded so elicitation can't hang indefinitely (#4586). */\nconst ELICIT_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes\n\n/**\n * Default child-process runner used by secure_env_collect to push secrets\n * into `vercel env add` / `npx convex env set`. Previously `applySecrets`\n * was called without an `execFn`, so vercel/convex destinations silently\n * dropped every collected key. This restores the write path.\n */\nfunction defaultExecFn(\n cmd: string,\n args: string[],\n opts?: { stdin?: string },\n): Promise<{ code: number; stderr: string }> {\n return new Promise((res) => {\n // stdin: pipe only when a caller explicitly supplies input; otherwise\n // ignore it to avoid hanging if the child ever prompts interactively.\n // stdout: ignore — consumer only cares about stderr + exit code, and an\n // un-drained pipe deadlocks once the kernel buffer (~64KB) fills.\n // stderr: pipe — captured below for error surfacing.\n const child = spawn(resolveShellCommand(cmd), args, {\n shell: process.platform === 'win32',\n stdio: [opts?.stdin === undefined ? 'ignore' : 'pipe', 'ignore', 'pipe'],\n windowsHide: true,\n });\n let stderr = '';\n child.stdin?.on('error', () => {\n // Child exited before consuming stdin; close/error handling below will\n // surface the real process result.\n });\n if (opts?.stdin !== undefined) {\n child.stdin?.end(opts.stdin, 'utf8');\n }\n child.stderr?.on('data', (chunk) => {\n stderr += chunk.toString('utf8');\n });\n child.on('error', (err) => res({ code: 1, stderr: err.message }));\n child.on('close', (code) => res({ code: code ?? 1, stderr }));\n });\n}\n\nfunction resolveShellCommand(cmd: string): string {\n if (process.platform !== 'win32') return cmd;\n if (cmd === 'vercel') return 'vercel.cmd';\n if (cmd === 'npx') return 'npx.cmd';\n return cmd;\n}\n\n/**\n * Race a promise against a timeout. Rejects with a typed error on timeout so\n * callers can return a specific MCP error response rather than hanging.\n * If a parent AbortSignal is provided, an abort also rejects the race so\n * client-side cancellation propagates instead of being absorbed by the\n * 10-minute elicitation hold.\n *\n * @param timeoutMs - override for testing; defaults to ELICIT_TIMEOUT_MS\n */\nexport async function withElicitTimeout<T>(\n promise: Promise<T>,\n label: string,\n timeoutMs = ELICIT_TIMEOUT_MS,\n signal?: AbortSignal,\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const racers: Promise<T>[] = [promise];\n racers.push(\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`${label} timed out after ${timeoutMs / 60000} minutes — no user response received`)),\n timeoutMs,\n );\n }),\n );\n let abortListener: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) {\n clearTimeout(timer);\n throw new Error(`${label} cancelled by client`);\n }\n racers.push(\n new Promise<never>((_, reject) => {\n abortListener = () => reject(new Error(`${label} cancelled by client`));\n signal.addEventListener('abort', abortListener, { once: true });\n }),\n );\n }\n try {\n return await Promise.race(racers);\n } finally {\n clearTimeout(timer);\n if (signal && abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tool result helpers\n// ---------------------------------------------------------------------------\n\n/** Wrap a JSON-serializable value as MCP tool content. */\nfunction jsonContent(data: unknown): { content: Array<{ type: 'text'; text: string }> } {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] };\n}\n\n/** Return an MCP error response. */\nfunction errorContent(message: string): { isError: true; content: Array<{ type: 'text'; text: string }> } {\n return { isError: true, content: [{ type: 'text' as const, text: message }] };\n}\n\n/** Return raw text content without JSON wrapping. */\nfunction textContent(text: string): { content: Array<{ type: 'text'; text: string }> } {\n return { content: [{ type: 'text' as const, text }] };\n}\n\n// ---------------------------------------------------------------------------\n// gsd_query filesystem reader\n// ---------------------------------------------------------------------------\n\n/**\n * Normalized query categories for {@link readProjectState}.\n *\n * Maps user-supplied query strings (or empty) to the set of fields we return.\n * Accepts common synonyms so the MCP client can pass intuitive values.\n */\nconst QUERY_FIELDS = {\n all: ['state', 'project', 'requirements', 'milestones'] as const,\n state: ['state'] as const,\n status: ['state'] as const,\n project: ['project'] as const,\n requirements: ['requirements'] as const,\n milestones: ['milestones'] as const,\n} as const;\n\ntype QueryCategory = keyof typeof QUERY_FIELDS;\ntype ProjectStateField = (typeof QUERY_FIELDS)[QueryCategory][number];\n\nfunction normalizeQuery(query: string | undefined): QueryCategory {\n const key = (query ?? 'all').trim().toLowerCase();\n if (key in QUERY_FIELDS) return key as QueryCategory;\n return 'all';\n}\n\nasync function readProjectState(projectDir: string, query: string | undefined): Promise<Record<string, unknown>> {\n const gsdDir = join(resolve(projectDir), '.gsd');\n const category = normalizeQuery(query);\n const wanted = new Set<ProjectStateField>(QUERY_FIELDS[category]);\n\n const result: Record<string, unknown> = {\n projectDir: resolve(projectDir),\n query: category,\n };\n\n if (wanted.has('state')) {\n try {\n result.state = await readFile(join(gsdDir, 'STATE.md'), 'utf-8');\n } catch {\n result.state = null;\n }\n }\n\n if (wanted.has('project')) {\n try {\n result.project = await readFile(join(gsdDir, 'PROJECT.md'), 'utf-8');\n } catch {\n result.project = null;\n }\n }\n\n if (wanted.has('requirements')) {\n try {\n result.requirements = await readFile(join(gsdDir, 'REQUIREMENTS.md'), 'utf-8');\n } catch {\n result.requirements = null;\n }\n }\n\n if (wanted.has('milestones')) {\n const milestonesDir = join(gsdDir, 'milestones');\n try {\n const entries = await readdir(milestonesDir, { withFileTypes: true });\n const milestones: Array<{ id: string; hasRoadmap: boolean; hasSummary: boolean }> = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const hasRoadmap = !!resolveMilestoneFile(gsdDir, entry.name, 'ROADMAP');\n const hasSummary = !!resolveMilestoneFile(gsdDir, entry.name, 'SUMMARY');\n milestones.push({ id: entry.name, hasRoadmap, hasSummary });\n }\n result.milestones = milestones;\n } catch {\n result.milestones = [];\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// MCP Server type — minimal interface for the dynamically-imported McpServer\n// ---------------------------------------------------------------------------\n\ninterface ElicitResult {\n action: 'accept' | 'decline' | 'cancel';\n content?: Record<string, string | number | boolean | string[]>;\n}\n\ninterface ElicitRequestFormParams {\n mode?: 'form';\n message: string;\n requestedSchema: {\n type: 'object';\n properties: Record<string, Record<string, unknown>>;\n required?: string[];\n };\n}\n\n/**\n * Handler extra — the second argument passed by McpServer.tool handlers.\n * Contains an AbortSignal scoped to the JSON-RPC request (cancelled when\n * the client cancels the `tools/call`) plus other per-request metadata.\n * Tools that can actually be stopped mid-flight should honour `signal`.\n */\nexport interface McpToolExtra {\n signal?: AbortSignal;\n requestId?: string | number;\n sendNotification?: (notification: unknown) => void | Promise<void>;\n}\n\ninterface McpServerInstance {\n tool(\n name: string,\n description: string,\n params: Record<string, unknown>,\n handler: (args: Record<string, unknown>, extra?: McpToolExtra) => Promise<unknown>,\n ): unknown;\n server: {\n elicitInput(\n params: AskUserQuestionsElicitRequest | ElicitRequestFormParams,\n options?: unknown,\n ): Promise<AskUserQuestionsElicitResult>;\n };\n connect(transport: unknown): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface AskUserQuestionOption {\n label: string;\n description: string;\n}\n\ninterface AskUserQuestion {\n id: string;\n header: string;\n question: string;\n options: AskUserQuestionOption[];\n allowMultiple?: boolean;\n}\n\ninterface AskUserQuestionsParams {\n questions: AskUserQuestion[];\n}\n\ntype AskUserQuestionsContentValue = string | number | boolean | string[];\n\ninterface AskUserQuestionsElicitResult {\n action: 'accept' | 'decline' | 'cancel';\n content?: Record<string, AskUserQuestionsContentValue>;\n}\n\ninterface AskUserQuestionsElicitRequest {\n mode: 'form';\n message: string;\n requestedSchema: {\n type: 'object';\n properties: Record<string, Record<string, unknown>>;\n required?: string[];\n };\n}\n\n/**\n * Structured payload mirrored to the MCP `structuredContent` field on\n * `ask_user_questions` results. Mirrors the `LocalResultDetails` shape that\n * src/resources/extensions/ask-user-questions.ts already produces, so the\n * GSD discussion-gate hook in register-hooks.ts can treat the MCP path\n * identically to the in-process extension path. Without this, the bridge\n * surfaces `details = undefined` and the gate hook's\n * `if (details?.cancelled || !details?.response)` branch HARD-BLOCKs every\n * user answer, including successful confirmations. See #5267.\n */\ninterface AskUserQuestionsRoundResultAnswer {\n selected: string | string[];\n notes: string;\n}\n\ninterface AskUserQuestionsRoundResult {\n endInterview: false;\n answers: Record<string, AskUserQuestionsRoundResultAnswer>;\n}\n\ninterface AskUserQuestionsStructuredContent {\n questions: AskUserQuestion[];\n response: AskUserQuestionsRoundResult | null;\n cancelled: boolean;\n}\n\ninterface AskUserQuestionsWriteGateModule {\n isGateQuestionId(questionId: string): boolean;\n isDepthConfirmationAnswer(selected: unknown, options?: Array<{ label?: string }>): boolean;\n setPendingGate(gateId: string, basePath: string): void;\n markApprovalGateVerified(gateId?: string | null, basePath?: string): void;\n markDepthVerified(milestoneId?: string | null, basePath?: string): void;\n clearPendingGate(basePath: string): void;\n extractDepthVerificationMilestoneId(questionId: string): string | null;\n}\n\nconst OTHER_OPTION_LABEL = 'None of the above';\n\nfunction normalizeAskUserQuestionsNote(value: AskUserQuestionsContentValue | undefined): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction normalizeAskUserQuestionsAnswers(\n value: AskUserQuestionsContentValue | undefined,\n allowMultiple: boolean,\n): string[] {\n if (allowMultiple) {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [];\n }\n\n return typeof value === 'string' && value.length > 0 ? [value] : [];\n}\n\nfunction validateAskUserQuestionsPayload(questions: AskUserQuestion[]): string | null {\n if (questions.length === 0 || questions.length > 3) {\n return 'Error: questions must contain 1-3 items';\n }\n\n for (const question of questions) {\n if (!question.options || question.options.length === 0) {\n return `Error: ask_user_questions requires non-empty options for every question (question \"${question.id}\" has none)`;\n }\n }\n\n return null;\n}\n\nexport function buildAskUserQuestionsElicitRequest(questions: AskUserQuestion[]): AskUserQuestionsElicitRequest {\n const properties: Record<string, Record<string, unknown>> = {};\n const required = questions.map((question) => question.id);\n\n for (const question of questions) {\n if (question.allowMultiple) {\n properties[question.id] = {\n type: 'array',\n title: question.header,\n description: question.question,\n minItems: 1,\n maxItems: question.options.length,\n items: {\n anyOf: question.options.map((option) => ({\n const: option.label,\n title: option.label,\n })),\n },\n };\n continue;\n }\n\n properties[question.id] = {\n type: 'string',\n title: question.header,\n description: question.question,\n oneOf: [...question.options, { label: OTHER_OPTION_LABEL, description: 'Choose this when the listed options do not fit.' }].map((option) => ({\n const: option.label,\n title: option.label,\n })),\n };\n\n properties[`${question.id}__note`] = {\n type: 'string',\n title: `${question.header} Note`,\n description: `Optional note for \"${OTHER_OPTION_LABEL}\".`,\n maxLength: 500,\n };\n }\n\n return {\n mode: 'form',\n message: 'Please answer the following question(s). For single-select questions, choose \"None of the above\" and add a note if the provided options do not fit.',\n requestedSchema: {\n type: 'object',\n properties,\n required,\n },\n };\n}\n\nexport function formatAskUserQuestionsElicitResult(\n questions: AskUserQuestion[],\n result: AskUserQuestionsElicitResult,\n): string {\n const answers: Record<string, { answers: string[] }> = {};\n const content = result.content ?? {};\n\n for (const question of questions) {\n const answerList = normalizeAskUserQuestionsAnswers(content[question.id], !!question.allowMultiple);\n\n if (!question.allowMultiple && answerList[0] === OTHER_OPTION_LABEL) {\n const note = normalizeAskUserQuestionsNote(content[`${question.id}__note`]);\n if (note) {\n answerList.push(`user_note: ${note}`);\n }\n }\n\n answers[question.id] = { answers: answerList };\n }\n\n return JSON.stringify({ answers });\n}\n\n/**\n * Normalize an MCP elicitation form result into the `RoundResult` shape the\n * GSD discussion-gate hook reads from `tool_result` `details.response`. The\n * elicitation `content` map carries `{ [id]: label, [id]__note?: string }`;\n * the hook expects `{ answers: { [id]: { selected, notes } } }`. Mirrored into\n * `structuredContent` by `askUserQuestionsHandler`. See #5267.\n */\nexport function buildAskUserQuestionsRoundResult(\n questions: AskUserQuestion[],\n result: AskUserQuestionsElicitResult,\n): AskUserQuestionsRoundResult {\n const answers: Record<string, AskUserQuestionsRoundResultAnswer> = {};\n const content = result.content ?? {};\n\n for (const question of questions) {\n if (question.allowMultiple) {\n const list = normalizeAskUserQuestionsAnswers(content[question.id], true);\n answers[question.id] = { selected: list, notes: '' };\n continue;\n }\n\n const list = normalizeAskUserQuestionsAnswers(content[question.id], false);\n const selected = list[0] ?? '';\n const notes = selected === OTHER_OPTION_LABEL\n ? normalizeAskUserQuestionsNote(content[`${question.id}__note`])\n : '';\n answers[question.id] = { selected, notes };\n }\n\n // `endInterview: false` mirrors the local extension's `RoundResult` shape and\n // matches the remote path's `toRoundResultResponse` so register-hooks reads\n // identical payloads regardless of channel. See peer review #5267-Q2.\n return { endInterview: false, answers };\n}\n\ninterface AskUserQuestionsHandlerDeps {\n elicitInput(params: AskUserQuestionsElicitRequest): Promise<AskUserQuestionsElicitResult>;\n isRemoteConfigured(): boolean;\n tryRemoteQuestions(questions: AskUserQuestion[], signal?: AbortSignal): Promise<RemoteToolResult | null>;\n writeGate?: AskUserQuestionsWriteGateModule | null;\n writeGateBasePath?: string;\n}\n\nlet askUserQuestionsWriteGateModulePromise: Promise<AskUserQuestionsWriteGateModule | null> | null = null;\n\nfunction isAskUserQuestionsWriteGateModule(value: unknown): value is AskUserQuestionsWriteGateModule {\n if (!value || typeof value !== 'object') return false;\n const module = value as Record<string, unknown>;\n return (\n typeof module['isGateQuestionId'] === 'function' &&\n typeof module['isDepthConfirmationAnswer'] === 'function' &&\n typeof module['setPendingGate'] === 'function' &&\n typeof module['markApprovalGateVerified'] === 'function' &&\n typeof module['markDepthVerified'] === 'function' &&\n typeof module['clearPendingGate'] === 'function' &&\n typeof module['extractDepthVerificationMilestoneId'] === 'function'\n );\n}\n\nasync function loadAskUserQuestionsWriteGateModule(): Promise<AskUserQuestionsWriteGateModule | null> {\n if (!askUserQuestionsWriteGateModulePromise) {\n askUserQuestionsWriteGateModulePromise = (async () => {\n const modulePath = process.env.GSD_WORKFLOW_WRITE_GATE_MODULE?.trim();\n if (!modulePath) return null;\n try {\n if (/^[a-z]{2,}:/i.test(modulePath) && !modulePath.startsWith('file:')) {\n throw new Error('GSD_WORKFLOW_WRITE_GATE_MODULE only supports file: URLs or filesystem paths.');\n }\n const baseRoot = process.env.GSD_WORKFLOW_PROJECT_ROOT?.trim() || process.cwd();\n const specifier = modulePath.startsWith('file:') ? modulePath : pathToFileURL(resolve(baseRoot, modulePath)).href;\n const loaded = await import(specifier);\n return isAskUserQuestionsWriteGateModule(loaded) ? loaded : null;\n } catch (err) {\n console.warn(`[gsd:mcp] ask_user_questions write-gate integration unavailable: ${formatErrorMessage(err)}`);\n return null;\n }\n })();\n }\n return askUserQuestionsWriteGateModulePromise;\n}\n\nfunction askUserQuestionsWriteGateBasePath(deps: AskUserQuestionsHandlerDeps): string {\n return deps.writeGateBasePath ?? process.env.GSD_WORKFLOW_PROJECT_ROOT?.trim() ?? process.cwd();\n}\n\nasync function resolveAskUserQuestionsWriteGate(deps: AskUserQuestionsHandlerDeps): Promise<AskUserQuestionsWriteGateModule | null> {\n if (deps.writeGate !== undefined) return deps.writeGate;\n return loadAskUserQuestionsWriteGateModule();\n}\n\nasync function recordAskUserQuestionsPendingGate(\n questions: AskUserQuestion[],\n deps: AskUserQuestionsHandlerDeps,\n): Promise<void> {\n const writeGate = await resolveAskUserQuestionsWriteGate(deps);\n if (!writeGate) return;\n\n const basePath = askUserQuestionsWriteGateBasePath(deps);\n for (const question of questions) {\n if (writeGate.isGateQuestionId(question.id)) {\n writeGate.setPendingGate(question.id, basePath);\n }\n }\n}\n\nasync function recordAskUserQuestionsGateResult(\n structured: AskUserQuestionsStructuredContent,\n deps: AskUserQuestionsHandlerDeps,\n): Promise<void> {\n if (structured.cancelled || !structured.response) return;\n const writeGate = await resolveAskUserQuestionsWriteGate(deps);\n if (!writeGate) return;\n\n const basePath = askUserQuestionsWriteGateBasePath(deps);\n for (const question of structured.questions) {\n if (!writeGate.isGateQuestionId(question.id)) continue;\n const selected = structured.response.answers[question.id]?.selected;\n if (!writeGate.isDepthConfirmationAnswer(selected, question.options)) continue;\n\n writeGate.markApprovalGateVerified(question.id, basePath);\n writeGate.markDepthVerified(writeGate.extractDepthVerificationMilestoneId(question.id), basePath);\n writeGate.clearPendingGate(basePath);\n }\n}\n\nfunction isLocalElicitFallbackError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const message = err.message.toLowerCase();\n return (\n message.includes('timed out after') ||\n message.includes('elicit') ||\n message.includes('elicitation') ||\n message.includes('host') ||\n message.includes('not supported') ||\n message.includes('method not found') ||\n message.includes('-32601')\n );\n}\n\nfunction formatErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/**\n * Defensive guard for the `details.response` payload from `tryRemoteQuestions`.\n * Accepts only an object with a plain `answers` map; anything else (null,\n * stringified JSON, missing) falls back to `null` so the gate hook routes\n * the cancel branch instead of crashing on `details.response.answers[id]`.\n */\nfunction isRoundResultLike(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false;\n const answers = (value as Record<string, unknown>)['answers'];\n return !!answers && typeof answers === 'object' && !Array.isArray(answers);\n}\n\nexport async function askUserQuestionsHandler(\n questions: AskUserQuestion[],\n extra: McpToolExtra | undefined,\n deps: AskUserQuestionsHandlerDeps,\n): Promise<ToolContent> {\n try {\n const validationError = validateAskUserQuestionsPayload(questions);\n if (validationError) return errorContent(validationError);\n await recordAskUserQuestionsPendingGate(questions, deps);\n\n // Local-first: try the MCP host's elicitation channel (Claude Code,\n // Cursor, etc.) before any configured remote channel. A misconfigured\n // remote (e.g. expired Discord token returning 401) must not block the\n // depth-verification gate when the user is sitting in front of the host.\n let localElicitError: unknown;\n try {\n const elicitation = await withElicitTimeout(\n deps.elicitInput(buildAskUserQuestionsElicitRequest(questions)),\n 'ask_user_questions',\n );\n if (elicitation.action === 'accept' && elicitation.content) {\n const structured: AskUserQuestionsStructuredContent = {\n questions,\n response: buildAskUserQuestionsRoundResult(questions, elicitation),\n cancelled: false,\n };\n await recordAskUserQuestionsGateResult(structured, deps);\n return {\n content: [{ type: 'text' as const, text: formatAskUserQuestionsElicitResult(questions, elicitation) }],\n structuredContent: structured as unknown as Record<string, unknown>,\n };\n }\n } catch (err) {\n if (!isLocalElicitFallbackError(err)) throw err;\n localElicitError = err;\n console.warn(`[gsd:mcp] ask_user_questions local elicitation unavailable; trying remote fallback: ${formatErrorMessage(err)}`);\n }\n\n // Local cancelled / unavailable — fall back to the configured remote\n // channel (Discord, Slack, Telegram) if one is set.\n if (deps.isRemoteConfigured()) {\n let remoteResult: RemoteToolResult | null;\n try {\n remoteResult = await deps.tryRemoteQuestions(questions, extra?.signal);\n } catch (err) {\n if (localElicitError) {\n throw new Error(\n `Local elicitation failed (${formatErrorMessage(localElicitError)}); remote fallback failed (${formatErrorMessage(err)})`,\n );\n }\n throw err;\n }\n if (remoteResult) {\n const details = remoteResult.details as Record<string, unknown> | undefined;\n if (details?.['timed_out'] || details?.['error']) {\n // Mirror the timeout/error into structuredContent so the gate hook's\n // `details?.cancelled || !details?.response` branch fires correctly\n // (gate stays pending, model re-asks) instead of silently dropping\n // because no `details` made it across the MCP wire. See #5267.\n const failedStructured: AskUserQuestionsStructuredContent = {\n questions,\n response: null,\n cancelled: true,\n };\n return {\n content: [{ type: 'text' as const, text: remoteResult.content[0]?.text ?? 'Remote questions timed out or failed' }],\n structuredContent: failedStructured as unknown as Record<string, unknown>,\n };\n }\n // Successful remote answer — surface the normalized RoundResult that\n // remote-questions.ts attached to `details.response` so the gate hook\n // sees `details.response.answers[id].selected` on this path too.\n // A malformed `response` (failing isRoundResultLike) is reported as\n // an explicit cancellation rather than a silent `cancelled: false`\n // with `response: null` — the latter would lie to any consumer that\n // reads `structuredContent.cancelled` independently of `.response`.\n const hasValidResponse = isRoundResultLike(details?.['response']);\n const acceptedStructured: AskUserQuestionsStructuredContent = hasValidResponse\n ? {\n questions,\n response: details!['response'] as AskUserQuestionsRoundResult,\n cancelled: false,\n }\n : {\n questions,\n response: null,\n cancelled: true,\n };\n await recordAskUserQuestionsGateResult(acceptedStructured, deps);\n return {\n content: [{ type: 'text' as const, text: remoteResult.content[0]?.text ?? '' }],\n structuredContent: acceptedStructured as unknown as Record<string, unknown>,\n };\n }\n }\n\n if (localElicitError) throw localElicitError;\n\n const cancelledStructured: AskUserQuestionsStructuredContent = {\n questions,\n response: null,\n cancelled: true,\n };\n return {\n content: [{ type: 'text' as const, text: 'ask_user_questions was cancelled before receiving a response' }],\n structuredContent: cancelledStructured as unknown as Record<string, unknown>,\n };\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n}\n\n// ---------------------------------------------------------------------------\n// secure_env_collect handler (extracted so tests can drive it directly)\n// ---------------------------------------------------------------------------\n\nexport type ElicitInputFn = (params: {\n message: string;\n requestedSchema: { type: 'object'; properties: Record<string, unknown>; required: string[] };\n}) => Promise<{ action: 'accept' | 'cancel' | 'decline'; content?: Record<string, unknown> }>;\n\ntype ToolContent =\n | { content: Array<{ type: 'text'; text: string }>; structuredContent?: Record<string, unknown> }\n | { isError: true; content: Array<{ type: 'text'; text: string }>; structuredContent?: Record<string, unknown> };\n\nexport async function secureEnvCollectHandler(\n args: Record<string, unknown>,\n elicitInput: ElicitInputFn,\n): Promise<ToolContent> {\n const { projectDir, keys, destination, envFilePath, environment } = args as {\n projectDir: string;\n keys: Array<{ key: string; hint?: string; guidance?: string[] }>;\n destination?: 'dotenv' | 'vercel' | 'convex';\n envFilePath?: string;\n environment?: 'development' | 'preview' | 'production';\n };\n\n try {\n const resolvedProjectDir = validateProjectDir(projectDir);\n const resolvedEnvPath = resolveProjectEnvFilePath(resolvedProjectDir, envFilePath ?? '.env');\n\n // (1) Check which keys already exist\n const allKeyNames = keys.map((k) => k.key);\n const existingKeys = await checkExistingEnvKeys(allKeyNames, resolvedEnvPath);\n const existingSet = new Set(existingKeys);\n const pendingKeys = keys.filter((k) => !existingSet.has(k.key));\n\n // If all keys already exist, return immediately\n if (pendingKeys.length === 0) {\n const lines = existingKeys.map((k) => `• ${k}: already set`);\n return textContent(`All ${existingKeys.length} key(s) already set.\\n${lines.join('\\n')}`);\n }\n\n // (2) Build elicitation form — one string field per pending key\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n\n for (const item of pendingKeys) {\n const descParts: string[] = [];\n if (item.hint) descParts.push(`Format: ${item.hint}`);\n if (item.guidance && item.guidance.length > 0) {\n descParts.push('How to get this:');\n item.guidance.forEach((step, i) => descParts.push(`${i + 1}. ${step}`));\n }\n descParts.push('Leave empty to skip.');\n\n properties[item.key] = {\n type: 'string',\n title: item.key,\n description: descParts.join('\\n'),\n };\n // Don't mark as required — empty string = skip\n }\n\n // (3) Elicit input from the MCP client\n const elicitation = await withElicitTimeout(\n elicitInput({\n message: `Enter values for ${pendingKeys.length} environment variable(s). Values are written directly to the project and never shown to the AI.`,\n requestedSchema: {\n type: 'object',\n properties,\n required,\n },\n }),\n 'secure_env_collect',\n );\n\n if (elicitation.action !== 'accept' || !elicitation.content) {\n return textContent('secure_env_collect was cancelled by user.');\n }\n\n // (4) Separate provided vs skipped from form response\n const provided: Array<{ key: string; value: string }> = [];\n const skipped: string[] = [];\n\n for (const item of pendingKeys) {\n const raw = elicitation.content[item.key];\n const value = typeof raw === 'string' ? raw.trim() : '';\n if (value.length > 0) {\n provided.push({ key: item.key, value });\n } else {\n skipped.push(item.key);\n }\n }\n\n // (5) Auto-detect destination if not specified\n const resolvedDestination = destination ?? detectDestination(resolvedProjectDir);\n\n // (6) Write secrets to destination\n const { applied, errors } = await applySecrets(provided, resolvedDestination, {\n envFilePath: resolvedEnvPath,\n environment,\n execFn: defaultExecFn,\n });\n\n // (7) Build result — NEVER include secret values\n const lines: string[] = [\n `destination: ${resolvedDestination}${!destination ? ' (auto-detected)' : ''}${environment ? ` (${environment})` : ''}`,\n ];\n for (const k of applied) lines.push(`✓ ${k}: applied`);\n for (const k of skipped) lines.push(`• ${k}: skipped`);\n for (const k of existingKeys) lines.push(`• ${k}: already set`);\n for (const e of errors) lines.push(`✗ ${e}`);\n\n return errors.length > 0 && applied.length === 0\n ? errorContent(lines.join('\\n'))\n : textContent(lines.join('\\n'));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n}\n\n// ---------------------------------------------------------------------------\n// createMcpServer\n// ---------------------------------------------------------------------------\n\n/**\n * Create and configure an MCP server with session, read-only, and workflow tools.\n *\n * Returns the McpServer instance — call `connect(transport)` to start serving.\n * Uses dynamic imports for the MCP SDK to avoid TS subpath resolution issues.\n */\nexport async function createMcpServer(\n sessionManager: SessionManager,\n): Promise<{\n server: McpServerInstance;\n}> {\n // Dynamic import — same workaround as src/mcp-server.ts\n const mcpMod = await import(`${MCP_PKG}/server/mcp.js`);\n const McpServer = mcpMod.McpServer as new (\n info: { name: string; version: string },\n opts: { capabilities: Record<string, unknown> },\n ) => McpServerInstance;\n\n const server: McpServerInstance = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, elicitation: {} } },\n );\n\n // -----------------------------------------------------------------------\n // gsd_execute — start a new GSD auto-mode session.\n //\n // If the JSON-RPC request is aborted while the session is starting (or\n // immediately after), we cancel the session so we don't leak a background\n // RpcClient process. Once the session is running the caller should use\n // `gsd_cancel` to stop it via sessionId.\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_execute',\n 'Start a GSD auto-mode session for a project directory. Returns a sessionId for tracking.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n command: z.string().optional().describe('Command to send (default: \"/gsd auto\")'),\n model: z.string().optional().describe('Model ID override'),\n bare: z.boolean().optional().describe('Run in bare mode (skip user config)'),\n },\n async (args: Record<string, unknown>, extra?: McpToolExtra) => {\n const { projectDir, command, model, bare } = args as {\n projectDir: string; command?: string; model?: string; bare?: boolean;\n };\n try {\n const sessionId = await sessionManager.startSession(projectDir, { command, model, bare });\n\n // If the client aborted while startSession was running, cancel the\n // newly-created session rather than leaving an orphaned process.\n if (extra?.signal?.aborted) {\n await sessionManager.cancelSession(sessionId).catch(() => { /* swallow */ });\n return errorContent('gsd_execute aborted by client before returning');\n }\n\n return jsonContent({ sessionId, status: 'started' });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_status — poll session status\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_status',\n 'Get the current status of a GSD session including progress, recent events, and pending blockers.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n const session = sessionManager.getSession(sessionId);\n if (!session) return errorContent(`Session not found: ${sessionId}`);\n\n const durationMs = Date.now() - session.startTime;\n const toolCallCount = session.events.filter(\n (e) => (e as Record<string, unknown>).type === 'tool_use' ||\n (e as Record<string, unknown>).type === 'tool_execution_start'\n ).length;\n\n return jsonContent({\n status: session.status,\n progress: {\n eventCount: session.events.length,\n toolCalls: toolCallCount,\n },\n recentEvents: session.events.slice(-10),\n pendingBlocker: session.pendingBlocker\n ? {\n id: session.pendingBlocker.id,\n method: session.pendingBlocker.method,\n message: session.pendingBlocker.message,\n }\n : null,\n cost: session.cost,\n durationMs,\n });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_result — get accumulated session result\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_result',\n 'Get the result of a GSD session. Returns partial results if the session is still running.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n const result = sessionManager.getResult(sessionId);\n return jsonContent(result);\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_cancel — cancel a running session\n //\n // Supports two lookup strategies:\n // 1. sessionId — the ID returned from gsd_execute (primary)\n // 2. projectDir — absolute path to the project directory (fallback)\n //\n // The projectDir fallback handles interactive sessions (started via\n // `/gsd auto` in the terminal) and post-restart MCP sessions that were\n // never registered with a sessionId in this server instance.\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_cancel',\n 'Cancel a running GSD session. Aborts the current operation and stops the process. Provide sessionId (from gsd_execute) or projectDir as a fallback for interactive/restarted sessions.',\n {\n sessionId: z.string().optional().describe('Session ID returned from gsd_execute'),\n projectDir: z.string().optional().describe('Absolute path to the project directory (fallback when sessionId is unavailable)'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId, projectDir } = args as { sessionId?: string; projectDir?: string };\n try {\n if (!sessionId && !projectDir) {\n return errorContent('Either sessionId or projectDir must be provided');\n }\n if (sessionId) {\n try {\n await sessionManager.cancelSession(sessionId);\n } catch (err) {\n if (!projectDir || !(err instanceof Error) || !err.message.includes('Session not found')) {\n throw err;\n }\n await sessionManager.cancelSessionByDir(projectDir);\n }\n } else if (projectDir) {\n await sessionManager.cancelSessionByDir(projectDir);\n }\n return jsonContent({ cancelled: true });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_query — read project state from filesystem (no session needed).\n //\n // `query` is optional: when omitted the tool returns all fields (STATE.md,\n // PROJECT.md, requirements, milestone listing). Accepted narrow values:\n // \"state\" / \"status\", \"project\", \"requirements\", \"milestones\", \"all\".\n // Unknown values fall back to \"all\" for forward-compatibility.\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_query',\n 'Query GSD project state from the filesystem. By default returns STATE.md, PROJECT.md, requirements, and milestone listing. Pass `query` to narrow the response (accepted: \"state\"/\"status\", \"project\", \"requirements\", \"milestones\", \"all\"). Does not require an active session.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n query: z\n .enum(['all', 'state', 'status', 'project', 'requirements', 'milestones'])\n .optional()\n .describe('Narrow the response to a single field (default: \"all\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, query } = args as { projectDir: string; query?: string };\n try {\n const validated = validateProjectDir(projectDir);\n const state = await readProjectState(validated, query);\n return jsonContent(state);\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_resolve_blocker — resolve a pending blocker\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_resolve_blocker',\n 'Resolve a pending blocker in a GSD session by sending a response to the UI request.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n response: z.string().describe('Response to send for the pending blocker'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId, response } = args as { sessionId: string; response: string };\n try {\n await sessionManager.resolveBlocker(sessionId, response);\n return jsonContent({ resolved: true });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // ask_user_questions — structured user input via MCP form elicitation\n // -----------------------------------------------------------------------\n server.tool(\n 'ask_user_questions',\n 'Request user input for one to three short questions and wait for the response. Single-select questions include a free-form \"None of the above\" path. Multi-select questions allow multiple choices.',\n {\n questions: z.array(z.object({\n id: z.string().describe('Stable identifier for mapping answers (snake_case)'),\n header: z.string().describe('Short header label shown in the UI (12 or fewer chars)'),\n question: z.string().describe('Single-sentence prompt shown to the user'),\n options: z.array(z.object({\n label: z.string().describe('User-facing label (1-5 words)'),\n description: z.string().describe('One short sentence explaining impact/tradeoff if selected'),\n })).describe('Provide 2-3 mutually exclusive choices. Put the recommended option first and suffix its label with \"(Recommended)\". Do not include an \"Other\" option for single-select questions.'),\n allowMultiple: z.boolean().optional().describe('If true, the user can select multiple options. No \"None of the above\" option is added.'),\n })).describe('Questions to show the user. Prefer 1 and do not exceed 3.'),\n },\n async (args: Record<string, unknown>, extra?: McpToolExtra) => {\n const { questions } = args as unknown as AskUserQuestionsParams;\n return askUserQuestionsHandler(questions, extra, {\n elicitInput: (params) => server.server.elicitInput(params),\n isRemoteConfigured,\n tryRemoteQuestions,\n });\n },\n );\n\n // -----------------------------------------------------------------------\n // secure_env_collect — collect secrets via MCP form elicitation\n // -----------------------------------------------------------------------\n server.tool(\n 'secure_env_collect',\n 'Collect environment variables securely via form input. Values are written directly to .env (or Vercel/Convex) and NEVER appear in tool output — only key names and applied/skipped status are returned. Use this instead of asking users to manually edit .env files or paste secrets into chat.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n keys: z.array(z.object({\n key: z.string().describe('Env var name, e.g. OPENAI_API_KEY'),\n hint: z.string().optional().describe('Format hint shown to user, e.g. \"starts with sk-\"'),\n guidance: z.array(z.string()).optional().describe('Step-by-step instructions for obtaining this key'),\n })).min(1).describe('Environment variables to collect'),\n destination: z.enum(['dotenv', 'vercel', 'convex']).optional().describe('Where to write secrets. Auto-detected from project files if omitted.'),\n envFilePath: z.string().optional().describe('Path to .env file (dotenv only). Defaults to .env in projectDir.'),\n environment: z.enum(['development', 'preview', 'production']).optional().describe('Target environment (vercel/convex only)'),\n },\n async (args: Record<string, unknown>) =>\n secureEnvCollectHandler(args, (params) =>\n server.server.elicitInput(params as ElicitRequestFormParams),\n ),\n );\n\n // =======================================================================\n // READ-ONLY TOOLS — no session required, pure filesystem reads\n // =======================================================================\n\n // -----------------------------------------------------------------------\n // gsd_progress — structured project progress metrics\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_progress',\n 'Get structured project progress: active milestone/slice/task, phase, completion counts, blockers, and next action. No session required — reads directly from .gsd/ on disk.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir } = args as { projectDir: string };\n try {\n return jsonContent(readProgress(validateProjectDir(projectDir)));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_roadmap — milestone/slice/task structure with status\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_roadmap',\n 'Get the full project roadmap structure: milestones with their slices, tasks, status, risk, and dependencies. Optionally filter to a single milestone. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n milestoneId: z.string().optional().describe('Filter to a specific milestone (e.g. \"M001\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, milestoneId } = args as { projectDir: string; milestoneId?: string };\n try {\n return jsonContent(readRoadmap(validateProjectDir(projectDir), milestoneId));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_history — execution history with cost/token metrics\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_history',\n 'Get execution history with cost, token usage, model, and duration per unit. Returns totals across all units. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n limit: z.number().optional().describe('Max entries to return (most recent first). Default: all.'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, limit } = args as { projectDir: string; limit?: number };\n try {\n return jsonContent(readHistory(validateProjectDir(projectDir), limit));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_doctor — lightweight structural health check\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_doctor',\n 'Run a lightweight structural health check on the .gsd/ directory. Checks for missing files, status inconsistencies, and orphaned state. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n scope: z.string().optional().describe('Limit checks to a specific milestone (e.g. \"M001\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, scope } = args as { projectDir: string; scope?: string };\n try {\n return jsonContent(runDoctorLite(validateProjectDir(projectDir), scope));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_captures — pending captures and ideas\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_captures',\n 'Get captured ideas and thoughts from CAPTURES.md with triage status. Filter by pending, actionable, or all. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n filter: z.enum(['all', 'pending', 'actionable']).optional().describe('Filter captures (default: \"all\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, filter } = args as { projectDir: string; filter?: 'all' | 'pending' | 'actionable' };\n try {\n return jsonContent(readCaptures(validateProjectDir(projectDir), filter ?? 'all'));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_knowledge — project knowledge base\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_knowledge',\n 'Get the project knowledge base: rules, patterns, and lessons learned accumulated during development. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir } = args as { projectDir: string };\n try {\n return jsonContent(readKnowledge(validateProjectDir(projectDir)));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_graph — knowledge graph for GSD projects\n //\n // Modes:\n // build Parse .gsd/ artifacts and write graph.json atomically.\n // query Search the graph for nodes matching a term (BFS, budget-trimmed).\n // status Check whether graph.json exists and whether it is stale (>24h).\n // diff Compare graph.json with the last build snapshot.\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_graph',\n [\n 'Manage the GSD project knowledge graph. No session required.',\n '',\n 'Modes:',\n ' build Parse .gsd/ artifacts (STATE.md, milestone ROADMAPs, slice PLANs,',\n ' KNOWLEDGE.md) and write .gsd/graphs/graph.json atomically.',\n ' query Search graph nodes by term (BFS from seed matches, budget-trimmed).',\n ' Returns matching nodes and reachable edges within the token budget.',\n ' status Show whether graph.json exists, its age, node/edge counts, and',\n ' whether it is stale (built more than 24 hours ago).',\n ' diff Compare current graph.json with .last-build-snapshot.json.',\n ' Returns added, removed, and changed nodes and edges.',\n ].join('\\n'),\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n mode: z.enum(['build', 'query', 'status', 'diff']).describe(\n 'Operation: build | query | status | diff',\n ),\n term: z.string().optional().describe('Search term for query mode (case-insensitive)'),\n budget: z.number().optional().describe('Token budget for query mode (default: 4000)'),\n snapshot: z.boolean().optional().describe('Write snapshot before build (for future diff)'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir: rawProjectDir, mode, term, budget, snapshot } = args as {\n projectDir: string;\n mode: 'build' | 'query' | 'status' | 'diff';\n term?: string;\n budget?: number;\n snapshot?: boolean;\n };\n\n try {\n const projectDir = validateProjectDir(rawProjectDir);\n const gsdRoot = resolveGsdRoot(projectDir);\n\n switch (mode) {\n case 'build': {\n if (snapshot) {\n await writeSnapshot(gsdRoot).catch(() => { /* best-effort */ });\n }\n const graph = await buildGraph(projectDir);\n await writeGraph(gsdRoot, graph);\n return jsonContent({\n built: true,\n nodeCount: graph.nodes.length,\n edgeCount: graph.edges.length,\n builtAt: graph.builtAt,\n });\n }\n\n case 'query': {\n const result = await graphQuery(projectDir, term ?? '', budget);\n return jsonContent(result);\n }\n\n case 'status': {\n const result = await graphStatus(projectDir);\n return jsonContent(result);\n }\n\n case 'diff': {\n const result = await graphDiff(projectDir);\n return jsonContent(result);\n }\n }\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n registerWorkflowTools(server);\n\n return { server };\n}\n"]}
|
|
@@ -353,7 +353,7 @@ function extractBlocker(event) {
|
|
|
353
353
|
const uiEvent = event;
|
|
354
354
|
return {
|
|
355
355
|
id: String(uiEvent.id ?? ''),
|
|
356
|
-
method:
|
|
356
|
+
method: uiEvent.method,
|
|
357
357
|
message: String(uiEvent.title ?? uiEvent.message ?? ''),
|
|
358
358
|
event: uiEvent,
|
|
359
359
|
};
|