gsd-pi 2.67.0-dev.2142d3e → 2.67.0-dev.2367d7e
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/README.md +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +152 -70
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto-start.js +16 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +62 -15
- package/dist/resources/extensions/gsd/auto.js +121 -59
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +7 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -1
- package/dist/resources/extensions/gsd/commands-mcp-status.js +43 -7
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -4
- package/dist/resources/extensions/gsd/doctor-proactive.js +3 -3
- package/dist/resources/extensions/gsd/doctor.js +8 -4
- package/dist/resources/extensions/gsd/gsd-db.js +11 -0
- package/dist/resources/extensions/gsd/guided-flow.js +40 -31
- package/dist/resources/extensions/gsd/init-wizard.js +15 -12
- package/dist/resources/extensions/gsd/interrupted-session.js +146 -0
- package/dist/resources/extensions/gsd/mcp-project-config.js +83 -0
- package/dist/resources/extensions/gsd/state.js +7 -2
- package/dist/resources/extensions/gsd/workflow-mcp.js +90 -19
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +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/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
- 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/2826.821e01b07d92e948.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-0c485498795110d6.js → page-f1e30ab6bb269149.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-b49b09f97429b5d0.js → webpack-6e4d7e9a4f57bed4.js} +1 -1
- package/package.json +4 -2
- package/packages/mcp-server/dist/cli.d.ts +9 -0
- package/packages/mcp-server/dist/cli.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli.js +58 -0
- package/packages/mcp-server/dist/cli.js.map +1 -0
- package/packages/mcp-server/dist/index.d.ts +20 -0
- package/packages/mcp-server/dist/index.d.ts.map +1 -0
- package/packages/mcp-server/dist/index.js +14 -0
- package/packages/mcp-server/dist/index.js.map +1 -0
- package/packages/mcp-server/dist/readers/captures.d.ts +25 -0
- package/packages/mcp-server/dist/readers/captures.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/captures.js +67 -0
- package/packages/mcp-server/dist/readers/captures.js.map +1 -0
- package/packages/mcp-server/dist/readers/doctor-lite.d.ts +20 -0
- package/packages/mcp-server/dist/readers/doctor-lite.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/doctor-lite.js +173 -0
- package/packages/mcp-server/dist/readers/doctor-lite.js.map +1 -0
- package/packages/mcp-server/dist/readers/index.d.ts +14 -0
- package/packages/mcp-server/dist/readers/index.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/index.js +10 -0
- package/packages/mcp-server/dist/readers/index.js.map +1 -0
- package/packages/mcp-server/dist/readers/knowledge.d.ts +18 -0
- package/packages/mcp-server/dist/readers/knowledge.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/knowledge.js +82 -0
- package/packages/mcp-server/dist/readers/knowledge.js.map +1 -0
- package/packages/mcp-server/dist/readers/metrics.d.ts +32 -0
- package/packages/mcp-server/dist/readers/metrics.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/metrics.js +74 -0
- package/packages/mcp-server/dist/readers/metrics.js.map +1 -0
- package/packages/mcp-server/dist/readers/paths.d.ts +42 -0
- package/packages/mcp-server/dist/readers/paths.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/paths.js +199 -0
- package/packages/mcp-server/dist/readers/paths.js.map +1 -0
- package/packages/mcp-server/dist/readers/roadmap.d.ts +26 -0
- package/packages/mcp-server/dist/readers/roadmap.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/roadmap.js +194 -0
- package/packages/mcp-server/dist/readers/roadmap.js.map +1 -0
- package/packages/mcp-server/dist/readers/state.d.ts +43 -0
- package/packages/mcp-server/dist/readers/state.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/state.js +184 -0
- package/packages/mcp-server/dist/readers/state.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +28 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -0
- package/packages/mcp-server/dist/server.js +319 -0
- package/packages/mcp-server/dist/server.js.map +1 -0
- package/packages/mcp-server/dist/session-manager.d.ts +54 -0
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -0
- package/packages/mcp-server/dist/session-manager.js +284 -0
- package/packages/mcp-server/dist/session-manager.js.map +1 -0
- package/packages/mcp-server/dist/types.d.ts +61 -0
- package/packages/mcp-server/dist/types.d.ts.map +1 -0
- package/packages/mcp-server/dist/types.js +11 -0
- package/packages/mcp-server/dist/types.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +9 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.js +532 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -0
- package/packages/mcp-server/src/workflow-tools.ts +13 -2
- package/packages/mcp-server/tsconfig.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +14 -6
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +53 -0
- package/packages/pi-agent-core/src/agent-loop.ts +20 -6
- package/packages/pi-coding-agent/dist/core/contextual-tips.d.ts +43 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.js +208 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.js +227 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +28 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +17 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +14 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +15 -12
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/contextual-tips.test.ts +259 -0
- package/packages/pi-coding-agent/src/core/contextual-tips.ts +232 -0
- package/packages/pi-coding-agent/src/core/index.ts +2 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +54 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +18 -12
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +21 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +19 -15
- package/packages/rpc-client/dist/index.d.ts +10 -0
- package/packages/rpc-client/dist/index.d.ts.map +1 -0
- package/packages/rpc-client/dist/index.js +9 -0
- package/packages/rpc-client/dist/index.js.map +1 -0
- package/packages/rpc-client/dist/jsonl.d.ts +17 -0
- package/packages/rpc-client/dist/jsonl.d.ts.map +1 -0
- package/packages/rpc-client/dist/jsonl.js +54 -0
- package/packages/rpc-client/dist/jsonl.js.map +1 -0
- package/packages/rpc-client/dist/rpc-client.d.ts +259 -0
- package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -0
- package/packages/rpc-client/dist/rpc-client.js +541 -0
- package/packages/rpc-client/dist/rpc-client.js.map +1 -0
- package/packages/rpc-client/dist/rpc-client.test.d.ts +2 -0
- package/packages/rpc-client/dist/rpc-client.test.d.ts.map +1 -0
- package/packages/rpc-client/dist/rpc-client.test.js +477 -0
- package/packages/rpc-client/dist/rpc-client.test.js.map +1 -0
- package/packages/rpc-client/dist/rpc-types.d.ts +566 -0
- package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -0
- package/packages/rpc-client/dist/rpc-types.js +12 -0
- package/packages/rpc-client/dist/rpc-types.js.map +1 -0
- package/scripts/ensure-workspace-builds.cjs +2 -0
- package/scripts/link-workspace-packages.cjs +21 -14
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +190 -93
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +89 -116
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto-start.ts +23 -55
- package/src/resources/extensions/gsd/auto-worktree.ts +59 -15
- package/src/resources/extensions/gsd/auto.ts +133 -64
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -2
- package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
- package/src/resources/extensions/gsd/commands-mcp-status.ts +53 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -4
- package/src/resources/extensions/gsd/doctor-proactive.ts +3 -3
- package/src/resources/extensions/gsd/doctor.ts +9 -5
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +42 -36
- package/src/resources/extensions/gsd/init-wizard.ts +17 -11
- package/src/resources/extensions/gsd/interrupted-session.ts +224 -0
- package/src/resources/extensions/gsd/mcp-project-config.ts +128 -0
- package/src/resources/extensions/gsd/state.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +668 -2
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +380 -2
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +52 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +2 -9
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -33
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +169 -0
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +212 -13
- package/src/resources/extensions/gsd/workflow-mcp.ts +106 -19
- package/dist/web/standalone/.next/static/chunks/6502.b804e48b7919f55e.js +0 -9
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts +0 -13
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js +0 -27
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js.map +0 -1
- package/packages/pi-coding-agent/src/modes/interactive/provider-auth-setup.ts +0 -40
- package/src/resources/extensions/gsd/tests/init-bootstrap-completeness.test.ts +0 -121
- /package/dist/web/standalone/.next/static/{xR6qurkuYSvyjBjRyJLxG → WMDT_0C0XDkBKtsAI_AX4}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{xR6qurkuYSvyjBjRyJLxG → WMDT_0C0XDkBKtsAI_AX4}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-tools.js","sourceRoot":"","sources":["../src/workflow-tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Workflow MCP tools — exposes the core GSD mutation/read handlers over MCP.\n */\n\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { z } from \"zod\";\n\ntype WorkflowToolExecutors = {\n SUPPORTED_SUMMARY_ARTIFACT_TYPES: readonly string[];\n executeMilestoneStatus: (params: { milestoneId: string }, basePath?: string) => Promise<unknown>;\n executePlanMilestone: (\n params: {\n milestoneId: string;\n title: string;\n vision: string;\n slices: Array<{\n sliceId: string;\n title: string;\n risk: string;\n depends: string[];\n demo: string;\n goal: string;\n successCriteria: string;\n proofLevel: string;\n integrationClosure: string;\n observabilityImpact: string;\n }>;\n status?: string;\n dependsOn?: string[];\n successCriteria?: string[];\n keyRisks?: Array<{ risk: string; whyItMatters: string }>;\n proofStrategy?: Array<{ riskOrUnknown: string; retireIn: string; whatWillBeProven: string }>;\n verificationContract?: string;\n verificationIntegration?: string;\n verificationOperational?: string;\n verificationUat?: string;\n definitionOfDone?: string[];\n requirementCoverage?: string;\n boundaryMapMarkdown?: string;\n },\n basePath?: string,\n ) => Promise<unknown>;\n executePlanSlice: (\n params: {\n milestoneId: string;\n sliceId: string;\n goal: string;\n tasks: Array<{\n taskId: string;\n title: string;\n description: string;\n estimate: string;\n files: string[];\n verify: string;\n inputs: string[];\n expectedOutput: string[];\n observabilityImpact?: string;\n }>;\n successCriteria?: string;\n proofLevel?: string;\n integrationClosure?: string;\n observabilityImpact?: string;\n },\n basePath?: string,\n ) => Promise<unknown>;\n executeReplanSlice: (\n params: {\n milestoneId: string;\n sliceId: string;\n blockerTaskId: string;\n blockerDescription: string;\n whatChanged: string;\n updatedTasks: Array<{\n taskId: string;\n title: string;\n description: string;\n estimate: string;\n files: string[];\n verify: string;\n inputs: string[];\n expectedOutput: string[];\n fullPlanMd?: string;\n }>;\n removedTaskIds: string[];\n },\n basePath?: string,\n ) => Promise<unknown>;\n executeSliceComplete: (\n params: {\n sliceId: string;\n milestoneId: string;\n sliceTitle: string;\n oneLiner: string;\n narrative: string;\n verification: string;\n uatContent: string;\n deviations?: string;\n knownLimitations?: string;\n followUps?: string;\n keyFiles?: string[] | string;\n keyDecisions?: string[] | string;\n patternsEstablished?: string[] | string;\n observabilitySurfaces?: string[] | string;\n provides?: string[] | string;\n requirementsSurfaced?: string[] | string;\n drillDownPaths?: string[] | string;\n affects?: string[] | string;\n requirementsAdvanced?: Array<{ id: string; how: string } | string>;\n requirementsValidated?: Array<{ id: string; proof: string } | string>;\n requirementsInvalidated?: Array<{ id: string; what: string } | string>;\n filesModified?: Array<{ path: string; description: string } | string>;\n requires?: Array<{ slice: string; provides: string } | string>;\n },\n basePath?: string,\n ) => Promise<unknown>;\n executeCompleteMilestone: (\n params: {\n milestoneId: string;\n title: string;\n oneLiner: string;\n narrative: string;\n verificationPassed: boolean;\n successCriteriaResults?: string;\n definitionOfDoneResults?: string;\n requirementOutcomes?: string;\n keyDecisions?: string[];\n keyFiles?: string[];\n lessonsLearned?: string[];\n followUps?: string;\n deviations?: string;\n },\n basePath?: string,\n ) => Promise<unknown>;\n executeValidateMilestone: (\n params: {\n milestoneId: string;\n verdict: \"pass\" | \"needs-attention\" | \"needs-remediation\";\n remediationRound: number;\n successCriteriaChecklist: string;\n sliceDeliveryAudit: string;\n crossSliceIntegration: string;\n requirementCoverage: string;\n verificationClasses?: string;\n verdictRationale: string;\n remediationPlan?: string;\n },\n basePath?: string,\n ) => Promise<unknown>;\n executeReassessRoadmap: (\n params: {\n milestoneId: string;\n completedSliceId: string;\n verdict: string;\n assessment: string;\n sliceChanges: {\n modified: Array<{\n sliceId: string;\n title: string;\n risk?: string;\n depends?: string[];\n demo?: string;\n }>;\n added: Array<{\n sliceId: string;\n title: string;\n risk?: string;\n depends?: string[];\n demo?: string;\n }>;\n removed: string[];\n };\n },\n basePath?: string,\n ) => Promise<unknown>;\n executeSaveGateResult: (\n params: {\n milestoneId: string;\n sliceId: string;\n gateId: string;\n taskId?: string;\n verdict: \"pass\" | \"flag\" | \"omitted\";\n rationale: string;\n findings?: string;\n },\n basePath?: string,\n ) => Promise<unknown>;\n executeSummarySave: (\n params: {\n milestone_id: string;\n slice_id?: string;\n task_id?: string;\n artifact_type: string;\n content: string;\n },\n basePath?: string,\n ) => Promise<unknown>;\n executeTaskComplete: (\n params: {\n taskId: string;\n sliceId: string;\n milestoneId: string;\n oneLiner: string;\n narrative: string;\n verification: string;\n deviations?: string;\n knownIssues?: string;\n keyFiles?: string[];\n keyDecisions?: string[];\n blockerDiscovered?: boolean;\n verificationEvidence?: Array<\n { command: string; exitCode: number; verdict: string; durationMs: number } | string\n >;\n },\n basePath?: string,\n ) => Promise<unknown>;\n};\n\ntype WorkflowWriteGateModule = {\n loadWriteGateSnapshot: (basePath?: string) => {\n verifiedDepthMilestones: string[];\n activeQueuePhase: boolean;\n pendingGateId: string | null;\n };\n shouldBlockPendingGateInSnapshot: (\n snapshot: {\n verifiedDepthMilestones: string[];\n activeQueuePhase: boolean;\n pendingGateId: string | null;\n },\n toolName: string,\n milestoneId: string | null,\n queuePhaseActive?: boolean,\n ) => { block: boolean; reason?: string };\n shouldBlockQueueExecutionInSnapshot: (\n snapshot: {\n verifiedDepthMilestones: string[];\n activeQueuePhase: boolean;\n pendingGateId: string | null;\n },\n toolName: string,\n input: string,\n queuePhaseActive?: boolean,\n ) => { block: boolean; reason?: string };\n};\n\nlet workflowToolExecutorsPromise: Promise<WorkflowToolExecutors> | null = null;\nlet workflowExecutionQueue: Promise<void> = Promise.resolve();\nlet workflowWriteGatePromise: Promise<WorkflowWriteGateModule> | null = null;\n\nfunction getAllowedProjectRoot(env: NodeJS.ProcessEnv = process.env): string | null {\n const configuredRoot = env.GSD_WORKFLOW_PROJECT_ROOT?.trim();\n return configuredRoot ? resolve(configuredRoot) : null;\n}\n\nfunction isWithinRoot(candidatePath: string, rootPath: string): boolean {\n const rel = relative(rootPath, candidatePath);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\nfunction validateProjectDir(projectDir: string, env: NodeJS.ProcessEnv = process.env): string {\n if (!isAbsolute(projectDir)) {\n throw new Error(`projectDir must be an absolute path. Received: ${projectDir}`);\n }\n\n const resolvedProjectDir = resolve(projectDir);\n const allowedRoot = getAllowedProjectRoot(env);\n if (allowedRoot && !isWithinRoot(resolvedProjectDir, allowedRoot)) {\n throw new Error(\n `projectDir must stay within the configured workflow project root. Received: ${resolvedProjectDir}; allowed root: ${allowedRoot}`,\n );\n }\n\n return resolvedProjectDir;\n}\n\nfunction parseToolArgs<T>(schema: z.ZodType<T>, args: Record<string, unknown>): T {\n return schema.parse(args);\n}\n\nfunction parseWorkflowArgs<T extends { projectDir: string }>(\n schema: z.ZodType<T>,\n args: Record<string, unknown>,\n): T {\n const parsed = parseToolArgs(schema, args);\n return {\n ...parsed,\n projectDir: validateProjectDir(parsed.projectDir),\n };\n}\n\nfunction isWorkflowToolExecutors(value: unknown): value is WorkflowToolExecutors {\n if (!value || typeof value !== \"object\") return false;\n const record = value as Record<string, unknown>;\n const functionExports = [\n \"executeMilestoneStatus\",\n \"executePlanMilestone\",\n \"executePlanSlice\",\n \"executeReplanSlice\",\n \"executeSliceComplete\",\n \"executeCompleteMilestone\",\n \"executeValidateMilestone\",\n \"executeReassessRoadmap\",\n \"executeSaveGateResult\",\n \"executeSummarySave\",\n \"executeTaskComplete\",\n ];\n\n return Array.isArray(record.SUPPORTED_SUMMARY_ARTIFACT_TYPES) &&\n functionExports.every((key) => typeof record[key] === \"function\");\n}\n\nfunction getSupportedSummaryArtifactTypes(executors: WorkflowToolExecutors): readonly string[] {\n return executors.SUPPORTED_SUMMARY_ARTIFACT_TYPES;\n}\n\nfunction getWriteGateModuleCandidates(): string[] {\n const candidates: string[] = [];\n const explicitModule = process.env.GSD_WORKFLOW_WRITE_GATE_MODULE?.trim();\n if (explicitModule) {\n if (/^[a-z]+:/i.test(explicitModule) && !explicitModule.startsWith(\"file:\")) {\n throw new Error(\"GSD_WORKFLOW_WRITE_GATE_MODULE only supports file: URLs or filesystem paths.\");\n }\n candidates.push(explicitModule.startsWith(\"file:\") ? explicitModule : toFileUrl(explicitModule));\n }\n\n candidates.push(\n new URL(\"../../../src/resources/extensions/gsd/bootstrap/write-gate.js\", import.meta.url).href,\n new URL(\"../../../src/resources/extensions/gsd/bootstrap/write-gate.ts\", import.meta.url).href,\n );\n\n return [...new Set(candidates)];\n}\n\nfunction toFileUrl(modulePath: string): string {\n return pathToFileURL(resolve(modulePath)).href;\n}\n\nfunction getWorkflowExecutorModuleCandidates(env: NodeJS.ProcessEnv = process.env): string[] {\n const candidates: string[] = [];\n const explicitModule = env.GSD_WORKFLOW_EXECUTORS_MODULE?.trim();\n if (explicitModule) {\n if (/^[a-z]+:/i.test(explicitModule) && !explicitModule.startsWith(\"file:\")) {\n throw new Error(\"GSD_WORKFLOW_EXECUTORS_MODULE only supports file: URLs or filesystem paths.\");\n }\n candidates.push(explicitModule.startsWith(\"file:\") ? explicitModule : toFileUrl(explicitModule));\n }\n\n candidates.push(\n new URL(\"../../../src/resources/extensions/gsd/tools/workflow-tool-executors.js\", import.meta.url).href,\n new URL(\"../../../src/resources/extensions/gsd/tools/workflow-tool-executors.ts\", import.meta.url).href,\n );\n\n return [...new Set(candidates)];\n}\n\nasync function getWorkflowToolExecutors(): Promise<WorkflowToolExecutors> {\n if (!workflowToolExecutorsPromise) {\n workflowToolExecutorsPromise = (async () => {\n const attempts: string[] = [];\n for (const candidate of getWorkflowExecutorModuleCandidates()) {\n try {\n const loaded = await import(candidate);\n if (isWorkflowToolExecutors(loaded)) {\n return loaded;\n }\n attempts.push(`${candidate} (module shape mismatch)`);\n } catch (err) {\n attempts.push(`${candidate} (${err instanceof Error ? err.message : String(err)})`);\n }\n }\n\n throw new Error(\n \"Unable to load GSD workflow executor bridge for MCP mutation tools. \" +\n \"Set GSD_WORKFLOW_EXECUTORS_MODULE to an importable workflow-tool-executors module, \" +\n \"or run the MCP server from a GSD checkout that includes src/resources/extensions/gsd/tools/workflow-tool-executors.(js|ts). \" +\n `Attempts: ${attempts.join(\"; \")}`,\n );\n })();\n }\n return workflowToolExecutorsPromise;\n}\n\nasync function getWorkflowWriteGateModule(): Promise<WorkflowWriteGateModule> {\n if (!workflowWriteGatePromise) {\n workflowWriteGatePromise = (async () => {\n const attempts: string[] = [];\n for (const candidate of getWriteGateModuleCandidates()) {\n try {\n const loaded = await import(candidate);\n if (\n loaded &&\n typeof loaded.loadWriteGateSnapshot === \"function\" &&\n typeof loaded.shouldBlockPendingGateInSnapshot === \"function\" &&\n typeof loaded.shouldBlockQueueExecutionInSnapshot === \"function\"\n ) {\n return loaded as WorkflowWriteGateModule;\n }\n attempts.push(`${candidate} (module shape mismatch)`);\n } catch (err) {\n attempts.push(`${candidate} (${err instanceof Error ? err.message : String(err)})`);\n }\n }\n\n throw new Error(\n \"Unable to load GSD write-gate bridge for workflow MCP tools. \" +\n `Attempts: ${attempts.join(\"; \")}`,\n );\n })();\n }\n return workflowWriteGatePromise;\n}\n\ninterface McpToolServer {\n tool(\n name: string,\n description: string,\n params: Record<string, unknown>,\n handler: (args: Record<string, unknown>) => Promise<unknown>,\n ): unknown;\n}\n\nasync function runSerializedWorkflowOperation<T>(fn: () => Promise<T>): Promise<T> {\n // The shared DB adapter and workflow log base path are process-global, so\n // workflow MCP mutations must not overlap within a single server process.\n const prior = workflowExecutionQueue;\n let release!: () => void;\n workflowExecutionQueue = new Promise<void>((resolve) => {\n release = resolve;\n });\n\n await prior;\n try {\n return await fn();\n } finally {\n release();\n }\n}\n\nasync function enforceWorkflowWriteGate(\n toolName: string,\n projectDir: string,\n milestoneId: string | null = null,\n): Promise<void> {\n const writeGate = await getWorkflowWriteGateModule();\n const snapshot = writeGate.loadWriteGateSnapshot(projectDir);\n const pendingGate = writeGate.shouldBlockPendingGateInSnapshot(\n snapshot,\n toolName,\n milestoneId,\n snapshot.activeQueuePhase,\n );\n if (pendingGate.block) {\n throw new Error(pendingGate.reason ?? \"workflow tool blocked by pending discussion gate\");\n }\n\n const queueGuard = writeGate.shouldBlockQueueExecutionInSnapshot(\n snapshot,\n toolName,\n \"\",\n snapshot.activeQueuePhase,\n );\n if (queueGuard.block) {\n throw new Error(queueGuard.reason ?? \"workflow tool blocked during queue mode\");\n }\n}\n\nasync function handleTaskComplete(\n projectDir: string,\n args: Omit<z.infer<typeof taskCompleteSchema>, \"projectDir\">,\n): Promise<unknown> {\n await enforceWorkflowWriteGate(\"gsd_task_complete\", projectDir, args.milestoneId);\n const {\n taskId,\n sliceId,\n milestoneId,\n oneLiner,\n narrative,\n verification,\n deviations,\n knownIssues,\n keyFiles,\n keyDecisions,\n blockerDiscovered,\n verificationEvidence,\n } = args;\n const { executeTaskComplete } = await getWorkflowToolExecutors();\n return runSerializedWorkflowOperation(() =>\n executeTaskComplete(\n {\n taskId,\n sliceId,\n milestoneId,\n oneLiner,\n narrative,\n verification,\n deviations,\n knownIssues,\n keyFiles,\n keyDecisions,\n blockerDiscovered,\n verificationEvidence,\n },\n projectDir,\n ),\n );\n}\n\nasync function handleSliceComplete(\n projectDir: string,\n args: z.infer<typeof sliceCompleteSchema>,\n): Promise<unknown> {\n await enforceWorkflowWriteGate(\"gsd_slice_complete\", projectDir, args.milestoneId);\n const { executeSliceComplete } = await getWorkflowToolExecutors();\n const { projectDir: _projectDir, ...params } = args;\n return runSerializedWorkflowOperation(() => executeSliceComplete(params, projectDir));\n}\n\nasync function handleReplanSlice(\n projectDir: string,\n args: z.infer<typeof replanSliceSchema>,\n): Promise<unknown> {\n await enforceWorkflowWriteGate(\"gsd_replan_slice\", projectDir, args.milestoneId);\n const { executeReplanSlice } = await getWorkflowToolExecutors();\n const { projectDir: _projectDir, ...params } = args;\n return runSerializedWorkflowOperation(() => executeReplanSlice(params, projectDir));\n}\n\nasync function handleCompleteMilestone(\n projectDir: string,\n args: z.infer<typeof completeMilestoneSchema>,\n): Promise<unknown> {\n await enforceWorkflowWriteGate(\"gsd_complete_milestone\", projectDir, args.milestoneId);\n const { executeCompleteMilestone } = await getWorkflowToolExecutors();\n const { projectDir: _projectDir, ...params } = args;\n return runSerializedWorkflowOperation(() => executeCompleteMilestone(params, projectDir));\n}\n\nasync function handleValidateMilestone(\n projectDir: string,\n args: z.infer<typeof validateMilestoneSchema>,\n): Promise<unknown> {\n await enforceWorkflowWriteGate(\"gsd_validate_milestone\", projectDir, args.milestoneId);\n const { executeValidateMilestone } = await getWorkflowToolExecutors();\n const { projectDir: _projectDir, ...params } = args;\n return runSerializedWorkflowOperation(() => executeValidateMilestone(params, projectDir));\n}\n\nasync function handleReassessRoadmap(\n projectDir: string,\n args: z.infer<typeof reassessRoadmapSchema>,\n): Promise<unknown> {\n await enforceWorkflowWriteGate(\"gsd_reassess_roadmap\", projectDir, args.milestoneId);\n const { executeReassessRoadmap } = await getWorkflowToolExecutors();\n const { projectDir: _projectDir, ...params } = args;\n return runSerializedWorkflowOperation(() => executeReassessRoadmap(params, projectDir));\n}\n\nasync function handleSaveGateResult(\n projectDir: string,\n args: z.infer<typeof saveGateResultSchema>,\n): Promise<unknown> {\n await enforceWorkflowWriteGate(\"gsd_save_gate_result\", projectDir, args.milestoneId);\n const { executeSaveGateResult } = await getWorkflowToolExecutors();\n const { projectDir: _projectDir, ...params } = args;\n return runSerializedWorkflowOperation(() => executeSaveGateResult(params, projectDir));\n}\n\nconst projectDirParam = z.string().describe(\"Absolute path to the project directory within the configured workflow root\");\n\nconst planMilestoneParams = {\n projectDir: projectDirParam,\n milestoneId: z.string().describe(\"Milestone ID (e.g. M001)\"),\n title: z.string().describe(\"Milestone title\"),\n vision: z.string().describe(\"Milestone vision\"),\n slices: z.array(z.object({\n sliceId: z.string(),\n title: z.string(),\n risk: z.string(),\n depends: z.array(z.string()),\n demo: z.string(),\n goal: z.string(),\n successCriteria: z.string(),\n proofLevel: z.string(),\n integrationClosure: z.string(),\n observabilityImpact: z.string(),\n })).describe(\"Planned slices for the milestone\"),\n status: z.string().optional().describe(\"Milestone status\"),\n dependsOn: z.array(z.string()).optional().describe(\"Milestone dependencies\"),\n successCriteria: z.array(z.string()).optional().describe(\"Top-level success criteria bullets\"),\n keyRisks: z.array(z.object({\n risk: z.string(),\n whyItMatters: z.string(),\n })).optional().describe(\"Structured risk entries\"),\n proofStrategy: z.array(z.object({\n riskOrUnknown: z.string(),\n retireIn: z.string(),\n whatWillBeProven: z.string(),\n })).optional().describe(\"Structured proof strategy entries\"),\n verificationContract: z.string().optional(),\n verificationIntegration: z.string().optional(),\n verificationOperational: z.string().optional(),\n verificationUat: z.string().optional(),\n definitionOfDone: z.array(z.string()).optional(),\n requirementCoverage: z.string().optional(),\n boundaryMapMarkdown: z.string().optional(),\n};\nconst planMilestoneSchema = z.object(planMilestoneParams);\n\nconst planSliceParams = {\n projectDir: projectDirParam,\n milestoneId: z.string().describe(\"Milestone ID (e.g. M001)\"),\n sliceId: z.string().describe(\"Slice ID (e.g. S01)\"),\n goal: z.string().describe(\"Slice goal\"),\n tasks: z.array(z.object({\n taskId: z.string(),\n title: z.string(),\n description: z.string(),\n estimate: z.string(),\n files: z.array(z.string()),\n verify: z.string(),\n inputs: z.array(z.string()),\n expectedOutput: z.array(z.string()),\n observabilityImpact: z.string().optional(),\n })).describe(\"Planned tasks for the slice\"),\n successCriteria: z.string().optional(),\n proofLevel: z.string().optional(),\n integrationClosure: z.string().optional(),\n observabilityImpact: z.string().optional(),\n};\nconst planSliceSchema = z.object(planSliceParams);\n\nconst completeMilestoneParams = {\n projectDir: projectDirParam,\n milestoneId: z.string().describe(\"Milestone ID (e.g. M001)\"),\n title: z.string().describe(\"Milestone title\"),\n oneLiner: z.string().describe(\"One-sentence summary of what the milestone achieved\"),\n narrative: z.string().describe(\"Detailed narrative of what happened during the milestone\"),\n verificationPassed: z.boolean().describe(\"Must be true after milestone verification succeeds\"),\n successCriteriaResults: z.string().optional(),\n definitionOfDoneResults: z.string().optional(),\n requirementOutcomes: z.string().optional(),\n keyDecisions: z.array(z.string()).optional(),\n keyFiles: z.array(z.string()).optional(),\n lessonsLearned: z.array(z.string()).optional(),\n followUps: z.string().optional(),\n deviations: z.string().optional(),\n};\nconst completeMilestoneSchema = z.object(completeMilestoneParams);\n\nconst validateMilestoneParams = {\n projectDir: projectDirParam,\n milestoneId: z.string().describe(\"Milestone ID (e.g. M001)\"),\n verdict: z.enum([\"pass\", \"needs-attention\", \"needs-remediation\"]).describe(\"Validation verdict\"),\n remediationRound: z.number().describe(\"Remediation round (0 for first validation)\"),\n successCriteriaChecklist: z.string().describe(\"Markdown checklist of success criteria with evidence\"),\n sliceDeliveryAudit: z.string().describe(\"Markdown auditing each slice's claimed vs delivered output\"),\n crossSliceIntegration: z.string().describe(\"Markdown describing cross-slice issues or closure\"),\n requirementCoverage: z.string().describe(\"Markdown describing requirement coverage and gaps\"),\n verificationClasses: z.string().optional(),\n verdictRationale: z.string().describe(\"Why this verdict was chosen\"),\n remediationPlan: z.string().optional(),\n};\nconst validateMilestoneSchema = z.object(validateMilestoneParams);\n\nconst roadmapSliceChangeSchema = z.object({\n sliceId: z.string(),\n title: z.string(),\n risk: z.string().optional(),\n depends: z.array(z.string()).optional(),\n demo: z.string().optional(),\n});\n\nconst reassessRoadmapParams = {\n projectDir: projectDirParam,\n milestoneId: z.string().describe(\"Milestone ID (e.g. M001)\"),\n completedSliceId: z.string().describe(\"Slice ID that just completed\"),\n verdict: z.string().describe(\"Assessment verdict such as roadmap-confirmed or roadmap-adjusted\"),\n assessment: z.string().describe(\"Assessment text explaining the roadmap decision\"),\n sliceChanges: z.object({\n modified: z.array(roadmapSliceChangeSchema),\n added: z.array(roadmapSliceChangeSchema),\n removed: z.array(z.string()),\n }).describe(\"Slice changes to apply\"),\n};\nconst reassessRoadmapSchema = z.object(reassessRoadmapParams);\n\nconst saveGateResultParams = {\n projectDir: projectDirParam,\n milestoneId: z.string().describe(\"Milestone ID (e.g. M001)\"),\n sliceId: z.string().describe(\"Slice ID (e.g. S01)\"),\n gateId: z.enum([\"Q3\", \"Q4\", \"Q5\", \"Q6\", \"Q7\", \"Q8\"]).describe(\"Gate ID\"),\n taskId: z.string().optional().describe(\"Task ID for task-scoped gates\"),\n verdict: z.enum([\"pass\", \"flag\", \"omitted\"]).describe(\"Gate verdict\"),\n rationale: z.string().describe(\"One-sentence justification\"),\n findings: z.string().optional().describe(\"Detailed markdown findings\"),\n};\nconst saveGateResultSchema = z.object(saveGateResultParams);\n\nconst replanSliceParams = {\n projectDir: projectDirParam,\n milestoneId: z.string().describe(\"Milestone ID (e.g. M001)\"),\n sliceId: z.string().describe(\"Slice ID (e.g. S01)\"),\n blockerTaskId: z.string().describe(\"Task ID that discovered the blocker\"),\n blockerDescription: z.string().describe(\"Description of the blocker\"),\n whatChanged: z.string().describe(\"Summary of what changed in the plan\"),\n updatedTasks: z.array(z.object({\n taskId: z.string(),\n title: z.string(),\n description: z.string(),\n estimate: z.string(),\n files: z.array(z.string()),\n verify: z.string(),\n inputs: z.array(z.string()),\n expectedOutput: z.array(z.string()),\n fullPlanMd: z.string().optional(),\n })).describe(\"Tasks to upsert into the replanned slice\"),\n removedTaskIds: z.array(z.string()).describe(\"Task IDs to remove from the slice\"),\n};\nconst replanSliceSchema = z.object(replanSliceParams);\n\nconst sliceCompleteParams = {\n projectDir: projectDirParam,\n sliceId: z.string().describe(\"Slice ID (e.g. S01)\"),\n milestoneId: z.string().describe(\"Milestone ID (e.g. M001)\"),\n sliceTitle: z.string().describe(\"Title of the slice\"),\n oneLiner: z.string().describe(\"One-line summary of what the slice accomplished\"),\n narrative: z.string().describe(\"Detailed narrative of what happened across all tasks\"),\n verification: z.string().describe(\"What was verified across all tasks\"),\n uatContent: z.string().describe(\"UAT test content (markdown body)\"),\n deviations: z.string().optional(),\n knownLimitations: z.string().optional(),\n followUps: z.string().optional(),\n keyFiles: z.union([z.array(z.string()), z.string()]).optional(),\n keyDecisions: z.union([z.array(z.string()), z.string()]).optional(),\n patternsEstablished: z.union([z.array(z.string()), z.string()]).optional(),\n observabilitySurfaces: z.union([z.array(z.string()), z.string()]).optional(),\n provides: z.union([z.array(z.string()), z.string()]).optional(),\n requirementsSurfaced: z.union([z.array(z.string()), z.string()]).optional(),\n drillDownPaths: z.union([z.array(z.string()), z.string()]).optional(),\n affects: z.union([z.array(z.string()), z.string()]).optional(),\n requirementsAdvanced: z.array(z.union([\n z.object({ id: z.string(), how: z.string() }),\n z.string(),\n ])).optional(),\n requirementsValidated: z.array(z.union([\n z.object({ id: z.string(), proof: z.string() }),\n z.string(),\n ])).optional(),\n requirementsInvalidated: z.array(z.union([\n z.object({ id: z.string(), what: z.string() }),\n z.string(),\n ])).optional(),\n filesModified: z.array(z.union([\n z.object({ path: z.string(), description: z.string() }),\n z.string(),\n ])).optional(),\n requires: z.array(z.union([\n z.object({ slice: z.string(), provides: z.string() }),\n z.string(),\n ])).optional(),\n};\nconst sliceCompleteSchema = z.object(sliceCompleteParams);\n\nconst summarySaveParams = {\n projectDir: projectDirParam,\n milestone_id: z.string().describe(\"Milestone ID (e.g. M001)\"),\n slice_id: z.string().optional().describe(\"Slice ID (e.g. S01)\"),\n task_id: z.string().optional().describe(\"Task ID (e.g. T01)\"),\n artifact_type: z.string().describe(\"Artifact type to save (SUMMARY, RESEARCH, CONTEXT, ASSESSMENT, CONTEXT-DRAFT)\"),\n content: z.string().describe(\"The full markdown content of the artifact\"),\n};\nconst summarySaveSchema = z.object(summarySaveParams);\n\nconst taskCompleteParams = {\n projectDir: projectDirParam,\n taskId: z.string().describe(\"Task ID (e.g. T01)\"),\n sliceId: z.string().describe(\"Slice ID (e.g. S01)\"),\n milestoneId: z.string().describe(\"Milestone ID (e.g. M001)\"),\n oneLiner: z.string().describe(\"One-line summary of what was accomplished\"),\n narrative: z.string().describe(\"Detailed narrative of what happened during the task\"),\n verification: z.string().describe(\"What was verified and how\"),\n deviations: z.string().optional().describe(\"Deviations from the task plan\"),\n knownIssues: z.string().optional().describe(\"Known issues discovered but not fixed\"),\n keyFiles: z.array(z.string()).optional().describe(\"List of key files created or modified\"),\n keyDecisions: z.array(z.string()).optional().describe(\"List of key decisions made during this task\"),\n blockerDiscovered: z.boolean().optional().describe(\"Whether a plan-invalidating blocker was discovered\"),\n verificationEvidence: z.array(z.union([\n z.object({\n command: z.string(),\n exitCode: z.number(),\n verdict: z.string(),\n durationMs: z.number(),\n }),\n z.string(),\n ])).optional().describe(\"Verification evidence entries\"),\n};\nconst taskCompleteSchema = z.object(taskCompleteParams);\n\nconst milestoneStatusParams = {\n projectDir: projectDirParam,\n milestoneId: z.string().describe(\"Milestone ID to query (e.g. M001)\"),\n};\nconst milestoneStatusSchema = z.object(milestoneStatusParams);\n\nexport function registerWorkflowTools(server: McpToolServer): void {\n server.tool(\n \"gsd_plan_milestone\",\n \"Write milestone planning state to the GSD database and render ROADMAP.md from DB.\",\n planMilestoneParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(planMilestoneSchema, args);\n const { projectDir, ...params } = parsed;\n await enforceWorkflowWriteGate(\"gsd_plan_milestone\", projectDir, params.milestoneId);\n const { executePlanMilestone } = await getWorkflowToolExecutors();\n return runSerializedWorkflowOperation(() => executePlanMilestone(params, projectDir));\n },\n );\n\n server.tool(\n \"gsd_plan_slice\",\n \"Write slice/task planning state to the GSD database and render plan artifacts from DB.\",\n planSliceParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(planSliceSchema, args);\n const { projectDir, ...params } = parsed;\n await enforceWorkflowWriteGate(\"gsd_plan_slice\", projectDir, params.milestoneId);\n const { executePlanSlice } = await getWorkflowToolExecutors();\n return runSerializedWorkflowOperation(() => executePlanSlice(params, projectDir));\n },\n );\n\n server.tool(\n \"gsd_replan_slice\",\n \"Replan a slice after a blocker is discovered, preserving completed tasks and re-rendering PLAN.md + REPLAN.md.\",\n replanSliceParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(replanSliceSchema, args);\n return handleReplanSlice(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_slice_replan\",\n \"Alias for gsd_replan_slice. Replan a slice after a blocker is discovered.\",\n replanSliceParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(replanSliceSchema, args);\n return handleReplanSlice(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_slice_complete\",\n \"Record a completed slice to the GSD database, render SUMMARY.md + UAT.md, and update roadmap projection.\",\n sliceCompleteParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(sliceCompleteSchema, args);\n return handleSliceComplete(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_complete_slice\",\n \"Alias for gsd_slice_complete. Record a completed slice to the GSD database and render summary/UAT artifacts.\",\n sliceCompleteParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(sliceCompleteSchema, args);\n return handleSliceComplete(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_complete_milestone\",\n \"Record a completed milestone to the GSD database and render its SUMMARY.md.\",\n completeMilestoneParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(completeMilestoneSchema, args);\n return handleCompleteMilestone(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_milestone_complete\",\n \"Alias for gsd_complete_milestone. Record a completed milestone to the GSD database and render its SUMMARY.md.\",\n completeMilestoneParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(completeMilestoneSchema, args);\n return handleCompleteMilestone(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_validate_milestone\",\n \"Validate a milestone, persist validation results to the GSD database, and render VALIDATION.md.\",\n validateMilestoneParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(validateMilestoneSchema, args);\n return handleValidateMilestone(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_milestone_validate\",\n \"Alias for gsd_validate_milestone. Validate a milestone and render VALIDATION.md.\",\n validateMilestoneParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(validateMilestoneSchema, args);\n return handleValidateMilestone(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_reassess_roadmap\",\n \"Reassess a milestone roadmap after a slice completes, writing ASSESSMENT.md and re-rendering ROADMAP.md.\",\n reassessRoadmapParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(reassessRoadmapSchema, args);\n return handleReassessRoadmap(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_roadmap_reassess\",\n \"Alias for gsd_reassess_roadmap. Reassess a roadmap after slice completion.\",\n reassessRoadmapParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(reassessRoadmapSchema, args);\n return handleReassessRoadmap(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_save_gate_result\",\n \"Save a quality gate result to the GSD database.\",\n saveGateResultParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(saveGateResultSchema, args);\n return handleSaveGateResult(parsed.projectDir, parsed);\n },\n );\n\n server.tool(\n \"gsd_summary_save\",\n \"Save a GSD summary/research/context/assessment artifact to the database and disk.\",\n summarySaveParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(summarySaveSchema, args);\n const { projectDir, milestone_id, slice_id, task_id, artifact_type, content } = parsed;\n await enforceWorkflowWriteGate(\"gsd_summary_save\", projectDir, milestone_id);\n const executors = await getWorkflowToolExecutors();\n const supportedArtifactTypes = getSupportedSummaryArtifactTypes(executors);\n if (!supportedArtifactTypes.includes(artifact_type)) {\n throw new Error(\n `artifact_type must be one of: ${supportedArtifactTypes.join(\", \")}`,\n );\n }\n return runSerializedWorkflowOperation(() =>\n executors.executeSummarySave({ milestone_id, slice_id, task_id, artifact_type, content }, projectDir),\n );\n },\n );\n\n server.tool(\n \"gsd_task_complete\",\n \"Record a completed task to the GSD database and render its SUMMARY.md.\",\n taskCompleteParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(taskCompleteSchema, args);\n const { projectDir, ...taskArgs } = parsed;\n return handleTaskComplete(projectDir, taskArgs);\n },\n );\n\n server.tool(\n \"gsd_complete_task\",\n \"Alias for gsd_task_complete. Record a completed task to the GSD database and render its SUMMARY.md.\",\n taskCompleteParams,\n async (args: Record<string, unknown>) => {\n const parsed = parseWorkflowArgs(taskCompleteSchema, args);\n const { projectDir, ...taskArgs } = parsed;\n return handleTaskComplete(projectDir, taskArgs);\n },\n );\n\n server.tool(\n \"gsd_milestone_status\",\n \"Read the current status of a milestone and all its slices from the GSD database.\",\n milestoneStatusParams,\n async (args: Record<string, unknown>) => {\n const { projectDir, milestoneId } = parseWorkflowArgs(milestoneStatusSchema, args);\n await enforceWorkflowWriteGate(\"gsd_milestone_status\", projectDir, milestoneId);\n const { executeMilestoneStatus } = await getWorkflowToolExecutors();\n return runSerializedWorkflowOperation(() => executeMilestoneStatus({ milestoneId }, projectDir));\n },\n );\n}\n"]}
|
|
@@ -315,10 +315,21 @@ function getSupportedSummaryArtifactTypes(executors: WorkflowToolExecutors): rea
|
|
|
315
315
|
}
|
|
316
316
|
|
|
317
317
|
function getWriteGateModuleCandidates(): string[] {
|
|
318
|
-
|
|
318
|
+
const candidates: string[] = [];
|
|
319
|
+
const explicitModule = process.env.GSD_WORKFLOW_WRITE_GATE_MODULE?.trim();
|
|
320
|
+
if (explicitModule) {
|
|
321
|
+
if (/^[a-z]+:/i.test(explicitModule) && !explicitModule.startsWith("file:")) {
|
|
322
|
+
throw new Error("GSD_WORKFLOW_WRITE_GATE_MODULE only supports file: URLs or filesystem paths.");
|
|
323
|
+
}
|
|
324
|
+
candidates.push(explicitModule.startsWith("file:") ? explicitModule : toFileUrl(explicitModule));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
candidates.push(
|
|
319
328
|
new URL("../../../src/resources/extensions/gsd/bootstrap/write-gate.js", import.meta.url).href,
|
|
320
329
|
new URL("../../../src/resources/extensions/gsd/bootstrap/write-gate.ts", import.meta.url).href,
|
|
321
|
-
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
return [...new Set(candidates)];
|
|
322
333
|
}
|
|
323
334
|
|
|
324
335
|
function toFileUrl(modulePath: string): string {
|
|
@@ -189,8 +189,11 @@ async function runLoop(currentContext, newMessages, config, signal, stream, stre
|
|
|
189
189
|
if (hasMoreToolCalls && config.externalToolExecution) {
|
|
190
190
|
// External execution mode: tools were handled by the provider
|
|
191
191
|
// (e.g., Claude Code SDK). Emit tool_execution events for each
|
|
192
|
-
// tool call.
|
|
192
|
+
// tool call. Prefer any provider-supplied externalResult attached
|
|
193
|
+
// to the tool call so the UI can show the real stdout/stderr
|
|
194
|
+
// instead of a generic placeholder.
|
|
193
195
|
for (const tc of toolCalls) {
|
|
196
|
+
const externalResult = tc.externalResult;
|
|
194
197
|
stream.push({
|
|
195
198
|
type: "tool_execution_start",
|
|
196
199
|
toolCallId: tc.id,
|
|
@@ -201,11 +204,16 @@ async function runLoop(currentContext, newMessages, config, signal, stream, stre
|
|
|
201
204
|
type: "tool_execution_end",
|
|
202
205
|
toolCallId: tc.id,
|
|
203
206
|
toolName: tc.name,
|
|
204
|
-
result:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
207
|
+
result: externalResult
|
|
208
|
+
? {
|
|
209
|
+
content: externalResult.content ?? [{ type: "text", text: "" }],
|
|
210
|
+
details: externalResult.details ?? {},
|
|
211
|
+
}
|
|
212
|
+
: {
|
|
213
|
+
content: [{ type: "text", text: "(executed by Claude Code)" }],
|
|
214
|
+
details: {},
|
|
215
|
+
},
|
|
216
|
+
isError: externalResult?.isError ?? false,
|
|
209
217
|
});
|
|
210
218
|
}
|
|
211
219
|
// Don't add tool results to context or loop back — the streamSimple
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent loop that works with AgentMessage throughout.\n * Transforms to Message[] only at the LLM call boundary.\n */\n\nimport {\n\ttype AssistantMessage,\n\ttype Context,\n\tEventStream,\n\tstreamSimple,\n\ttype ToolResultMessage,\n\tvalidateToolArguments,\n} from \"@gsd/pi-ai\";\nimport type {\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopConfig,\n\tAgentMessage,\n\tAgentTool,\n\tAgentToolCall,\n\tAgentToolResult,\n\tStreamFn,\n} from \"./types.js\";\n\n/**\n * Maximum number of consecutive turns where ALL tool calls in the turn fail\n * schema validation before the loop terminates. This prevents unbounded retry\n * loops when the LLM repeatedly emits tool calls with arguments that cannot\n * pass validation (e.g., schema overload, truncated JSON, missing required\n * fields). See: https://github.com/gsd-build/gsd-2/issues/2783\n */\nexport const MAX_CONSECUTIVE_VALIDATION_FAILURES = 3;\n\nexport const ZERO_USAGE = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n} as const;\n\n/**\n * Build an AssistantMessage for an unhandled error caught outside runLoop.\n * Uses the model from config so the message satisfies the full interface.\n */\nfunction createErrorMessage(error: unknown, config: AgentLoopConfig): AssistantMessage {\n\tconst msg = error instanceof Error ? error.message : String(error);\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [{ type: \"text\", text: msg }],\n\t\tapi: config.model.api,\n\t\tprovider: config.model.provider,\n\t\tmodel: config.model.id,\n\t\tusage: ZERO_USAGE,\n\t\tstopReason: \"error\",\n\t\terrorMessage: msg,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\n/**\n * Emit a message_start + message_end pair for a single message.\n */\nfunction emitMessagePair(stream: EventStream<AgentEvent, AgentMessage[]>, message: AgentMessage): void {\n\tstream.push({ type: \"message_start\", message });\n\tstream.push({ type: \"message_end\", message });\n}\n\n/**\n * Emit the standard error sequence when the outer agent loop catches an error.\n * Pushes message_start/end, turn_end, agent_end, then closes the stream.\n */\nfunction emitErrorSequence(\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n\terrMsg: AssistantMessage,\n\tnewMessages: AgentMessage[],\n): void {\n\temitMessagePair(stream, errMsg);\n\tstream.push({ type: \"turn_end\", message: errMsg, toolResults: [] });\n\tstream.push({ type: \"agent_end\", messages: [...newMessages, errMsg] });\n\tstream.end([...newMessages, errMsg]);\n}\n\n/**\n * Start an agent loop with a new prompt message.\n * The prompt is added to the context and events are emitted for it.\n */\nexport function agentLoop(\n\tprompts: AgentMessage[],\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal?: AbortSignal,\n\tstreamFn?: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tconst stream = createAgentStream();\n\n\t(async () => {\n\t\tconst newMessages: AgentMessage[] = [...prompts];\n\t\tconst currentContext: AgentContext = {\n\t\t\t...context,\n\t\t\tmessages: [...context.messages, ...prompts],\n\t\t};\n\n\t\tstream.push({ type: \"agent_start\" });\n\t\tstream.push({ type: \"turn_start\" });\n\t\tfor (const prompt of prompts) {\n\t\t\temitMessagePair(stream, prompt);\n\t\t}\n\n\t\ttry {\n\t\t\tawait runLoop(currentContext, newMessages, config, signal, stream, streamFn);\n\t\t} catch (error) {\n\t\t\temitErrorSequence(stream, createErrorMessage(error, config), newMessages);\n\t\t}\n\t})();\n\n\treturn stream;\n}\n\n/**\n * Continue an agent loop from the current context without adding a new message.\n * Used for retries - context already has user message or tool results.\n *\n * **Important:** The last message in context must convert to a `user` or `toolResult` message\n * via `convertToLlm`. If it doesn't, the LLM provider will reject the request.\n * This cannot be validated here since `convertToLlm` is only called once per turn.\n */\nexport function agentLoopContinue(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal?: AbortSignal,\n\tstreamFn?: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\n\tconst stream = createAgentStream();\n\n\t(async () => {\n\t\tconst newMessages: AgentMessage[] = [];\n\t\tconst currentContext: AgentContext = {\n\t\t\t...context,\n\t\t\tmessages: [...context.messages],\n\t\t};\n\n\t\tstream.push({ type: \"agent_start\" });\n\t\tstream.push({ type: \"turn_start\" });\n\n\t\ttry {\n\t\t\tawait runLoop(currentContext, newMessages, config, signal, stream, streamFn);\n\t\t} catch (error) {\n\t\t\temitErrorSequence(stream, createErrorMessage(error, config), newMessages);\n\t\t}\n\t})();\n\n\treturn stream;\n}\n\nfunction createAgentStream(): EventStream<AgentEvent, AgentMessage[]> {\n\treturn new EventStream<AgentEvent, AgentMessage[]>(\n\t\t(event: AgentEvent) => event.type === \"agent_end\",\n\t\t(event: AgentEvent) => (event.type === \"agent_end\" ? event.messages : []),\n\t);\n}\n\n/**\n * Main loop logic shared by agentLoop and agentLoopContinue.\n */\nasync function runLoop(\n\tcurrentContext: AgentContext,\n\tnewMessages: AgentMessage[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n\tstreamFn?: StreamFn,\n): Promise<void> {\n\tlet firstTurn = true;\n\t// Check for steering messages at start (user may have typed while waiting)\n\tlet pendingMessages: AgentMessage[] = (await config.getSteeringMessages?.()) || [];\n\n\t// Track consecutive turns where ALL tool calls fail validation.\n\t// When the LLM repeatedly emits tool calls with schema-overloaded or malformed\n\t// arguments, each turn produces only error tool results. Without a cap, this\n\t// creates an unbounded retry loop that burns budget. (#2783)\n\tlet consecutiveAllToolErrorTurns = 0;\n\n\t// Outer loop: continues when queued follow-up messages arrive after agent would stop\n\twhile (true) {\n\t\tlet hasMoreToolCalls = true;\n\t\tlet steeringAfterTools: AgentMessage[] | null = null;\n\n\t\t// Inner loop: process tool calls and steering messages\n\t\twhile (hasMoreToolCalls || pendingMessages.length > 0) {\n\t\t\tif (!firstTurn) {\n\t\t\t\tstream.push({ type: \"turn_start\" });\n\t\t\t} else {\n\t\t\t\tfirstTurn = false;\n\t\t\t}\n\n\t\t\t// Process pending messages (inject before next assistant response)\n\t\t\tif (pendingMessages.length > 0) {\n\t\t\t\tfor (const message of pendingMessages) {\n\t\t\t\t\temitMessagePair(stream, message);\n\t\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\t\tnewMessages.push(message);\n\t\t\t\t}\n\t\t\t\tpendingMessages = [];\n\t\t\t}\n\n\t\t\t// Stream assistant response\n\t\t\tlet message: AssistantMessage;\n\t\t\ttry {\n\t\t\t\tmessage = await streamAssistantResponse(currentContext, config, signal, stream, streamFn);\n\t\t\t} catch (error) {\n\t\t\t\t// Critical failure before stream started (e.g. getApiKey threw, credentials in\n\t\t\t\t// backoff, network unavailable). Convert to a graceful error message so the\n\t\t\t\t// agent loop can end cleanly instead of crashing with an unhandled rejection.\n\t\t\t\tconst errorText = error instanceof Error ? error.message : String(error);\n\t\t\t\tmessage = {\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tcontent: [],\n\t\t\t\t\tapi: config.model.api,\n\t\t\t\t\tprovider: config.model.provider,\n\t\t\t\t\tmodel: config.model.id,\n\t\t\t\t\tusage: ZERO_USAGE,\n\t\t\t\t\tstopReason: signal?.aborted ? \"aborted\" : \"error\",\n\t\t\t\t\terrorMessage: errorText,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tstream.push({ type: \"message_start\", message: { ...message } });\n\t\t\t\tstream.push({ type: \"message_end\", message });\n\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t}\n\t\t\tnewMessages.push(message);\n\n\t\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\t\t\tstream.push({ type: \"turn_end\", message, toolResults: [] });\n\t\t\t\tstream.push({ type: \"agent_end\", messages: newMessages });\n\t\t\t\tstream.end(newMessages);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check for tool calls or paused server turn\n\t\t\tconst toolCalls = message.content.filter((c) => c.type === \"toolCall\");\n\t\t\thasMoreToolCalls =\n\t\t\t\ttoolCalls.length > 0 || message.stopReason === \"pauseTurn\";\n\n\t\t\tconst toolResults: ToolResultMessage[] = [];\n\t\t\tif (hasMoreToolCalls && config.externalToolExecution) {\n\t\t\t\t// External execution mode: tools were handled by the provider\n\t\t\t\t// (e.g., Claude Code SDK). Emit tool_execution events for each\n\t\t\t\t// tool call. The TUI adds these as components after the message.\n\t\t\t\tfor (const tc of toolCalls as AgentToolCall[]) {\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"tool_execution_start\",\n\t\t\t\t\t\ttoolCallId: tc.id,\n\t\t\t\t\t\ttoolName: tc.name,\n\t\t\t\t\t\targs: tc.arguments,\n\t\t\t\t\t});\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"tool_execution_end\",\n\t\t\t\t\t\ttoolCallId: tc.id,\n\t\t\t\t\t\ttoolName: tc.name,\n\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"(executed by Claude Code)\" }],\n\t\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Don't add tool results to context or loop back — the streamSimple\n\t\t\t\t// call already ran the full multi-turn agentic loop.\n\t\t\t\thasMoreToolCalls = false;\n\t\t\t} else if (hasMoreToolCalls) {\n\t\t\t\tconst toolExecution = await executeToolCalls(\n\t\t\t\t\tcurrentContext,\n\t\t\t\t\tmessage,\n\t\t\t\t\tconfig,\n\t\t\t\t\tsignal,\n\t\t\t\t\tstream,\n\t\t\t\t);\n\t\t\t\ttoolResults.push(...toolExecution.toolResults);\n\t\t\t\tsteeringAfterTools = toolExecution.steeringMessages ?? null;\n\n\t\t\t\tfor (const result of toolResults) {\n\t\t\t\t\tcurrentContext.messages.push(result);\n\t\t\t\t\tnewMessages.push(result);\n\t\t\t\t}\n\n\t\t\t\t// Schema overload detection (#2783): count only preparation-phase\n\t\t\t\t// errors (schema validation, tool-not-found, tool-blocked) toward the\n\t\t\t\t// consecutive failure cap. Tool execution errors — such as bash\n\t\t\t\t// commands returning non-zero exit codes (e.g. grep/rg exit 1 for\n\t\t\t\t// \"no matches\") — are valid tool usage and must NOT trigger the cap.\n\t\t\t\t// See: #3618\n\t\t\t\tconst hasPreparationErrors = toolExecution.preparationErrorCount > 0;\n\t\t\t\tconst allToolsFailedPreparation =\n\t\t\t\t\ttoolResults.length > 0 &&\n\t\t\t\t\ttoolExecution.preparationErrorCount === toolResults.length;\n\t\t\t\tif (allToolsFailedPreparation) {\n\t\t\t\t\tconsecutiveAllToolErrorTurns++;\n\t\t\t\t} else if (!hasPreparationErrors) {\n\t\t\t\t\t// Reset only when there are zero preparation errors this turn.\n\t\t\t\t\t// Mixed turns (some prep errors, some successes) don't reset,\n\t\t\t\t\t// but they also don't increment — this avoids masking a\n\t\t\t\t\t// pattern of alternating schema failures with one working call.\n\t\t\t\t\tconsecutiveAllToolErrorTurns = 0;\n\t\t\t\t}\n\n\t\t\t\tif (consecutiveAllToolErrorTurns >= MAX_CONSECUTIVE_VALIDATION_FAILURES) {\n\t\t\t\t\t// Force-stop: the LLM is stuck retrying broken tool calls.\n\t\t\t\t\t// Emit the turn_end and terminate the agent loop cleanly.\n\t\t\t\t\tstream.push({ type: \"turn_end\", message, toolResults });\n\t\t\t\t\tconst stopMessage: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Agent stopped: ${consecutiveAllToolErrorTurns} consecutive turns with all tool calls failing. This usually means the model is repeatedly sending arguments that do not match the tool schema.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tapi: config.model.api,\n\t\t\t\t\t\tprovider: config.model.provider,\n\t\t\t\t\t\tmodel: config.model.id,\n\t\t\t\t\t\tusage: ZERO_USAGE,\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: \"Schema overload: consecutive tool validation failures exceeded cap\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\temitMessagePair(stream, stopMessage);\n\t\t\t\t\tnewMessages.push(stopMessage);\n\t\t\t\t\tstream.push({ type: \"turn_end\", message: stopMessage, toolResults: [] });\n\t\t\t\t\tstream.push({ type: \"agent_end\", messages: newMessages });\n\t\t\t\t\tstream.end(newMessages);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstream.push({ type: \"turn_end\", message, toolResults });\n\n\t\t\t// Get steering messages after turn completes\n\t\t\tif (steeringAfterTools && steeringAfterTools.length > 0) {\n\t\t\t\tpendingMessages = steeringAfterTools;\n\t\t\t\tsteeringAfterTools = null;\n\t\t\t} else {\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t}\n\t\t}\n\n\t\t// Agent would stop here. Check for follow-up messages.\n\t\tconst followUpMessages = (await config.getFollowUpMessages?.()) || [];\n\t\tif (followUpMessages.length > 0) {\n\t\t\t// Set as pending so inner loop processes them\n\t\t\tpendingMessages = followUpMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// No more messages, exit\n\t\tbreak;\n\t}\n\n\tstream.push({ type: \"agent_end\", messages: newMessages });\n\tstream.end(newMessages);\n}\n\n/**\n * Stream an assistant response from the LLM.\n * This is where AgentMessage[] gets transformed to Message[] for the LLM.\n */\nasync function streamAssistantResponse(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n\tstreamFn?: StreamFn,\n): Promise<AssistantMessage> {\n\t// Apply context transform if configured (AgentMessage[] → AgentMessage[])\n\tlet messages = context.messages;\n\tif (config.transformContext) {\n\t\tmessages = await config.transformContext(messages, signal);\n\t}\n\n\t// Convert to LLM-compatible messages (AgentMessage[] → Message[])\n\tconst llmMessages = await config.convertToLlm(messages);\n\n\t// Build LLM context\n\tconst llmContext: Context = {\n\t\tsystemPrompt: context.systemPrompt,\n\t\tmessages: llmMessages,\n\t\ttools: context.tools,\n\t};\n\n\tconst streamFunction = streamFn || streamSimple;\n\n\t// Resolve API key (important for expiring tokens)\n\tconst resolvedApiKey =\n\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\n\tconst response = await streamFunction(config.model, llmContext, {\n\t\t...config,\n\t\tapiKey: resolvedApiKey,\n\t\tsignal,\n\t});\n\n\tlet partialMessage: AssistantMessage | null = null;\n\tlet addedPartial = false;\n\n\tfor await (const event of response) {\n\t\tswitch (event.type) {\n\t\t\tcase \"start\":\n\t\t\t\tpartialMessage = event.partial;\n\t\t\t\tcontext.messages.push(partialMessage);\n\t\t\t\taddedPartial = true;\n\t\t\t\tstream.push({ type: \"message_start\", message: { ...partialMessage } });\n\t\t\t\tbreak;\n\n\t\t\tcase \"text_start\":\n\t\t\tcase \"text_delta\":\n\t\t\tcase \"text_end\":\n\t\t\tcase \"thinking_start\":\n\t\t\tcase \"thinking_delta\":\n\t\t\tcase \"thinking_end\":\n\t\t\tcase \"toolcall_start\":\n\t\t\tcase \"toolcall_delta\":\n\t\t\tcase \"toolcall_end\":\n\t\t\tcase \"server_tool_use\":\n\t\t\tcase \"web_search_result\":\n\t\t\t\tif (partialMessage) {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tcontext.messages[context.messages.length - 1] = partialMessage;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"message_update\",\n\t\t\t\t\t\tassistantMessageEvent: event,\n\t\t\t\t\t\tmessage: { ...partialMessage },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"done\":\n\t\t\tcase \"error\": {\n\t\t\t\tconst finalMessage = await response.result();\n\t\t\t\tif (addedPartial) {\n\t\t\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t\t\t} else {\n\t\t\t\t\tcontext.messages.push(finalMessage);\n\t\t\t\t}\n\t\t\t\tif (!addedPartial) {\n\t\t\t\t\tstream.push({ type: \"message_start\", message: { ...finalMessage } });\n\t\t\t\t}\n\t\t\t\tstream.push({ type: \"message_end\", message: finalMessage });\n\t\t\t\treturn finalMessage;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn await response.result();\n}\n\n/**\n * Result from executing tool calls in a turn. Includes metadata about\n * error provenance so the schema overload detector can distinguish\n * preparation failures (schema validation, tool-not-found, tool-blocked)\n * from execution failures (the tool ran but threw, e.g. bash exit code 1).\n */\ninterface ToolExecutionResult {\n\ttoolResults: ToolResultMessage[];\n\tsteeringMessages?: AgentMessage[];\n\t/** Number of tool results that failed during preparation (validation/schema). */\n\tpreparationErrorCount: number;\n}\n\n/**\n * Execute tool calls from an assistant message.\n */\nasync function executeToolCalls(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ToolExecutionResult> {\n\tconst toolCalls = assistantMessage.content.filter((c) => c.type === \"toolCall\") as AgentToolCall[];\n\tif (config.toolExecution === \"sequential\") {\n\t\treturn executeToolCallsSequential(currentContext, assistantMessage, toolCalls, config, signal, stream);\n\t}\n\treturn executeToolCallsParallel(currentContext, assistantMessage, toolCalls, config, signal, stream);\n}\n\nasync function executeToolCallsSequential(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ToolExecutionResult> {\n\tconst results: ToolResultMessage[] = [];\n\tlet steeringMessages: AgentMessage[] | undefined;\n\tlet preparationErrorCount = 0;\n\n\tfor (let index = 0; index < toolCalls.length; index++) {\n\t\tconst toolCall = toolCalls[index];\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tif (preparation.kind === \"immediate\") {\n\t\t\tif (preparation.isError) {\n\t\t\t\tpreparationErrorCount++;\n\t\t\t}\n\t\t\tresults.push(emitToolCallOutcome(toolCall, preparation.result, preparation.isError, stream));\n\t\t} else {\n\t\t\tconst executed = await executePreparedToolCall(preparation, signal, stream);\n\t\t\tresults.push(\n\t\t\t\tawait finalizeExecutedToolCall(\n\t\t\t\t\tcurrentContext,\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\tpreparation,\n\t\t\t\t\texecuted,\n\t\t\t\t\tconfig,\n\t\t\t\t\tsignal,\n\t\t\t\t\tstream,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (config.getSteeringMessages) {\n\t\t\tconst steering = await config.getSteeringMessages();\n\t\t\tif (steering.length > 0) {\n\t\t\t\tsteeringMessages = steering;\n\t\t\t\tconst remainingCalls = toolCalls.slice(index + 1);\n\t\t\t\tfor (const skipped of remainingCalls) {\n\t\t\t\t\tresults.push(skipToolCall(skipped, stream));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { toolResults: results, steeringMessages, preparationErrorCount };\n}\n\nasync function executeToolCallsParallel(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ToolExecutionResult> {\n\tconst results: ToolResultMessage[] = [];\n\tconst runnableCalls: PreparedToolCall[] = [];\n\tlet steeringMessages: AgentMessage[] | undefined;\n\tlet preparationErrorCount = 0;\n\n\tfor (let index = 0; index < toolCalls.length; index++) {\n\t\tconst toolCall = toolCalls[index];\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tif (preparation.kind === \"immediate\") {\n\t\t\tif (preparation.isError) {\n\t\t\t\tpreparationErrorCount++;\n\t\t\t}\n\t\t\tresults.push(emitToolCallOutcome(toolCall, preparation.result, preparation.isError, stream));\n\t\t} else {\n\t\t\trunnableCalls.push(preparation);\n\t\t}\n\n\t\tif (config.getSteeringMessages) {\n\t\t\tconst steering = await config.getSteeringMessages();\n\t\t\tif (steering.length > 0) {\n\t\t\t\tsteeringMessages = steering;\n\t\t\t\tfor (const runnable of runnableCalls) {\n\t\t\t\t\tresults.push(skipToolCall(runnable.toolCall, stream, { emitStart: false }));\n\t\t\t\t}\n\t\t\t\tconst remainingCalls = toolCalls.slice(index + 1);\n\t\t\t\tfor (const skipped of remainingCalls) {\n\t\t\t\t\tresults.push(skipToolCall(skipped, stream));\n\t\t\t\t}\n\t\t\t\treturn { toolResults: results, steeringMessages, preparationErrorCount };\n\t\t\t}\n\t\t}\n\t}\n\n\tconst runningCalls = runnableCalls.map((prepared) => ({\n\t\tprepared,\n\t\texecution: executePreparedToolCall(prepared, signal, stream),\n\t}));\n\n\tfor (const running of runningCalls) {\n\t\tconst executed = await running.execution;\n\t\tresults.push(\n\t\t\tawait finalizeExecutedToolCall(\n\t\t\t\tcurrentContext,\n\t\t\t\tassistantMessage,\n\t\t\t\trunning.prepared,\n\t\t\t\texecuted,\n\t\t\t\tconfig,\n\t\t\t\tsignal,\n\t\t\t\tstream,\n\t\t\t),\n\t\t);\n\t}\n\n\tif (!steeringMessages && config.getSteeringMessages) {\n\t\tconst steering = await config.getSteeringMessages();\n\t\tif (steering.length > 0) {\n\t\t\tsteeringMessages = steering;\n\t\t}\n\t}\n\n\treturn { toolResults: results, steeringMessages, preparationErrorCount };\n}\n\ntype PreparedToolCall = {\n\tkind: \"prepared\";\n\ttoolCall: AgentToolCall;\n\ttool: AgentTool<any>;\n\targs: unknown;\n};\n\ntype ImmediateToolCallOutcome = {\n\tkind: \"immediate\";\n\tresult: AgentToolResult<any>;\n\tisError: boolean;\n};\n\ntype ExecutedToolCallOutcome = {\n\tresult: AgentToolResult<any>;\n\tisError: boolean;\n};\n\nasync function prepareToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCall: AgentToolCall,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<PreparedToolCall | ImmediateToolCallOutcome> {\n\tconst tool = currentContext.tools?.find((t) => t.name === toolCall.name);\n\tif (!tool) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\tresult: createErrorToolResult(`Tool ${toolCall.name} not found`),\n\t\t\tisError: true,\n\t\t};\n\t}\n\n\ttry {\n\t\tconst validatedArgs = validateToolArguments(tool, toolCall);\n\t\tif (config.beforeToolCall) {\n\t\t\tconst beforeResult = await config.beforeToolCall(\n\t\t\t\t{\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\ttoolCall,\n\t\t\t\t\targs: validatedArgs,\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (beforeResult?.block) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"immediate\",\n\t\t\t\t\tresult: createErrorToolResult(beforeResult.reason || \"Tool execution was blocked\"),\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tkind: \"prepared\",\n\t\t\ttoolCall,\n\t\t\ttool,\n\t\t\targs: validatedArgs,\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t}\n}\n\nasync function executePreparedToolCall(\n\tprepared: PreparedToolCall,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ExecutedToolCallOutcome> {\n\ttry {\n\t\tconst result = await prepared.tool.execute(\n\t\t\tprepared.toolCall.id,\n\t\t\tprepared.args as never,\n\t\t\tsignal,\n\t\t\t(partialResult) => {\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\t\ttoolCallId: prepared.toolCall.id,\n\t\t\t\t\ttoolName: prepared.toolCall.name,\n\t\t\t\t\targs: prepared.toolCall.arguments,\n\t\t\t\t\tpartialResult,\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t\treturn { result, isError: false };\n\t} catch (error) {\n\t\treturn {\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t}\n}\n\nasync function finalizeExecutedToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tprepared: PreparedToolCall,\n\texecuted: ExecutedToolCallOutcome,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ToolResultMessage> {\n\tlet result = executed.result;\n\tlet isError = executed.isError;\n\n\tif (config.afterToolCall) {\n\t\tconst afterResult = await config.afterToolCall(\n\t\t\t{\n\t\t\t\tassistantMessage,\n\t\t\t\ttoolCall: prepared.toolCall,\n\t\t\t\targs: prepared.args,\n\t\t\t\tresult,\n\t\t\t\tisError,\n\t\t\t\tcontext: currentContext,\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\tif (afterResult) {\n\t\t\tresult = {\n\t\t\t\tcontent: afterResult.content !== undefined ? afterResult.content : result.content,\n\t\t\t\tdetails: afterResult.details !== undefined ? afterResult.details : result.details,\n\t\t\t};\n\t\t\tisError = afterResult.isError !== undefined ? afterResult.isError : isError;\n\t\t}\n\t}\n\n\treturn emitToolCallOutcome(prepared.toolCall, result, isError, stream);\n}\n\nfunction createErrorToolResult(message: string): AgentToolResult<any> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: message }],\n\t\tdetails: {},\n\t};\n}\n\nfunction emitToolCallOutcome(\n\ttoolCall: AgentToolCall,\n\tresult: AgentToolResult<any>,\n\tisError: boolean,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): ToolResultMessage {\n\tstream.push({\n\t\ttype: \"tool_execution_end\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tresult,\n\t\tisError,\n\t});\n\n\tconst toolResultMessage: ToolResultMessage = {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tcontent: result.content,\n\t\tdetails: result.details,\n\t\tisError,\n\t\ttimestamp: Date.now(),\n\t};\n\n\temitMessagePair(stream, toolResultMessage);\n\treturn toolResultMessage;\n}\n\nfunction skipToolCall(\n\ttoolCall: AgentToolCall,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n\toptions?: { emitStart?: boolean },\n): ToolResultMessage {\n\tconst result: AgentToolResult<any> = {\n\t\tcontent: [{ type: \"text\", text: \"Skipped due to queued user message.\" }],\n\t\tdetails: {},\n\t};\n\n\tif (options?.emitStart !== false) {\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\t}\n\n\treturn emitToolCallOutcome(toolCall, result, true, stream);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent loop that works with AgentMessage throughout.\n * Transforms to Message[] only at the LLM call boundary.\n */\n\nimport {\n\ttype AssistantMessage,\n\ttype Context,\n\tEventStream,\n\tstreamSimple,\n\ttype ToolResultMessage,\n\tvalidateToolArguments,\n} from \"@gsd/pi-ai\";\nimport type {\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopConfig,\n\tAgentMessage,\n\tAgentTool,\n\tAgentToolCall,\n\tAgentToolResult,\n\tStreamFn,\n} from \"./types.js\";\n\n/**\n * Maximum number of consecutive turns where ALL tool calls in the turn fail\n * schema validation before the loop terminates. This prevents unbounded retry\n * loops when the LLM repeatedly emits tool calls with arguments that cannot\n * pass validation (e.g., schema overload, truncated JSON, missing required\n * fields). See: https://github.com/gsd-build/gsd-2/issues/2783\n */\nexport const MAX_CONSECUTIVE_VALIDATION_FAILURES = 3;\n\nexport const ZERO_USAGE = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n} as const;\n\n/**\n * Build an AssistantMessage for an unhandled error caught outside runLoop.\n * Uses the model from config so the message satisfies the full interface.\n */\nfunction createErrorMessage(error: unknown, config: AgentLoopConfig): AssistantMessage {\n\tconst msg = error instanceof Error ? error.message : String(error);\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [{ type: \"text\", text: msg }],\n\t\tapi: config.model.api,\n\t\tprovider: config.model.provider,\n\t\tmodel: config.model.id,\n\t\tusage: ZERO_USAGE,\n\t\tstopReason: \"error\",\n\t\terrorMessage: msg,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\n/**\n * Emit a message_start + message_end pair for a single message.\n */\nfunction emitMessagePair(stream: EventStream<AgentEvent, AgentMessage[]>, message: AgentMessage): void {\n\tstream.push({ type: \"message_start\", message });\n\tstream.push({ type: \"message_end\", message });\n}\n\n/**\n * Emit the standard error sequence when the outer agent loop catches an error.\n * Pushes message_start/end, turn_end, agent_end, then closes the stream.\n */\nfunction emitErrorSequence(\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n\terrMsg: AssistantMessage,\n\tnewMessages: AgentMessage[],\n): void {\n\temitMessagePair(stream, errMsg);\n\tstream.push({ type: \"turn_end\", message: errMsg, toolResults: [] });\n\tstream.push({ type: \"agent_end\", messages: [...newMessages, errMsg] });\n\tstream.end([...newMessages, errMsg]);\n}\n\n/**\n * Start an agent loop with a new prompt message.\n * The prompt is added to the context and events are emitted for it.\n */\nexport function agentLoop(\n\tprompts: AgentMessage[],\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal?: AbortSignal,\n\tstreamFn?: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tconst stream = createAgentStream();\n\n\t(async () => {\n\t\tconst newMessages: AgentMessage[] = [...prompts];\n\t\tconst currentContext: AgentContext = {\n\t\t\t...context,\n\t\t\tmessages: [...context.messages, ...prompts],\n\t\t};\n\n\t\tstream.push({ type: \"agent_start\" });\n\t\tstream.push({ type: \"turn_start\" });\n\t\tfor (const prompt of prompts) {\n\t\t\temitMessagePair(stream, prompt);\n\t\t}\n\n\t\ttry {\n\t\t\tawait runLoop(currentContext, newMessages, config, signal, stream, streamFn);\n\t\t} catch (error) {\n\t\t\temitErrorSequence(stream, createErrorMessage(error, config), newMessages);\n\t\t}\n\t})();\n\n\treturn stream;\n}\n\n/**\n * Continue an agent loop from the current context without adding a new message.\n * Used for retries - context already has user message or tool results.\n *\n * **Important:** The last message in context must convert to a `user` or `toolResult` message\n * via `convertToLlm`. If it doesn't, the LLM provider will reject the request.\n * This cannot be validated here since `convertToLlm` is only called once per turn.\n */\nexport function agentLoopContinue(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal?: AbortSignal,\n\tstreamFn?: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\n\tconst stream = createAgentStream();\n\n\t(async () => {\n\t\tconst newMessages: AgentMessage[] = [];\n\t\tconst currentContext: AgentContext = {\n\t\t\t...context,\n\t\t\tmessages: [...context.messages],\n\t\t};\n\n\t\tstream.push({ type: \"agent_start\" });\n\t\tstream.push({ type: \"turn_start\" });\n\n\t\ttry {\n\t\t\tawait runLoop(currentContext, newMessages, config, signal, stream, streamFn);\n\t\t} catch (error) {\n\t\t\temitErrorSequence(stream, createErrorMessage(error, config), newMessages);\n\t\t}\n\t})();\n\n\treturn stream;\n}\n\nfunction createAgentStream(): EventStream<AgentEvent, AgentMessage[]> {\n\treturn new EventStream<AgentEvent, AgentMessage[]>(\n\t\t(event: AgentEvent) => event.type === \"agent_end\",\n\t\t(event: AgentEvent) => (event.type === \"agent_end\" ? event.messages : []),\n\t);\n}\n\n/**\n * Main loop logic shared by agentLoop and agentLoopContinue.\n */\nasync function runLoop(\n\tcurrentContext: AgentContext,\n\tnewMessages: AgentMessage[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n\tstreamFn?: StreamFn,\n): Promise<void> {\n\tlet firstTurn = true;\n\t// Check for steering messages at start (user may have typed while waiting)\n\tlet pendingMessages: AgentMessage[] = (await config.getSteeringMessages?.()) || [];\n\n\t// Track consecutive turns where ALL tool calls fail validation.\n\t// When the LLM repeatedly emits tool calls with schema-overloaded or malformed\n\t// arguments, each turn produces only error tool results. Without a cap, this\n\t// creates an unbounded retry loop that burns budget. (#2783)\n\tlet consecutiveAllToolErrorTurns = 0;\n\n\t// Outer loop: continues when queued follow-up messages arrive after agent would stop\n\twhile (true) {\n\t\tlet hasMoreToolCalls = true;\n\t\tlet steeringAfterTools: AgentMessage[] | null = null;\n\n\t\t// Inner loop: process tool calls and steering messages\n\t\twhile (hasMoreToolCalls || pendingMessages.length > 0) {\n\t\t\tif (!firstTurn) {\n\t\t\t\tstream.push({ type: \"turn_start\" });\n\t\t\t} else {\n\t\t\t\tfirstTurn = false;\n\t\t\t}\n\n\t\t\t// Process pending messages (inject before next assistant response)\n\t\t\tif (pendingMessages.length > 0) {\n\t\t\t\tfor (const message of pendingMessages) {\n\t\t\t\t\temitMessagePair(stream, message);\n\t\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\t\tnewMessages.push(message);\n\t\t\t\t}\n\t\t\t\tpendingMessages = [];\n\t\t\t}\n\n\t\t\t// Stream assistant response\n\t\t\tlet message: AssistantMessage;\n\t\t\ttry {\n\t\t\t\tmessage = await streamAssistantResponse(currentContext, config, signal, stream, streamFn);\n\t\t\t} catch (error) {\n\t\t\t\t// Critical failure before stream started (e.g. getApiKey threw, credentials in\n\t\t\t\t// backoff, network unavailable). Convert to a graceful error message so the\n\t\t\t\t// agent loop can end cleanly instead of crashing with an unhandled rejection.\n\t\t\t\tconst errorText = error instanceof Error ? error.message : String(error);\n\t\t\t\tmessage = {\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tcontent: [],\n\t\t\t\t\tapi: config.model.api,\n\t\t\t\t\tprovider: config.model.provider,\n\t\t\t\t\tmodel: config.model.id,\n\t\t\t\t\tusage: ZERO_USAGE,\n\t\t\t\t\tstopReason: signal?.aborted ? \"aborted\" : \"error\",\n\t\t\t\t\terrorMessage: errorText,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tstream.push({ type: \"message_start\", message: { ...message } });\n\t\t\t\tstream.push({ type: \"message_end\", message });\n\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t}\n\t\t\tnewMessages.push(message);\n\n\t\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\t\t\tstream.push({ type: \"turn_end\", message, toolResults: [] });\n\t\t\t\tstream.push({ type: \"agent_end\", messages: newMessages });\n\t\t\t\tstream.end(newMessages);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check for tool calls or paused server turn\n\t\t\tconst toolCalls = message.content.filter((c) => c.type === \"toolCall\");\n\t\t\thasMoreToolCalls =\n\t\t\t\ttoolCalls.length > 0 || message.stopReason === \"pauseTurn\";\n\n\t\t\tconst toolResults: ToolResultMessage[] = [];\n\t\t\tif (hasMoreToolCalls && config.externalToolExecution) {\n\t\t\t\t// External execution mode: tools were handled by the provider\n\t\t\t\t// (e.g., Claude Code SDK). Emit tool_execution events for each\n\t\t\t\t// tool call. Prefer any provider-supplied externalResult attached\n\t\t\t\t// to the tool call so the UI can show the real stdout/stderr\n\t\t\t\t// instead of a generic placeholder.\n\t\t\t\tfor (const tc of toolCalls as AgentToolCall[]) {\n\t\t\t\t\tconst externalResult = (tc as AgentToolCall & {\n\t\t\t\t\t\texternalResult?: {\n\t\t\t\t\t\t\tcontent?: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\t\t\t\t\t\t\tdetails?: Record<string, unknown>;\n\t\t\t\t\t\t\tisError?: boolean;\n\t\t\t\t\t\t};\n\t\t\t\t\t}).externalResult;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"tool_execution_start\",\n\t\t\t\t\t\ttoolCallId: tc.id,\n\t\t\t\t\t\ttoolName: tc.name,\n\t\t\t\t\t\targs: tc.arguments,\n\t\t\t\t\t});\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"tool_execution_end\",\n\t\t\t\t\t\ttoolCallId: tc.id,\n\t\t\t\t\t\ttoolName: tc.name,\n\t\t\t\t\t\tresult: externalResult\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tcontent: externalResult.content ?? [{ type: \"text\", text: \"\" }],\n\t\t\t\t\t\t\t\t\tdetails: externalResult.details ?? {},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"(executed by Claude Code)\" }],\n\t\t\t\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\tisError: externalResult?.isError ?? false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Don't add tool results to context or loop back — the streamSimple\n\t\t\t\t// call already ran the full multi-turn agentic loop.\n\t\t\t\thasMoreToolCalls = false;\n\t\t\t} else if (hasMoreToolCalls) {\n\t\t\t\tconst toolExecution = await executeToolCalls(\n\t\t\t\t\tcurrentContext,\n\t\t\t\t\tmessage,\n\t\t\t\t\tconfig,\n\t\t\t\t\tsignal,\n\t\t\t\t\tstream,\n\t\t\t\t);\n\t\t\t\ttoolResults.push(...toolExecution.toolResults);\n\t\t\t\tsteeringAfterTools = toolExecution.steeringMessages ?? null;\n\n\t\t\t\tfor (const result of toolResults) {\n\t\t\t\t\tcurrentContext.messages.push(result);\n\t\t\t\t\tnewMessages.push(result);\n\t\t\t\t}\n\n\t\t\t\t// Schema overload detection (#2783): count only preparation-phase\n\t\t\t\t// errors (schema validation, tool-not-found, tool-blocked) toward the\n\t\t\t\t// consecutive failure cap. Tool execution errors — such as bash\n\t\t\t\t// commands returning non-zero exit codes (e.g. grep/rg exit 1 for\n\t\t\t\t// \"no matches\") — are valid tool usage and must NOT trigger the cap.\n\t\t\t\t// See: #3618\n\t\t\t\tconst hasPreparationErrors = toolExecution.preparationErrorCount > 0;\n\t\t\t\tconst allToolsFailedPreparation =\n\t\t\t\t\ttoolResults.length > 0 &&\n\t\t\t\t\ttoolExecution.preparationErrorCount === toolResults.length;\n\t\t\t\tif (allToolsFailedPreparation) {\n\t\t\t\t\tconsecutiveAllToolErrorTurns++;\n\t\t\t\t} else if (!hasPreparationErrors) {\n\t\t\t\t\t// Reset only when there are zero preparation errors this turn.\n\t\t\t\t\t// Mixed turns (some prep errors, some successes) don't reset,\n\t\t\t\t\t// but they also don't increment — this avoids masking a\n\t\t\t\t\t// pattern of alternating schema failures with one working call.\n\t\t\t\t\tconsecutiveAllToolErrorTurns = 0;\n\t\t\t\t}\n\n\t\t\t\tif (consecutiveAllToolErrorTurns >= MAX_CONSECUTIVE_VALIDATION_FAILURES) {\n\t\t\t\t\t// Force-stop: the LLM is stuck retrying broken tool calls.\n\t\t\t\t\t// Emit the turn_end and terminate the agent loop cleanly.\n\t\t\t\t\tstream.push({ type: \"turn_end\", message, toolResults });\n\t\t\t\t\tconst stopMessage: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Agent stopped: ${consecutiveAllToolErrorTurns} consecutive turns with all tool calls failing. This usually means the model is repeatedly sending arguments that do not match the tool schema.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tapi: config.model.api,\n\t\t\t\t\t\tprovider: config.model.provider,\n\t\t\t\t\t\tmodel: config.model.id,\n\t\t\t\t\t\tusage: ZERO_USAGE,\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: \"Schema overload: consecutive tool validation failures exceeded cap\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\temitMessagePair(stream, stopMessage);\n\t\t\t\t\tnewMessages.push(stopMessage);\n\t\t\t\t\tstream.push({ type: \"turn_end\", message: stopMessage, toolResults: [] });\n\t\t\t\t\tstream.push({ type: \"agent_end\", messages: newMessages });\n\t\t\t\t\tstream.end(newMessages);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstream.push({ type: \"turn_end\", message, toolResults });\n\n\t\t\t// Get steering messages after turn completes\n\t\t\tif (steeringAfterTools && steeringAfterTools.length > 0) {\n\t\t\t\tpendingMessages = steeringAfterTools;\n\t\t\t\tsteeringAfterTools = null;\n\t\t\t} else {\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t}\n\t\t}\n\n\t\t// Agent would stop here. Check for follow-up messages.\n\t\tconst followUpMessages = (await config.getFollowUpMessages?.()) || [];\n\t\tif (followUpMessages.length > 0) {\n\t\t\t// Set as pending so inner loop processes them\n\t\t\tpendingMessages = followUpMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// No more messages, exit\n\t\tbreak;\n\t}\n\n\tstream.push({ type: \"agent_end\", messages: newMessages });\n\tstream.end(newMessages);\n}\n\n/**\n * Stream an assistant response from the LLM.\n * This is where AgentMessage[] gets transformed to Message[] for the LLM.\n */\nasync function streamAssistantResponse(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n\tstreamFn?: StreamFn,\n): Promise<AssistantMessage> {\n\t// Apply context transform if configured (AgentMessage[] → AgentMessage[])\n\tlet messages = context.messages;\n\tif (config.transformContext) {\n\t\tmessages = await config.transformContext(messages, signal);\n\t}\n\n\t// Convert to LLM-compatible messages (AgentMessage[] → Message[])\n\tconst llmMessages = await config.convertToLlm(messages);\n\n\t// Build LLM context\n\tconst llmContext: Context = {\n\t\tsystemPrompt: context.systemPrompt,\n\t\tmessages: llmMessages,\n\t\ttools: context.tools,\n\t};\n\n\tconst streamFunction = streamFn || streamSimple;\n\n\t// Resolve API key (important for expiring tokens)\n\tconst resolvedApiKey =\n\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\n\tconst response = await streamFunction(config.model, llmContext, {\n\t\t...config,\n\t\tapiKey: resolvedApiKey,\n\t\tsignal,\n\t});\n\n\tlet partialMessage: AssistantMessage | null = null;\n\tlet addedPartial = false;\n\n\tfor await (const event of response) {\n\t\tswitch (event.type) {\n\t\t\tcase \"start\":\n\t\t\t\tpartialMessage = event.partial;\n\t\t\t\tcontext.messages.push(partialMessage);\n\t\t\t\taddedPartial = true;\n\t\t\t\tstream.push({ type: \"message_start\", message: { ...partialMessage } });\n\t\t\t\tbreak;\n\n\t\t\tcase \"text_start\":\n\t\t\tcase \"text_delta\":\n\t\t\tcase \"text_end\":\n\t\t\tcase \"thinking_start\":\n\t\t\tcase \"thinking_delta\":\n\t\t\tcase \"thinking_end\":\n\t\t\tcase \"toolcall_start\":\n\t\t\tcase \"toolcall_delta\":\n\t\t\tcase \"toolcall_end\":\n\t\t\tcase \"server_tool_use\":\n\t\t\tcase \"web_search_result\":\n\t\t\t\tif (partialMessage) {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tcontext.messages[context.messages.length - 1] = partialMessage;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"message_update\",\n\t\t\t\t\t\tassistantMessageEvent: event,\n\t\t\t\t\t\tmessage: { ...partialMessage },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"done\":\n\t\t\tcase \"error\": {\n\t\t\t\tconst finalMessage = await response.result();\n\t\t\t\tif (addedPartial) {\n\t\t\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t\t\t} else {\n\t\t\t\t\tcontext.messages.push(finalMessage);\n\t\t\t\t}\n\t\t\t\tif (!addedPartial) {\n\t\t\t\t\tstream.push({ type: \"message_start\", message: { ...finalMessage } });\n\t\t\t\t}\n\t\t\t\tstream.push({ type: \"message_end\", message: finalMessage });\n\t\t\t\treturn finalMessage;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn await response.result();\n}\n\n/**\n * Result from executing tool calls in a turn. Includes metadata about\n * error provenance so the schema overload detector can distinguish\n * preparation failures (schema validation, tool-not-found, tool-blocked)\n * from execution failures (the tool ran but threw, e.g. bash exit code 1).\n */\ninterface ToolExecutionResult {\n\ttoolResults: ToolResultMessage[];\n\tsteeringMessages?: AgentMessage[];\n\t/** Number of tool results that failed during preparation (validation/schema). */\n\tpreparationErrorCount: number;\n}\n\n/**\n * Execute tool calls from an assistant message.\n */\nasync function executeToolCalls(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ToolExecutionResult> {\n\tconst toolCalls = assistantMessage.content.filter((c) => c.type === \"toolCall\") as AgentToolCall[];\n\tif (config.toolExecution === \"sequential\") {\n\t\treturn executeToolCallsSequential(currentContext, assistantMessage, toolCalls, config, signal, stream);\n\t}\n\treturn executeToolCallsParallel(currentContext, assistantMessage, toolCalls, config, signal, stream);\n}\n\nasync function executeToolCallsSequential(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ToolExecutionResult> {\n\tconst results: ToolResultMessage[] = [];\n\tlet steeringMessages: AgentMessage[] | undefined;\n\tlet preparationErrorCount = 0;\n\n\tfor (let index = 0; index < toolCalls.length; index++) {\n\t\tconst toolCall = toolCalls[index];\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tif (preparation.kind === \"immediate\") {\n\t\t\tif (preparation.isError) {\n\t\t\t\tpreparationErrorCount++;\n\t\t\t}\n\t\t\tresults.push(emitToolCallOutcome(toolCall, preparation.result, preparation.isError, stream));\n\t\t} else {\n\t\t\tconst executed = await executePreparedToolCall(preparation, signal, stream);\n\t\t\tresults.push(\n\t\t\t\tawait finalizeExecutedToolCall(\n\t\t\t\t\tcurrentContext,\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\tpreparation,\n\t\t\t\t\texecuted,\n\t\t\t\t\tconfig,\n\t\t\t\t\tsignal,\n\t\t\t\t\tstream,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (config.getSteeringMessages) {\n\t\t\tconst steering = await config.getSteeringMessages();\n\t\t\tif (steering.length > 0) {\n\t\t\t\tsteeringMessages = steering;\n\t\t\t\tconst remainingCalls = toolCalls.slice(index + 1);\n\t\t\t\tfor (const skipped of remainingCalls) {\n\t\t\t\t\tresults.push(skipToolCall(skipped, stream));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { toolResults: results, steeringMessages, preparationErrorCount };\n}\n\nasync function executeToolCallsParallel(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ToolExecutionResult> {\n\tconst results: ToolResultMessage[] = [];\n\tconst runnableCalls: PreparedToolCall[] = [];\n\tlet steeringMessages: AgentMessage[] | undefined;\n\tlet preparationErrorCount = 0;\n\n\tfor (let index = 0; index < toolCalls.length; index++) {\n\t\tconst toolCall = toolCalls[index];\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tif (preparation.kind === \"immediate\") {\n\t\t\tif (preparation.isError) {\n\t\t\t\tpreparationErrorCount++;\n\t\t\t}\n\t\t\tresults.push(emitToolCallOutcome(toolCall, preparation.result, preparation.isError, stream));\n\t\t} else {\n\t\t\trunnableCalls.push(preparation);\n\t\t}\n\n\t\tif (config.getSteeringMessages) {\n\t\t\tconst steering = await config.getSteeringMessages();\n\t\t\tif (steering.length > 0) {\n\t\t\t\tsteeringMessages = steering;\n\t\t\t\tfor (const runnable of runnableCalls) {\n\t\t\t\t\tresults.push(skipToolCall(runnable.toolCall, stream, { emitStart: false }));\n\t\t\t\t}\n\t\t\t\tconst remainingCalls = toolCalls.slice(index + 1);\n\t\t\t\tfor (const skipped of remainingCalls) {\n\t\t\t\t\tresults.push(skipToolCall(skipped, stream));\n\t\t\t\t}\n\t\t\t\treturn { toolResults: results, steeringMessages, preparationErrorCount };\n\t\t\t}\n\t\t}\n\t}\n\n\tconst runningCalls = runnableCalls.map((prepared) => ({\n\t\tprepared,\n\t\texecution: executePreparedToolCall(prepared, signal, stream),\n\t}));\n\n\tfor (const running of runningCalls) {\n\t\tconst executed = await running.execution;\n\t\tresults.push(\n\t\t\tawait finalizeExecutedToolCall(\n\t\t\t\tcurrentContext,\n\t\t\t\tassistantMessage,\n\t\t\t\trunning.prepared,\n\t\t\t\texecuted,\n\t\t\t\tconfig,\n\t\t\t\tsignal,\n\t\t\t\tstream,\n\t\t\t),\n\t\t);\n\t}\n\n\tif (!steeringMessages && config.getSteeringMessages) {\n\t\tconst steering = await config.getSteeringMessages();\n\t\tif (steering.length > 0) {\n\t\t\tsteeringMessages = steering;\n\t\t}\n\t}\n\n\treturn { toolResults: results, steeringMessages, preparationErrorCount };\n}\n\ntype PreparedToolCall = {\n\tkind: \"prepared\";\n\ttoolCall: AgentToolCall;\n\ttool: AgentTool<any>;\n\targs: unknown;\n};\n\ntype ImmediateToolCallOutcome = {\n\tkind: \"immediate\";\n\tresult: AgentToolResult<any>;\n\tisError: boolean;\n};\n\ntype ExecutedToolCallOutcome = {\n\tresult: AgentToolResult<any>;\n\tisError: boolean;\n};\n\nasync function prepareToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCall: AgentToolCall,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<PreparedToolCall | ImmediateToolCallOutcome> {\n\tconst tool = currentContext.tools?.find((t) => t.name === toolCall.name);\n\tif (!tool) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\tresult: createErrorToolResult(`Tool ${toolCall.name} not found`),\n\t\t\tisError: true,\n\t\t};\n\t}\n\n\ttry {\n\t\tconst validatedArgs = validateToolArguments(tool, toolCall);\n\t\tif (config.beforeToolCall) {\n\t\t\tconst beforeResult = await config.beforeToolCall(\n\t\t\t\t{\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\ttoolCall,\n\t\t\t\t\targs: validatedArgs,\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (beforeResult?.block) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"immediate\",\n\t\t\t\t\tresult: createErrorToolResult(beforeResult.reason || \"Tool execution was blocked\"),\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tkind: \"prepared\",\n\t\t\ttoolCall,\n\t\t\ttool,\n\t\t\targs: validatedArgs,\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t}\n}\n\nasync function executePreparedToolCall(\n\tprepared: PreparedToolCall,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ExecutedToolCallOutcome> {\n\ttry {\n\t\tconst result = await prepared.tool.execute(\n\t\t\tprepared.toolCall.id,\n\t\t\tprepared.args as never,\n\t\t\tsignal,\n\t\t\t(partialResult) => {\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\t\ttoolCallId: prepared.toolCall.id,\n\t\t\t\t\ttoolName: prepared.toolCall.name,\n\t\t\t\t\targs: prepared.toolCall.arguments,\n\t\t\t\t\tpartialResult,\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t\treturn { result, isError: false };\n\t} catch (error) {\n\t\treturn {\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t}\n}\n\nasync function finalizeExecutedToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tprepared: PreparedToolCall,\n\texecuted: ExecutedToolCallOutcome,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): Promise<ToolResultMessage> {\n\tlet result = executed.result;\n\tlet isError = executed.isError;\n\n\tif (config.afterToolCall) {\n\t\tconst afterResult = await config.afterToolCall(\n\t\t\t{\n\t\t\t\tassistantMessage,\n\t\t\t\ttoolCall: prepared.toolCall,\n\t\t\t\targs: prepared.args,\n\t\t\t\tresult,\n\t\t\t\tisError,\n\t\t\t\tcontext: currentContext,\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t\tif (afterResult) {\n\t\t\tresult = {\n\t\t\t\tcontent: afterResult.content !== undefined ? afterResult.content : result.content,\n\t\t\t\tdetails: afterResult.details !== undefined ? afterResult.details : result.details,\n\t\t\t};\n\t\t\tisError = afterResult.isError !== undefined ? afterResult.isError : isError;\n\t\t}\n\t}\n\n\treturn emitToolCallOutcome(prepared.toolCall, result, isError, stream);\n}\n\nfunction createErrorToolResult(message: string): AgentToolResult<any> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: message }],\n\t\tdetails: {},\n\t};\n}\n\nfunction emitToolCallOutcome(\n\ttoolCall: AgentToolCall,\n\tresult: AgentToolResult<any>,\n\tisError: boolean,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n): ToolResultMessage {\n\tstream.push({\n\t\ttype: \"tool_execution_end\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tresult,\n\t\tisError,\n\t});\n\n\tconst toolResultMessage: ToolResultMessage = {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tcontent: result.content,\n\t\tdetails: result.details,\n\t\tisError,\n\t\ttimestamp: Date.now(),\n\t};\n\n\temitMessagePair(stream, toolResultMessage);\n\treturn toolResultMessage;\n}\n\nfunction skipToolCall(\n\ttoolCall: AgentToolCall,\n\tstream: EventStream<AgentEvent, AgentMessage[]>,\n\toptions?: { emitStart?: boolean },\n): ToolResultMessage {\n\tconst result: AgentToolResult<any> = {\n\t\tcontent: [{ type: \"text\", text: \"Skipped due to queued user message.\" }],\n\t\tdetails: {},\n\t};\n\n\tif (options?.emitStart !== false) {\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\t}\n\n\treturn emitToolCallOutcome(toolCall, result, true, stream);\n}\n"]}
|
|
@@ -45,6 +45,59 @@ describe("agent-loop — pauseTurn handling (#2869)", () => {
|
|
|
45
45
|
'StopReason type must include "pauseTurn"',
|
|
46
46
|
);
|
|
47
47
|
});
|
|
48
|
+
|
|
49
|
+
it("uses provider-supplied external tool results instead of the placeholder", async () => {
|
|
50
|
+
const externalMessage = makeAssistantMessage({
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: "toolCall",
|
|
54
|
+
id: "tc-external-1",
|
|
55
|
+
name: "bash",
|
|
56
|
+
arguments: { command: "echo hi" },
|
|
57
|
+
externalResult: {
|
|
58
|
+
content: [{ type: "text", text: "hi\n" }],
|
|
59
|
+
details: { source: "claude-code" },
|
|
60
|
+
isError: false,
|
|
61
|
+
},
|
|
62
|
+
} as any,
|
|
63
|
+
],
|
|
64
|
+
stopReason: "toolUse",
|
|
65
|
+
provider: "claude-code",
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const mockStream = createMockStreamFn([externalMessage]);
|
|
69
|
+
|
|
70
|
+
const context: AgentContext = {
|
|
71
|
+
systemPrompt: "You are a test agent.",
|
|
72
|
+
messages: [{ role: "user", content: [{ type: "text", text: "Run the command" }], timestamp: Date.now() }],
|
|
73
|
+
tools: [],
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const config: AgentLoopConfig = {
|
|
77
|
+
model: { ...TEST_MODEL, provider: "claude-code" },
|
|
78
|
+
convertToLlm: (msgs) => msgs.filter((m): m is any => m.role !== "custom"),
|
|
79
|
+
toolExecution: "sequential",
|
|
80
|
+
externalToolExecution: true,
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const stream = agentLoop(
|
|
84
|
+
[{ role: "user", content: [{ type: "text", text: "Run the command" }], timestamp: Date.now() }],
|
|
85
|
+
context,
|
|
86
|
+
config,
|
|
87
|
+
undefined,
|
|
88
|
+
mockStream as any,
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const events = await collectEvents(stream);
|
|
92
|
+
const toolEnd = events.find(
|
|
93
|
+
(event): event is Extract<AgentEvent, { type: "tool_execution_end" }> => event.type === "tool_execution_end",
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
assert.ok(toolEnd, "expected tool_execution_end event");
|
|
97
|
+
assert.deepEqual(toolEnd.result.content, [{ type: "text", text: "hi\n" }]);
|
|
98
|
+
assert.deepEqual(toolEnd.result.details, { source: "claude-code" });
|
|
99
|
+
assert.equal(toolEnd.isError, false);
|
|
100
|
+
});
|
|
48
101
|
});
|
|
49
102
|
|
|
50
103
|
/**
|
|
@@ -255,8 +255,17 @@ async function runLoop(
|
|
|
255
255
|
if (hasMoreToolCalls && config.externalToolExecution) {
|
|
256
256
|
// External execution mode: tools were handled by the provider
|
|
257
257
|
// (e.g., Claude Code SDK). Emit tool_execution events for each
|
|
258
|
-
// tool call.
|
|
258
|
+
// tool call. Prefer any provider-supplied externalResult attached
|
|
259
|
+
// to the tool call so the UI can show the real stdout/stderr
|
|
260
|
+
// instead of a generic placeholder.
|
|
259
261
|
for (const tc of toolCalls as AgentToolCall[]) {
|
|
262
|
+
const externalResult = (tc as AgentToolCall & {
|
|
263
|
+
externalResult?: {
|
|
264
|
+
content?: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;
|
|
265
|
+
details?: Record<string, unknown>;
|
|
266
|
+
isError?: boolean;
|
|
267
|
+
};
|
|
268
|
+
}).externalResult;
|
|
260
269
|
stream.push({
|
|
261
270
|
type: "tool_execution_start",
|
|
262
271
|
toolCallId: tc.id,
|
|
@@ -267,11 +276,16 @@ async function runLoop(
|
|
|
267
276
|
type: "tool_execution_end",
|
|
268
277
|
toolCallId: tc.id,
|
|
269
278
|
toolName: tc.name,
|
|
270
|
-
result:
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
279
|
+
result: externalResult
|
|
280
|
+
? {
|
|
281
|
+
content: externalResult.content ?? [{ type: "text", text: "" }],
|
|
282
|
+
details: externalResult.details ?? {},
|
|
283
|
+
}
|
|
284
|
+
: {
|
|
285
|
+
content: [{ type: "text", text: "(executed by Claude Code)" }],
|
|
286
|
+
details: {},
|
|
287
|
+
},
|
|
288
|
+
isError: externalResult?.isError ?? false,
|
|
275
289
|
});
|
|
276
290
|
}
|
|
277
291
|
// Don't add tool results to context or loop back — the streamSimple
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contextual tips system — shows non-intrusive, session-scoped hints
|
|
3
|
+
* when user behavior suggests they'd benefit from knowing a feature.
|
|
4
|
+
*
|
|
5
|
+
* Each tip fires at most `maxShows` times per session. Tips are
|
|
6
|
+
* evaluated in order; the first match wins per input event.
|
|
7
|
+
*/
|
|
8
|
+
export interface TipContext {
|
|
9
|
+
/** The raw input text the user submitted */
|
|
10
|
+
input: string;
|
|
11
|
+
/** Whether the agent is currently streaming */
|
|
12
|
+
isStreaming: boolean;
|
|
13
|
+
/** Current thinking level (e.g. "off", "low", "high", "xhigh") */
|
|
14
|
+
thinkingLevel?: string;
|
|
15
|
+
/** Number of `!` (included) bash commands run this session */
|
|
16
|
+
bashIncludedCount: number;
|
|
17
|
+
/** Approximate context usage percentage (0–100), if known */
|
|
18
|
+
contextPercent?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface Tip {
|
|
21
|
+
id: string;
|
|
22
|
+
/** Maximum times this tip is shown per session */
|
|
23
|
+
maxShows: number;
|
|
24
|
+
/** Returns the tip message if the tip should fire, or null to skip */
|
|
25
|
+
evaluate: (ctx: TipContext) => string | null;
|
|
26
|
+
}
|
|
27
|
+
export declare class ContextualTips {
|
|
28
|
+
/** Map of tip ID → number of times shown this session */
|
|
29
|
+
private showCounts;
|
|
30
|
+
/** Track ! bash commands for double-bang reminder */
|
|
31
|
+
private _bashIncludedCount;
|
|
32
|
+
/** Increment the bash-included counter. Call when user runs ! (not !!) command. */
|
|
33
|
+
recordBashIncluded(): void;
|
|
34
|
+
get bashIncludedCount(): number;
|
|
35
|
+
/**
|
|
36
|
+
* Evaluate all tips against the current input context.
|
|
37
|
+
* Returns the first matching tip message, or null if none apply.
|
|
38
|
+
*/
|
|
39
|
+
evaluate(ctx: Omit<TipContext, "bashIncludedCount">): string | null;
|
|
40
|
+
/** Reset all counters (e.g. on new session). */
|
|
41
|
+
reset(): void;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=contextual-tips.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextual-tips.d.ts","sourceRoot":"","sources":["../../src/core/contextual-tips.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,UAAU;IAC1B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,QAAQ,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,IAAI,CAAC;CAC7C;AA8JD,qBAAa,cAAc;IAC1B,yDAAyD;IACzD,OAAO,CAAC,UAAU,CAA6B;IAC/C,qDAAqD;IACrD,OAAO,CAAC,kBAAkB,CAAK;IAE/B,mFAAmF;IACnF,kBAAkB,IAAI,IAAI;IAI1B,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,GAAG,MAAM,GAAG,IAAI;IAoBnE,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAIb"}
|