@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.8e6112e9
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-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/help-text.js +5 -0
- 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 +81 -25
- 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 +5 -2
- 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/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +546 -426
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +256 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- 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 +80 -56
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +310 -78
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2299
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +6 -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-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +56 -63
- package/dist/resources/extensions/gsd/auto-model-selection.js +44 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +47 -17
- package/dist/resources/extensions/gsd/auto-prompts.js +161 -26
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +59 -52
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +14 -47
- package/dist/resources/extensions/gsd/auto-verification.js +30 -37
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +68 -370
- package/dist/resources/extensions/gsd/auto.js +71 -29
- 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/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +74 -50
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +316 -161
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +365 -58
- 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 +5 -15
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +66 -3
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -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/engine.js +757 -0
- package/dist/resources/extensions/gsd/db/queries.js +428 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +10 -1
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +186 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +174 -473
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +12 -1
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +97 -28
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- 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-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -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 +3 -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 +6 -3
- 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-payload-policy.js +83 -0
- 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/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +33 -5
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -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/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +24 -26
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +66 -11
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- 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 +41 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- 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/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +57 -25
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +114 -21
- 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-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- 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 +117 -0
- 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-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/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/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- 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 +40 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +4 -4
- 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 +8 -8
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/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/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 +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- 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/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.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/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +4 -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/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.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 +58 -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 +113 -40
- 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-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-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 +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +12 -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 +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +209 -103
- 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/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 +183 -76
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +193 -112
- 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/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.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/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- 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/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.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 +94 -26
- 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 +5 -2
- 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/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +651 -483
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +940 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +324 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- 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-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +89 -61
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +350 -81
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -2981
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +7 -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-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +68 -68
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +56 -16
- package/src/resources/extensions/gsd/auto-prompts.ts +225 -44
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +65 -53
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +21 -49
- package/src/resources/extensions/gsd/auto-verification.ts +33 -36
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -386
- package/src/resources/extensions/gsd/auto.ts +99 -34
- 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/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +93 -49
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +375 -177
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +452 -58
- 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 +5 -16
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +64 -3
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -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/engine.ts +811 -0
- package/src/resources/extensions/gsd/db/queries.ts +519 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +12 -1
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +190 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +240 -585
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +13 -1
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +121 -28
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- 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-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -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 +3 -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 +6 -3
- 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-payload-policy.ts +140 -0
- 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/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +36 -5
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -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/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +31 -27
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -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-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +649 -26
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +395 -30
- 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 +80 -2
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- 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/canonical-milestone-root.test.ts +20 -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 +44 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
- 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-complete-milestone-guard.test.ts +34 -3
- 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 +89 -0
- 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/doctor-scope-db-unavailable.test.ts +18 -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/evidence-xref-gsd-exec.test.ts +157 -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/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -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 +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- 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/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +120 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- 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/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- 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/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- 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/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +56 -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 +11 -4
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +51 -2
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +300 -41
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +9 -4
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- 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-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- 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 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +114 -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/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
- 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 +193 -13
- 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/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.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 +75 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.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 +188 -1
- package/src/resources/extensions/gsd/tool-contract.ts +124 -11
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- 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 +45 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- 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/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +80 -25
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +196 -21
- 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-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- 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 +144 -0
- 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-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +20 -25
- package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/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/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- 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 -195
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -88
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -198
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
|
@@ -14,13 +14,23 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
14
14
|
import { homedir } from "node:os";
|
|
15
15
|
import { createRequire } from "node:module";
|
|
16
16
|
import { dirname, join } from "node:path";
|
|
17
|
-
import {
|
|
17
|
+
import { ZERO_USAGE, mapUsage } from "./partial-builder.js";
|
|
18
|
+
import { attachExternalResultsToToolBlocks, buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, shouldSuppressDuplicateToolUnavailableBlock, } from "./turn-assembler.js";
|
|
18
19
|
import { buildWorkflowMcpServers, getRequiredWorkflowToolsForAutoUnit, resolveWorkflowMcpProjectRoot, } from "../gsd/workflow-mcp.js";
|
|
20
|
+
import { resolveWorkflowQuestionToolSurface } from "../gsd/question-transport.js";
|
|
19
21
|
import { buildProjectGsdMcpServers, ensureProjectWorkflowMcpConfig } from "../gsd/mcp-project-config.js";
|
|
20
22
|
import { loadProjectGSDPreferences } from "../gsd/preferences.js";
|
|
23
|
+
import { markToolStart, markToolEnd } from "../gsd/auto.js";
|
|
24
|
+
import { markInteractiveElicitationStart, markInteractiveElicitationEnd, } from "../gsd/auto-tool-tracking.js";
|
|
21
25
|
import { discoverBrowserMcpServerName, discoverMcpServers, discoverMcpServerNames, discoverUserMcpServerNames, discoverWorkflowMcpServerName, computeMcpDisallowedTools, } from "../gsd/mcp-filter.js";
|
|
22
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";
|
|
23
32
|
import { showInterviewRound } from "../shared/tui.js";
|
|
33
|
+
export { buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, mergePendingToolCalls, shouldSuppressDuplicateToolUnavailableBlock, } from "./turn-assembler.js";
|
|
24
34
|
export function serverToolUseToToolCallLike(block) {
|
|
25
35
|
const argumentsValue = block.input && typeof block.input === "object" && !Array.isArray(block.input)
|
|
26
36
|
? block.input
|
|
@@ -172,13 +182,18 @@ const GSD_PHASE_PATTERNS = [
|
|
|
172
182
|
["reassess-roadmap", /\b(?:UNIT:\s*Reassess Roadmap|reassess-roadmap)\b/i],
|
|
173
183
|
["complete-slice", /\b(?:UNIT:\s*Complete Slice|complete-slice)\b/i],
|
|
174
184
|
["replan-slice", /\b(?:UNIT:\s*Replan Slice|replan-slice)\b/i],
|
|
185
|
+
["refine-slice", /\b(?:UNIT:\s*Refine Slice|refine-slice)\b/i],
|
|
175
186
|
["plan-slice", /\b(?:UNIT:\s*Plan Slice|plan-slice|gsd_plan_slice)\b/i],
|
|
176
187
|
["plan-milestone", /\b(?:UNIT:\s*Plan Milestone|plan-milestone|gsd_plan_milestone)\b/i],
|
|
177
188
|
["execute-task", /\b(?:UNIT:\s*Execute Task|execute-task|execute-task-simple|reactive-execute)\b/i],
|
|
178
189
|
["gate-evaluate", /\b(?:UNIT:\s*Gate Evaluate|gate-evaluate|gsd_save_gate_result)\b/i],
|
|
179
190
|
["research-milestone", /\b(?:UNIT:\s*Research Milestone|research-milestone)\b/i],
|
|
180
191
|
["research-slice", /\b(?:UNIT:\s*Research Slice|research-slice)\b/i],
|
|
192
|
+
["research-decision", /\b(?:research decision|research-decision)\b/i],
|
|
181
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],
|
|
182
197
|
];
|
|
183
198
|
export function inferGsdPhaseFromContext(context) {
|
|
184
199
|
const text = [
|
|
@@ -191,6 +206,24 @@ export function inferGsdPhaseFromContext(context) {
|
|
|
191
206
|
}
|
|
192
207
|
return undefined;
|
|
193
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
|
+
}
|
|
194
227
|
/**
|
|
195
228
|
* Build a full conversational prompt from GSD's context messages.
|
|
196
229
|
*
|
|
@@ -216,10 +249,15 @@ export function buildPromptFromContext(context, toolContext = {}) {
|
|
|
216
249
|
const workflowToolLine = toolContext.workflowMcpServerName
|
|
217
250
|
? "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, gsd_save_gate_result, etc.) " +
|
|
218
251
|
`are MCP tools — call them as mcp__${toolContext.workflowMcpServerName}__<tool_name> ` +
|
|
219
|
-
`(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"
|
|
220
255
|
: "- GSD workflow MCP tools are unavailable in this Claude Code run.\n";
|
|
221
256
|
const toolSearchLine = toolContext.workflowMcpServerName
|
|
222
|
-
? "- 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"
|
|
223
261
|
: "- ToolSearch is NOT available — never use it to discover tools\n";
|
|
224
262
|
const browserToolLine = toolContext.browserMcpServerName
|
|
225
263
|
? "- Browser verification uses gsd-browser MCP by default — call browser tools as " +
|
|
@@ -313,9 +351,11 @@ export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext
|
|
|
313
351
|
message: { role: "user", content },
|
|
314
352
|
parent_tool_use_id: null,
|
|
315
353
|
};
|
|
316
|
-
return
|
|
317
|
-
|
|
318
|
-
|
|
354
|
+
return {
|
|
355
|
+
async *[Symbol.asyncIterator]() {
|
|
356
|
+
yield sdkMessage;
|
|
357
|
+
},
|
|
358
|
+
};
|
|
319
359
|
}
|
|
320
360
|
// ---------------------------------------------------------------------------
|
|
321
361
|
// Error helper
|
|
@@ -334,6 +374,40 @@ function makeErrorMessage(model, errorMsg) {
|
|
|
334
374
|
timestamp: Date.now(),
|
|
335
375
|
};
|
|
336
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
|
+
}
|
|
337
411
|
export function isClaudeCodeAbortErrorMessage(message) {
|
|
338
412
|
if (!message)
|
|
339
413
|
return false;
|
|
@@ -1078,7 +1152,26 @@ export function createClaudeCodeCanUseToolHandler(ui) {
|
|
|
1078
1152
|
// ---------------------------------------------------------------------------
|
|
1079
1153
|
// Elicitation handler
|
|
1080
1154
|
// ---------------------------------------------------------------------------
|
|
1081
|
-
/**
|
|
1155
|
+
/**
|
|
1156
|
+
* Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available.
|
|
1157
|
+
*
|
|
1158
|
+
* For structured (AskUserQuestion) elicitations, the interview round's result
|
|
1159
|
+
* disambiguates two cases that must not be conflated: an `undefined` result
|
|
1160
|
+
* means the custom UI is unavailable, so we fall back to the simpler `select`
|
|
1161
|
+
* dialogs; an empty-answers result means the user dismissed the question, which
|
|
1162
|
+
* is treated as a clean cancel. Falling back to dialogs on dismissal would
|
|
1163
|
+
* re-ask the same questions (the duplicate-question bug).
|
|
1164
|
+
*/
|
|
1165
|
+
/**
|
|
1166
|
+
* Monotonic counter so concurrent/sequential elicitations resolved within the
|
|
1167
|
+
* same millisecond get distinct synthetic in-flight-tool ids (the `cc-elicit-*`
|
|
1168
|
+
* namespace never collides with real MCP toolCallIds).
|
|
1169
|
+
*/
|
|
1170
|
+
let _elicitationSeq = 0;
|
|
1171
|
+
function nextElicitationSeq() {
|
|
1172
|
+
_elicitationSeq = (_elicitationSeq + 1) % Number.MAX_SAFE_INTEGER;
|
|
1173
|
+
return _elicitationSeq;
|
|
1174
|
+
}
|
|
1082
1175
|
export function createClaudeCodeElicitationHandler(ui) {
|
|
1083
1176
|
if (!ui)
|
|
1084
1177
|
return undefined;
|
|
@@ -1091,18 +1184,64 @@ export function createClaudeCodeElicitationHandler(ui) {
|
|
|
1091
1184
|
const headlessAnswer = answerElicitationFromHeadlessAnswers(questions, loadHeadlessAnswers());
|
|
1092
1185
|
if (headlessAnswer)
|
|
1093
1186
|
return headlessAnswer;
|
|
1094
|
-
|
|
1095
|
-
|
|
1187
|
+
// The SDK elicitation blocks waiting for human input, but it is not an
|
|
1188
|
+
// MCP tool dispatch, so markToolStart/markToolEnd are never called for
|
|
1189
|
+
// it. Without this the soft/context/idle/hard watchdogs see zero
|
|
1190
|
+
// in-flight tools and re-dispatch (and ultimately abort) the agent
|
|
1191
|
+
// turn hosting this elicitation, tearing the question down (#2676 /
|
|
1192
|
+
// claude-code-cli self-cancel loop). Bracketing the human wait with
|
|
1193
|
+
// the s.active-gated interactive-tool guard makes it visible to
|
|
1194
|
+
// hasInteractiveToolInFlight()/getInFlightToolCount() so those
|
|
1195
|
+
// watchdogs exempt it. No-op outside auto-mode (wrapper self-gates).
|
|
1196
|
+
//
|
|
1197
|
+
// markInteractiveElicitationStart/End is a SEPARATE, ungated signal that
|
|
1198
|
+
// is observable in FOREGROUND (where the s.active-gated markToolStart is a
|
|
1199
|
+
// no-op). The foreground approval-gate pause path (register-hooks
|
|
1200
|
+
// message_update) consults isInteractiveElicitationInFlight() and bails so
|
|
1201
|
+
// it does not tear down the very elicitation that IS the human boundary
|
|
1202
|
+
// (#cc-elicitation-self-cancel). It clears in the finally on every exit.
|
|
1203
|
+
const elicId = "cc-elicit-" + (request.id ?? `${Date.now()}-${nextElicitationSeq()}`);
|
|
1204
|
+
markInteractiveElicitationStart();
|
|
1205
|
+
markToolStart(elicId, "ask_user_questions");
|
|
1206
|
+
try {
|
|
1207
|
+
const interviewResult = await showInterviewRound(questions, { signal, overlay: true }, { ui }).catch(() => undefined);
|
|
1208
|
+
if (interviewResult === undefined) {
|
|
1209
|
+
// `await` so the dialog human-wait stays inside try/finally and the
|
|
1210
|
+
// in-flight guard is held until the dialog resolves. Without it,
|
|
1211
|
+
// `finally` runs the moment the promise is created and the fallback
|
|
1212
|
+
// wait runs with zero in-flight tools — reintroducing the
|
|
1213
|
+
// self-cancel on this path (Bugbot #1c00624d).
|
|
1214
|
+
return await promptElicitationWithDialogs(request, questions, ui, signal);
|
|
1215
|
+
}
|
|
1216
|
+
if (Object.keys(interviewResult.answers).length === 0) {
|
|
1217
|
+
// A system/host teardown (compaction, session_switch, true
|
|
1218
|
+
// interrupt) that aborted the signal mid-wait sets `interrupted`.
|
|
1219
|
+
// Surface that as a non-affirmative `decline` so it is not
|
|
1220
|
+
// laundered into a clean user-declined `cancel` the model re-asks
|
|
1221
|
+
// against. A genuine user dismissal leaves `interrupted` falsy and
|
|
1222
|
+
// keeps the prior `cancel` semantics.
|
|
1223
|
+
return interviewResult.interrupted ? { action: "decline" } : { action: "cancel" };
|
|
1224
|
+
}
|
|
1096
1225
|
return {
|
|
1097
1226
|
action: "accept",
|
|
1098
1227
|
content: roundResultToElicitationContent(questions, interviewResult),
|
|
1099
1228
|
};
|
|
1100
1229
|
}
|
|
1101
|
-
|
|
1230
|
+
finally {
|
|
1231
|
+
markToolEnd(elicId);
|
|
1232
|
+
markInteractiveElicitationEnd();
|
|
1233
|
+
}
|
|
1102
1234
|
}
|
|
1103
1235
|
const textFields = parseTextInputElicitation(request);
|
|
1104
1236
|
if (textFields) {
|
|
1105
|
-
|
|
1237
|
+
const elicId = "cc-elicit-" + (request.id ?? `${Date.now()}-${nextElicitationSeq()}`);
|
|
1238
|
+
markToolStart(elicId, "secure_env_collect");
|
|
1239
|
+
try {
|
|
1240
|
+
return await promptTextInputElicitation(request, textFields, ui, signal);
|
|
1241
|
+
}
|
|
1242
|
+
finally {
|
|
1243
|
+
markToolEnd(elicId);
|
|
1244
|
+
}
|
|
1106
1245
|
}
|
|
1107
1246
|
return { action: "decline" };
|
|
1108
1247
|
};
|
|
@@ -1172,6 +1311,8 @@ function modelSupportsAdaptiveThinking(modelId) {
|
|
|
1172
1311
|
|| modelId.includes("opus-4.7")
|
|
1173
1312
|
|| modelId.includes("opus-4-8")
|
|
1174
1313
|
|| modelId.includes("opus-4.8")
|
|
1314
|
+
|| modelId.includes("fable-5")
|
|
1315
|
+
|| modelId.includes("fable.5")
|
|
1175
1316
|
|| modelId.includes("sonnet-4-6")
|
|
1176
1317
|
|| modelId.includes("sonnet-4.6")
|
|
1177
1318
|
|| modelId.includes("sonnet-4-7")
|
|
@@ -1193,7 +1334,9 @@ function mapThinkingLevelToAnthropicEffort(level, modelId) {
|
|
|
1193
1334
|
if (modelId.includes("opus-4-7")
|
|
1194
1335
|
|| modelId.includes("opus-4.7")
|
|
1195
1336
|
|| modelId.includes("opus-4-8")
|
|
1196
|
-
|| modelId.includes("opus-4.8")
|
|
1337
|
+
|| modelId.includes("opus-4.8")
|
|
1338
|
+
|| modelId.includes("fable-5")
|
|
1339
|
+
|| modelId.includes("fable.5"))
|
|
1197
1340
|
return "xhigh";
|
|
1198
1341
|
if (modelId.includes("opus-4-6") || modelId.includes("opus-4.6"))
|
|
1199
1342
|
return "max";
|
|
@@ -1215,7 +1358,7 @@ function browserMcpServerNameFromAllowedTools(allowedTools) {
|
|
|
1215
1358
|
const parsed = parseAllowedMcpToolName(toolName);
|
|
1216
1359
|
if (!parsed)
|
|
1217
1360
|
continue;
|
|
1218
|
-
if (parsed.server === "gsd-browser" || parsed.tool
|
|
1361
|
+
if (parsed.server === "gsd-browser" || hasBrowserContractPrefix(parsed.tool)) {
|
|
1219
1362
|
return parsed.server;
|
|
1220
1363
|
}
|
|
1221
1364
|
}
|
|
@@ -1229,7 +1372,7 @@ function workflowMcpServerNameFromAllowedTools(allowedTools) {
|
|
|
1229
1372
|
if (typeof toolName !== "string")
|
|
1230
1373
|
continue;
|
|
1231
1374
|
const parsed = parseAllowedMcpToolName(toolName);
|
|
1232
|
-
if (!parsed || parsed.server === browserServerName || parsed.tool
|
|
1375
|
+
if (!parsed || parsed.server === browserServerName || hasBrowserContractPrefix(parsed.tool))
|
|
1233
1376
|
continue;
|
|
1234
1377
|
return parsed.server;
|
|
1235
1378
|
}
|
|
@@ -1278,11 +1421,13 @@ function resolveProjectMcpServerConfigs(projectRoot, serverNames, fallbackServer
|
|
|
1278
1421
|
function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, workflowExplicitlyBlocked) {
|
|
1279
1422
|
if (!gsdPhase || !workflowServerName || workflowExplicitlyBlocked)
|
|
1280
1423
|
return [];
|
|
1281
|
-
const
|
|
1424
|
+
const requestedTools = gsdPhase === "run-uat"
|
|
1282
1425
|
? [...RUN_UAT_WORKFLOW_TOOL_NAMES]
|
|
1283
|
-
:
|
|
1284
|
-
|
|
1285
|
-
|
|
1426
|
+
: [
|
|
1427
|
+
...(getUnitToolSurfaceContract(gsdPhase)?.allowedGsdTools ?? []),
|
|
1428
|
+
...getRequiredWorkflowToolsForAutoUnit(gsdPhase),
|
|
1429
|
+
];
|
|
1430
|
+
const requestedToolNames = [...new Set(requestedTools.filter((toolName) => toolName.startsWith("gsd_") || toolName === "ask_user_questions"))];
|
|
1286
1431
|
if (requestedToolNames.length === 0)
|
|
1287
1432
|
return [];
|
|
1288
1433
|
return resolveToolPresentationPlan({
|
|
@@ -1292,6 +1437,25 @@ function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, work
|
|
|
1292
1437
|
requestedToolNames,
|
|
1293
1438
|
}).presentedToolNames;
|
|
1294
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
|
+
}
|
|
1295
1459
|
export function autoInitClaudeCodeWorkflowMcp(cwd) {
|
|
1296
1460
|
const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
|
|
1297
1461
|
try {
|
|
@@ -1303,6 +1467,51 @@ export function autoInitClaudeCodeWorkflowMcp(cwd) {
|
|
|
1303
1467
|
}
|
|
1304
1468
|
}
|
|
1305
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
|
+
}
|
|
1306
1515
|
/**
|
|
1307
1516
|
* Build the options object passed to the Claude Agent SDK's `query()` call.
|
|
1308
1517
|
*
|
|
@@ -1417,6 +1626,13 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
|
|
|
1417
1626
|
// leave allowed mcp__... tools with no registered backing tool.
|
|
1418
1627
|
const settingSources = strictMcpConfig ? [] : ["user", "project", "local"];
|
|
1419
1628
|
const exactWorkflowMcpTools = resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, workflowExplicitlyBlocked);
|
|
1629
|
+
const questionToolSurface = resolveWorkflowQuestionToolSurface({
|
|
1630
|
+
workflowServerName,
|
|
1631
|
+
workflowExplicitlyBlocked,
|
|
1632
|
+
workflowMcpTools,
|
|
1633
|
+
exactWorkflowMcpTools,
|
|
1634
|
+
env: process.env,
|
|
1635
|
+
});
|
|
1420
1636
|
const runUatDisallowedTools = gsdPhase === "run-uat" && workflowServerName
|
|
1421
1637
|
? [
|
|
1422
1638
|
...RUN_UAT_FORBIDDEN_TOOL_NAMES.filter((toolName) => !toolName.startsWith("mcp__")),
|
|
@@ -1427,33 +1643,27 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
|
|
|
1427
1643
|
`mcp__${workflowServerName}__gsd_save_gate_result`,
|
|
1428
1644
|
]
|
|
1429
1645
|
: [];
|
|
1646
|
+
const allowToolSearchForWorkflowMcp = workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0;
|
|
1430
1647
|
const disallowedTools = [...new Set([
|
|
1431
|
-
"ToolSearch",
|
|
1648
|
+
...(allowToolSearchForWorkflowMcp ? [] : ["ToolSearch"]),
|
|
1649
|
+
...(gsdPhase ? ["Skill"] : []),
|
|
1432
1650
|
...(workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
|
|
1651
|
+
...questionToolSurface.disallowedTools,
|
|
1433
1652
|
...runUatDisallowedTools,
|
|
1434
1653
|
...extraDisallowedTools,
|
|
1435
1654
|
])];
|
|
1436
|
-
const
|
|
1437
|
-
"Read",
|
|
1438
|
-
"Write",
|
|
1439
|
-
"Edit",
|
|
1440
|
-
"Glob",
|
|
1441
|
-
"Grep",
|
|
1442
|
-
"Bash",
|
|
1443
|
-
"Agent",
|
|
1444
|
-
"WebFetch",
|
|
1445
|
-
"WebSearch",
|
|
1446
|
-
];
|
|
1655
|
+
const nativeTools = resolveClaudeNativeToolsForPhase(gsdPhase);
|
|
1447
1656
|
const allowedTools = gsdPhase === "run-uat"
|
|
1448
1657
|
? [
|
|
1449
|
-
...
|
|
1658
|
+
...nativeTools,
|
|
1450
1659
|
...(exactWorkflowMcpTools.length > 0 ? exactWorkflowMcpTools : []),
|
|
1451
1660
|
...allowedBrowserMcpTools,
|
|
1452
1661
|
]
|
|
1453
1662
|
: [
|
|
1454
|
-
...
|
|
1663
|
+
...nativeTools,
|
|
1455
1664
|
...exactWorkflowMcpTools,
|
|
1456
|
-
...(workflowMcpTools.length > 0 ? workflowMcpTools : [
|
|
1665
|
+
...(!gsdPhase && workflowMcpTools.length > 0 ? workflowMcpTools : []),
|
|
1666
|
+
...(workflowMcpTools.length === 0 && exactWorkflowMcpTools.length === 0 ? ["AskUserQuestion"] : []),
|
|
1457
1667
|
...allowedBrowserMcpTools,
|
|
1458
1668
|
];
|
|
1459
1669
|
const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
|
|
@@ -1486,234 +1696,14 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
|
|
|
1486
1696
|
|| modelId.includes("opus-4-7")
|
|
1487
1697
|
|| modelId.includes("opus-4.7")
|
|
1488
1698
|
|| modelId.includes("opus-4-8")
|
|
1489
|
-
|| modelId.includes("opus-4.8")
|
|
1699
|
+
|| modelId.includes("opus-4.8")
|
|
1700
|
+
|| modelId.includes("fable-5")
|
|
1701
|
+
|| modelId.includes("fable.5")) ? ["context-1m-2025-08-07"] : [],
|
|
1490
1702
|
...(thinkingConfig ?? {}),
|
|
1491
1703
|
...(effort ? { effort } : {}),
|
|
1492
1704
|
...sdkExtraOptions,
|
|
1493
1705
|
};
|
|
1494
1706
|
}
|
|
1495
|
-
/** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
|
|
1496
|
-
function normalizeToolResultContent(content) {
|
|
1497
|
-
if (typeof content === "string") {
|
|
1498
|
-
return [{ type: "text", text: content }];
|
|
1499
|
-
}
|
|
1500
|
-
if (!Array.isArray(content)) {
|
|
1501
|
-
if (content == null)
|
|
1502
|
-
return [{ type: "text", text: "" }];
|
|
1503
|
-
return [{ type: "text", text: JSON.stringify(content) }];
|
|
1504
|
-
}
|
|
1505
|
-
const blocks = [];
|
|
1506
|
-
for (const item of content) {
|
|
1507
|
-
if (typeof item === "string") {
|
|
1508
|
-
blocks.push({ type: "text", text: item });
|
|
1509
|
-
continue;
|
|
1510
|
-
}
|
|
1511
|
-
if (!item || typeof item !== "object") {
|
|
1512
|
-
blocks.push({ type: "text", text: String(item) });
|
|
1513
|
-
continue;
|
|
1514
|
-
}
|
|
1515
|
-
const block = item;
|
|
1516
|
-
if (block.type === "text") {
|
|
1517
|
-
blocks.push({ type: "text", text: typeof block.text === "string" ? block.text : "" });
|
|
1518
|
-
continue;
|
|
1519
|
-
}
|
|
1520
|
-
if (block.type === "image"
|
|
1521
|
-
&& typeof block.data === "string"
|
|
1522
|
-
&& typeof block.mimeType === "string") {
|
|
1523
|
-
blocks.push({ type: "image", data: block.data, mimeType: block.mimeType });
|
|
1524
|
-
continue;
|
|
1525
|
-
}
|
|
1526
|
-
blocks.push({ type: "text", text: JSON.stringify(block) });
|
|
1527
|
-
}
|
|
1528
|
-
return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
|
|
1529
|
-
}
|
|
1530
|
-
/**
|
|
1531
|
-
* Extract a `details` payload from an MCP tool-result block.
|
|
1532
|
-
*
|
|
1533
|
-
* MCP's `CallToolResult` carries structured data in `structuredContent` — the
|
|
1534
|
-
* protocol's supported channel for non-text payloads. Claude Code's synthetic
|
|
1535
|
-
* user message may surface that field in one of two shapes depending on SDK
|
|
1536
|
-
* version: as a sibling on the `mcp_tool_result` block itself, or as a
|
|
1537
|
-
* dedicated content sub-block with `type: "structuredContent"`. Snake-case
|
|
1538
|
-
* (`structured_content`) is accepted defensively in case a transport hop
|
|
1539
|
-
* rewrites casing. All other shapes fall back to an empty object so callers
|
|
1540
|
-
* can rely on `details` being present.
|
|
1541
|
-
*/
|
|
1542
|
-
function extractStructuredDetailsFromBlock(block) {
|
|
1543
|
-
const sibling = block.structuredContent ?? block.structured_content;
|
|
1544
|
-
if (sibling && typeof sibling === "object" && !Array.isArray(sibling)) {
|
|
1545
|
-
return sibling;
|
|
1546
|
-
}
|
|
1547
|
-
if (Array.isArray(block.content)) {
|
|
1548
|
-
for (const item of block.content) {
|
|
1549
|
-
if (!item || typeof item !== "object")
|
|
1550
|
-
continue;
|
|
1551
|
-
const sub = item;
|
|
1552
|
-
if (sub.type !== "structuredContent" && sub.type !== "structured_content")
|
|
1553
|
-
continue;
|
|
1554
|
-
const payload = sub.structuredContent ?? sub.structured_content ?? sub.data ?? sub.value;
|
|
1555
|
-
if (payload && typeof payload === "object" && !Array.isArray(payload)) {
|
|
1556
|
-
return payload;
|
|
1557
|
-
}
|
|
1558
|
-
}
|
|
1559
|
-
}
|
|
1560
|
-
// Return undefined (not {}) when no structured payload is present, matching
|
|
1561
|
-
// the pre-#4477 contract where `details` was nullable. An empty-object
|
|
1562
|
-
// sentinel is truthy and breaks downstream consumers that gate on
|
|
1563
|
-
// `if (details)`. `undefined` matches the type of the field these results
|
|
1564
|
-
// flow into (`Record<string, unknown> | undefined`).
|
|
1565
|
-
return undefined;
|
|
1566
|
-
}
|
|
1567
|
-
/**
|
|
1568
|
-
* True for items that are MCP `structuredContent` pseudo-blocks living inside
|
|
1569
|
-
* a tool-result `content[]` array. These blocks carry the structured payload
|
|
1570
|
-
* (extracted separately by `extractStructuredDetailsFromBlock`) and must NOT
|
|
1571
|
-
* leak into the visible content rendered to the user — otherwise the renderer
|
|
1572
|
-
* stringifies the JSON pseudo-block and shows it next to the actual tool
|
|
1573
|
-
* output. See PR #4477 review (post-fix-round).
|
|
1574
|
-
*/
|
|
1575
|
-
function isStructuredContentPseudoBlock(item) {
|
|
1576
|
-
if (!item || typeof item !== "object")
|
|
1577
|
-
return false;
|
|
1578
|
-
const type = item.type;
|
|
1579
|
-
return type === "structuredContent" || type === "structured_content";
|
|
1580
|
-
}
|
|
1581
|
-
/**
|
|
1582
|
-
* Strip `structuredContent` pseudo-blocks from a tool-result content array
|
|
1583
|
-
* before normalization. The structured payload is extracted via the sibling
|
|
1584
|
-
* `structuredContent` field (or a dedicated extractor pass on the raw block);
|
|
1585
|
-
* the visible content path must not include the pseudo-block itself.
|
|
1586
|
-
*/
|
|
1587
|
-
function stripStructuredContentPseudoBlocks(content) {
|
|
1588
|
-
if (!Array.isArray(content))
|
|
1589
|
-
return content;
|
|
1590
|
-
return content.filter((item) => !isStructuredContentPseudoBlock(item));
|
|
1591
|
-
}
|
|
1592
|
-
/** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
|
|
1593
|
-
export function extractToolResultsFromSdkUserMessage(message) {
|
|
1594
|
-
const extracted = [];
|
|
1595
|
-
const seen = new Set();
|
|
1596
|
-
const rawMessage = message.message;
|
|
1597
|
-
const content = Array.isArray(rawMessage?.content) ? rawMessage.content : [];
|
|
1598
|
-
for (const item of content) {
|
|
1599
|
-
if (!item || typeof item !== "object")
|
|
1600
|
-
continue;
|
|
1601
|
-
const block = item;
|
|
1602
|
-
const type = typeof block.type === "string" ? block.type : "";
|
|
1603
|
-
if (type !== "tool_result" && type !== "mcp_tool_result")
|
|
1604
|
-
continue;
|
|
1605
|
-
const toolUseId = typeof block.tool_use_id === "string" ? block.tool_use_id : "";
|
|
1606
|
-
if (!toolUseId || seen.has(toolUseId))
|
|
1607
|
-
continue;
|
|
1608
|
-
seen.add(toolUseId);
|
|
1609
|
-
extracted.push({
|
|
1610
|
-
toolUseId,
|
|
1611
|
-
result: {
|
|
1612
|
-
content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(block.content)),
|
|
1613
|
-
details: extractStructuredDetailsFromBlock(block),
|
|
1614
|
-
isError: block.is_error === true,
|
|
1615
|
-
},
|
|
1616
|
-
});
|
|
1617
|
-
}
|
|
1618
|
-
if (extracted.length === 0) {
|
|
1619
|
-
const fallback = message.tool_use_result;
|
|
1620
|
-
if (fallback && typeof fallback === "object") {
|
|
1621
|
-
const toolResult = fallback;
|
|
1622
|
-
const toolUseId = typeof toolResult.tool_use_id === "string" ? toolResult.tool_use_id : "";
|
|
1623
|
-
if (toolUseId) {
|
|
1624
|
-
extracted.push({
|
|
1625
|
-
toolUseId,
|
|
1626
|
-
result: {
|
|
1627
|
-
content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(toolResult.content)),
|
|
1628
|
-
details: extractStructuredDetailsFromBlock(toolResult),
|
|
1629
|
-
isError: toolResult.is_error === true,
|
|
1630
|
-
},
|
|
1631
|
-
});
|
|
1632
|
-
}
|
|
1633
|
-
}
|
|
1634
|
-
}
|
|
1635
|
-
return extracted;
|
|
1636
|
-
}
|
|
1637
|
-
/** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
|
|
1638
|
-
function attachExternalResultsToToolBlocks(toolBlocks, toolResultsById) {
|
|
1639
|
-
for (const block of toolBlocks) {
|
|
1640
|
-
if (block.type !== "toolCall" && block.type !== "serverToolUse")
|
|
1641
|
-
continue;
|
|
1642
|
-
const externalResult = toolResultsById.get(block.id);
|
|
1643
|
-
if (!externalResult)
|
|
1644
|
-
continue;
|
|
1645
|
-
block.externalResult = externalResult;
|
|
1646
|
-
}
|
|
1647
|
-
}
|
|
1648
|
-
/**
|
|
1649
|
-
* Build the final assistant content that Agent Core consumes in
|
|
1650
|
-
* `externalToolExecution` mode. This preserves tool-call blocks, attaches any
|
|
1651
|
-
* SDK-produced external results by tool-call id, and then appends the final
|
|
1652
|
-
* text/thinking blocks for the completed turn.
|
|
1653
|
-
*/
|
|
1654
|
-
export function buildFinalAssistantContent(params) {
|
|
1655
|
-
const mergedToolBlocks = [...params.intermediateToolBlocks];
|
|
1656
|
-
if (params.pendingContent) {
|
|
1657
|
-
mergePendingToolCalls(mergedToolBlocks, params.pendingContent);
|
|
1658
|
-
}
|
|
1659
|
-
attachExternalResultsToToolBlocks(mergedToolBlocks, params.toolResultsById);
|
|
1660
|
-
const finalContent = [...mergedToolBlocks];
|
|
1661
|
-
if (params.pendingContent && params.pendingContent.length > 0) {
|
|
1662
|
-
for (const block of params.pendingContent) {
|
|
1663
|
-
if (block.type === "text" || block.type === "thinking") {
|
|
1664
|
-
finalContent.push(block);
|
|
1665
|
-
}
|
|
1666
|
-
}
|
|
1667
|
-
}
|
|
1668
|
-
else {
|
|
1669
|
-
if (params.lastThinkingContent) {
|
|
1670
|
-
finalContent.push({ type: "thinking", thinking: params.lastThinkingContent });
|
|
1671
|
-
}
|
|
1672
|
-
if (params.lastTextContent) {
|
|
1673
|
-
finalContent.push({ type: "text", text: params.lastTextContent });
|
|
1674
|
-
}
|
|
1675
|
-
}
|
|
1676
|
-
if (finalContent.length === 0 && params.fallbackResultText) {
|
|
1677
|
-
finalContent.push({ type: "text", text: params.fallbackResultText });
|
|
1678
|
-
}
|
|
1679
|
-
return finalContent;
|
|
1680
|
-
}
|
|
1681
|
-
/**
|
|
1682
|
-
* Merge tool-call blocks from the active partial-message builder into the
|
|
1683
|
-
* running list of intermediate tool calls, preserving order and de-duping
|
|
1684
|
-
* by tool-call id. Exposed for testing the F3 fix (final-turn tool calls
|
|
1685
|
-
* dropped when `result` arrives without a preceding synthetic `user`).
|
|
1686
|
-
*/
|
|
1687
|
-
export function mergePendingToolCalls(intermediate, pending) {
|
|
1688
|
-
const alreadyIncluded = new Set();
|
|
1689
|
-
for (const block of intermediate) {
|
|
1690
|
-
if (block.type === "toolCall")
|
|
1691
|
-
alreadyIncluded.add(block.id);
|
|
1692
|
-
}
|
|
1693
|
-
for (const block of pending) {
|
|
1694
|
-
if (block.type !== "toolCall")
|
|
1695
|
-
continue;
|
|
1696
|
-
if (alreadyIncluded.has(block.id))
|
|
1697
|
-
continue;
|
|
1698
|
-
alreadyIncluded.add(block.id);
|
|
1699
|
-
intermediate.push(block);
|
|
1700
|
-
}
|
|
1701
|
-
return intermediate;
|
|
1702
|
-
}
|
|
1703
|
-
export function handleClaudeCodePartialStreamEvent(builder, event, modelId) {
|
|
1704
|
-
if (event.type === "message_start") {
|
|
1705
|
-
// Claude Code can emit repeated SDK message_start events inside one
|
|
1706
|
-
// logical assistant response. Keep appending until a synthetic user
|
|
1707
|
-
// tool-result boundary explicitly clears the builder.
|
|
1708
|
-
return {
|
|
1709
|
-
builder: builder ?? new PartialMessageBuilder(event.message?.model ?? modelId),
|
|
1710
|
-
assistantEvent: null,
|
|
1711
|
-
};
|
|
1712
|
-
}
|
|
1713
|
-
if (!builder)
|
|
1714
|
-
return { builder, assistantEvent: null };
|
|
1715
|
-
return { builder, assistantEvent: builder.handleEvent(event) };
|
|
1716
|
-
}
|
|
1717
1707
|
// ---------------------------------------------------------------------------
|
|
1718
1708
|
// streamSimple implementation
|
|
1719
1709
|
// ---------------------------------------------------------------------------
|
|
@@ -1730,33 +1720,33 @@ export function streamViaClaudeCode(model, context, options) {
|
|
|
1730
1720
|
void pumpSdkMessages(model, context, options, stream);
|
|
1731
1721
|
return stream;
|
|
1732
1722
|
}
|
|
1723
|
+
function createSdkAttemptMessageState() {
|
|
1724
|
+
return {
|
|
1725
|
+
builder: null,
|
|
1726
|
+
intermediateToolBlocks: [],
|
|
1727
|
+
toolResultsById: new Map(),
|
|
1728
|
+
};
|
|
1729
|
+
}
|
|
1733
1730
|
/** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
|
|
1734
1731
|
async function pumpSdkMessages(model, context, options, stream) {
|
|
1735
1732
|
const modelId = model.id;
|
|
1736
|
-
let builder = null;
|
|
1737
1733
|
/** Track the last text content seen across all assistant turns for the final message. */
|
|
1738
1734
|
let lastTextContent = "";
|
|
1739
1735
|
let lastThinkingContent = "";
|
|
1740
|
-
/** Collect tool blocks from intermediate SDK turns for tool execution rendering. */
|
|
1741
|
-
const intermediateToolBlocks = [];
|
|
1742
|
-
/** Preserve real external tool results from Claude Code's synthetic user messages. */
|
|
1743
|
-
const toolResultsById = new Map();
|
|
1744
1736
|
try {
|
|
1745
|
-
// Dynamic import — the SDK is an optional dependency.
|
|
1746
|
-
const sdkModule = "@anthropic-ai/claude-agent-sdk";
|
|
1747
|
-
const sdk = (await import(/* webpackIgnore: true */ sdkModule));
|
|
1748
|
-
// Bridge GSD's AbortSignal to SDK's AbortController
|
|
1749
|
-
const controller = new AbortController();
|
|
1750
|
-
if (options?.signal) {
|
|
1751
|
-
options.signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
1752
|
-
}
|
|
1753
1737
|
const permissionMode = await resolveClaudePermissionMode();
|
|
1754
|
-
const
|
|
1755
|
-
const
|
|
1756
|
-
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;
|
|
1757
1746
|
const cwd = resolveClaudeCodeCwd(options);
|
|
1747
|
+
const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
|
|
1758
1748
|
autoInitClaudeCodeWorkflowMcp(cwd);
|
|
1759
|
-
const gsdPhase =
|
|
1749
|
+
const gsdPhase = resolveGsdPhaseForSdk(context, projectRoot);
|
|
1760
1750
|
const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
|
|
1761
1751
|
// When no UI is available (headless / auto-mode), auto-approve all
|
|
1762
1752
|
// tool requests. This replaces the old bypassPermissions workaround.
|
|
@@ -1773,18 +1763,14 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
1773
1763
|
}
|
|
1774
1764
|
: {}),
|
|
1775
1765
|
});
|
|
1766
|
+
const workflowMcpServerName = workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools);
|
|
1767
|
+
const allowPendingToolSearchHydration = Boolean(workflowMcpServerName && gsdPhase)
|
|
1768
|
+
&& !sdkOpts.disallowedTools?.includes("ToolSearch");
|
|
1776
1769
|
const prompt = buildPromptFromContext(context, {
|
|
1777
|
-
workflowMcpServerName
|
|
1770
|
+
workflowMcpServerName,
|
|
1778
1771
|
browserMcpServerName: browserMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
|
|
1779
1772
|
});
|
|
1780
1773
|
const queryPrompt = buildSdkQueryPrompt(context, prompt);
|
|
1781
|
-
const queryResult = sdk.query({
|
|
1782
|
-
prompt: queryPrompt,
|
|
1783
|
-
options: {
|
|
1784
|
-
...sdkOpts,
|
|
1785
|
-
abortController: controller,
|
|
1786
|
-
},
|
|
1787
|
-
});
|
|
1788
1774
|
// Emit start with an empty partial
|
|
1789
1775
|
const initialPartial = {
|
|
1790
1776
|
role: "assistant",
|
|
@@ -1797,169 +1783,303 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
1797
1783
|
timestamp: Date.now(),
|
|
1798
1784
|
};
|
|
1799
1785
|
stream.push({ type: "start", partial: initialPartial });
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
const
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
console.warn("[claude-code] onExternalToolCall callback failed:", error);
|
|
1835
|
-
}
|
|
1836
|
-
}
|
|
1837
|
-
}
|
|
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;
|
|
1838
1820
|
}
|
|
1839
|
-
|
|
1821
|
+
workflowMcpPreflightVerified = true;
|
|
1840
1822
|
}
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
const sdkAssistant = msg;
|
|
1844
|
-
// Capture text content from complete messages
|
|
1845
|
-
for (const block of sdkAssistant.message.content) {
|
|
1846
|
-
if (block.type === "text") {
|
|
1847
|
-
lastTextContent = block.text;
|
|
1848
|
-
}
|
|
1849
|
-
else if (block.type === "thinking") {
|
|
1850
|
-
lastThinkingContent = block.thinking;
|
|
1851
|
-
}
|
|
1852
|
-
}
|
|
1853
|
-
break;
|
|
1823
|
+
finally {
|
|
1824
|
+
uiContext?.setStatus?.("gsd-step", "");
|
|
1854
1825
|
}
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
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;
|
|
1870
1856
|
}
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
// Push synthetic completion events with result attached so the
|
|
1890
|
-
// chat-controller can update pending ToolExecutionComponents.
|
|
1891
|
-
if (block.type === "toolCall") {
|
|
1892
|
-
try {
|
|
1893
|
-
await onExternalToolResult?.({
|
|
1894
|
-
toolCall: block,
|
|
1895
|
-
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,
|
|
1896
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
|
+
}
|
|
1897
1906
|
}
|
|
1898
|
-
|
|
1899
|
-
|
|
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
|
+
}
|
|
1900
1929
|
}
|
|
1901
|
-
|
|
1902
|
-
type: "toolcall_end",
|
|
1903
|
-
contentIndex,
|
|
1904
|
-
toolCall: block,
|
|
1905
|
-
partial: builder.message,
|
|
1906
|
-
});
|
|
1930
|
+
break;
|
|
1907
1931
|
}
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
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
|
+
}
|
|
1943
|
+
}
|
|
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
|
+
}
|
|
1914
1962
|
}
|
|
1915
|
-
|
|
1916
|
-
|
|
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);
|
|
1917
1967
|
}
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
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
|
+
}
|
|
2028
|
+
}
|
|
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,
|
|
1922
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;
|
|
1923
2061
|
}
|
|
2062
|
+
default:
|
|
2063
|
+
break;
|
|
1924
2064
|
}
|
|
1925
2065
|
}
|
|
1926
|
-
builder = null;
|
|
1927
|
-
break;
|
|
1928
2066
|
}
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
const result = msg;
|
|
1932
|
-
const finalContent = buildFinalAssistantContent({
|
|
1933
|
-
intermediateToolBlocks,
|
|
1934
|
-
pendingContent: builder?.message.content,
|
|
1935
|
-
toolResultsById,
|
|
1936
|
-
lastThinkingContent,
|
|
1937
|
-
lastTextContent,
|
|
1938
|
-
fallbackResultText: result.subtype === "success" && result.result ? result.result : undefined,
|
|
1939
|
-
});
|
|
1940
|
-
const finalMessage = {
|
|
1941
|
-
role: "assistant",
|
|
1942
|
-
content: finalContent,
|
|
1943
|
-
api: "anthropic-messages",
|
|
1944
|
-
provider: "claude-code",
|
|
1945
|
-
model: modelId,
|
|
1946
|
-
usage: mapUsage(result.usage, result.total_cost_usd),
|
|
1947
|
-
stopReason: result.is_error ? "error" : "stop",
|
|
1948
|
-
timestamp: Date.now(),
|
|
1949
|
-
};
|
|
1950
|
-
if (result.is_error) {
|
|
1951
|
-
finalMessage.errorMessage = getResultErrorMessage(result);
|
|
1952
|
-
stream.push({ type: "error", reason: "error", error: finalMessage });
|
|
1953
|
-
}
|
|
1954
|
-
else {
|
|
1955
|
-
stream.push({ type: "done", reason: "stop", message: finalMessage });
|
|
1956
|
-
}
|
|
1957
|
-
return;
|
|
2067
|
+
finally {
|
|
2068
|
+
options?.signal?.removeEventListener("abort", forwardAbort);
|
|
1958
2069
|
}
|
|
1959
|
-
|
|
1960
|
-
|
|
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;
|
|
1961
2077
|
}
|
|
1962
2078
|
}
|
|
2079
|
+
finally {
|
|
2080
|
+
if (trackWorkflowMcpSdk)
|
|
2081
|
+
endWorkflowMcpSdkSession();
|
|
2082
|
+
}
|
|
1963
2083
|
// Generator exhaustion without a terminal result is a stream interruption,
|
|
1964
2084
|
// not a successful completion. Emitting an error lets GSD classify it as a
|
|
1965
2085
|
// transient provider failure instead of advancing auto-mode state.
|