@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +3 -0
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +456 -198
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
- package/dist/resources/extensions/gsd/auto.js +56 -15
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +4 -6
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +258 -131
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +110 -6
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +12 -22
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +367 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- 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/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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/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 +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-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/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -50
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +178 -82
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +3 -0
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +537 -202
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
- package/src/resources/extensions/gsd/auto.ts +72 -17
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +4 -6
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +269 -149
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +161 -26
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +16 -22
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -58
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +442 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -15,7 +15,7 @@ import { homedir } from "node:os";
|
|
|
15
15
|
import { createRequire } from "node:module";
|
|
16
16
|
import { dirname, join } from "node:path";
|
|
17
17
|
import { ZERO_USAGE, mapUsage } from "./partial-builder.js";
|
|
18
|
-
import { attachExternalResultsToToolBlocks, buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, } from "./turn-assembler.js";
|
|
18
|
+
import { attachExternalResultsToToolBlocks, buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, shouldSuppressDuplicateToolUnavailableBlock, } from "./turn-assembler.js";
|
|
19
19
|
import { buildWorkflowMcpServers, getRequiredWorkflowToolsForAutoUnit, resolveWorkflowMcpProjectRoot, } from "../gsd/workflow-mcp.js";
|
|
20
20
|
import { resolveWorkflowQuestionToolSurface } from "../gsd/question-transport.js";
|
|
21
21
|
import { buildProjectGsdMcpServers, ensureProjectWorkflowMcpConfig } from "../gsd/mcp-project-config.js";
|
|
@@ -24,8 +24,13 @@ import { markToolStart, markToolEnd } from "../gsd/auto.js";
|
|
|
24
24
|
import { markInteractiveElicitationStart, markInteractiveElicitationEnd, } from "../gsd/auto-tool-tracking.js";
|
|
25
25
|
import { discoverBrowserMcpServerName, discoverMcpServers, discoverMcpServerNames, discoverUserMcpServerNames, discoverWorkflowMcpServerName, computeMcpDisallowedTools, } from "../gsd/mcp-filter.js";
|
|
26
26
|
import { RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES, RUN_UAT_FORBIDDEN_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES, resolveToolPresentationPlan } from "../gsd/tool-presentation-plan.js";
|
|
27
|
+
import { getUnitToolSurfaceContract } from "../gsd/unit-tool-contracts.js";
|
|
28
|
+
import { awaitWorkflowMcpToolRegistration, getToolSurfaceReadinessError, POST_PREFLIGHT_READINESS_RETRY_DELAYS_MS, POST_PREFLIGHT_SDK_SETTLE_MS, TOOL_SURFACE_NOT_READY, } from "../gsd/tool-surface-readiness.js";
|
|
29
|
+
import { beginWorkflowMcpSdkSession, endWorkflowMcpSdkSession, } from "../gsd/workflow-mcp-readiness-cache.js";
|
|
30
|
+
import { getGuidedUnitContext } from "../gsd/guided-unit-context.js";
|
|
31
|
+
import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
|
|
27
32
|
import { showInterviewRound } from "../shared/tui.js";
|
|
28
|
-
export { buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, mergePendingToolCalls, } from "./turn-assembler.js";
|
|
33
|
+
export { buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, mergePendingToolCalls, shouldSuppressDuplicateToolUnavailableBlock, } from "./turn-assembler.js";
|
|
29
34
|
export function serverToolUseToToolCallLike(block) {
|
|
30
35
|
const argumentsValue = block.input && typeof block.input === "object" && !Array.isArray(block.input)
|
|
31
36
|
? block.input
|
|
@@ -177,13 +182,18 @@ const GSD_PHASE_PATTERNS = [
|
|
|
177
182
|
["reassess-roadmap", /\b(?:UNIT:\s*Reassess Roadmap|reassess-roadmap)\b/i],
|
|
178
183
|
["complete-slice", /\b(?:UNIT:\s*Complete Slice|complete-slice)\b/i],
|
|
179
184
|
["replan-slice", /\b(?:UNIT:\s*Replan Slice|replan-slice)\b/i],
|
|
185
|
+
["refine-slice", /\b(?:UNIT:\s*Refine Slice|refine-slice)\b/i],
|
|
180
186
|
["plan-slice", /\b(?:UNIT:\s*Plan Slice|plan-slice|gsd_plan_slice)\b/i],
|
|
181
187
|
["plan-milestone", /\b(?:UNIT:\s*Plan Milestone|plan-milestone|gsd_plan_milestone)\b/i],
|
|
182
188
|
["execute-task", /\b(?:UNIT:\s*Execute Task|execute-task|execute-task-simple|reactive-execute)\b/i],
|
|
183
189
|
["gate-evaluate", /\b(?:UNIT:\s*Gate Evaluate|gate-evaluate|gsd_save_gate_result)\b/i],
|
|
184
190
|
["research-milestone", /\b(?:UNIT:\s*Research Milestone|research-milestone)\b/i],
|
|
185
191
|
["research-slice", /\b(?:UNIT:\s*Research Slice|research-slice)\b/i],
|
|
192
|
+
["research-decision", /\b(?:research decision|research-decision)\b/i],
|
|
186
193
|
["discuss-milestone", /\b(?:Discuss milestone|discuss-milestone)\b/i],
|
|
194
|
+
["discuss-slice", /\b(?:Discuss slice|discuss-slice)\b/i],
|
|
195
|
+
["discuss-project", /\b(?:discuss-project|Discuss project)\b/i],
|
|
196
|
+
["discuss-requirements", /\b(?:discuss-requirements|Discuss requirements)\b/i],
|
|
187
197
|
];
|
|
188
198
|
export function inferGsdPhaseFromContext(context) {
|
|
189
199
|
const text = [
|
|
@@ -196,6 +206,24 @@ export function inferGsdPhaseFromContext(context) {
|
|
|
196
206
|
}
|
|
197
207
|
return undefined;
|
|
198
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Resolve the GSD unit phase for Claude Code SDK sessions. Guided-flow
|
|
211
|
+
* dispatch records the authoritative unit type before the turn is queued;
|
|
212
|
+
* prefer that over regex inference from prompt text.
|
|
213
|
+
*/
|
|
214
|
+
export function resolveGsdPhaseForSdk(context, projectRoot) {
|
|
215
|
+
const resolvedRoot = resolveWorkflowMcpProjectRoot(projectRoot);
|
|
216
|
+
const guided = getGuidedUnitContext(resolvedRoot)
|
|
217
|
+
?? getGuidedUnitContext(projectRoot)
|
|
218
|
+
?? getGuidedUnitContext();
|
|
219
|
+
if (guided?.unitType) {
|
|
220
|
+
const guidedRoot = resolveWorkflowMcpProjectRoot(guided.basePath);
|
|
221
|
+
if (guidedRoot === resolvedRoot) {
|
|
222
|
+
return guided.unitType;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return inferGsdPhaseFromContext(context);
|
|
226
|
+
}
|
|
199
227
|
/**
|
|
200
228
|
* Build a full conversational prompt from GSD's context messages.
|
|
201
229
|
*
|
|
@@ -221,10 +249,15 @@ export function buildPromptFromContext(context, toolContext = {}) {
|
|
|
221
249
|
const workflowToolLine = toolContext.workflowMcpServerName
|
|
222
250
|
? "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, gsd_save_gate_result, etc.) " +
|
|
223
251
|
`are MCP tools — call them as mcp__${toolContext.workflowMcpServerName}__<tool_name> ` +
|
|
224
|
-
`(e.g. mcp__${toolContext.workflowMcpServerName}__gsd_exec, mcp__${toolContext.workflowMcpServerName}__gsd_save_gate_result)\n`
|
|
252
|
+
`(e.g. mcp__${toolContext.workflowMcpServerName}__gsd_exec, mcp__${toolContext.workflowMcpServerName}__gsd_save_gate_result)\n` +
|
|
253
|
+
`- Structured user input: call mcp__${toolContext.workflowMcpServerName}__ask_user_questions. ` +
|
|
254
|
+
"Do not call bare ask_user_questions. Do not call native AskUserQuestion.\n"
|
|
225
255
|
: "- GSD workflow MCP tools are unavailable in this Claude Code run.\n";
|
|
226
256
|
const toolSearchLine = toolContext.workflowMcpServerName
|
|
227
|
-
? "- ToolSearch is
|
|
257
|
+
? "- ToolSearch is available only for Claude Code deferred workflow MCP hydration. " +
|
|
258
|
+
`If mcp__${toolContext.workflowMcpServerName}__<tool_name> is missing or Claude Code reports the server is still connecting, ` +
|
|
259
|
+
`use ToolSearch with select:mcp__${toolContext.workflowMcpServerName}__<tool_name> or the base tool name, then call the returned MCP tool directly. ` +
|
|
260
|
+
"Do not use ToolSearch for browser_* tools or general discovery.\n"
|
|
228
261
|
: "- ToolSearch is NOT available — never use it to discover tools\n";
|
|
229
262
|
const browserToolLine = toolContext.browserMcpServerName
|
|
230
263
|
? "- Browser verification uses gsd-browser MCP by default — call browser tools as " +
|
|
@@ -318,9 +351,11 @@ export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext
|
|
|
318
351
|
message: { role: "user", content },
|
|
319
352
|
parent_tool_use_id: null,
|
|
320
353
|
};
|
|
321
|
-
return
|
|
322
|
-
|
|
323
|
-
|
|
354
|
+
return {
|
|
355
|
+
async *[Symbol.asyncIterator]() {
|
|
356
|
+
yield sdkMessage;
|
|
357
|
+
},
|
|
358
|
+
};
|
|
324
359
|
}
|
|
325
360
|
// ---------------------------------------------------------------------------
|
|
326
361
|
// Error helper
|
|
@@ -339,6 +374,40 @@ function makeErrorMessage(model, errorMsg) {
|
|
|
339
374
|
timestamp: Date.now(),
|
|
340
375
|
};
|
|
341
376
|
}
|
|
377
|
+
export function buildWorkflowMcpReadinessProgressMessage(input) {
|
|
378
|
+
const { unitType, workflowServerName, stage } = input;
|
|
379
|
+
if (stage === "preflight") {
|
|
380
|
+
return `Starting ${workflowServerName} MCP for ${unitType}; waiting for workflow tools to register...`;
|
|
381
|
+
}
|
|
382
|
+
const attempt = input.attempt === undefined ? "" : ` attempt ${input.attempt}`;
|
|
383
|
+
const delay = input.delayMs === undefined ? "" : ` Retrying in ${formatReadinessDelay(input.delayMs)}.`;
|
|
384
|
+
return `Still waiting for ${workflowServerName} MCP tools for ${unitType}${attempt}.${delay}`;
|
|
385
|
+
}
|
|
386
|
+
function formatReadinessDelay(delayMs) {
|
|
387
|
+
if (delayMs < 1_000)
|
|
388
|
+
return `${delayMs}ms`;
|
|
389
|
+
const seconds = delayMs / 1_000;
|
|
390
|
+
return Number.isInteger(seconds) ? `${seconds}s` : `${seconds.toFixed(1)}s`;
|
|
391
|
+
}
|
|
392
|
+
export function pushWorkflowMcpReadinessProgressEvent(input) {
|
|
393
|
+
const { stream, partial, state, message } = input;
|
|
394
|
+
if (!message)
|
|
395
|
+
return;
|
|
396
|
+
let contentIndex = state.contentIndex;
|
|
397
|
+
const existing = contentIndex === undefined ? undefined : partial.content[contentIndex];
|
|
398
|
+
if (contentIndex === undefined || existing?.type !== "text") {
|
|
399
|
+
contentIndex = partial.content.length;
|
|
400
|
+
state.contentIndex = contentIndex;
|
|
401
|
+
partial.content.push({ type: "text", text: "" });
|
|
402
|
+
stream.push({ type: "text_start", contentIndex, partial });
|
|
403
|
+
}
|
|
404
|
+
const block = partial.content[contentIndex];
|
|
405
|
+
if (block.type !== "text")
|
|
406
|
+
return;
|
|
407
|
+
const delta = block.text.length === 0 ? message : `\n${message}`;
|
|
408
|
+
block.text += delta;
|
|
409
|
+
stream.push({ type: "text_delta", contentIndex, delta, partial });
|
|
410
|
+
}
|
|
342
411
|
export function isClaudeCodeAbortErrorMessage(message) {
|
|
343
412
|
if (!message)
|
|
344
413
|
return false;
|
|
@@ -1289,7 +1358,7 @@ function browserMcpServerNameFromAllowedTools(allowedTools) {
|
|
|
1289
1358
|
const parsed = parseAllowedMcpToolName(toolName);
|
|
1290
1359
|
if (!parsed)
|
|
1291
1360
|
continue;
|
|
1292
|
-
if (parsed.server === "gsd-browser" || parsed.tool
|
|
1361
|
+
if (parsed.server === "gsd-browser" || hasBrowserContractPrefix(parsed.tool)) {
|
|
1293
1362
|
return parsed.server;
|
|
1294
1363
|
}
|
|
1295
1364
|
}
|
|
@@ -1303,7 +1372,7 @@ function workflowMcpServerNameFromAllowedTools(allowedTools) {
|
|
|
1303
1372
|
if (typeof toolName !== "string")
|
|
1304
1373
|
continue;
|
|
1305
1374
|
const parsed = parseAllowedMcpToolName(toolName);
|
|
1306
|
-
if (!parsed || parsed.server === browserServerName || parsed.tool
|
|
1375
|
+
if (!parsed || parsed.server === browserServerName || hasBrowserContractPrefix(parsed.tool))
|
|
1307
1376
|
continue;
|
|
1308
1377
|
return parsed.server;
|
|
1309
1378
|
}
|
|
@@ -1352,11 +1421,13 @@ function resolveProjectMcpServerConfigs(projectRoot, serverNames, fallbackServer
|
|
|
1352
1421
|
function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, workflowExplicitlyBlocked) {
|
|
1353
1422
|
if (!gsdPhase || !workflowServerName || workflowExplicitlyBlocked)
|
|
1354
1423
|
return [];
|
|
1355
|
-
const
|
|
1424
|
+
const requestedTools = gsdPhase === "run-uat"
|
|
1356
1425
|
? [...RUN_UAT_WORKFLOW_TOOL_NAMES]
|
|
1357
|
-
:
|
|
1358
|
-
|
|
1359
|
-
|
|
1426
|
+
: [
|
|
1427
|
+
...(getUnitToolSurfaceContract(gsdPhase)?.allowedGsdTools ?? []),
|
|
1428
|
+
...getRequiredWorkflowToolsForAutoUnit(gsdPhase),
|
|
1429
|
+
];
|
|
1430
|
+
const requestedToolNames = [...new Set(requestedTools.filter((toolName) => toolName.startsWith("gsd_") || toolName === "ask_user_questions"))];
|
|
1360
1431
|
if (requestedToolNames.length === 0)
|
|
1361
1432
|
return [];
|
|
1362
1433
|
return resolveToolPresentationPlan({
|
|
@@ -1366,6 +1437,25 @@ function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, work
|
|
|
1366
1437
|
requestedToolNames,
|
|
1367
1438
|
}).presentedToolNames;
|
|
1368
1439
|
}
|
|
1440
|
+
function resolveClaudeNativeToolsForPhase(gsdPhase) {
|
|
1441
|
+
const standardClaudeTools = [
|
|
1442
|
+
"Read",
|
|
1443
|
+
"Write",
|
|
1444
|
+
"Edit",
|
|
1445
|
+
"Glob",
|
|
1446
|
+
"Grep",
|
|
1447
|
+
"Bash",
|
|
1448
|
+
"Agent",
|
|
1449
|
+
"WebFetch",
|
|
1450
|
+
"WebSearch",
|
|
1451
|
+
];
|
|
1452
|
+
if (!gsdPhase)
|
|
1453
|
+
return standardClaudeTools;
|
|
1454
|
+
if (gsdPhase === "run-uat" || gsdPhase === "complete-slice") {
|
|
1455
|
+
return [...RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES];
|
|
1456
|
+
}
|
|
1457
|
+
return standardClaudeTools;
|
|
1458
|
+
}
|
|
1369
1459
|
export function autoInitClaudeCodeWorkflowMcp(cwd) {
|
|
1370
1460
|
const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
|
|
1371
1461
|
try {
|
|
@@ -1377,6 +1467,51 @@ export function autoInitClaudeCodeWorkflowMcp(cwd) {
|
|
|
1377
1467
|
}
|
|
1378
1468
|
}
|
|
1379
1469
|
}
|
|
1470
|
+
export function resolveClaudeCodeToolSurfaceReadinessError(input) {
|
|
1471
|
+
const error = getToolSurfaceReadinessError(input);
|
|
1472
|
+
if (error
|
|
1473
|
+
&& input.allowPendingToolSearchHydration
|
|
1474
|
+
&& input.workflowServerName
|
|
1475
|
+
&& input.observation.mcpServers.some((server) => server.name === input.workflowServerName && server.status === "pending")) {
|
|
1476
|
+
return Promise.resolve(null);
|
|
1477
|
+
}
|
|
1478
|
+
return Promise.resolve(error);
|
|
1479
|
+
}
|
|
1480
|
+
export { awaitWorkflowMcpToolRegistration } from "../gsd/tool-surface-readiness.js";
|
|
1481
|
+
const TOOL_SURFACE_READINESS_RETRY_DELAYS_MS = [500, 1_000, 2_000, 4_000, 8_000, 15_000, 15_000, 15_000];
|
|
1482
|
+
export function shouldRetryClaudeCodeToolSurfaceReadiness(error) {
|
|
1483
|
+
if (!error)
|
|
1484
|
+
return false;
|
|
1485
|
+
return error.includes(TOOL_SURFACE_NOT_READY) && !/\bterminal\b/i.test(error);
|
|
1486
|
+
}
|
|
1487
|
+
export function resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(error, attempt, preflightVerified = false) {
|
|
1488
|
+
if (!shouldRetryClaudeCodeToolSurfaceReadiness(error))
|
|
1489
|
+
return null;
|
|
1490
|
+
const delays = preflightVerified
|
|
1491
|
+
? POST_PREFLIGHT_READINESS_RETRY_DELAYS_MS
|
|
1492
|
+
: TOOL_SURFACE_READINESS_RETRY_DELAYS_MS;
|
|
1493
|
+
return delays[attempt] ?? null;
|
|
1494
|
+
}
|
|
1495
|
+
function makeAbortError() {
|
|
1496
|
+
const error = new Error("AbortError: The operation was aborted");
|
|
1497
|
+
error.name = "AbortError";
|
|
1498
|
+
return error;
|
|
1499
|
+
}
|
|
1500
|
+
function delay(ms, signal) {
|
|
1501
|
+
if (signal?.aborted)
|
|
1502
|
+
return Promise.reject(makeAbortError());
|
|
1503
|
+
return new Promise((resolve, reject) => {
|
|
1504
|
+
const timeout = setTimeout(() => {
|
|
1505
|
+
signal?.removeEventListener("abort", onAbort);
|
|
1506
|
+
resolve();
|
|
1507
|
+
}, ms);
|
|
1508
|
+
const onAbort = () => {
|
|
1509
|
+
clearTimeout(timeout);
|
|
1510
|
+
reject(makeAbortError());
|
|
1511
|
+
};
|
|
1512
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
1513
|
+
});
|
|
1514
|
+
}
|
|
1380
1515
|
/**
|
|
1381
1516
|
* Build the options object passed to the Claude Agent SDK's `query()` call.
|
|
1382
1517
|
*
|
|
@@ -1508,34 +1643,27 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
|
|
|
1508
1643
|
`mcp__${workflowServerName}__gsd_save_gate_result`,
|
|
1509
1644
|
]
|
|
1510
1645
|
: [];
|
|
1646
|
+
const allowToolSearchForWorkflowMcp = workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0;
|
|
1511
1647
|
const disallowedTools = [...new Set([
|
|
1512
|
-
"ToolSearch",
|
|
1648
|
+
...(allowToolSearchForWorkflowMcp ? [] : ["ToolSearch"]),
|
|
1649
|
+
...(gsdPhase ? ["Skill"] : []),
|
|
1513
1650
|
...(workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
|
|
1514
1651
|
...questionToolSurface.disallowedTools,
|
|
1515
1652
|
...runUatDisallowedTools,
|
|
1516
1653
|
...extraDisallowedTools,
|
|
1517
1654
|
])];
|
|
1518
|
-
const
|
|
1519
|
-
"Read",
|
|
1520
|
-
"Write",
|
|
1521
|
-
"Edit",
|
|
1522
|
-
"Glob",
|
|
1523
|
-
"Grep",
|
|
1524
|
-
"Bash",
|
|
1525
|
-
"Agent",
|
|
1526
|
-
"WebFetch",
|
|
1527
|
-
"WebSearch",
|
|
1528
|
-
];
|
|
1655
|
+
const nativeTools = resolveClaudeNativeToolsForPhase(gsdPhase);
|
|
1529
1656
|
const allowedTools = gsdPhase === "run-uat"
|
|
1530
1657
|
? [
|
|
1531
|
-
...
|
|
1658
|
+
...nativeTools,
|
|
1532
1659
|
...(exactWorkflowMcpTools.length > 0 ? exactWorkflowMcpTools : []),
|
|
1533
1660
|
...allowedBrowserMcpTools,
|
|
1534
1661
|
]
|
|
1535
1662
|
: [
|
|
1536
|
-
...
|
|
1663
|
+
...nativeTools,
|
|
1537
1664
|
...exactWorkflowMcpTools,
|
|
1538
|
-
...(workflowMcpTools.length > 0 ? workflowMcpTools : [
|
|
1665
|
+
...(!gsdPhase && workflowMcpTools.length > 0 ? workflowMcpTools : []),
|
|
1666
|
+
...(workflowMcpTools.length === 0 && exactWorkflowMcpTools.length === 0 ? ["AskUserQuestion"] : []),
|
|
1539
1667
|
...allowedBrowserMcpTools,
|
|
1540
1668
|
];
|
|
1541
1669
|
const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
|
|
@@ -1592,33 +1720,33 @@ export function streamViaClaudeCode(model, context, options) {
|
|
|
1592
1720
|
void pumpSdkMessages(model, context, options, stream);
|
|
1593
1721
|
return stream;
|
|
1594
1722
|
}
|
|
1723
|
+
function createSdkAttemptMessageState() {
|
|
1724
|
+
return {
|
|
1725
|
+
builder: null,
|
|
1726
|
+
intermediateToolBlocks: [],
|
|
1727
|
+
toolResultsById: new Map(),
|
|
1728
|
+
};
|
|
1729
|
+
}
|
|
1595
1730
|
/** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
|
|
1596
1731
|
async function pumpSdkMessages(model, context, options, stream) {
|
|
1597
1732
|
const modelId = model.id;
|
|
1598
|
-
let builder = null;
|
|
1599
1733
|
/** Track the last text content seen across all assistant turns for the final message. */
|
|
1600
1734
|
let lastTextContent = "";
|
|
1601
1735
|
let lastThinkingContent = "";
|
|
1602
|
-
/** Collect tool blocks from intermediate SDK turns for tool execution rendering. */
|
|
1603
|
-
const intermediateToolBlocks = [];
|
|
1604
|
-
/** Preserve real external tool results from Claude Code's synthetic user messages. */
|
|
1605
|
-
const toolResultsById = new Map();
|
|
1606
1736
|
try {
|
|
1607
|
-
// Dynamic import — the SDK is an optional dependency.
|
|
1608
|
-
const sdkModule = "@anthropic-ai/claude-agent-sdk";
|
|
1609
|
-
const sdk = (await import(/* webpackIgnore: true */ sdkModule));
|
|
1610
|
-
// Bridge GSD's AbortSignal to SDK's AbortController
|
|
1611
|
-
const controller = new AbortController();
|
|
1612
|
-
if (options?.signal) {
|
|
1613
|
-
options.signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
1614
|
-
}
|
|
1615
1737
|
const permissionMode = await resolveClaudePermissionMode();
|
|
1616
|
-
const
|
|
1617
|
-
const
|
|
1618
|
-
const
|
|
1738
|
+
const claudeOptions = options;
|
|
1739
|
+
const uiContext = claudeOptions?.extensionUIContext;
|
|
1740
|
+
const onExternalToolCall = claudeOptions?.onExternalToolCall;
|
|
1741
|
+
const onExternalToolResult = claudeOptions?.onExternalToolResult;
|
|
1742
|
+
const sdkQueryForTest = claudeOptions?._sdkQueryForTest;
|
|
1743
|
+
const query = sdkQueryForTest ??
|
|
1744
|
+
// Dynamic import — the SDK is an optional dependency.
|
|
1745
|
+
(await import(/* webpackIgnore: true */ "@anthropic-ai/claude-agent-sdk")).query;
|
|
1619
1746
|
const cwd = resolveClaudeCodeCwd(options);
|
|
1747
|
+
const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
|
|
1620
1748
|
autoInitClaudeCodeWorkflowMcp(cwd);
|
|
1621
|
-
const gsdPhase =
|
|
1749
|
+
const gsdPhase = resolveGsdPhaseForSdk(context, projectRoot);
|
|
1622
1750
|
const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
|
|
1623
1751
|
// When no UI is available (headless / auto-mode), auto-approve all
|
|
1624
1752
|
// tool requests. This replaces the old bypassPermissions workaround.
|
|
@@ -1635,18 +1763,14 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
1635
1763
|
}
|
|
1636
1764
|
: {}),
|
|
1637
1765
|
});
|
|
1766
|
+
const workflowMcpServerName = workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools);
|
|
1767
|
+
const allowPendingToolSearchHydration = Boolean(workflowMcpServerName && gsdPhase)
|
|
1768
|
+
&& !sdkOpts.disallowedTools?.includes("ToolSearch");
|
|
1638
1769
|
const prompt = buildPromptFromContext(context, {
|
|
1639
|
-
workflowMcpServerName
|
|
1770
|
+
workflowMcpServerName,
|
|
1640
1771
|
browserMcpServerName: browserMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
|
|
1641
1772
|
});
|
|
1642
1773
|
const queryPrompt = buildSdkQueryPrompt(context, prompt);
|
|
1643
|
-
const queryResult = sdk.query({
|
|
1644
|
-
prompt: queryPrompt,
|
|
1645
|
-
options: {
|
|
1646
|
-
...sdkOpts,
|
|
1647
|
-
abortController: controller,
|
|
1648
|
-
},
|
|
1649
|
-
});
|
|
1650
1774
|
// Emit start with an empty partial
|
|
1651
1775
|
const initialPartial = {
|
|
1652
1776
|
role: "assistant",
|
|
@@ -1659,169 +1783,303 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
1659
1783
|
timestamp: Date.now(),
|
|
1660
1784
|
};
|
|
1661
1785
|
stream.push({ type: "start", partial: initialPartial });
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
const
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
console.warn("[claude-code] onExternalToolCall callback failed:", error);
|
|
1697
|
-
}
|
|
1698
|
-
}
|
|
1699
|
-
}
|
|
1786
|
+
const readinessProgressState = {};
|
|
1787
|
+
const trackWorkflowMcpSdk = Boolean(workflowMcpServerName && gsdPhase);
|
|
1788
|
+
if (trackWorkflowMcpSdk)
|
|
1789
|
+
beginWorkflowMcpSdkSession();
|
|
1790
|
+
try {
|
|
1791
|
+
let workflowMcpPreflightVerified = false;
|
|
1792
|
+
const shouldRunWorkflowMcpPreflight = workflowMcpServerName && gsdPhase && !claudeOptions?._skipWorkflowMcpPreflightForTest;
|
|
1793
|
+
if (shouldRunWorkflowMcpPreflight) {
|
|
1794
|
+
try {
|
|
1795
|
+
const progressMessage = buildWorkflowMcpReadinessProgressMessage({
|
|
1796
|
+
unitType: gsdPhase,
|
|
1797
|
+
workflowServerName: workflowMcpServerName,
|
|
1798
|
+
stage: "preflight",
|
|
1799
|
+
});
|
|
1800
|
+
pushWorkflowMcpReadinessProgressEvent({
|
|
1801
|
+
stream,
|
|
1802
|
+
partial: initialPartial,
|
|
1803
|
+
state: readinessProgressState,
|
|
1804
|
+
message: progressMessage,
|
|
1805
|
+
});
|
|
1806
|
+
uiContext?.setStatus?.("gsd-step", progressMessage);
|
|
1807
|
+
const preflightError = await awaitWorkflowMcpToolRegistration({
|
|
1808
|
+
unitType: gsdPhase,
|
|
1809
|
+
workflowServerName: workflowMcpServerName,
|
|
1810
|
+
projectRoot,
|
|
1811
|
+
signal: options?.signal,
|
|
1812
|
+
});
|
|
1813
|
+
if (preflightError) {
|
|
1814
|
+
stream.push({
|
|
1815
|
+
type: "error",
|
|
1816
|
+
reason: "error",
|
|
1817
|
+
error: makeErrorMessage(modelId, preflightError),
|
|
1818
|
+
});
|
|
1819
|
+
return;
|
|
1700
1820
|
}
|
|
1701
|
-
|
|
1821
|
+
workflowMcpPreflightVerified = true;
|
|
1702
1822
|
}
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
const sdkAssistant = msg;
|
|
1706
|
-
// Capture text content from complete messages
|
|
1707
|
-
for (const block of sdkAssistant.message.content) {
|
|
1708
|
-
if (block.type === "text") {
|
|
1709
|
-
lastTextContent = block.text;
|
|
1710
|
-
}
|
|
1711
|
-
else if (block.type === "thinking") {
|
|
1712
|
-
lastThinkingContent = block.thinking;
|
|
1713
|
-
}
|
|
1714
|
-
}
|
|
1715
|
-
break;
|
|
1823
|
+
finally {
|
|
1824
|
+
uiContext?.setStatus?.("gsd-step", "");
|
|
1716
1825
|
}
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1826
|
+
if (workflowMcpPreflightVerified) {
|
|
1827
|
+
await delay(POST_PREFLIGHT_SDK_SETTLE_MS, options?.signal);
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
sdkAttemptLoop: for (let readinessAttempt = 0;; readinessAttempt++) {
|
|
1831
|
+
let { builder, intermediateToolBlocks, toolResultsById } = createSdkAttemptMessageState();
|
|
1832
|
+
const controller = new AbortController();
|
|
1833
|
+
const forwardAbort = () => controller.abort();
|
|
1834
|
+
if (options?.signal) {
|
|
1835
|
+
options.signal.addEventListener("abort", forwardAbort, { once: true });
|
|
1836
|
+
}
|
|
1837
|
+
const queryResult = query({
|
|
1838
|
+
prompt: queryPrompt,
|
|
1839
|
+
options: {
|
|
1840
|
+
...sdkOpts,
|
|
1841
|
+
abortController: controller,
|
|
1842
|
+
},
|
|
1843
|
+
});
|
|
1844
|
+
try {
|
|
1845
|
+
for await (const msg of queryResult) {
|
|
1846
|
+
if (options?.signal?.aborted) {
|
|
1847
|
+
// User-initiated cancel — emit an aborted error so the agent
|
|
1848
|
+
// loop classifies this as a deliberate stop, not a transient
|
|
1849
|
+
// provider failure that should be retried.
|
|
1850
|
+
stream.push({
|
|
1851
|
+
type: "error",
|
|
1852
|
+
reason: "aborted",
|
|
1853
|
+
error: makeAbortedMessage(modelId, lastTextContent),
|
|
1854
|
+
});
|
|
1855
|
+
return;
|
|
1732
1856
|
}
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
// Push synthetic completion events with result attached so the
|
|
1752
|
-
// chat-controller can update pending ToolExecutionComponents.
|
|
1753
|
-
if (block.type === "toolCall") {
|
|
1754
|
-
try {
|
|
1755
|
-
await onExternalToolResult?.({
|
|
1756
|
-
toolCall: block,
|
|
1757
|
-
result: extResult,
|
|
1857
|
+
switch (msg.type) {
|
|
1858
|
+
// -- Init --
|
|
1859
|
+
case "system": {
|
|
1860
|
+
// Tool Surface Readiness gate: the init message is the first (and
|
|
1861
|
+
// only) point where the session reports its live tool surface and
|
|
1862
|
+
// MCP server statuses. If the workflow server failed or has not
|
|
1863
|
+
// registered this Unit's required tools, abort before the first
|
|
1864
|
+
// model turn with a transient, recovery-classifiable error
|
|
1865
|
+
// (tool-unavailable → retry) instead of letting the model hit
|
|
1866
|
+
// "No such tool available" mid-Unit and improvise around it.
|
|
1867
|
+
const init = msg;
|
|
1868
|
+
if (init.subtype === "init") {
|
|
1869
|
+
const readinessError = await resolveClaudeCodeToolSurfaceReadinessError({
|
|
1870
|
+
unitType: gsdPhase,
|
|
1871
|
+
workflowServerName: workflowMcpServerName,
|
|
1872
|
+
projectRoot,
|
|
1873
|
+
observation: { tools: init.tools ?? [], mcpServers: init.mcp_servers ?? [] },
|
|
1874
|
+
allowPendingToolSearchHydration,
|
|
1758
1875
|
});
|
|
1876
|
+
if (readinessError) {
|
|
1877
|
+
const retryDelayMs = resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(readinessError, readinessAttempt, workflowMcpPreflightVerified);
|
|
1878
|
+
if (retryDelayMs !== null && !options?.signal?.aborted) {
|
|
1879
|
+
controller.abort();
|
|
1880
|
+
const progressMessage = buildWorkflowMcpReadinessProgressMessage({
|
|
1881
|
+
unitType: gsdPhase ?? "workflow unit",
|
|
1882
|
+
workflowServerName: workflowMcpServerName ?? "workflow",
|
|
1883
|
+
stage: "retry",
|
|
1884
|
+
attempt: readinessAttempt + 1,
|
|
1885
|
+
delayMs: retryDelayMs,
|
|
1886
|
+
});
|
|
1887
|
+
pushWorkflowMcpReadinessProgressEvent({
|
|
1888
|
+
stream,
|
|
1889
|
+
partial: initialPartial,
|
|
1890
|
+
state: readinessProgressState,
|
|
1891
|
+
message: progressMessage,
|
|
1892
|
+
});
|
|
1893
|
+
uiContext?.setStatus?.("gsd-step", progressMessage);
|
|
1894
|
+
await delay(retryDelayMs, options?.signal);
|
|
1895
|
+
uiContext?.setStatus?.("gsd-step", "");
|
|
1896
|
+
continue sdkAttemptLoop;
|
|
1897
|
+
}
|
|
1898
|
+
controller.abort();
|
|
1899
|
+
stream.push({
|
|
1900
|
+
type: "error",
|
|
1901
|
+
reason: "error",
|
|
1902
|
+
error: makeErrorMessage(modelId, readinessError),
|
|
1903
|
+
});
|
|
1904
|
+
return;
|
|
1905
|
+
}
|
|
1759
1906
|
}
|
|
1760
|
-
|
|
1761
|
-
|
|
1907
|
+
break;
|
|
1908
|
+
}
|
|
1909
|
+
// -- Streaming partial messages --
|
|
1910
|
+
case "stream_event": {
|
|
1911
|
+
const partial = msg;
|
|
1912
|
+
const event = partial.event;
|
|
1913
|
+
const result = handleClaudeCodePartialStreamEvent(builder, event, modelId);
|
|
1914
|
+
builder = result.builder;
|
|
1915
|
+
const assistantEvent = result.assistantEvent;
|
|
1916
|
+
if (assistantEvent) {
|
|
1917
|
+
stream.push(assistantEvent);
|
|
1918
|
+
if (assistantEvent.type === "toolcall_start") {
|
|
1919
|
+
const toolBlock = assistantEvent.partial.content[assistantEvent.contentIndex];
|
|
1920
|
+
if (toolBlock?.type === "toolCall") {
|
|
1921
|
+
try {
|
|
1922
|
+
await onExternalToolCall?.(toolBlock);
|
|
1923
|
+
}
|
|
1924
|
+
catch (error) {
|
|
1925
|
+
console.warn("[claude-code] onExternalToolCall callback failed:", error);
|
|
1926
|
+
}
|
|
1927
|
+
}
|
|
1928
|
+
}
|
|
1762
1929
|
}
|
|
1763
|
-
|
|
1764
|
-
type: "toolcall_end",
|
|
1765
|
-
contentIndex,
|
|
1766
|
-
toolCall: block,
|
|
1767
|
-
partial: builder.message,
|
|
1768
|
-
});
|
|
1930
|
+
break;
|
|
1769
1931
|
}
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1932
|
+
// -- Complete assistant message (non-streaming fallback) --
|
|
1933
|
+
case "assistant": {
|
|
1934
|
+
const sdkAssistant = msg;
|
|
1935
|
+
// Capture text content from complete messages
|
|
1936
|
+
for (const block of sdkAssistant.message.content) {
|
|
1937
|
+
if (block.type === "text") {
|
|
1938
|
+
lastTextContent = block.text;
|
|
1939
|
+
}
|
|
1940
|
+
else if (block.type === "thinking") {
|
|
1941
|
+
lastThinkingContent = block.thinking;
|
|
1942
|
+
}
|
|
1776
1943
|
}
|
|
1777
|
-
|
|
1778
|
-
|
|
1944
|
+
break;
|
|
1945
|
+
}
|
|
1946
|
+
// -- User message (synthetic tool result — signals turn boundary) --
|
|
1947
|
+
case "user": {
|
|
1948
|
+
// Capture content from the completed turn before resetting
|
|
1949
|
+
if (builder) {
|
|
1950
|
+
for (const block of builder.message.content) {
|
|
1951
|
+
if (block.type === "text" && block.text) {
|
|
1952
|
+
lastTextContent = block.text;
|
|
1953
|
+
}
|
|
1954
|
+
else if (block.type === "thinking" && block.thinking) {
|
|
1955
|
+
lastThinkingContent = block.thinking;
|
|
1956
|
+
}
|
|
1957
|
+
else if (block.type === "toolCall" || block.type === "serverToolUse") {
|
|
1958
|
+
// Collect tool blocks for externalToolExecution rendering
|
|
1959
|
+
intermediateToolBlocks.push(block);
|
|
1960
|
+
}
|
|
1961
|
+
}
|
|
1962
|
+
}
|
|
1963
|
+
// Extract tool results from the SDK's synthetic user message
|
|
1964
|
+
// and attach to corresponding tool call blocks immediately.
|
|
1965
|
+
for (const { toolUseId, result } of extractToolResultsFromSdkUserMessage(msg)) {
|
|
1966
|
+
toolResultsById.set(toolUseId, result);
|
|
1967
|
+
}
|
|
1968
|
+
attachExternalResultsToToolBlocks(intermediateToolBlocks, toolResultsById);
|
|
1969
|
+
// Push a synthetic toolcall_end for each tool call from this turn
|
|
1970
|
+
// so the TUI can render tool results in real-time during the SDK
|
|
1971
|
+
// session instead of waiting until the entire session completes.
|
|
1972
|
+
if (builder) {
|
|
1973
|
+
for (const block of builder.message.content) {
|
|
1974
|
+
const extResult = block.externalResult;
|
|
1975
|
+
if (!extResult)
|
|
1976
|
+
continue;
|
|
1977
|
+
const contentIndex = builder.message.content.indexOf(block);
|
|
1978
|
+
if (contentIndex < 0)
|
|
1979
|
+
continue;
|
|
1980
|
+
const suppressDuplicateUnavailable = shouldSuppressDuplicateToolUnavailableBlock(block, builder.message.content);
|
|
1981
|
+
// Push synthetic completion events with result attached so the
|
|
1982
|
+
// chat-controller can update pending ToolExecutionComponents.
|
|
1983
|
+
if (block.type === "toolCall") {
|
|
1984
|
+
if (suppressDuplicateUnavailable) {
|
|
1985
|
+
delete block.externalResult;
|
|
1986
|
+
stream.push({
|
|
1987
|
+
type: "toolcall_end",
|
|
1988
|
+
contentIndex,
|
|
1989
|
+
toolCall: block,
|
|
1990
|
+
partial: builder.message,
|
|
1991
|
+
});
|
|
1992
|
+
block.externalResult = extResult;
|
|
1993
|
+
continue;
|
|
1994
|
+
}
|
|
1995
|
+
try {
|
|
1996
|
+
await onExternalToolResult?.({
|
|
1997
|
+
toolCall: block,
|
|
1998
|
+
result: extResult,
|
|
1999
|
+
});
|
|
2000
|
+
}
|
|
2001
|
+
catch (error) {
|
|
2002
|
+
console.warn("[claude-code] onExternalToolResult callback failed:", error);
|
|
2003
|
+
}
|
|
2004
|
+
stream.push({
|
|
2005
|
+
type: "toolcall_end",
|
|
2006
|
+
contentIndex,
|
|
2007
|
+
toolCall: block,
|
|
2008
|
+
partial: builder.message,
|
|
2009
|
+
});
|
|
2010
|
+
}
|
|
2011
|
+
else if (block.type === "serverToolUse") {
|
|
2012
|
+
try {
|
|
2013
|
+
await onExternalToolResult?.({
|
|
2014
|
+
toolCall: serverToolUseToToolCallLike(block),
|
|
2015
|
+
result: extResult,
|
|
2016
|
+
});
|
|
2017
|
+
}
|
|
2018
|
+
catch (error) {
|
|
2019
|
+
console.warn("[claude-code] onExternalToolResult callback failed:", error);
|
|
2020
|
+
}
|
|
2021
|
+
stream.push({
|
|
2022
|
+
type: "server_tool_use",
|
|
2023
|
+
contentIndex,
|
|
2024
|
+
partial: builder.message,
|
|
2025
|
+
});
|
|
2026
|
+
}
|
|
2027
|
+
}
|
|
1779
2028
|
}
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
2029
|
+
builder = null;
|
|
2030
|
+
break;
|
|
2031
|
+
}
|
|
2032
|
+
// -- Result (terminal) --
|
|
2033
|
+
case "result": {
|
|
2034
|
+
const result = msg;
|
|
2035
|
+
const finalContent = buildFinalAssistantContent({
|
|
2036
|
+
intermediateToolBlocks,
|
|
2037
|
+
pendingContent: builder?.message.content,
|
|
2038
|
+
toolResultsById,
|
|
2039
|
+
lastThinkingContent,
|
|
2040
|
+
lastTextContent,
|
|
2041
|
+
fallbackResultText: result.subtype === "success" && result.result ? result.result : undefined,
|
|
1784
2042
|
});
|
|
2043
|
+
const finalMessage = {
|
|
2044
|
+
role: "assistant",
|
|
2045
|
+
content: finalContent,
|
|
2046
|
+
api: "anthropic-messages",
|
|
2047
|
+
provider: "claude-code",
|
|
2048
|
+
model: modelId,
|
|
2049
|
+
usage: mapUsage(result.usage, result.total_cost_usd),
|
|
2050
|
+
stopReason: result.is_error ? "error" : "stop",
|
|
2051
|
+
timestamp: Date.now(),
|
|
2052
|
+
};
|
|
2053
|
+
if (result.is_error) {
|
|
2054
|
+
finalMessage.errorMessage = getResultErrorMessage(result);
|
|
2055
|
+
stream.push({ type: "error", reason: "error", error: finalMessage });
|
|
2056
|
+
}
|
|
2057
|
+
else {
|
|
2058
|
+
stream.push({ type: "done", reason: "stop", message: finalMessage });
|
|
2059
|
+
}
|
|
2060
|
+
return;
|
|
1785
2061
|
}
|
|
2062
|
+
default:
|
|
2063
|
+
break;
|
|
1786
2064
|
}
|
|
1787
2065
|
}
|
|
1788
|
-
builder = null;
|
|
1789
|
-
break;
|
|
1790
2066
|
}
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
const result = msg;
|
|
1794
|
-
const finalContent = buildFinalAssistantContent({
|
|
1795
|
-
intermediateToolBlocks,
|
|
1796
|
-
pendingContent: builder?.message.content,
|
|
1797
|
-
toolResultsById,
|
|
1798
|
-
lastThinkingContent,
|
|
1799
|
-
lastTextContent,
|
|
1800
|
-
fallbackResultText: result.subtype === "success" && result.result ? result.result : undefined,
|
|
1801
|
-
});
|
|
1802
|
-
const finalMessage = {
|
|
1803
|
-
role: "assistant",
|
|
1804
|
-
content: finalContent,
|
|
1805
|
-
api: "anthropic-messages",
|
|
1806
|
-
provider: "claude-code",
|
|
1807
|
-
model: modelId,
|
|
1808
|
-
usage: mapUsage(result.usage, result.total_cost_usd),
|
|
1809
|
-
stopReason: result.is_error ? "error" : "stop",
|
|
1810
|
-
timestamp: Date.now(),
|
|
1811
|
-
};
|
|
1812
|
-
if (result.is_error) {
|
|
1813
|
-
finalMessage.errorMessage = getResultErrorMessage(result);
|
|
1814
|
-
stream.push({ type: "error", reason: "error", error: finalMessage });
|
|
1815
|
-
}
|
|
1816
|
-
else {
|
|
1817
|
-
stream.push({ type: "done", reason: "stop", message: finalMessage });
|
|
1818
|
-
}
|
|
1819
|
-
return;
|
|
2067
|
+
finally {
|
|
2068
|
+
options?.signal?.removeEventListener("abort", forwardAbort);
|
|
1820
2069
|
}
|
|
1821
|
-
|
|
1822
|
-
|
|
2070
|
+
// The SDK stream ended without a terminal `result` message and
|
|
2071
|
+
// without a readiness retry (the only restart path, via
|
|
2072
|
+
// `continue sdkAttemptLoop`). Break out so the post-loop
|
|
2073
|
+
// exhaustion handler emits a transient stream-exhausted error,
|
|
2074
|
+
// instead of silently starting another SDK session and looping
|
|
2075
|
+
// forever.
|
|
2076
|
+
break sdkAttemptLoop;
|
|
1823
2077
|
}
|
|
1824
2078
|
}
|
|
2079
|
+
finally {
|
|
2080
|
+
if (trackWorkflowMcpSdk)
|
|
2081
|
+
endWorkflowMcpSdkSession();
|
|
2082
|
+
}
|
|
1825
2083
|
// Generator exhaustion without a terminal result is a stream interruption,
|
|
1826
2084
|
// not a successful completion. Emitting an error lets GSD classify it as a
|
|
1827
2085
|
// transient provider failure instead of advancing auto-mode state.
|