@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6
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-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/help-text.js +5 -0
- package/dist/project-sessions.js +4 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -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/contracts.js +8 -1
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
- package/dist/resources/extensions/gsd/auto/phases.js +28 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
- package/dist/resources/extensions/gsd/auto-start.js +12 -23
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
- package/dist/resources/extensions/gsd/auto.js +73 -471
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- 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-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/debug-logger.js +10 -0
- 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/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/gsd-db.js +12 -0
- package/dist/resources/extensions/gsd/guided-flow.js +36 -470
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
- package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
- package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- 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-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/native-git-bridge.js +45 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences.js +147 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -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/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
- package/dist/resources/extensions/gsd/state.js +13 -5
- 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 +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
- package/dist/resources/extensions/gsd/uat-policy.js +16 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
- package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- 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-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
- 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.cf859a427a2cb2ac.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-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/package.json +17 -11
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/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/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
- 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.js +1 -1
- 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 +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.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/package.json +7 -7
- 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 +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +30 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +8 -127
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +47 -166
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
- package/packages/pi-coding-agent/dist/core/auth-storage.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/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/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/install/deps.js +10 -0
- package/scripts/link-workspace-packages.cjs +7 -40
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -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/contracts.ts +40 -121
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
- package/src/resources/extensions/gsd/auto/phases.ts +35 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
- package/src/resources/extensions/gsd/auto-start.ts +17 -20
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
- package/src/resources/extensions/gsd/auto.ts +96 -508
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- 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-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/debug-logger.ts +11 -0
- 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/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +49 -560
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
- package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
- package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- 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-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/native-git-bridge.ts +48 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +173 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -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/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
- package/src/resources/extensions/gsd/state.ts +15 -5
- 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/artifact-db-drift-memo.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
- 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-orchestrator.test.ts +709 -845
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -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 +38 -1
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- 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/integration/merge-strategy-regular.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- 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-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/native-merge-regular.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- 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 +75 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
- package/src/resources/extensions/gsd/uat-policy.ts +19 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
- package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
- 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/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/dist/web/standalone/.next/server/chunks/678.js +0 -2
- 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/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
- package/scripts/ensure-workspace-builds.cjs +0 -129
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
// gsd-pi - Claude Code logical turn assembly
|
|
2
|
+
import { PartialMessageBuilder } from "./partial-builder.js";
|
|
3
|
+
/** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
|
|
4
|
+
function normalizeToolResultContent(content) {
|
|
5
|
+
if (typeof content === "string") {
|
|
6
|
+
return [{ type: "text", text: content }];
|
|
7
|
+
}
|
|
8
|
+
if (!Array.isArray(content)) {
|
|
9
|
+
if (content == null)
|
|
10
|
+
return [{ type: "text", text: "" }];
|
|
11
|
+
return [{ type: "text", text: JSON.stringify(content) }];
|
|
12
|
+
}
|
|
13
|
+
const blocks = [];
|
|
14
|
+
for (const item of content) {
|
|
15
|
+
if (typeof item === "string") {
|
|
16
|
+
blocks.push({ type: "text", text: item });
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (!item || typeof item !== "object") {
|
|
20
|
+
blocks.push({ type: "text", text: String(item) });
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const block = item;
|
|
24
|
+
if (block.type === "text") {
|
|
25
|
+
blocks.push({ type: "text", text: typeof block.text === "string" ? block.text : "" });
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (block.type === "image"
|
|
29
|
+
&& typeof block.data === "string"
|
|
30
|
+
&& typeof block.mimeType === "string") {
|
|
31
|
+
blocks.push({ type: "image", data: block.data, mimeType: block.mimeType });
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
blocks.push({ type: "text", text: JSON.stringify(block) });
|
|
35
|
+
}
|
|
36
|
+
return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Extract a `details` payload from an MCP tool-result block.
|
|
40
|
+
*
|
|
41
|
+
* MCP's `CallToolResult` carries structured data in `structuredContent` — the
|
|
42
|
+
* protocol's supported channel for non-text payloads. Claude Code's synthetic
|
|
43
|
+
* user message may surface that field in one of two shapes depending on SDK
|
|
44
|
+
* version: as a sibling on the `mcp_tool_result` block itself, or as a
|
|
45
|
+
* dedicated content sub-block with `type: "structuredContent"`. Snake-case
|
|
46
|
+
* (`structured_content`) is accepted defensively in case a transport hop
|
|
47
|
+
* rewrites casing. All other shapes return undefined, matching the nullable
|
|
48
|
+
* `details` contract consumed by tool result renderers.
|
|
49
|
+
*/
|
|
50
|
+
function extractStructuredDetailsFromBlock(block) {
|
|
51
|
+
const sibling = block.structuredContent ?? block.structured_content;
|
|
52
|
+
if (sibling && typeof sibling === "object" && !Array.isArray(sibling)) {
|
|
53
|
+
return sibling;
|
|
54
|
+
}
|
|
55
|
+
if (Array.isArray(block.content)) {
|
|
56
|
+
for (const item of block.content) {
|
|
57
|
+
if (!item || typeof item !== "object")
|
|
58
|
+
continue;
|
|
59
|
+
const sub = item;
|
|
60
|
+
if (sub.type !== "structuredContent" && sub.type !== "structured_content")
|
|
61
|
+
continue;
|
|
62
|
+
const payload = sub.structuredContent ?? sub.structured_content ?? sub.data ?? sub.value;
|
|
63
|
+
if (payload && typeof payload === "object" && !Array.isArray(payload)) {
|
|
64
|
+
return payload;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Return undefined (not {}) when no structured payload is present, matching
|
|
69
|
+
// the pre-#4477 contract where `details` was nullable. An empty-object
|
|
70
|
+
// sentinel is truthy and breaks downstream consumers that gate on
|
|
71
|
+
// `if (details)`. `undefined` matches the type of the field these results
|
|
72
|
+
// flow into (`Record<string, unknown> | undefined`).
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* True for items that are MCP `structuredContent` pseudo-blocks living inside
|
|
77
|
+
* a tool-result `content[]` array. These blocks carry the structured payload
|
|
78
|
+
* (extracted separately by `extractStructuredDetailsFromBlock`) and must NOT
|
|
79
|
+
* leak into the visible content rendered to the user — otherwise the renderer
|
|
80
|
+
* stringifies the JSON pseudo-block and shows it next to the actual tool
|
|
81
|
+
* output. See PR #4477 review (post-fix-round).
|
|
82
|
+
*/
|
|
83
|
+
function isStructuredContentPseudoBlock(item) {
|
|
84
|
+
if (!item || typeof item !== "object")
|
|
85
|
+
return false;
|
|
86
|
+
const type = item.type;
|
|
87
|
+
return type === "structuredContent" || type === "structured_content";
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Strip `structuredContent` pseudo-blocks from a tool-result content array
|
|
91
|
+
* before normalization. The structured payload is extracted via the sibling
|
|
92
|
+
* `structuredContent` field (or a dedicated extractor pass on the raw block);
|
|
93
|
+
* the visible content path must not include the pseudo-block itself.
|
|
94
|
+
*/
|
|
95
|
+
function stripStructuredContentPseudoBlocks(content) {
|
|
96
|
+
if (!Array.isArray(content))
|
|
97
|
+
return content;
|
|
98
|
+
return content.filter((item) => !isStructuredContentPseudoBlock(item));
|
|
99
|
+
}
|
|
100
|
+
/** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
|
|
101
|
+
export function extractToolResultsFromSdkUserMessage(message) {
|
|
102
|
+
const extracted = [];
|
|
103
|
+
const seen = new Set();
|
|
104
|
+
const rawMessage = message.message;
|
|
105
|
+
const content = Array.isArray(rawMessage?.content) ? rawMessage.content : [];
|
|
106
|
+
for (const item of content) {
|
|
107
|
+
if (!item || typeof item !== "object")
|
|
108
|
+
continue;
|
|
109
|
+
const block = item;
|
|
110
|
+
const type = typeof block.type === "string" ? block.type : "";
|
|
111
|
+
if (type !== "tool_result" && type !== "mcp_tool_result")
|
|
112
|
+
continue;
|
|
113
|
+
const toolUseId = typeof block.tool_use_id === "string" ? block.tool_use_id : "";
|
|
114
|
+
if (!toolUseId || seen.has(toolUseId))
|
|
115
|
+
continue;
|
|
116
|
+
seen.add(toolUseId);
|
|
117
|
+
extracted.push({
|
|
118
|
+
toolUseId,
|
|
119
|
+
result: {
|
|
120
|
+
content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(block.content)),
|
|
121
|
+
details: extractStructuredDetailsFromBlock(block),
|
|
122
|
+
isError: block.is_error === true,
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (extracted.length === 0) {
|
|
127
|
+
const fallback = message.tool_use_result;
|
|
128
|
+
if (fallback && typeof fallback === "object") {
|
|
129
|
+
const toolResult = fallback;
|
|
130
|
+
const toolUseId = typeof toolResult.tool_use_id === "string" ? toolResult.tool_use_id : "";
|
|
131
|
+
if (toolUseId) {
|
|
132
|
+
extracted.push({
|
|
133
|
+
toolUseId,
|
|
134
|
+
result: {
|
|
135
|
+
content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(toolResult.content)),
|
|
136
|
+
details: extractStructuredDetailsFromBlock(toolResult),
|
|
137
|
+
isError: toolResult.is_error === true,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return extracted;
|
|
144
|
+
}
|
|
145
|
+
/** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
|
|
146
|
+
export function attachExternalResultsToToolBlocks(toolBlocks, toolResultsById) {
|
|
147
|
+
for (const block of toolBlocks) {
|
|
148
|
+
if (block.type !== "toolCall" && block.type !== "serverToolUse")
|
|
149
|
+
continue;
|
|
150
|
+
const externalResult = toolResultsById.get(block.id);
|
|
151
|
+
if (!externalResult)
|
|
152
|
+
continue;
|
|
153
|
+
block.externalResult = externalResult;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Build the final assistant content that Agent Core consumes in
|
|
158
|
+
* `externalToolExecution` mode. This preserves tool-call blocks, attaches any
|
|
159
|
+
* SDK-produced external results by tool-call id, and then appends the final
|
|
160
|
+
* text/thinking blocks for the completed turn.
|
|
161
|
+
*/
|
|
162
|
+
export function buildFinalAssistantContent(params) {
|
|
163
|
+
const mergedToolBlocks = [...params.intermediateToolBlocks];
|
|
164
|
+
if (params.pendingContent) {
|
|
165
|
+
mergePendingToolCalls(mergedToolBlocks, params.pendingContent);
|
|
166
|
+
}
|
|
167
|
+
attachExternalResultsToToolBlocks(mergedToolBlocks, params.toolResultsById);
|
|
168
|
+
const finalContent = [...mergedToolBlocks];
|
|
169
|
+
if (params.pendingContent && params.pendingContent.length > 0) {
|
|
170
|
+
for (const block of params.pendingContent) {
|
|
171
|
+
if (block.type === "text" || block.type === "thinking") {
|
|
172
|
+
finalContent.push(block);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
if (params.lastThinkingContent) {
|
|
178
|
+
finalContent.push({ type: "thinking", thinking: params.lastThinkingContent });
|
|
179
|
+
}
|
|
180
|
+
if (params.lastTextContent) {
|
|
181
|
+
finalContent.push({ type: "text", text: params.lastTextContent });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (finalContent.length === 0 && params.fallbackResultText) {
|
|
185
|
+
finalContent.push({ type: "text", text: params.fallbackResultText });
|
|
186
|
+
}
|
|
187
|
+
return finalContent;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Merge tool-call blocks from the active partial-message builder into the
|
|
191
|
+
* running list of intermediate tool calls, preserving order and de-duping
|
|
192
|
+
* by tool-call id. Exposed for testing the F3 fix (final-turn tool calls
|
|
193
|
+
* dropped when `result` arrives without a preceding synthetic `user`).
|
|
194
|
+
*/
|
|
195
|
+
export function mergePendingToolCalls(intermediate, pending) {
|
|
196
|
+
const alreadyIncluded = new Set();
|
|
197
|
+
for (const block of intermediate) {
|
|
198
|
+
if (block.type === "toolCall")
|
|
199
|
+
alreadyIncluded.add(block.id);
|
|
200
|
+
}
|
|
201
|
+
for (const block of pending) {
|
|
202
|
+
if (block.type !== "toolCall")
|
|
203
|
+
continue;
|
|
204
|
+
if (alreadyIncluded.has(block.id))
|
|
205
|
+
continue;
|
|
206
|
+
alreadyIncluded.add(block.id);
|
|
207
|
+
intermediate.push(block);
|
|
208
|
+
}
|
|
209
|
+
return intermediate;
|
|
210
|
+
}
|
|
211
|
+
export function handleClaudeCodePartialStreamEvent(builder, event, modelId) {
|
|
212
|
+
if (event.type === "message_start") {
|
|
213
|
+
// Claude Code can emit repeated SDK message_start events inside one
|
|
214
|
+
// logical assistant response. Keep appending until a synthetic user
|
|
215
|
+
// tool-result boundary explicitly clears the builder.
|
|
216
|
+
return {
|
|
217
|
+
builder: builder ?? new PartialMessageBuilder(event.message?.model ?? modelId),
|
|
218
|
+
assistantEvent: null,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
if (!builder)
|
|
222
|
+
return { builder, assistantEvent: null };
|
|
223
|
+
return { builder, assistantEvent: builder.handleEvent(event) };
|
|
224
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* All functions produce GitHub-flavored markdown strings ready
|
|
8
8
|
* for the `gh` CLI body parameters.
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
10
|
+
import { buildPullRequestEvidence } from "../gsd/pull-request-process.js";
|
|
11
11
|
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
12
12
|
/**
|
|
13
13
|
* Wrap a string in a CommonMark inline-code span, escaping any embedded
|
|
@@ -85,7 +85,7 @@ export function formatSlicePRBody(data) {
|
|
|
85
85
|
.map((task) => task.issueNumber)
|
|
86
86
|
.filter((issueNumber) => typeof issueNumber === "number")
|
|
87
87
|
.map((issueNumber) => `#${issueNumber}`);
|
|
88
|
-
return
|
|
88
|
+
return buildPullRequestEvidence({
|
|
89
89
|
milestoneId: data.id,
|
|
90
90
|
subjectId: data.id,
|
|
91
91
|
subjectKind: "slice",
|
|
@@ -172,7 +172,7 @@ export function formatSwarmLanePRBody(data) {
|
|
|
172
172
|
`### Changed contracts\n${checkedList(data.lane.changedContracts, "No shared contracts changed").join("\n")}`,
|
|
173
173
|
`### Transition risks\n${checkedList(data.transitionRisks, "No transition risks identified").join("\n")}`,
|
|
174
174
|
].filter(Boolean);
|
|
175
|
-
return
|
|
175
|
+
return buildPullRequestEvidence({
|
|
176
176
|
milestoneId: laneLabel,
|
|
177
177
|
subjectId: laneLabel,
|
|
178
178
|
subjectKind: "workflow",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Resolves closeout artifact projection roots across project and milestone worktrees.
|
|
3
|
+
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
4
|
+
import { resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
5
|
+
export function resolveCloseoutArtifactProjection(input) {
|
|
6
|
+
const projectRoot = resolveWorktreeProjectRoot(input.basePath, input.originalBasePath);
|
|
7
|
+
const canonicalMilestoneRoot = resolveCanonicalMilestoneRoot(projectRoot, input.milestoneId);
|
|
8
|
+
return {
|
|
9
|
+
projectRoot,
|
|
10
|
+
canonicalMilestoneRoot,
|
|
11
|
+
summaryArtifactBasePath: canonicalMilestoneRoot,
|
|
12
|
+
gateEvidenceBasePath: canonicalMilestoneRoot,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
|
-
// File Purpose: Auto Orchestration module
|
|
2
|
+
// File Purpose: Auto Orchestration module public contract types.
|
|
3
|
+
//
|
|
4
|
+
// Phase 2 of #442 collapsed the nine single-implementation adapter interfaces
|
|
5
|
+
// (DispatchAdapter, RecoveryAdapter, StateReconciliationAdapter,
|
|
6
|
+
// ToolContractAdapter, WorktreeAdapter, HealthAdapter, UokGateAdapter,
|
|
7
|
+
// RuntimePersistenceAdapter, NotificationAdapter) and AutoOrchestratorDeps
|
|
8
|
+
// into AutoOrchestrator itself (auto/orchestrator.ts). Only the public result
|
|
9
|
+
// and lifecycle-interface types remain here.
|
|
3
10
|
export {};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* auto/loop.ts — Main auto-mode execution loop.
|
|
5
5
|
*
|
|
6
|
-
* Iterates:
|
|
6
|
+
* Iterates: orchestration.advance → guards → runUnit → finalize → repeat.
|
|
7
7
|
* Exits when s.active becomes false or a terminal condition is reached.
|
|
8
8
|
*
|
|
9
9
|
* Imports from: auto/types, auto/resolve, auto/phases
|
|
@@ -13,7 +13,7 @@ import { mkdirSync, writeFileSync } from "node:fs";
|
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
import { MAX_LOOP_ITERATIONS, } from "./types.js";
|
|
15
15
|
import { _clearCurrentResolve } from "./resolve.js";
|
|
16
|
-
import {
|
|
16
|
+
import { runGuards, runFinalize, STUCK_WINDOW_SIZE } from "./phases.js";
|
|
17
17
|
import { debugLog } from "../debug-logger.js";
|
|
18
18
|
import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterMs, COOLDOWN_FALLBACK_WAIT_MS, MAX_COOLDOWN_RETRIES } from "./infra-errors.js";
|
|
19
19
|
import { ModelPolicyDispatchBlockedError } from "../auto-model-selection.js";
|
|
@@ -92,6 +92,22 @@ function resolveCompletionStopFromState(stateSnapshot) {
|
|
|
92
92
|
},
|
|
93
93
|
};
|
|
94
94
|
}
|
|
95
|
+
function resolveCompletionStopFromOutcome(outcome, stateSnapshot) {
|
|
96
|
+
if (outcome?.code !== "all-complete")
|
|
97
|
+
return null;
|
|
98
|
+
const completedMilestone = stateSnapshot?.lastCompletedMilestone ?? stateSnapshot?.activeMilestone;
|
|
99
|
+
return {
|
|
100
|
+
reason: outcome.displayReason,
|
|
101
|
+
options: {
|
|
102
|
+
completionWidget: {
|
|
103
|
+
milestoneId: completedMilestone?.id ?? null,
|
|
104
|
+
milestoneTitle: completedMilestone?.title ?? null,
|
|
105
|
+
allMilestonesComplete: true,
|
|
106
|
+
},
|
|
107
|
+
terminalOutcome: outcome,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
95
111
|
// ── Stuck detection persistence (#3704) ──────────────────────────────────
|
|
96
112
|
// Phase C migration: stuck-state.json deleted in favor of DB-backed
|
|
97
113
|
// equivalents. recentUnits is rebuilt from unit_dispatches (Phase B
|
|
@@ -104,6 +120,7 @@ function resolveCompletionStopFromState(stateSnapshot) {
|
|
|
104
120
|
// tolerates — same behavior as a fresh session.
|
|
105
121
|
const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
|
|
106
122
|
const MAX_CONSECUTIVE_ALREADY_ACTIVE_SKIPS = 3;
|
|
123
|
+
const ORCHESTRATION_MISSING_REASON = "Auto Orchestration Module is not wired; cannot dispatch built-in GSD Unit.";
|
|
107
124
|
function stableStuckStateScopeId(s) {
|
|
108
125
|
return normalizeRealPath(s.scope?.workspace.projectRoot ?? (s.originalBasePath || s.basePath));
|
|
109
126
|
}
|
|
@@ -247,9 +264,9 @@ function closeOutCrashedUnit(s, iterData, err) {
|
|
|
247
264
|
}
|
|
248
265
|
}
|
|
249
266
|
/**
|
|
250
|
-
* Main auto-mode execution loop. Iterates:
|
|
251
|
-
* runUnit → finalize → repeat. Exits when s.active becomes false or a
|
|
252
|
-
*
|
|
267
|
+
* Main auto-mode execution loop. Iterates: orchestration.advance → guards →
|
|
268
|
+
* runUnit → finalize → repeat. Exits when s.active becomes false or a terminal
|
|
269
|
+
* condition is reached.
|
|
253
270
|
*
|
|
254
271
|
* This is the linear replacement for the recursive
|
|
255
272
|
* dispatchNextUnit → resolveAgentEnd → dispatchNextUnit chain.
|
|
@@ -441,10 +458,9 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
441
458
|
journalReporter.emit("iteration-start", { iteration });
|
|
442
459
|
let iterData;
|
|
443
460
|
// ── Custom engine path ──────────────────────────────────────────────
|
|
444
|
-
// When activeEngineId is a non-dev value,
|
|
445
|
-
//
|
|
446
|
-
//
|
|
447
|
-
// After unit execution, verifies then reconciles via the engine layer.
|
|
461
|
+
// When activeEngineId is a non-dev value, the custom engine drives its own
|
|
462
|
+
// state via GRAPH.yaml. It shares guards and Unit execution with the dev
|
|
463
|
+
// path, then verifies and reconciles via the engine layer.
|
|
448
464
|
//
|
|
449
465
|
// GSD_ENGINE_BYPASS=1 skips the engine layer entirely — falls through
|
|
450
466
|
// to the dev path below.
|
|
@@ -520,7 +536,7 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
520
536
|
});
|
|
521
537
|
observedUnitType = iterData.unitType;
|
|
522
538
|
observedUnitId = iterData.unitId;
|
|
523
|
-
// ── Progress widget (mirrors dev path
|
|
539
|
+
// ── Progress widget (mirrors the dev path) ──
|
|
524
540
|
deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state);
|
|
525
541
|
// ── Guards (shared with dev path) ──
|
|
526
542
|
const guardsResult = await runGuards(ic, s.currentMilestoneId ?? "workflow");
|
|
@@ -727,15 +743,23 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
727
743
|
: await orchestration.advance();
|
|
728
744
|
if (orchestrationResult.kind === "blocked") {
|
|
729
745
|
s.pendingOrchestrationDispatch = null;
|
|
746
|
+
const blockMessage = orchestrationResult.terminalOutcome?.code === "settlement-blocked"
|
|
747
|
+
? [
|
|
748
|
+
orchestrationResult.terminalOutcome.displayReason,
|
|
749
|
+
`Next: ${orchestrationResult.terminalOutcome.nextAction}`,
|
|
750
|
+
].join("\n")
|
|
751
|
+
: orchestrationResult.reason;
|
|
730
752
|
if (orchestrationResult.action === "pause") {
|
|
731
753
|
await deps.pauseAuto(ctx, pi, {
|
|
732
|
-
message:
|
|
754
|
+
message: blockMessage,
|
|
733
755
|
category: "unknown",
|
|
756
|
+
}, {
|
|
757
|
+
expectedCurrentUnit: null,
|
|
734
758
|
});
|
|
735
759
|
finishTurn("paused", "manual-attention", "orchestration-blocked");
|
|
736
760
|
}
|
|
737
761
|
else {
|
|
738
|
-
await deps.stopAuto(ctx, pi,
|
|
762
|
+
await deps.stopAuto(ctx, pi, blockMessage);
|
|
739
763
|
finishTurn("stopped", "manual-attention", "orchestration-blocked");
|
|
740
764
|
}
|
|
741
765
|
finishIncompleteIteration({
|
|
@@ -745,8 +769,19 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
745
769
|
});
|
|
746
770
|
break;
|
|
747
771
|
}
|
|
772
|
+
if (orchestrationResult.kind === "skipped") {
|
|
773
|
+
s.pendingOrchestrationDispatch = null;
|
|
774
|
+
emitIterationEnd({ skipped: true });
|
|
775
|
+
completeIteration();
|
|
776
|
+
finishTurn("skipped");
|
|
777
|
+
continue;
|
|
778
|
+
}
|
|
748
779
|
if (orchestrationResult.kind === "paused") {
|
|
749
780
|
s.pendingOrchestrationDispatch = null;
|
|
781
|
+
finishIncompleteIteration({
|
|
782
|
+
status: "paused",
|
|
783
|
+
reason: orchestrationResult.reason,
|
|
784
|
+
});
|
|
750
785
|
finishTurn("skipped");
|
|
751
786
|
continue;
|
|
752
787
|
}
|
|
@@ -766,7 +801,8 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
766
801
|
}
|
|
767
802
|
if (orchestrationResult.kind === "stopped") {
|
|
768
803
|
s.pendingOrchestrationDispatch = null;
|
|
769
|
-
|
|
804
|
+
let completionStop = resolveCompletionStopFromOutcome(orchestrationResult.terminalOutcome, orchestrationResult.stateSnapshot);
|
|
805
|
+
completionStop ??= resolveCompletionStopFromState(orchestrationResult.stateSnapshot);
|
|
770
806
|
if (completionStop) {
|
|
771
807
|
await deps.stopAuto(ctx, pi, completionStop.reason, completionStop.options);
|
|
772
808
|
}
|
|
@@ -837,55 +873,37 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
837
873
|
});
|
|
838
874
|
observedUnitType = iterData.unitType;
|
|
839
875
|
observedUnitId = iterData.unitId;
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
876
|
+
const guardMilestoneId = iterData.mid ?? s.currentMilestoneId ?? "workflow";
|
|
877
|
+
const guardsResult = await runGuards(ic, guardMilestoneId);
|
|
878
|
+
phaseReporter.report("guard", guardsResult.action, {
|
|
879
|
+
unitType: iterData.unitType,
|
|
880
|
+
unitId: iterData.unitId,
|
|
881
|
+
});
|
|
882
|
+
if (guardsResult.action === "break") {
|
|
883
|
+
finishTurn("stopped", "manual-attention", "guard-break");
|
|
846
884
|
finishIncompleteIteration({
|
|
847
885
|
status: "stopped",
|
|
848
|
-
reason: "
|
|
886
|
+
reason: "guard-break",
|
|
887
|
+
unitType: iterData.unitType,
|
|
888
|
+
unitId: iterData.unitId,
|
|
849
889
|
failureClass: "manual-attention",
|
|
850
890
|
});
|
|
851
891
|
break;
|
|
852
892
|
}
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
finishTurn("stopped", "manual-attention", "guard-break");
|
|
868
|
-
break;
|
|
869
|
-
}
|
|
870
|
-
const dispatchResult = await runDispatch(ic, preData, loopState);
|
|
871
|
-
phaseReporter.report("dispatch", dispatchResult.action);
|
|
872
|
-
if (dispatchResult.action === "break") {
|
|
873
|
-
finishTurn("stopped", "manual-attention", "dispatch-break");
|
|
874
|
-
break;
|
|
875
|
-
}
|
|
876
|
-
if (dispatchResult.action === "continue") {
|
|
877
|
-
emitIterationEnd({ skipped: true });
|
|
878
|
-
completeIteration();
|
|
879
|
-
finishTurn("skipped");
|
|
880
|
-
continue;
|
|
881
|
-
}
|
|
882
|
-
if (dispatchResult.action === "retry") {
|
|
883
|
-
finishTurn("retry", "execution", dispatchResult.reason);
|
|
884
|
-
continue;
|
|
885
|
-
}
|
|
886
|
-
iterData = dispatchResult.data;
|
|
887
|
-
observedUnitType = iterData.unitType;
|
|
888
|
-
observedUnitId = iterData.unitId;
|
|
893
|
+
}
|
|
894
|
+
else {
|
|
895
|
+
s.pendingOrchestrationDispatch = null;
|
|
896
|
+
await deps.pauseAuto(ctx, pi, {
|
|
897
|
+
message: ORCHESTRATION_MISSING_REASON,
|
|
898
|
+
category: "unknown",
|
|
899
|
+
});
|
|
900
|
+
finishTurn("paused", "manual-attention", "orchestration-missing");
|
|
901
|
+
finishIncompleteIteration({
|
|
902
|
+
status: "paused",
|
|
903
|
+
reason: ORCHESTRATION_MISSING_REASON,
|
|
904
|
+
failureClass: "manual-attention",
|
|
905
|
+
});
|
|
906
|
+
break;
|
|
889
907
|
}
|
|
890
908
|
}
|
|
891
909
|
else {
|