@mastra/core 1.7.0 → 1.8.0
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/CHANGELOG.md +218 -0
- package/dist/agent/agent-legacy.d.ts +15 -0
- package/dist/agent/agent-legacy.d.ts.map +1 -1
- package/dist/agent/agent.d.ts +7 -0
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.types.d.ts +311 -2
- package/dist/agent/agent.types.d.ts.map +1 -1
- package/dist/agent/index.cjs +13 -13
- package/dist/agent/index.d.ts +3 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +2 -2
- package/dist/agent/message-list/index.cjs +18 -18
- package/dist/agent/message-list/index.js +1 -1
- package/dist/agent/message-list/merge/MessageMerger.d.ts.map +1 -1
- package/dist/agent/message-list/message-list.d.ts.map +1 -1
- package/dist/agent/workflows/prepare-stream/map-results-step.d.ts.map +1 -1
- package/dist/agent/workflows/prepare-stream/prepare-tools-step.d.ts.map +1 -1
- package/dist/{chunk-A72NTLFT.cjs → chunk-2IO5Q7OZ.cjs} +7 -7
- package/dist/{chunk-A72NTLFT.cjs.map → chunk-2IO5Q7OZ.cjs.map} +1 -1
- package/dist/{chunk-DFCRXDVK.js → chunk-2KHPZJNU.js} +10 -8
- package/dist/chunk-2KHPZJNU.js.map +1 -0
- package/dist/{chunk-R4N65TLG.js → chunk-2R5MQMSA.js} +35 -16
- package/dist/chunk-2R5MQMSA.js.map +1 -0
- package/dist/{chunk-ZSBM2SVU.js → chunk-4H5F6AFP.js} +1064 -226
- package/dist/chunk-4H5F6AFP.js.map +1 -0
- package/dist/{chunk-BQHWJLXU.js → chunk-63G75DJE.js} +9 -3
- package/dist/chunk-63G75DJE.js.map +1 -0
- package/dist/{chunk-SBOHDNIZ.cjs → chunk-6GSWC5ZA.cjs} +2 -2
- package/dist/{chunk-SBOHDNIZ.cjs.map → chunk-6GSWC5ZA.cjs.map} +1 -1
- package/dist/{chunk-QTAS3HND.cjs → chunk-6Q2UD3XF.cjs} +21 -14
- package/dist/chunk-6Q2UD3XF.cjs.map +1 -0
- package/dist/{chunk-GPJGPARM.js → chunk-DTPR3JAM.js} +2 -2
- package/dist/{chunk-GPJGPARM.js.map → chunk-DTPR3JAM.js.map} +1 -1
- package/dist/{chunk-NN26FSKL.js → chunk-FHJ2KIU5.js} +3 -3
- package/dist/{chunk-NN26FSKL.js.map → chunk-FHJ2KIU5.js.map} +1 -1
- package/dist/{chunk-RABITNTG.cjs → chunk-HWG7NPJA.cjs} +55 -55
- package/dist/{chunk-RABITNTG.cjs.map → chunk-HWG7NPJA.cjs.map} +1 -1
- package/dist/{chunk-HB6T4554.cjs → chunk-KH3G65IS.cjs} +10 -8
- package/dist/chunk-KH3G65IS.cjs.map +1 -0
- package/dist/{chunk-YQG7NBPR.cjs → chunk-KZ4IKNPN.cjs} +25 -23
- package/dist/chunk-KZ4IKNPN.cjs.map +1 -0
- package/dist/{chunk-6DUTLERJ.js → chunk-MRV5NCPC.js} +3 -3
- package/dist/{chunk-6DUTLERJ.js.map → chunk-MRV5NCPC.js.map} +1 -1
- package/dist/{chunk-O7PZ4VOO.cjs → chunk-N3ROEJG4.cjs} +12 -10
- package/dist/chunk-N3ROEJG4.cjs.map +1 -0
- package/dist/{chunk-7EXW4AAG.js → chunk-NXKI2L4X.js} +6 -4
- package/dist/chunk-NXKI2L4X.js.map +1 -0
- package/dist/{chunk-QWTB53GS.js → chunk-OSEPGSLN.js} +6 -6
- package/dist/{chunk-QWTB53GS.js.map → chunk-OSEPGSLN.js.map} +1 -1
- package/dist/{chunk-6OXW5E2O.js → chunk-PI7ONENO.js} +4 -4
- package/dist/{chunk-6OXW5E2O.js.map → chunk-PI7ONENO.js.map} +1 -1
- package/dist/{chunk-KUXNBWN7.js → chunk-Q4MV4XKX.js} +8 -6
- package/dist/chunk-Q4MV4XKX.js.map +1 -0
- package/dist/{chunk-7UAJ6LMR.cjs → chunk-QKQGKEN7.cjs} +1078 -241
- package/dist/chunk-QKQGKEN7.cjs.map +1 -0
- package/dist/{chunk-IC5OUWKJ.js → chunk-SP7P6Z4L.js} +19 -2
- package/dist/chunk-SP7P6Z4L.js.map +1 -0
- package/dist/{chunk-QDH6MVJ7.cjs → chunk-TGUDI64A.cjs} +14 -14
- package/dist/{chunk-QDH6MVJ7.cjs.map → chunk-TGUDI64A.cjs.map} +1 -1
- package/dist/{chunk-EAZ6YDCQ.cjs → chunk-U3HBG2GU.cjs} +9 -2
- package/dist/chunk-U3HBG2GU.cjs.map +1 -0
- package/dist/{chunk-6QBN6MZY.cjs → chunk-VAKB5EXJ.cjs} +42 -23
- package/dist/chunk-VAKB5EXJ.cjs.map +1 -0
- package/dist/{chunk-QSHV7GPT.js → chunk-VBPU6CLZ.js} +3808 -3026
- package/dist/chunk-VBPU6CLZ.js.map +1 -0
- package/dist/{chunk-2X66GWF5.cjs → chunk-VTVCMIAI.cjs} +3905 -3121
- package/dist/chunk-VTVCMIAI.cjs.map +1 -0
- package/dist/{chunk-PHHJLGZU.cjs → chunk-XNWF6CYR.cjs} +6 -6
- package/dist/{chunk-PHHJLGZU.cjs.map → chunk-XNWF6CYR.cjs.map} +1 -1
- package/dist/{chunk-T6GAM3SQ.js → chunk-ZRPTWYWJ.js} +18 -11
- package/dist/chunk-ZRPTWYWJ.js.map +1 -0
- package/dist/{chunk-DB7U2C5B.cjs → chunk-ZXOWG32X.cjs} +19 -2
- package/dist/chunk-ZXOWG32X.cjs.map +1 -0
- package/dist/datasets/experiment/index.d.ts.map +1 -1
- package/dist/datasets/experiment/scorer.d.ts +1 -1
- package/dist/datasets/experiment/scorer.d.ts.map +1 -1
- package/dist/datasets/index.cjs +17 -17
- package/dist/datasets/index.js +2 -2
- package/dist/docs/SKILL.md +300 -0
- package/dist/docs/assets/SOURCE_MAP.json +1423 -0
- package/dist/docs/references/docs-agents-adding-voice.md +349 -0
- package/dist/docs/references/docs-agents-agent-approval.md +558 -0
- package/dist/docs/references/docs-agents-agent-memory.md +209 -0
- package/dist/docs/references/docs-agents-guardrails.md +374 -0
- package/dist/docs/references/docs-agents-network-approval.md +275 -0
- package/dist/docs/references/docs-agents-networks.md +299 -0
- package/dist/docs/references/docs-agents-overview.md +304 -0
- package/dist/docs/references/docs-agents-processors.md +622 -0
- package/dist/docs/references/docs-agents-structured-output.md +273 -0
- package/dist/docs/references/docs-agents-supervisor-agents.md +304 -0
- package/dist/docs/references/docs-agents-using-tools.md +214 -0
- package/dist/docs/references/docs-evals-custom-scorers.md +519 -0
- package/dist/docs/references/docs-evals-overview.md +141 -0
- package/dist/docs/references/docs-evals-running-in-ci.md +124 -0
- package/dist/docs/references/docs-memory-memory-processors.md +314 -0
- package/dist/docs/references/docs-memory-observational-memory.md +248 -0
- package/dist/docs/references/docs-memory-overview.md +45 -0
- package/dist/docs/references/docs-memory-semantic-recall.md +272 -0
- package/dist/docs/references/docs-memory-storage.md +261 -0
- package/dist/docs/references/docs-memory-working-memory.md +400 -0
- package/dist/docs/references/docs-observability-datasets-overview.md +198 -0
- package/dist/docs/references/docs-observability-datasets-running-experiments.md +274 -0
- package/dist/docs/references/docs-observability-logging.md +99 -0
- package/dist/docs/references/docs-observability-overview.md +70 -0
- package/dist/docs/references/docs-observability-tracing-bridges-otel.md +209 -0
- package/dist/docs/references/docs-observability-tracing-exporters-arize.md +272 -0
- package/dist/docs/references/docs-observability-tracing-exporters-braintrust.md +111 -0
- package/dist/docs/references/docs-observability-tracing-exporters-cloud.md +127 -0
- package/dist/docs/references/docs-observability-tracing-exporters-datadog.md +187 -0
- package/dist/docs/references/docs-observability-tracing-exporters-default.md +209 -0
- package/dist/docs/references/docs-observability-tracing-exporters-laminar.md +100 -0
- package/dist/docs/references/docs-observability-tracing-exporters-langfuse.md +213 -0
- package/dist/docs/references/docs-observability-tracing-exporters-langsmith.md +198 -0
- package/dist/docs/references/docs-observability-tracing-exporters-otel.md +476 -0
- package/dist/docs/references/docs-observability-tracing-exporters-posthog.md +148 -0
- package/dist/docs/references/docs-observability-tracing-overview.md +1112 -0
- package/dist/docs/references/docs-rag-chunking-and-embedding.md +183 -0
- package/dist/docs/references/docs-rag-graph-rag.md +215 -0
- package/dist/docs/references/docs-rag-overview.md +72 -0
- package/dist/docs/references/docs-rag-retrieval.md +515 -0
- package/dist/docs/references/docs-rag-vector-databases.md +645 -0
- package/dist/docs/references/docs-server-auth-auth0.md +220 -0
- package/dist/docs/references/docs-server-auth-clerk.md +132 -0
- package/dist/docs/references/docs-server-auth-composite-auth.md +234 -0
- package/dist/docs/references/docs-server-auth-custom-auth-provider.md +513 -0
- package/dist/docs/references/docs-server-auth-firebase.md +272 -0
- package/dist/docs/references/docs-server-auth-jwt.md +110 -0
- package/dist/docs/references/docs-server-auth-simple-auth.md +180 -0
- package/dist/docs/references/docs-server-auth-supabase.md +117 -0
- package/dist/docs/references/docs-server-auth-workos.md +186 -0
- package/dist/docs/references/docs-server-custom-adapters.md +378 -0
- package/dist/docs/references/docs-server-custom-api-routes.md +267 -0
- package/dist/docs/references/docs-server-mastra-client.md +243 -0
- package/dist/docs/references/docs-server-mastra-server.md +71 -0
- package/dist/docs/references/docs-server-middleware.md +225 -0
- package/dist/docs/references/docs-server-request-context.md +471 -0
- package/dist/docs/references/docs-streaming-events.md +237 -0
- package/dist/docs/references/docs-streaming-tool-streaming.md +175 -0
- package/dist/docs/references/docs-streaming-workflow-streaming.md +109 -0
- package/dist/docs/references/docs-voice-overview.md +959 -0
- package/dist/docs/references/docs-voice-speech-to-speech.md +102 -0
- package/dist/docs/references/docs-voice-speech-to-text.md +79 -0
- package/dist/docs/references/docs-voice-text-to-speech.md +83 -0
- package/dist/docs/references/docs-workflows-agents-and-tools.md +166 -0
- package/dist/docs/references/docs-workflows-control-flow.md +822 -0
- package/dist/docs/references/docs-workflows-error-handling.md +360 -0
- package/dist/docs/references/docs-workflows-human-in-the-loop.md +215 -0
- package/dist/docs/references/docs-workflows-overview.md +370 -0
- package/dist/docs/references/docs-workflows-snapshots.md +238 -0
- package/dist/docs/references/docs-workflows-suspend-and-resume.md +205 -0
- package/dist/docs/references/docs-workflows-time-travel.md +309 -0
- package/dist/docs/references/docs-workflows-workflow-state.md +181 -0
- package/dist/docs/references/docs-workspace-filesystem.md +164 -0
- package/dist/docs/references/docs-workspace-overview.md +239 -0
- package/dist/docs/references/docs-workspace-sandbox.md +63 -0
- package/dist/docs/references/docs-workspace-search.md +243 -0
- package/dist/docs/references/docs-workspace-skills.md +169 -0
- package/dist/docs/references/guides-agent-frameworks-ai-sdk.md +140 -0
- package/dist/docs/references/reference-agents-agent.md +141 -0
- package/dist/docs/references/reference-agents-generate.md +186 -0
- package/dist/docs/references/reference-agents-generateLegacy.md +173 -0
- package/dist/docs/references/reference-agents-getDefaultGenerateOptions.md +36 -0
- package/dist/docs/references/reference-agents-getDefaultOptions.md +34 -0
- package/dist/docs/references/reference-agents-getDefaultStreamOptions.md +36 -0
- package/dist/docs/references/reference-agents-getDescription.md +21 -0
- package/dist/docs/references/reference-agents-getInstructions.md +34 -0
- package/dist/docs/references/reference-agents-getLLM.md +37 -0
- package/dist/docs/references/reference-agents-getMemory.md +34 -0
- package/dist/docs/references/reference-agents-getModel.md +34 -0
- package/dist/docs/references/reference-agents-getTools.md +29 -0
- package/dist/docs/references/reference-agents-getVoice.md +34 -0
- package/dist/docs/references/reference-agents-listAgents.md +35 -0
- package/dist/docs/references/reference-agents-listScorers.md +34 -0
- package/dist/docs/references/reference-agents-listTools.md +34 -0
- package/dist/docs/references/reference-agents-listWorkflows.md +34 -0
- package/dist/docs/references/reference-agents-network.md +133 -0
- package/dist/docs/references/reference-ai-sdk-chat-route.md +82 -0
- package/dist/docs/references/reference-ai-sdk-network-route.md +74 -0
- package/dist/docs/references/reference-ai-sdk-to-ai-sdk-stream.md +231 -0
- package/dist/docs/references/reference-ai-sdk-with-mastra.md +59 -0
- package/dist/docs/references/reference-ai-sdk-workflow-route.md +79 -0
- package/dist/docs/references/reference-auth-auth0.md +73 -0
- package/dist/docs/references/reference-auth-clerk.md +36 -0
- package/dist/docs/references/reference-auth-firebase.md +80 -0
- package/dist/docs/references/reference-auth-jwt.md +26 -0
- package/dist/docs/references/reference-auth-supabase.md +33 -0
- package/dist/docs/references/reference-auth-workos.md +84 -0
- package/dist/docs/references/reference-client-js-agents.md +437 -0
- package/dist/docs/references/reference-configuration.md +752 -0
- package/dist/docs/references/reference-core-addGateway.md +42 -0
- package/dist/docs/references/reference-core-getAgent.md +21 -0
- package/dist/docs/references/reference-core-getAgentById.md +21 -0
- package/dist/docs/references/reference-core-getDeployer.md +22 -0
- package/dist/docs/references/reference-core-getGateway.md +38 -0
- package/dist/docs/references/reference-core-getGatewayById.md +41 -0
- package/dist/docs/references/reference-core-getLogger.md +22 -0
- package/dist/docs/references/reference-core-getMCPServer.md +47 -0
- package/dist/docs/references/reference-core-getMCPServerById.md +55 -0
- package/dist/docs/references/reference-core-getMemory.md +50 -0
- package/dist/docs/references/reference-core-getScorer.md +54 -0
- package/dist/docs/references/reference-core-getScorerById.md +54 -0
- package/dist/docs/references/reference-core-getServer.md +22 -0
- package/dist/docs/references/reference-core-getStorage.md +22 -0
- package/dist/docs/references/reference-core-getStoredAgentById.md +89 -0
- package/dist/docs/references/reference-core-getTelemetry.md +22 -0
- package/dist/docs/references/reference-core-getVector.md +22 -0
- package/dist/docs/references/reference-core-getWorkflow.md +42 -0
- package/dist/docs/references/reference-core-listAgents.md +21 -0
- package/dist/docs/references/reference-core-listGateways.md +40 -0
- package/dist/docs/references/reference-core-listLogs.md +38 -0
- package/dist/docs/references/reference-core-listLogsByRunId.md +36 -0
- package/dist/docs/references/reference-core-listMCPServers.md +55 -0
- package/dist/docs/references/reference-core-listMemory.md +56 -0
- package/dist/docs/references/reference-core-listScorers.md +29 -0
- package/dist/docs/references/reference-core-listStoredAgents.md +93 -0
- package/dist/docs/references/reference-core-listVectors.md +22 -0
- package/dist/docs/references/reference-core-listWorkflows.md +21 -0
- package/dist/docs/references/reference-core-mastra-class.md +66 -0
- package/dist/docs/references/reference-core-mastra-model-gateway.md +153 -0
- package/dist/docs/references/reference-core-setLogger.md +26 -0
- package/dist/docs/references/reference-core-setStorage.md +27 -0
- package/dist/docs/references/reference-datasets-addItem.md +37 -0
- package/dist/docs/references/reference-datasets-addItems.md +35 -0
- package/dist/docs/references/reference-datasets-compareExperiments.md +52 -0
- package/dist/docs/references/reference-datasets-create.md +51 -0
- package/dist/docs/references/reference-datasets-dataset.md +82 -0
- package/dist/docs/references/reference-datasets-datasets-manager.md +94 -0
- package/dist/docs/references/reference-datasets-delete.md +25 -0
- package/dist/docs/references/reference-datasets-deleteExperiment.md +27 -0
- package/dist/docs/references/reference-datasets-deleteItem.md +27 -0
- package/dist/docs/references/reference-datasets-deleteItems.md +29 -0
- package/dist/docs/references/reference-datasets-get.md +31 -0
- package/dist/docs/references/reference-datasets-getDetails.md +47 -0
- package/dist/docs/references/reference-datasets-getExperiment.md +30 -0
- package/dist/docs/references/reference-datasets-getItem.md +33 -0
- package/dist/docs/references/reference-datasets-getItemHistory.md +31 -0
- package/dist/docs/references/reference-datasets-list.md +31 -0
- package/dist/docs/references/reference-datasets-listExperimentResults.md +39 -0
- package/dist/docs/references/reference-datasets-listExperiments.md +33 -0
- package/dist/docs/references/reference-datasets-listItems.md +46 -0
- package/dist/docs/references/reference-datasets-listVersions.md +33 -0
- package/dist/docs/references/reference-datasets-startExperiment.md +62 -0
- package/dist/docs/references/reference-datasets-startExperimentAsync.md +43 -0
- package/dist/docs/references/reference-datasets-update.md +48 -0
- package/dist/docs/references/reference-datasets-updateItem.md +38 -0
- package/dist/docs/references/reference-evals-answer-relevancy.md +105 -0
- package/dist/docs/references/reference-evals-answer-similarity.md +99 -0
- package/dist/docs/references/reference-evals-bias.md +120 -0
- package/dist/docs/references/reference-evals-completeness.md +136 -0
- package/dist/docs/references/reference-evals-content-similarity.md +101 -0
- package/dist/docs/references/reference-evals-context-precision.md +196 -0
- package/dist/docs/references/reference-evals-create-scorer.md +270 -0
- package/dist/docs/references/reference-evals-faithfulness.md +114 -0
- package/dist/docs/references/reference-evals-hallucination.md +213 -0
- package/dist/docs/references/reference-evals-keyword-coverage.md +128 -0
- package/dist/docs/references/reference-evals-mastra-scorer.md +123 -0
- package/dist/docs/references/reference-evals-run-evals.md +179 -0
- package/dist/docs/references/reference-evals-scorer-utils.md +326 -0
- package/dist/docs/references/reference-evals-textual-difference.md +113 -0
- package/dist/docs/references/reference-evals-tone-consistency.md +119 -0
- package/dist/docs/references/reference-evals-toxicity.md +123 -0
- package/dist/docs/references/reference-harness-harness-class.md +708 -0
- package/dist/docs/references/reference-logging-pino-logger.md +117 -0
- package/dist/docs/references/reference-memory-deleteMessages.md +38 -0
- package/dist/docs/references/reference-memory-memory-class.md +147 -0
- package/dist/docs/references/reference-memory-observational-memory.md +565 -0
- package/dist/docs/references/reference-observability-tracing-bridges-otel.md +131 -0
- package/dist/docs/references/reference-observability-tracing-configuration.md +178 -0
- package/dist/docs/references/reference-observability-tracing-exporters-console-exporter.md +138 -0
- package/dist/docs/references/reference-observability-tracing-exporters-datadog.md +116 -0
- package/dist/docs/references/reference-observability-tracing-instances.md +107 -0
- package/dist/docs/references/reference-observability-tracing-interfaces.md +743 -0
- package/dist/docs/references/reference-observability-tracing-processors-sensitive-data-filter.md +144 -0
- package/dist/docs/references/reference-observability-tracing-spans.md +224 -0
- package/dist/docs/references/reference-processors-batch-parts-processor.md +61 -0
- package/dist/docs/references/reference-processors-language-detector.md +82 -0
- package/dist/docs/references/reference-processors-message-history-processor.md +85 -0
- package/dist/docs/references/reference-processors-moderation-processor.md +104 -0
- package/dist/docs/references/reference-processors-pii-detector.md +108 -0
- package/dist/docs/references/reference-processors-processor-interface.md +521 -0
- package/dist/docs/references/reference-processors-prompt-injection-detector.md +72 -0
- package/dist/docs/references/reference-processors-semantic-recall-processor.md +117 -0
- package/dist/docs/references/reference-processors-system-prompt-scrubber.md +80 -0
- package/dist/docs/references/reference-processors-token-limiter-processor.md +115 -0
- package/dist/docs/references/reference-processors-tool-call-filter.md +85 -0
- package/dist/docs/references/reference-processors-tool-search-processor.md +111 -0
- package/dist/docs/references/reference-processors-unicode-normalizer.md +62 -0
- package/dist/docs/references/reference-processors-working-memory-processor.md +152 -0
- package/dist/docs/references/reference-rag-database-config.md +261 -0
- package/dist/docs/references/reference-rag-embeddings.md +92 -0
- package/dist/docs/references/reference-server-mastra-server.md +298 -0
- package/dist/docs/references/reference-server-register-api-route.md +249 -0
- package/dist/docs/references/reference-storage-cloudflare-d1.md +218 -0
- package/dist/docs/references/reference-storage-composite.md +235 -0
- package/dist/docs/references/reference-storage-lance.md +131 -0
- package/dist/docs/references/reference-storage-libsql.md +135 -0
- package/dist/docs/references/reference-storage-mongodb.md +262 -0
- package/dist/docs/references/reference-storage-mssql.md +157 -0
- package/dist/docs/references/reference-storage-overview.md +121 -0
- package/dist/docs/references/reference-storage-postgresql.md +526 -0
- package/dist/docs/references/reference-storage-upstash.md +160 -0
- package/dist/docs/references/reference-streaming-ChunkType.md +292 -0
- package/dist/docs/references/reference-streaming-agents-MastraModelOutput.md +182 -0
- package/dist/docs/references/reference-streaming-agents-streamLegacy.md +142 -0
- package/dist/docs/references/reference-streaming-workflows-observeStream.md +42 -0
- package/dist/docs/references/reference-streaming-workflows-resumeStream.md +61 -0
- package/dist/docs/references/reference-streaming-workflows-stream.md +88 -0
- package/dist/docs/references/reference-streaming-workflows-timeTravelStream.md +142 -0
- package/dist/docs/references/reference-templates-overview.md +194 -0
- package/dist/docs/references/reference-tools-create-tool.md +237 -0
- package/dist/docs/references/reference-tools-graph-rag-tool.md +182 -0
- package/dist/docs/references/reference-tools-mcp-client.md +954 -0
- package/dist/docs/references/reference-tools-mcp-server.md +1271 -0
- package/dist/docs/references/reference-tools-vector-query-tool.md +459 -0
- package/dist/docs/references/reference-vectors-libsql.md +305 -0
- package/dist/docs/references/reference-vectors-mongodb.md +295 -0
- package/dist/docs/references/reference-vectors-pg.md +408 -0
- package/dist/docs/references/reference-vectors-upstash.md +294 -0
- package/dist/docs/references/reference-voice-composite-voice.md +121 -0
- package/dist/docs/references/reference-voice-mastra-voice.md +311 -0
- package/dist/docs/references/reference-voice-voice.addInstructions.md +55 -0
- package/dist/docs/references/reference-voice-voice.addTools.md +67 -0
- package/dist/docs/references/reference-voice-voice.connect.md +94 -0
- package/dist/docs/references/reference-voice-voice.events.md +37 -0
- package/dist/docs/references/reference-voice-voice.listen.md +164 -0
- package/dist/docs/references/reference-voice-voice.on.md +111 -0
- package/dist/docs/references/reference-voice-voice.speak.md +157 -0
- package/dist/docs/references/reference-workflows-run-methods-cancel.md +86 -0
- package/dist/docs/references/reference-workflows-run-methods-restart.md +33 -0
- package/dist/docs/references/reference-workflows-run-methods-resume.md +59 -0
- package/dist/docs/references/reference-workflows-run-methods-start.md +58 -0
- package/dist/docs/references/reference-workflows-run-methods-startAsync.md +67 -0
- package/dist/docs/references/reference-workflows-run-methods-timeTravel.md +142 -0
- package/dist/docs/references/reference-workflows-run.md +59 -0
- package/dist/docs/references/reference-workflows-step.md +119 -0
- package/dist/docs/references/reference-workflows-workflow-methods-branch.md +25 -0
- package/dist/docs/references/reference-workflows-workflow-methods-commit.md +17 -0
- package/dist/docs/references/reference-workflows-workflow-methods-create-run.md +63 -0
- package/dist/docs/references/reference-workflows-workflow-methods-dountil.md +25 -0
- package/dist/docs/references/reference-workflows-workflow-methods-dowhile.md +25 -0
- package/dist/docs/references/reference-workflows-workflow-methods-foreach.md +118 -0
- package/dist/docs/references/reference-workflows-workflow-methods-map.md +93 -0
- package/dist/docs/references/reference-workflows-workflow-methods-parallel.md +21 -0
- package/dist/docs/references/reference-workflows-workflow-methods-sleep.md +35 -0
- package/dist/docs/references/reference-workflows-workflow-methods-sleepUntil.md +35 -0
- package/dist/docs/references/reference-workflows-workflow-methods-then.md +21 -0
- package/dist/docs/references/reference-workflows-workflow.md +157 -0
- package/dist/docs/references/reference-workspace-filesystem.md +255 -0
- package/dist/docs/references/reference-workspace-local-filesystem.md +343 -0
- package/dist/docs/references/reference-workspace-local-sandbox.md +301 -0
- package/dist/docs/references/reference-workspace-sandbox.md +87 -0
- package/dist/docs/references/reference-workspace-workspace-class.md +244 -0
- package/dist/docs/references/reference.md +277 -0
- package/dist/evals/index.cjs +20 -20
- package/dist/evals/index.js +3 -3
- package/dist/evals/run/index.d.ts +9 -2
- package/dist/evals/run/index.d.ts.map +1 -1
- package/dist/evals/scoreTraces/index.cjs +5 -5
- package/dist/evals/scoreTraces/index.js +2 -2
- package/dist/harness/harness.d.ts +6 -0
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/index.cjs +28 -13
- package/dist/harness/index.cjs.map +1 -1
- package/dist/harness/index.js +20 -5
- package/dist/harness/index.js.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/dist/integration/index.cjs +2 -2
- package/dist/integration/index.js +1 -1
- package/dist/llm/index.cjs +6 -6
- package/dist/llm/index.js +1 -1
- package/dist/llm/model/embedding-router.d.ts.map +1 -1
- package/dist/llm/model/model.loop.d.ts +1 -1
- package/dist/llm/model/model.loop.d.ts.map +1 -1
- package/dist/loop/index.cjs +20 -12
- package/dist/loop/index.js +1 -1
- package/dist/loop/network/index.d.ts.map +1 -1
- package/dist/loop/network/validation.d.ts +51 -0
- package/dist/loop/network/validation.d.ts.map +1 -1
- package/dist/loop/test-utils/generateText.d.ts.map +1 -1
- package/dist/loop/test-utils/options.d.ts.map +1 -1
- package/dist/loop/test-utils/streamObject.d.ts.map +1 -1
- package/dist/loop/types.d.ts +15 -0
- package/dist/loop/types.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/index.d.ts +3 -0
- package/dist/loop/workflows/agentic-execution/index.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/is-task-complete-step.d.ts +126 -0
- package/dist/loop/workflows/agentic-execution/is-task-complete-step.d.ts.map +1 -0
- package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts +3 -1
- package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts +1 -0
- package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-loop/index.d.ts +3 -0
- package/dist/loop/workflows/agentic-loop/index.d.ts.map +1 -1
- package/dist/loop/workflows/schema.d.ts +3 -0
- package/dist/loop/workflows/schema.d.ts.map +1 -1
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.d.ts +9 -5
- package/dist/mastra/index.d.ts.map +1 -1
- package/dist/mastra/index.js +1 -1
- package/dist/memory/index.cjs +14 -14
- package/dist/memory/index.js +1 -1
- package/dist/processor-provider/index.cjs +10 -10
- package/dist/processor-provider/index.js +1 -1
- package/dist/processors/index.cjs +42 -42
- package/dist/processors/index.js +1 -1
- package/dist/processors/processors/skills.d.ts.map +1 -1
- package/dist/relevance/index.cjs +3 -3
- package/dist/relevance/index.js +1 -1
- package/dist/storage/constants.cjs +56 -56
- package/dist/storage/constants.js +1 -1
- package/dist/storage/domains/memory/inmemory.d.ts.map +1 -1
- package/dist/storage/index.cjs +160 -160
- package/dist/storage/index.js +2 -2
- package/dist/storage/types.d.ts +2 -3
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/stream/aisdk/v5/compat/prepare-tools.d.ts.map +1 -1
- package/dist/stream/base/output.d.ts +1 -0
- package/dist/stream/base/output.d.ts.map +1 -1
- package/dist/stream/index.cjs +11 -11
- package/dist/stream/index.js +2 -2
- package/dist/stream/types.d.ts +27 -1
- package/dist/stream/types.d.ts.map +1 -1
- package/dist/test-utils/llm-mock.cjs +4 -4
- package/dist/test-utils/llm-mock.js +1 -1
- package/dist/tool-loop-agent/index.cjs +4 -4
- package/dist/tool-loop-agent/index.js +1 -1
- package/dist/tools/index.cjs +9 -5
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/is-vercel-tool.cjs +2 -2
- package/dist/tools/is-vercel-tool.js +1 -1
- package/dist/tools/toolchecks.d.ts +10 -0
- package/dist/tools/toolchecks.d.ts.map +1 -1
- package/dist/utils.cjs +23 -23
- package/dist/utils.js +1 -1
- package/dist/vector/index.cjs +7 -7
- package/dist/vector/index.js +1 -1
- package/dist/vector/types.d.ts +9 -1
- package/dist/vector/types.d.ts.map +1 -1
- package/dist/workflows/evented/index.cjs +10 -10
- package/dist/workflows/evented/index.js +1 -1
- package/dist/workflows/index.cjs +25 -25
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/types.d.ts +14 -1
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/workflow.d.ts +3 -17
- package/dist/workflows/workflow.d.ts.map +1 -1
- package/dist/workspace/filesystem/composite-filesystem.d.ts +5 -0
- package/dist/workspace/filesystem/composite-filesystem.d.ts.map +1 -1
- package/dist/workspace/filesystem/filesystem.d.ts +12 -0
- package/dist/workspace/filesystem/filesystem.d.ts.map +1 -1
- package/dist/workspace/filesystem/fs-utils.d.ts +12 -0
- package/dist/workspace/filesystem/fs-utils.d.ts.map +1 -1
- package/dist/workspace/filesystem/local-filesystem.d.ts +6 -0
- package/dist/workspace/filesystem/local-filesystem.d.ts.map +1 -1
- package/dist/workspace/index.cjs +66 -66
- package/dist/workspace/index.js +1 -1
- package/dist/workspace/lsp/client.d.ts +76 -0
- package/dist/workspace/lsp/client.d.ts.map +1 -0
- package/dist/workspace/lsp/index.d.ts +6 -0
- package/dist/workspace/lsp/index.d.ts.map +1 -0
- package/dist/workspace/lsp/language.d.ts +16 -0
- package/dist/workspace/lsp/language.d.ts.map +1 -0
- package/dist/workspace/lsp/manager.d.ts +72 -0
- package/dist/workspace/lsp/manager.d.ts.map +1 -0
- package/dist/workspace/lsp/servers.d.ts +43 -0
- package/dist/workspace/lsp/servers.d.ts.map +1 -0
- package/dist/workspace/lsp/types.d.ts +45 -0
- package/dist/workspace/lsp/types.d.ts.map +1 -0
- package/dist/workspace/tools/ast-edit.d.ts.map +1 -1
- package/dist/workspace/tools/edit-file.d.ts.map +1 -1
- package/dist/workspace/tools/helpers.d.ts +13 -0
- package/dist/workspace/tools/helpers.d.ts.map +1 -1
- package/dist/workspace/tools/write-file.d.ts.map +1 -1
- package/dist/workspace/workspace.d.ts +33 -0
- package/dist/workspace/workspace.d.ts.map +1 -1
- package/package.json +10 -8
- package/dist/chunk-2X66GWF5.cjs.map +0 -1
- package/dist/chunk-6QBN6MZY.cjs.map +0 -1
- package/dist/chunk-7EXW4AAG.js.map +0 -1
- package/dist/chunk-7UAJ6LMR.cjs.map +0 -1
- package/dist/chunk-BQHWJLXU.js.map +0 -1
- package/dist/chunk-DB7U2C5B.cjs.map +0 -1
- package/dist/chunk-DFCRXDVK.js.map +0 -1
- package/dist/chunk-EAZ6YDCQ.cjs.map +0 -1
- package/dist/chunk-HB6T4554.cjs.map +0 -1
- package/dist/chunk-IC5OUWKJ.js.map +0 -1
- package/dist/chunk-KUXNBWN7.js.map +0 -1
- package/dist/chunk-O7PZ4VOO.cjs.map +0 -1
- package/dist/chunk-QSHV7GPT.js.map +0 -1
- package/dist/chunk-QTAS3HND.cjs.map +0 -1
- package/dist/chunk-R4N65TLG.js.map +0 -1
- package/dist/chunk-T6GAM3SQ.js.map +0 -1
- package/dist/chunk-YQG7NBPR.cjs.map +0 -1
- package/dist/chunk-ZSBM2SVU.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/harness/tools.ts","../../src/harness/types.ts","../../src/harness/harness.ts"],"names":["createTool","z","answer","Agent","durationMs","meta","Workspace","result","RequestContext"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod';\n\nimport { Agent } from '../agent';\nimport type { ToolsInput } from '../agent/types';\nimport type { MastraLanguageModel } from '../llm/model/shared.types';\nimport { createTool } from '../tools/tool';\n\nimport type { HarnessRequestContext, HarnessSubagent } from './types';\n\nlet questionCounter = 0;\nlet planCounter = 0;\n\n/**\n * Built-in harness tool: ask the user a question and wait for their response.\n * Supports single-select options and free-text input.\n * The tool pauses execution while the UI shows the dialog.\n */\nexport const askUserTool = createTool({\n id: 'ask_user',\n description:\n 'Ask the user a question and wait for their response. Use this when you need clarification, want to validate assumptions, or need the user to make a decision between options. Provide options for structured choices (2-4 options), or omit them for open-ended questions.',\n inputSchema: z.object({\n question: z.string().min(1).describe('The question to ask the user. Should be clear and specific.'),\n options: z\n .array(\n z.object({\n label: z.string().describe('Short display text for this option (1-5 words)'),\n description: z.string().optional().describe('Explanation of what this option means'),\n }),\n )\n .optional()\n .describe('Optional choices. If provided, shows a selection list. If omitted, shows a free-text input.'),\n }),\n execute: async ({ question, options }, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n if (!harnessCtx?.emitEvent || !harnessCtx?.registerQuestion) {\n return {\n content: `[Question for user]: ${question}${options ? '\\nOptions: ' + options.map(o => o.label).join(', ') : ''}`,\n isError: false,\n };\n }\n\n const questionId = `q_${++questionCounter}_${Date.now()}`;\n\n const answer = await new Promise<string>((resolve, reject) => {\n const signal = harnessCtx.abortSignal;\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n const onAbort = () => reject(new DOMException('Aborted', 'AbortError'));\n signal?.addEventListener('abort', onAbort, { once: true });\n\n harnessCtx.registerQuestion!({\n questionId,\n resolve: answer => {\n signal?.removeEventListener('abort', onAbort);\n resolve(answer);\n },\n });\n\n harnessCtx.emitEvent!({\n type: 'ask_question',\n questionId,\n question,\n options,\n });\n });\n\n return { content: `User answered: ${answer}`, isError: false };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { content: `Failed to ask user: ${msg}`, isError: true };\n }\n },\n});\n\n/**\n * Built-in harness tool: submit a plan for user review.\n * The plan renders in the UI with approve/reject options.\n * On approval, the harness switches to the default mode.\n */\nexport const submitPlanTool = createTool({\n id: 'submit_plan',\n description:\n 'Submit a completed implementation plan for user review. The plan will be rendered as markdown and the user can approve, reject, or request changes. Use this when your exploration is complete and you have a concrete plan ready for review. On approval, the system automatically switches to the default mode so you can implement.',\n inputSchema: z.object({\n title: z.string().optional().describe(\"Short title for the plan (e.g., 'Add dark mode toggle')\"),\n plan: z\n .string()\n .min(1)\n .describe('The full plan content in markdown format. Should include Overview, Steps, and Verification sections.'),\n }),\n execute: async ({ title, plan }, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n if (!harnessCtx?.emitEvent || !harnessCtx?.registerPlanApproval) {\n return {\n content: `[Plan submitted for review]\\n\\nTitle: ${title || 'Implementation Plan'}\\n\\n${plan}`,\n isError: false,\n };\n }\n\n const planId = `plan_${++planCounter}_${Date.now()}`;\n\n const result = await new Promise<{ action: 'approved' | 'rejected'; feedback?: string }>((resolve, reject) => {\n const signal = harnessCtx.abortSignal;\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n const onAbort = () => reject(new DOMException('Aborted', 'AbortError'));\n signal?.addEventListener('abort', onAbort, { once: true });\n\n harnessCtx.registerPlanApproval!({\n planId,\n resolve: res => {\n signal?.removeEventListener('abort', onAbort);\n resolve(res);\n },\n });\n\n harnessCtx.emitEvent!({\n type: 'plan_approval_required',\n planId,\n title: title || 'Implementation Plan',\n plan,\n });\n });\n\n if (result.action === 'approved') {\n return {\n content: 'Plan approved. Proceed with implementation following the approved plan.',\n isError: false,\n };\n }\n\n const feedback = result.feedback ? `\\n\\nUser feedback: ${result.feedback}` : '';\n return {\n content: `Plan was not approved. The user wants revisions.${feedback}\\n\\nPlease revise the plan based on the feedback and submit again with submit_plan.`,\n isError: false,\n };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { content: `Failed to submit plan: ${msg}`, isError: true };\n }\n },\n});\n\n// =============================================================================\n// Task Tools\n// =============================================================================\n\nconst taskItemSchema = z.object({\n content: z.string().min(1).describe(\"Task description in imperative form (e.g., 'Fix authentication bug')\"),\n status: z.enum(['pending', 'in_progress', 'completed']).describe('Current task status'),\n activeForm: z\n .string()\n .min(1)\n .describe(\"Present continuous form shown during execution (e.g., 'Fixing authentication bug')\"),\n});\n\nexport type TaskItem = z.infer<typeof taskItemSchema>;\n\n/**\n * Built-in harness tool: manage a structured task list for the coding session.\n * Full-replacement semantics: each call replaces the entire task list.\n */\nexport const taskWriteTool = createTool({\n id: 'task_write',\n description: `Create and manage a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\n\nUsage:\n- Pass the FULL task list each time (replaces previous list)\n- Each task has: content (imperative), status (pending|in_progress|completed), activeForm (present continuous)\n- Mark tasks in_progress BEFORE starting work (only ONE at a time)\n- Mark tasks completed IMMEDIATELY after finishing\n- Use this for multi-step tasks requiring 3+ distinct actions\n\nStates:\n- pending: Not yet started\n- in_progress: Currently working on (limit to ONE)\n- completed: Finished successfully`,\n inputSchema: z.object({\n tasks: z.array(taskItemSchema).describe('The complete updated task list'),\n }),\n execute: async ({ tasks }, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n if (harnessCtx) {\n // Always update state\n await harnessCtx.setState({ tasks });\n\n // Always emit event immediately for real-time updates\n // The UI will handle deduplication if needed\n harnessCtx.emitEvent?.({\n type: 'task_updated',\n tasks,\n });\n }\n\n // Build summary for the model's context\n const completed = tasks.filter(t => t.status === 'completed').length;\n const inProgress = tasks.find(t => t.status === 'in_progress');\n const total = tasks.length;\n\n let summary = `Tasks updated: [${completed}/${total} completed]`;\n if (inProgress) {\n summary += `\\nCurrently: ${inProgress.activeForm}`;\n }\n\n return {\n content: summary,\n isError: false,\n };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `Failed to update tasks: ${msg}`,\n isError: true,\n };\n }\n },\n});\n\n/**\n * Built-in harness tool: check the completion status of the current task list.\n * Helps the agent determine if all tasks are completed before ending work.\n */\nexport const taskCheckTool = createTool({\n id: 'task_check',\n description: `Check the completion status of your current task list. Use this before deciding to end work on a task to ensure all tasks are completed.\n\nReturns:\n- Total number of tasks\n- Number of completed, in progress, and pending tasks\n- List of incomplete tasks (if any)\n- Boolean indicating if all tasks are done`,\n inputSchema: z.object({}), // No input needed\n execute: async ({}, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n if (!harnessCtx) {\n return {\n content: 'Unable to access task list (no harness context)',\n isError: true,\n };\n }\n\n // Get current state which includes tasks\n // Use getState() for live state instead of the snapshot\n const state = harnessCtx.getState ? harnessCtx.getState() : harnessCtx.state;\n const typedState = state as {\n tasks?: Array<{\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n };\n\n const tasks = typedState.tasks || [];\n\n if (tasks.length === 0) {\n return {\n content: 'No tasks found. Consider using task_write to create a task list for complex work.',\n isError: false,\n };\n }\n\n // Calculate statistics\n const completed = tasks.filter(t => t.status === 'completed');\n const inProgress = tasks.filter(t => t.status === 'in_progress');\n const pending = tasks.filter(t => t.status === 'pending');\n const incomplete = [...inProgress, ...pending];\n const allDone = incomplete.length === 0;\n\n // Build detailed response\n let response = `Task Status: [${completed.length}/${tasks.length} completed]\\n`;\n response += `- Completed: ${completed.length}\\n`;\n response += `- In Progress: ${inProgress.length}\\n`;\n response += `- Pending: ${pending.length}\\n`;\n response += `\\nAll tasks completed: ${allDone ? '✓ YES' : '✗ NO'}`;\n\n if (!allDone) {\n response += '\\n\\nIncomplete tasks:';\n if (inProgress.length > 0) {\n response += '\\n\\nIn Progress:';\n inProgress.forEach(t => {\n response += `\\n- ${t.content}`;\n });\n }\n if (pending.length > 0) {\n response += '\\n\\nPending:';\n pending.forEach(t => {\n response += `\\n- ${t.content}`;\n });\n }\n response += '\\n\\nContinue working on these tasks before ending.';\n }\n\n return {\n content: response,\n isError: false,\n };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `Failed to check tasks: ${msg}`,\n isError: true,\n };\n }\n },\n});\n\n// =============================================================================\n// Subagent Tool\n// =============================================================================\n\nexport interface CreateSubagentToolOptions {\n subagents: HarnessSubagent[];\n resolveModel: (modelId: string) => MastraLanguageModel;\n /** Resolved harness tools (already evaluated from DynamicArgument) */\n harnessTools?: ToolsInput;\n /** Fallback model ID when subagent definition has no defaultModelId */\n fallbackModelId?: string;\n}\n\n/**\n * Creates a `subagent` tool from registered subagent definitions.\n * The tool spawns a fresh Agent per invocation with constrained tools,\n * streams the response, and forwards events to the harness.\n */\nexport function createSubagentTool(opts: CreateSubagentToolOptions) {\n const { subagents, resolveModel, harnessTools, fallbackModelId } = opts;\n\n const subagentIds = subagents.map(s => s.id);\n\n const typeDescriptions = subagents.map(s => `- **${s.id}** (${s.name}): ${s.description}`).join('\\n');\n\n return createTool({\n id: 'subagent',\n description: `Delegate a focused task to a specialized subagent. The subagent runs independently with a constrained toolset, then returns its findings as text.\n\nAvailable agent types:\n${typeDescriptions}\n\nThe subagent runs in its own context — it does NOT see the parent conversation history. Write a clear, self-contained task description.\n\nUse this tool when:\n- You want to run multiple investigations in parallel\n- The task is self-contained and can be delegated`,\n inputSchema: z.object({\n agentType: z.enum(subagentIds as [string, ...string[]]).describe('Type of subagent to spawn'),\n task: z\n .string()\n .describe(\n 'Clear, self-contained description of what the subagent should do. Include all relevant context — the subagent cannot see the parent conversation.',\n ),\n modelId: z.string().optional().describe('Optional model ID override for this task.'),\n }),\n execute: async ({ agentType, task, modelId }, context) => {\n const definition = subagents.find(s => s.id === agentType);\n if (!definition) {\n return {\n content: `Unknown agent type: ${agentType}. Valid types: ${subagentIds.join(', ')}`,\n isError: true,\n };\n }\n\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n const emitEvent = harnessCtx?.emitEvent;\n const abortSignal = harnessCtx?.abortSignal;\n const toolCallId = context?.agent?.toolCallId ?? 'unknown';\n\n // Merge tools: subagent's own tools + filtered harness tools\n const mergedTools: ToolsInput = { ...definition.tools };\n if (definition.allowedHarnessTools && harnessTools) {\n for (const toolId of definition.allowedHarnessTools) {\n if (harnessTools[toolId] && !mergedTools[toolId]) {\n mergedTools[toolId] = harnessTools[toolId];\n }\n }\n }\n\n // Resolve model: explicit arg → harness setting → subagent default → fallback\n const harnessModelId = harnessCtx?.getSubagentModelId?.({ agentType }) ?? undefined;\n const resolvedModelId = modelId ?? harnessModelId ?? definition.defaultModelId ?? fallbackModelId;\n if (!resolvedModelId) {\n return { content: 'No model ID available for subagent. Configure defaultModelId.', isError: true };\n }\n\n let model: MastraLanguageModel;\n try {\n model = resolveModel(resolvedModelId);\n } catch (err) {\n return {\n content: `Failed to resolve model \"${resolvedModelId}\": ${err instanceof Error ? err.message : String(err)}`,\n isError: true,\n };\n }\n\n const subagent = new Agent({\n id: `subagent-${definition.id}`,\n name: `${definition.name} Subagent`,\n instructions: definition.instructions,\n model,\n tools: mergedTools,\n });\n\n const startTime = Date.now();\n\n emitEvent?.({\n type: 'subagent_start',\n toolCallId,\n agentType,\n task,\n modelId: resolvedModelId,\n });\n\n let partialText = '';\n const toolCallLog: Array<{ name: string; toolCallId: string; isError?: boolean }> = [];\n\n try {\n const response = await subagent.stream(task, {\n maxSteps: 50,\n abortSignal,\n requireToolApproval: false,\n });\n\n for await (const chunk of response.fullStream) {\n switch (chunk.type) {\n case 'text-delta':\n partialText += chunk.payload.text;\n emitEvent?.({\n type: 'subagent_text_delta',\n toolCallId,\n agentType,\n textDelta: chunk.payload.text,\n });\n break;\n\n case 'tool-call':\n toolCallLog.push({ name: chunk.payload.toolName, toolCallId: chunk.payload.toolCallId });\n emitEvent?.({\n type: 'subagent_tool_start',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolArgs: chunk.payload.args,\n });\n break;\n\n case 'tool-result': {\n const isErr = chunk.payload.isError ?? false;\n for (let i = toolCallLog.length - 1; i >= 0; i--) {\n if (toolCallLog[i]!.toolCallId === chunk.payload.toolCallId && toolCallLog[i]!.isError === undefined) {\n toolCallLog[i]!.isError = isErr;\n break;\n }\n }\n emitEvent?.({\n type: 'subagent_tool_end',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolResult: chunk.payload.result,\n isError: isErr,\n });\n break;\n }\n }\n }\n\n if (abortSignal?.aborted) {\n const durationMs = Date.now() - startTime;\n const abortResult = partialText\n ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}`\n : '[Aborted by user]';\n\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return { content: abortResult + meta, isError: false };\n }\n\n const fullOutput = await response.getFullOutput();\n const resultText = fullOutput.text || partialText;\n\n const durationMs = Date.now() - startTime;\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: resultText, isError: false, durationMs });\n\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return { content: resultText + meta, isError: false };\n } catch (err) {\n const isAbort =\n err instanceof Error &&\n (err.name === 'AbortError' || err.message?.includes('abort') || err.message?.includes('cancel'));\n const durationMs = Date.now() - startTime;\n\n if (isAbort) {\n const abortResult = partialText\n ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}`\n : '[Aborted by user]';\n\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return { content: abortResult + meta, isError: false };\n }\n\n const message = err instanceof Error ? err.message : String(err);\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: message, isError: true, durationMs });\n\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return { content: `Subagent \"${definition.name}\" failed: ${message}` + meta, isError: true };\n }\n },\n });\n}\n\n/**\n * Build a metadata tag appended to subagent results.\n * UIs can parse this to display model ID, duration, and tool calls\n * when loading from history (where live events aren't available).\n */\nfunction buildSubagentMeta(\n modelId: string,\n durationMs: number,\n toolCalls: Array<{ name: string; isError?: boolean }>,\n): string {\n const tools = toolCalls.map(tc => `${tc.name}:${tc.isError ? 'err' : 'ok'}`).join(',');\n return `\\n<subagent-meta modelId=\"${modelId}\" durationMs=\"${durationMs}\" tools=\"${tools}\" />`;\n}\n\n/**\n * Parse subagent metadata from a tool result string.\n * Returns the metadata and the cleaned result text (without the tag).\n */\nexport function parseSubagentMeta(content: string): {\n text: string;\n modelId?: string;\n durationMs?: number;\n toolCalls?: Array<{ name: string; isError: boolean }>;\n} {\n const match = content.match(/\\n<subagent-meta modelId=\"([^\"]*)\" durationMs=\"(\\d+)\" tools=\"([^\"]*)\" \\/>$/);\n if (!match) return { text: content };\n\n const text = content.slice(0, match.index!);\n const modelId = match[1];\n const durationMs = parseInt(match[2]!, 10);\n const toolCalls = match[3]\n ? match[3]\n .split(',')\n .filter(Boolean)\n .map(entry => {\n const [name, status] = entry.split(':');\n return { name: name!, isError: status === 'err' };\n })\n : [];\n\n return { text, modelId, durationMs, toolCalls };\n}\n","import type { z } from 'zod';\n\nimport type { Agent } from '../agent';\nimport type { ToolsInput } from '../agent/types';\nimport type { MastraLanguageModel } from '../llm/model/shared.types';\nimport type { MastraMemory } from '../memory/memory';\nimport type { MastraCompositeStore } from '../storage/base';\nimport type { DynamicArgument } from '../types';\nimport type { Workspace, WorkspaceConfig, WorkspaceStatus } from '../workspace';\n\n// =============================================================================\n// Heartbeat Handlers\n// =============================================================================\n\n/**\n * A periodic task that the Harness runs on a timer.\n * Heartbeat handlers start during `init()` and are cleaned up on `stopHeartbeats()`.\n */\nexport interface HeartbeatHandler {\n /** Unique identifier for this handler (used for dedup and logging) */\n id: string;\n /** Interval in milliseconds between invocations */\n intervalMs: number;\n /** The function to run on each tick */\n handler: () => void | Promise<void>;\n /** Whether to run the handler immediately on start (default: true) */\n immediate?: boolean;\n /** Called when the handler is removed or all heartbeats are stopped */\n shutdown?: () => void | Promise<void>;\n}\n\n// =============================================================================\n// Harness Configuration\n// =============================================================================\n\n/**\n * Configuration for a single agent mode within the harness.\n * Each mode represents a different \"personality\" or capability set.\n */\nexport interface HarnessMode<TState extends HarnessStateSchema = HarnessStateSchema> {\n /** Unique identifier for this mode (e.g., \"plan\", \"build\", \"review\") */\n id: string;\n\n /** Human-readable name for display */\n name?: string;\n\n /** Whether this is the default mode when harness starts */\n default?: boolean;\n\n /**\n * Default model ID for this mode (e.g., \"anthropic/claude-sonnet-4-20250514\").\n * Used when no per-mode model has been explicitly selected.\n */\n defaultModelId?: string;\n\n /** Hex color for the mode indicator (e.g., \"#7c3aed\") */\n color?: string;\n\n /**\n * The agent for this mode.\n * Can be a static Agent or a function that receives harness state.\n */\n agent: Agent | ((state: z.infer<TState>) => Agent);\n}\n\n// =============================================================================\n// Subagents\n// =============================================================================\n\n/**\n * Definition of a subagent that the Harness can spawn via the built-in `subagent` tool.\n * Each subagent runs as a fresh Agent with constrained tools and its own instructions.\n */\nexport interface HarnessSubagent {\n /** Unique identifier for this subagent type (e.g., \"explore\", \"plan\", \"execute\") */\n id: string;\n\n /** Human-readable name shown in tool output (e.g., \"Explore\") */\n name: string;\n\n /** Description of what this subagent does (used in auto-generated tool description) */\n description: string;\n\n /** System prompt for this subagent */\n instructions: string;\n\n /** Tools this subagent has direct access to */\n tools?: ToolsInput;\n\n /**\n * Tool IDs to pull from the harness's shared `tools` config.\n * Merged with `tools` above — allows subagents to use a subset of harness tools.\n */\n allowedHarnessTools?: string[];\n\n /** Default model ID for this subagent type (e.g., \"anthropic/claude-sonnet-4-20250514\") */\n defaultModelId?: string;\n}\n\n/**\n * Schema type for harness state - must be a Zod object schema.\n */\nexport type HarnessStateSchema = z.ZodObject<z.ZodRawShape>;\n\n/**\n * Configuration for creating a Harness instance.\n */\nexport interface HarnessConfig<TState extends HarnessStateSchema = HarnessStateSchema> {\n /** Unique identifier for this harness instance */\n id: string;\n\n /**\n * Resource ID for grouping threads (e.g., project identifier).\n * Threads are scoped to this resource ID.\n */\n resourceId?: string;\n\n /** Storage backend for persistence (threads, messages, state) */\n storage?: MastraCompositeStore;\n\n /** Zod schema defining the shape of harness state */\n stateSchema?: TState;\n\n /** Initial state values (must conform to schema) */\n initialState?: Partial<z.infer<TState>>;\n\n /** Memory configuration (shared across all modes) */\n memory?: MastraMemory;\n\n /** Available agent modes */\n modes: HarnessMode<TState>[];\n\n /**\n * Tools available to all agents across all modes.\n * Can be a static tools object or a dynamic function that receives\n * the request context and returns tools per-request.\n */\n tools?: DynamicArgument<ToolsInput | undefined>;\n\n /**\n * Workspace configuration.\n * Accepts a pre-constructed Workspace instance, a WorkspaceConfig for\n * Harness to construct internally, or a dynamic factory function that\n * receives the request context and returns a Workspace per-request.\n */\n workspace?: DynamicArgument<Workspace | undefined> | WorkspaceConfig;\n\n /**\n * Periodic heartbeat handlers started during `init()`.\n * Use for background tasks like gateway sync, cache refresh, etc.\n */\n heartbeatHandlers?: HeartbeatHandler[];\n\n /**\n * Custom ID generator for threads, messages, and other entities.\n * Defaults to a timestamp + random string generator.\n */\n idGenerator?: () => string;\n\n /**\n * Custom auth checker for model providers.\n * Lets the app layer provide additional auth sources (e.g., OAuth tokens)\n * beyond the default env var check from the provider registry.\n */\n modelAuthChecker?: ModelAuthChecker;\n\n /**\n * Provides per-model use counts for `listAvailableModels()` sorting/display.\n * Lets the app layer track and report how often each model has been used.\n */\n modelUseCountProvider?: ModelUseCountProvider;\n\n /**\n * Subagent definitions. The Harness auto-creates a `subagent` built-in tool\n * that parent agents can call to spawn focused subagents.\n */\n subagents?: HarnessSubagent[];\n\n /**\n * Converts a model ID string (e.g., \"anthropic/claude-sonnet-4-20250514\") to a\n * language model instance. Used by subagents and OM model resolution.\n */\n resolveModel?: (modelId: string) => MastraLanguageModel;\n\n /**\n * Observational Memory configuration defaults.\n * The Harness auto-manages OM state (model IDs, thresholds) internally\n * and provides accessors that Memory's dynamic model functions can close over.\n */\n omConfig?: HarnessOMConfig;\n\n /**\n * Maps tool names to permission categories.\n * Used by the permission system to resolve category-level policies.\n * If not provided, all tools default to the \"other\" category.\n */\n toolCategoryResolver?: (toolName: string) => ToolCategory | null;\n\n /**\n * Optional thread locking callbacks.\n * Called during selectOrCreateThread, createThread, and switchThread\n * to prevent concurrent access to the same thread from multiple processes.\n * `acquire` should throw if the lock is held by another process.\n */\n threadLock?: {\n acquire: (threadId: string) => void;\n release: (threadId: string) => void;\n };\n}\n\n/**\n * Default configuration for Observational Memory.\n * These values are used when harness state doesn't have explicit OM values\n * (e.g., fresh thread with no persisted OM settings).\n */\nexport interface HarnessOMConfig {\n /** Default model ID for the observer agent */\n defaultObserverModelId?: string;\n /** Default model ID for the reflector agent */\n defaultReflectorModelId?: string;\n /** Default observation threshold in tokens */\n defaultObservationThreshold?: number;\n /** Default reflection threshold in tokens */\n defaultReflectionThreshold?: number;\n}\n\n// =============================================================================\n// Permissions\n// =============================================================================\n\n/**\n * Tool category for permission grouping.\n * Consumers define how tool names map to categories via `toolCategoryResolver`.\n */\nexport type ToolCategory = 'read' | 'edit' | 'execute' | 'mcp' | 'other';\n\n/**\n * Permission policy for a tool or category.\n */\nexport type PermissionPolicy = 'allow' | 'ask' | 'deny';\n\n/**\n * Permission rules for controlling tool approval behavior.\n * Per-tool overrides take precedence over category policies.\n */\nexport interface PermissionRules {\n categories: Partial<Record<ToolCategory, PermissionPolicy>>;\n tools: Partial<Record<string, PermissionPolicy>>;\n}\n\n// =============================================================================\n// Model Discovery\n// =============================================================================\n\n/**\n * Auth status for a model's provider.\n */\nexport interface ModelAuthStatus {\n hasAuth: boolean;\n apiKeyEnvVar?: string;\n}\n\n/**\n * Info about an available model from the provider registry.\n */\nexport interface AvailableModel {\n /** Full model ID (e.g., \"anthropic/claude-sonnet-4-20250514\") */\n id: string;\n /** Provider prefix (e.g., \"anthropic\") */\n provider: string;\n /** Model name without provider prefix */\n modelName: string;\n /** Whether the provider has valid authentication */\n hasApiKey: boolean;\n /** Environment variable for the provider's API key */\n apiKeyEnvVar?: string;\n /** Number of times this model has been used (from external tracking) */\n useCount: number;\n}\n\n/**\n * Custom auth checker for model providers.\n * Called by `getCurrentModelAuthStatus()` and `listAvailableModels()` to determine\n * whether a provider has valid authentication beyond just env var checks\n * (e.g., OAuth tokens, stored credentials).\n *\n * Return `true` if the provider is authenticated, `false` if not,\n * or `undefined` to fall back to the default env var check.\n */\nexport type ModelAuthChecker = (provider: string) => boolean | undefined;\n\n/**\n * Provides per-model use counts for sorting in `listAvailableModels()`.\n * Return a map of model ID → use count.\n */\nexport type ModelUseCountProvider = () => Record<string, number>;\n\n// =============================================================================\n// Harness State\n// =============================================================================\n\n/**\n * Thread metadata stored in the harness.\n */\nexport interface HarnessThread {\n id: string;\n resourceId: string;\n title?: string;\n createdAt: Date;\n updatedAt: Date;\n tokenUsage?: TokenUsage;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Session info for the current harness instance.\n */\nexport interface HarnessSession {\n currentThreadId: string | null;\n currentModeId: string;\n threads: HarnessThread[];\n}\n\n// =============================================================================\n// Events\n// =============================================================================\n\n/**\n * Token usage statistics from the model.\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n// =============================================================================\n// Observational Memory Progress\n// =============================================================================\n\n/**\n * Status of the Observational Memory system.\n */\nexport type OMStatus = 'idle' | 'observing' | 'reflecting';\n\n/**\n * Status of a buffered OM operation (observation or reflection).\n */\nexport type OMBufferedStatus = 'idle' | 'running' | 'complete';\n\n/**\n * Full progress state for Observational Memory.\n * Maintained by the Harness and exposed via `HarnessDisplayState`.\n */\nexport interface OMProgressState {\n status: OMStatus;\n // Active window tokens/thresholds (from om_status events)\n pendingTokens: number;\n threshold: number;\n thresholdPercent: number;\n observationTokens: number;\n reflectionThreshold: number;\n reflectionThresholdPercent: number;\n // Buffered state (from om_status events)\n buffered: {\n observations: {\n status: OMBufferedStatus;\n chunks: number;\n messageTokens: number;\n projectedMessageRemoval: number;\n observationTokens: number;\n };\n reflection: {\n status: OMBufferedStatus;\n inputObservationTokens: number;\n observationTokens: number;\n };\n };\n generationCount: number;\n stepNumber: number;\n cycleId?: string;\n startTime?: number;\n /** Observation tokens before reflection compression (set on om_reflection_start) */\n preReflectionTokens: number;\n}\n\n// =============================================================================\n// Display State\n// =============================================================================\n\n/**\n * State of an active tool execution, tracked by the Harness for UI consumption.\n */\nexport interface ActiveToolState {\n name: string;\n args: unknown;\n status: 'streaming_input' | 'running' | 'completed' | 'error';\n partialResult?: string;\n result?: unknown;\n isError?: boolean;\n shellOutput?: string;\n}\n\n/**\n * State of an active subagent execution, tracked by the Harness for UI consumption.\n */\nexport interface ActiveSubagentState {\n agentType: string;\n task: string;\n modelId?: string;\n toolCalls: Array<{ name: string; isError: boolean }>;\n textDelta: string;\n status: 'running' | 'completed' | 'error';\n durationMs?: number;\n result?: string;\n}\n\n/**\n * Canonical display state maintained by the Harness.\n *\n * This is the single source of truth for *what to display*.\n * Any UI (TUI, web, desktop) can subscribe to snapshots of this state\n * instead of interpreting 35+ raw event types.\n *\n * The Harness updates this state alongside every event emission,\n * then emits a `display_state_changed` event so UIs can react.\n */\nexport interface HarnessDisplayState {\n // ── Agent lifecycle ──────────────────────────────────────────────────\n /** Whether an agent operation is currently in progress */\n isRunning: boolean;\n\n // ── Current streaming message ────────────────────────────────────────\n /** The message currently being streamed (null when idle) */\n currentMessage: HarnessMessage | null;\n\n // ── Token usage ──────────────────────────────────────────────────────\n /** Cumulative token usage for the current thread */\n tokenUsage: TokenUsage;\n\n // ── Tool execution tracking ──────────────────────────────────────────\n /** Active tool executions keyed by toolCallId */\n activeTools: Map<string, ActiveToolState>;\n\n // ── Streaming tool input ─────────────────────────────────────────────\n /** Partial JSON buffers for tools whose arguments are being streamed */\n toolInputBuffers: Map<string, { text: string; toolName: string }>;\n\n // ── Tool approval ────────────────────────────────────────────────────\n /** A tool awaiting user approval (null when no approval pending) */\n pendingApproval: {\n toolCallId: string;\n toolName: string;\n args: unknown;\n } | null;\n\n // ── Interactive prompts ──────────────────────────────────────────────\n /** A question from the agent awaiting user answer (null when none) */\n pendingQuestion: {\n questionId: string;\n question: string;\n options?: Array<{ label: string; description?: string }>;\n } | null;\n\n /** A plan awaiting user approval (null when none) */\n pendingPlanApproval: {\n planId: string;\n title?: string;\n plan: string;\n } | null;\n\n // ── Subagent tracking ────────────────────────────────────────────────\n /** Active subagent executions keyed by parent toolCallId */\n activeSubagents: Map<string, ActiveSubagentState>;\n\n // ── Observational Memory ─────────────────────────────────────────────\n /** Full OM progress state (status, tokens, thresholds, buffered) */\n omProgress: OMProgressState;\n\n /** Whether message buffering is currently running */\n bufferingMessages: boolean;\n\n /** Whether observation buffering is currently running */\n bufferingObservations: boolean;\n\n // ── File modifications ───────────────────────────────────────────────\n /** Files modified by tool executions (for /diff and similar features) */\n modifiedFiles: Map<string, { operations: string[]; firstModified: Date }>;\n\n // ── Tasks ────────────────────────────────────────────────────────────\n /** Current task list (from task_write tool) */\n tasks: Array<{\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n\n /** Previous task list snapshot (for diff detection) */\n previousTasks: Array<{\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n}\n\n/**\n * Creates the default/initial `HarnessDisplayState`.\n */\nexport function defaultDisplayState(): HarnessDisplayState {\n return {\n isRunning: false,\n currentMessage: null,\n tokenUsage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n activeTools: new Map(),\n toolInputBuffers: new Map(),\n pendingApproval: null,\n pendingQuestion: null,\n pendingPlanApproval: null,\n activeSubagents: new Map(),\n omProgress: defaultOMProgressState(),\n bufferingMessages: false,\n bufferingObservations: false,\n modifiedFiles: new Map(),\n tasks: [],\n previousTasks: [],\n };\n}\n\n/**\n * Creates the default OM progress state.\n */\nexport function defaultOMProgressState(): OMProgressState {\n return {\n status: 'idle',\n pendingTokens: 0,\n threshold: 30000,\n thresholdPercent: 0,\n observationTokens: 0,\n reflectionThreshold: 40000,\n reflectionThresholdPercent: 0,\n buffered: {\n observations: {\n status: 'idle',\n chunks: 0,\n messageTokens: 0,\n projectedMessageRemoval: 0,\n observationTokens: 0,\n },\n reflection: {\n status: 'idle',\n inputObservationTokens: 0,\n observationTokens: 0,\n },\n },\n generationCount: 0,\n stepNumber: 0,\n preReflectionTokens: 0,\n };\n}\n\n// =============================================================================\n// Events\n// =============================================================================\n\n/**\n * Events emitted by the harness that UIs can subscribe to.\n */\nexport type HarnessEvent =\n | { type: 'mode_changed'; modeId: string; previousModeId: string }\n | { type: 'model_changed'; modelId: string; scope?: 'global' | 'thread' | 'mode'; modeId?: string }\n | { type: 'thread_changed'; threadId: string; previousThreadId: string | null }\n | { type: 'thread_created'; thread: HarnessThread }\n | { type: 'state_changed'; state: Record<string, unknown>; changedKeys: string[] }\n | { type: 'agent_start' }\n | { type: 'agent_end'; reason?: 'complete' | 'aborted' | 'error' }\n | { type: 'message_start'; message: HarnessMessage }\n | { type: 'message_update'; message: HarnessMessage }\n | { type: 'message_end'; message: HarnessMessage }\n | { type: 'tool_start'; toolCallId: string; toolName: string; args: unknown }\n | { type: 'tool_approval_required'; toolCallId: string; toolName: string; args: unknown }\n | { type: 'tool_update'; toolCallId: string; partialResult: unknown }\n | { type: 'tool_end'; toolCallId: string; result: unknown; isError: boolean }\n | { type: 'tool_input_start'; toolCallId: string; toolName: string }\n | { type: 'tool_input_delta'; toolCallId: string; argsTextDelta: string; toolName?: string }\n | { type: 'tool_input_end'; toolCallId: string }\n | { type: 'shell_output'; toolCallId: string; output: string; stream: 'stdout' | 'stderr' }\n | { type: 'usage_update'; usage: TokenUsage }\n | { type: 'info'; message: string }\n | { type: 'error'; error: Error; errorType?: string; retryable?: boolean; retryDelay?: number }\n | { type: 'follow_up_queued'; count: number }\n | { type: 'workspace_status_changed'; status: WorkspaceStatus; error?: Error }\n | { type: 'workspace_ready'; workspaceId: string; workspaceName: string }\n | { type: 'workspace_error'; error: Error }\n | {\n type: 'om_status';\n windows: {\n active: {\n messages: { tokens: number; threshold: number };\n observations: { tokens: number; threshold: number };\n };\n buffered: {\n observations: {\n status: 'idle' | 'running' | 'complete';\n chunks: number;\n messageTokens: number;\n projectedMessageRemoval: number;\n observationTokens: number;\n };\n reflection: {\n status: 'idle' | 'running' | 'complete';\n inputObservationTokens: number;\n observationTokens: number;\n };\n };\n };\n recordId: string;\n threadId: string;\n stepNumber: number;\n generationCount: number;\n }\n | {\n type: 'om_observation_start';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n tokensToObserve: number;\n }\n | {\n type: 'om_observation_end';\n cycleId: string;\n durationMs: number;\n tokensObserved: number;\n observationTokens: number;\n observations?: string;\n currentTask?: string;\n suggestedResponse?: string;\n }\n | { type: 'om_observation_failed'; cycleId: string; error: string; durationMs: number }\n | { type: 'om_reflection_start'; cycleId: string; tokensToReflect: number }\n | {\n type: 'om_reflection_end';\n cycleId: string;\n durationMs: number;\n compressedTokens: number;\n observations?: string;\n }\n | { type: 'om_reflection_failed'; cycleId: string; error: string; durationMs: number }\n | { type: 'om_model_changed'; role: 'observer' | 'reflector'; modelId: string }\n | {\n type: 'om_buffering_start';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n tokensToBuffer: number;\n }\n | {\n type: 'om_buffering_end';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n tokensBuffered: number;\n bufferedTokens: number;\n observations?: string;\n }\n | {\n type: 'om_buffering_failed';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n error: string;\n }\n | {\n type: 'om_activation';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n chunksActivated: number;\n tokensActivated: number;\n observationTokens: number;\n messagesActivated: number;\n generationCount: number;\n }\n | {\n type: 'ask_question';\n questionId: string;\n question: string;\n options?: Array<{ label: string; description?: string }>;\n }\n | {\n type: 'plan_approval_required';\n planId: string;\n title: string;\n plan: string;\n }\n | { type: 'plan_approved' }\n | { type: 'subagent_start'; toolCallId: string; agentType: string; task: string; modelId: string }\n | { type: 'subagent_text_delta'; toolCallId: string; agentType: string; textDelta: string }\n | {\n type: 'subagent_tool_start';\n toolCallId: string;\n agentType: string;\n subToolName: string;\n subToolArgs: unknown;\n }\n | {\n type: 'subagent_tool_end';\n toolCallId: string;\n agentType: string;\n subToolName: string;\n subToolResult: unknown;\n isError: boolean;\n }\n | {\n type: 'subagent_end';\n toolCallId: string;\n agentType: string;\n result: string;\n isError: boolean;\n durationMs: number;\n }\n | { type: 'subagent_model_changed'; modelId: string; scope: 'global' | 'thread'; agentType?: string }\n | {\n type: 'task_updated';\n tasks: Array<{\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n }\n | { type: 'display_state_changed'; displayState: HarnessDisplayState };\n\n/**\n * Listener function for harness events.\n */\nexport type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;\n\n// =============================================================================\n// Messages\n// =============================================================================\n\n/**\n * Simplified message type for UI consumption.\n * Maps from Mastra's internal message format.\n */\nexport interface HarnessMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: HarnessMessageContent[];\n createdAt: Date;\n stopReason?: 'complete' | 'tool_use' | 'aborted' | 'error';\n errorMessage?: string;\n}\n\nexport type HarnessMessageContent =\n | { type: 'text'; text: string }\n | { type: 'thinking'; thinking: string }\n | { type: 'tool_call'; id: string; name: string; args: unknown }\n | { type: 'tool_result'; id: string; name: string; result: unknown; isError: boolean }\n | { type: 'image'; data: string; mimeType: string }\n | {\n type: 'om_observation_start';\n tokensToObserve: number;\n operationType?: 'observation' | 'reflection';\n }\n | {\n type: 'om_observation_end';\n tokensObserved: number;\n observationTokens: number;\n durationMs: number;\n operationType?: 'observation' | 'reflection';\n observations?: string;\n currentTask?: string;\n suggestedResponse?: string;\n }\n | {\n type: 'om_observation_failed';\n error: string;\n tokensAttempted?: number;\n operationType?: 'observation' | 'reflection';\n };\n\n// =============================================================================\n// Request Context\n// =============================================================================\n\n/**\n * Harness-specific context set on the RequestContext under the 'harness' key.\n * Tools can access harness state and methods through requestContext.get('harness').\n */\nexport interface HarnessRequestContext<TState extends HarnessStateSchema = HarnessStateSchema> {\n /** The harness instance ID */\n harnessId: string;\n\n /** Current harness state (read-only snapshot) */\n state: z.infer<TState>;\n\n /** Get the current harness state (live, not snapshot) */\n getState: () => z.infer<TState>;\n\n /** Update harness state */\n setState: (updates: Partial<z.infer<TState>>) => Promise<void>;\n\n /** Current thread ID */\n threadId: string | null;\n\n /** Current resource ID */\n resourceId: string;\n\n /** Current mode ID */\n modeId: string;\n\n /** Abort signal for the current operation */\n abortSignal?: AbortSignal;\n\n /** Workspace instance (if configured on the Harness) */\n workspace?: Workspace;\n\n /** Emit a harness event (used by tools to forward events) */\n emitEvent?: (event: HarnessEvent) => void;\n\n /** Register a pending question resolver (used by ask_user tools) */\n registerQuestion?: (params: { questionId: string; resolve: (answer: string) => void }) => void;\n\n /** Register a pending plan approval resolver (used by submit_plan tools) */\n registerPlanApproval?: (params: {\n planId: string;\n resolve: (result: { action: 'approved' | 'rejected'; feedback?: string }) => void;\n }) => void;\n\n /** Get the configured subagent model ID for a specific agent type */\n getSubagentModelId?: (params?: { agentType?: string }) => string | null;\n}\n","import type { z } from 'zod';\n\nimport type { Agent } from '../agent';\nimport type { ToolsInput, ToolsetsInput } from '../agent/types';\nimport type { StorageThreadType } from '../memory/types';\nimport { RequestContext } from '../request-context';\nimport type { MemoryStorage } from '../storage/domains/memory/base';\nimport type { ObservationalMemoryRecord } from '../storage/types';\nimport { Workspace } from '../workspace/workspace';\nimport type { WorkspaceConfig } from '../workspace/workspace';\n\nimport { askUserTool, createSubagentTool, submitPlanTool, taskCheckTool, taskWriteTool } from './tools';\nimport { defaultDisplayState, defaultOMProgressState } from './types';\nimport type {\n AvailableModel,\n HeartbeatHandler,\n HarnessConfig,\n HarnessDisplayState,\n HarnessEvent,\n HarnessEventListener,\n HarnessMessage,\n HarnessMessageContent,\n HarnessMode,\n HarnessRequestContext,\n HarnessSession,\n HarnessStateSchema,\n HarnessThread,\n ModelAuthStatus,\n PermissionPolicy,\n PermissionRules,\n ToolCategory,\n} from './types';\n\n/**\n * The Harness orchestrates multiple agent modes, shared state, memory, and storage.\n * It's the core abstraction that a TUI (or other UI) controls.\n *\n * @example\n * ```ts\n * const harness = new Harness({\n * id: \"my-coding-agent\",\n * storage: new LibSQLStore({ url: \"file:./data.db\" }),\n * stateSchema: z.object({\n * currentModelId: z.string().optional(),\n * }),\n * modes: [\n * { id: \"plan\", name: \"Plan\", default: true, agent: planAgent },\n * { id: \"build\", name: \"Build\", agent: buildAgent },\n * ],\n * })\n *\n * harness.subscribe((event) => {\n * if (event.type === \"message_update\") renderMessage(event.message)\n * })\n *\n * await harness.init()\n * await harness.sendMessage({ content: \"Hello!\" })\n * ```\n */\nexport class Harness<TState extends HarnessStateSchema = HarnessStateSchema> {\n readonly id: string;\n\n private config: HarnessConfig<TState>;\n private state: z.infer<TState>;\n private currentModeId: string;\n private currentThreadId: string | null = null;\n private resourceId: string;\n private listeners: HarnessEventListener[] = [];\n private abortController: AbortController | null = null;\n private abortRequested: boolean = false;\n private currentRunId: string | null = null;\n private currentOperationId: number = 0;\n private followUpQueue: string[] = [];\n private pendingApprovalResolve: ((decision: 'approve' | 'decline') => void) | null = null;\n private pendingApprovalToolName: string | null = null;\n private pendingQuestions = new Map<string, (answer: string) => void>();\n private pendingPlanApprovals = new Map<\n string,\n (result: { action: 'approved' | 'rejected'; feedback?: string }) => void\n >();\n private workspace: Workspace | undefined = undefined;\n private workspaceFn:\n | ((ctx: { requestContext: RequestContext }) => Promise<Workspace | undefined> | Workspace | undefined)\n | undefined = undefined;\n private workspaceInitialized = false;\n private heartbeatTimers = new Map<string, { timer: NodeJS.Timeout; shutdown?: () => void | Promise<void> }>();\n private tokenUsage: { promptTokens: number; completionTokens: number; totalTokens: number } = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n private sessionGrantedCategories = new Set<string>();\n private sessionGrantedTools = new Set<string>();\n private displayState: HarnessDisplayState = defaultDisplayState();\n\n constructor(config: HarnessConfig<TState>) {\n this.id = config.id;\n this.config = config;\n this.resourceId = config.resourceId ?? config.id;\n\n // Initialize state from schema defaults + initial state\n this.state = {\n ...this.getSchemaDefaults(),\n ...config.initialState,\n } as z.infer<TState>;\n\n // Find default mode\n const defaultMode = config.modes.find(m => m.default) ?? config.modes[0];\n if (!defaultMode) {\n throw new Error('Harness requires at least one agent mode');\n }\n this.currentModeId = defaultMode.id;\n\n // Store workspace: pre-built instance, dynamic factory, or config (constructed in init())\n if (config.workspace instanceof Workspace) {\n this.workspace = config.workspace;\n } else if (typeof config.workspace === 'function') {\n this.workspaceFn = config.workspace;\n }\n\n // Seed model from mode default if not set\n const currentModel = (this.state as any).currentModelId;\n if (!currentModel && defaultMode.defaultModelId) {\n void this.setState({ currentModelId: defaultMode.defaultModelId } as Partial<z.infer<TState>>);\n }\n }\n\n // ===========================================================================\n // Initialization\n // ===========================================================================\n\n /**\n * Initialize the harness — loads storage and workspace.\n * Must be called before using the harness.\n */\n async init(): Promise<void> {\n if (this.config.storage) {\n await this.config.storage.init();\n }\n\n // Initialize workspace if configured (skip for dynamic factory — resolved per-request)\n if (this.config.workspace && !this.workspaceInitialized && !this.workspaceFn) {\n try {\n if (!this.workspace) {\n this.workspace = new Workspace(this.config.workspace as WorkspaceConfig);\n }\n\n this.emit({ type: 'workspace_status_changed', status: 'initializing' });\n await this.workspace.init();\n this.workspaceInitialized = true;\n\n this.emit({ type: 'workspace_status_changed', status: 'ready' });\n this.emit({\n type: 'workspace_ready',\n workspaceId: this.workspace.id,\n workspaceName: this.workspace.name,\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.workspace = undefined;\n this.workspaceInitialized = false;\n\n this.emit({ type: 'workspace_status_changed', status: 'error', error: err });\n this.emit({ type: 'workspace_error', error: err });\n }\n }\n\n // Propagate harness-level memory and workspace to mode agents (after workspace init)\n const workspaceForAgents = this.workspaceFn ?? this.workspace;\n for (const mode of this.config.modes) {\n const agent = typeof mode.agent === 'function' ? null : mode.agent;\n if (!agent) continue;\n\n if (this.config.memory && !agent.hasOwnMemory()) {\n agent.__setMemory(this.config.memory);\n }\n if (workspaceForAgents && !agent.hasOwnWorkspace()) {\n agent.__setWorkspace(workspaceForAgents);\n }\n }\n\n this.startHeartbeats();\n }\n\n /**\n * Select the most recent thread, or create one if none exist.\n */\n async selectOrCreateThread(): Promise<HarnessThread> {\n const threads = await this.listThreads();\n\n if (threads.length === 0) {\n return await this.createThread();\n }\n\n const sortedThreads = [...threads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n const mostRecent = sortedThreads[0]!;\n this.config.threadLock?.acquire(mostRecent.id);\n this.currentThreadId = mostRecent.id;\n await this.loadThreadMetadata();\n\n return mostRecent;\n }\n\n private async getMemoryStorage(): Promise<MemoryStorage> {\n if (!this.config.storage) {\n throw new Error('Storage is not configured on this Harness');\n }\n const memoryStorage = await this.config.storage.getStore('memory');\n if (!memoryStorage) {\n throw new Error('Storage does not have a memory domain configured');\n }\n return memoryStorage;\n }\n\n // ===========================================================================\n // State Management\n // ===========================================================================\n\n /**\n * Get current harness state (read-only snapshot).\n */\n getState(): Readonly<z.infer<TState>> {\n return { ...this.state };\n }\n\n /**\n * Update harness state. Validates against schema if provided.\n * Emits state_changed event.\n */\n async setState(updates: Partial<z.infer<TState>>): Promise<void> {\n const changedKeys = Object.keys(updates);\n const newState = { ...this.state, ...updates };\n\n if (this.config.stateSchema) {\n const result = this.config.stateSchema.safeParse(newState);\n if (!result.success) {\n throw new Error(`Invalid state update: ${result.error.message}`);\n }\n this.state = result.data as z.infer<TState>;\n } else {\n this.state = newState as z.infer<TState>;\n }\n\n this.emit({ type: 'state_changed', state: this.state, changedKeys });\n }\n\n private getSchemaDefaults(): Partial<z.infer<TState>> {\n if (!this.config.stateSchema) return {};\n\n const shape = this.config.stateSchema.shape;\n const defaults: Record<string, unknown> = {};\n\n for (const [key, field] of Object.entries(shape)) {\n try {\n const result = (field as any).safeParse(undefined);\n if (result.success && result.data !== undefined) {\n defaults[key] = result.data;\n }\n } catch {\n // field has no default or doesn't support safeParse — skip\n }\n }\n\n return defaults as Partial<z.infer<TState>>;\n }\n\n // ===========================================================================\n // Mode Management\n // ===========================================================================\n\n listModes(): HarnessMode<TState>[] {\n return this.config.modes;\n }\n\n getCurrentModeId(): string {\n return this.currentModeId;\n }\n\n getCurrentMode(): HarnessMode<TState> {\n const mode = this.config.modes.find(m => m.id === this.currentModeId);\n if (!mode) {\n throw new Error(`Mode not found: ${this.currentModeId}`);\n }\n return mode;\n }\n\n /**\n * Switch to a different mode.\n * Aborts any in-progress generation and switches to the mode's default model.\n */\n async switchMode({ modeId }: { modeId: string }): Promise<void> {\n const mode = this.config.modes.find(m => m.id === modeId);\n if (!mode) {\n throw new Error(`Mode not found: ${modeId}`);\n }\n\n this.abort();\n\n // Save current model to the outgoing mode before switching\n const currentModelId = this.getCurrentModelId();\n if (currentModelId) {\n await this.setThreadSetting({ key: `modeModelId_${this.currentModeId}`, value: currentModelId });\n }\n\n const previousModeId = this.currentModeId;\n this.currentModeId = modeId;\n\n await this.setThreadSetting({ key: 'currentModeId', value: modeId });\n\n // Load the incoming mode's model\n const modeModelId = await this.loadModeModelId(modeId);\n if (modeModelId) {\n void this.setState({ currentModelId: modeModelId } as Partial<z.infer<TState>>);\n this.emit({ type: 'model_changed', modelId: modeModelId } as HarnessEvent);\n }\n\n this.emit({ type: 'mode_changed', modeId, previousModeId });\n }\n\n /**\n * Load the stored model ID for a specific mode.\n * Falls back to: thread metadata -> mode's defaultModelId -> current model.\n */\n private async loadModeModelId(modeId: string): Promise<string | null> {\n if (this.currentThreadId && this.config.storage) {\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n const meta = thread?.metadata as Record<string, unknown> | undefined;\n const stored = meta?.[`modeModelId_${modeId}`] as string | undefined;\n if (stored) return stored;\n } catch {\n // Fall through to defaults\n }\n }\n\n const mode = this.config.modes.find(m => m.id === modeId);\n if (mode?.defaultModelId) return mode.defaultModelId;\n\n return null;\n }\n\n /**\n * Get the agent for the current mode.\n */\n private getCurrentAgent(): Agent {\n const mode = this.getCurrentMode();\n if (typeof mode.agent === 'function') {\n return mode.agent(this.state);\n }\n return mode.agent;\n }\n\n /**\n * Get a short display name from the current model ID.\n */\n getModelName(): string {\n const modelId = this.getCurrentModelId();\n if (!modelId || modelId === 'unknown') return modelId || 'unknown';\n const parts = modelId.split('/');\n return parts[parts.length - 1] || modelId;\n }\n\n /**\n * Get the full model ID (e.g., \"anthropic/claude-sonnet-4\").\n */\n getFullModelId(): string {\n return this.getCurrentModelId();\n }\n\n /**\n * Switch to a different model at runtime.\n */\n async switchModel({\n modelId,\n scope = 'thread',\n modeId,\n }: {\n modelId: string;\n scope?: 'global' | 'thread';\n modeId?: string;\n }): Promise<void> {\n const targetModeId = modeId ?? this.currentModeId;\n\n if (targetModeId === this.currentModeId) {\n void this.setState({ currentModelId: modelId } as Partial<z.infer<TState>>);\n }\n\n if (scope === 'thread') {\n await this.setThreadSetting({ key: `modeModelId_${targetModeId}`, value: modelId });\n }\n\n this.emit({ type: 'model_changed', modelId, scope, modeId: targetModeId } as HarnessEvent);\n }\n\n getCurrentModelId(): string {\n const state = this.getState() as { currentModelId?: string };\n return state.currentModelId ?? '';\n }\n\n hasModelSelected(): boolean {\n return this.getCurrentModelId() !== '';\n }\n\n /**\n * Check if the current model's provider has authentication configured.\n * Uses the provider registry's `apiKeyEnvVar` and the optional `modelAuthChecker` hook.\n */\n async getCurrentModelAuthStatus(): Promise<ModelAuthStatus> {\n const modelId = this.getCurrentModelId();\n const provider = modelId.split('/')[0];\n if (!provider) return { hasAuth: true };\n\n if (this.config.modelAuthChecker) {\n const result = this.config.modelAuthChecker(provider);\n if (result === true) return { hasAuth: true };\n if (result === false) {\n const apiKeyEnvVar = await this.getProviderApiKeyEnvVar(provider);\n return { hasAuth: false, apiKeyEnvVar };\n }\n }\n\n try {\n const { PROVIDER_REGISTRY } = await import('../llm/model/provider-registry.js');\n const registry = PROVIDER_REGISTRY as Record<string, { apiKeyEnvVar?: string | string[] }>;\n const providerConfig = registry[provider];\n const envVars = providerConfig?.apiKeyEnvVar;\n const apiKeyEnvVar = Array.isArray(envVars) ? envVars[0] : envVars;\n if (apiKeyEnvVar && process.env[apiKeyEnvVar]) {\n return { hasAuth: true };\n }\n return { hasAuth: false, apiKeyEnvVar: apiKeyEnvVar || undefined };\n } catch {\n return { hasAuth: true };\n }\n }\n\n /**\n * Get all available models from the provider registry with auth status.\n * Uses the optional `modelAuthChecker` and `modelUseCountProvider` hooks.\n */\n async listAvailableModels(): Promise<AvailableModel[]> {\n try {\n const { PROVIDER_REGISTRY } = await import('../llm/model/provider-registry.js');\n\n if (!PROVIDER_REGISTRY) return [];\n\n const registry = PROVIDER_REGISTRY as Record<\n string,\n { models?: string[]; name?: string; apiKeyEnvVar?: string | string[] }\n >;\n const providers = Object.keys(registry);\n const useCounts = this.config.modelUseCountProvider?.() ?? {};\n const models: AvailableModel[] = [];\n\n for (const provider of providers) {\n const providerConfig = registry[provider];\n const envVars = providerConfig?.apiKeyEnvVar;\n const apiKeyEnvVar = Array.isArray(envVars) ? envVars[0] : envVars;\n const hasEnvKey = apiKeyEnvVar ? !!process.env[apiKeyEnvVar] : false;\n\n let hasApiKey = hasEnvKey;\n if (!hasApiKey && this.config.modelAuthChecker) {\n const customAuth = this.config.modelAuthChecker(provider);\n if (customAuth === true) hasApiKey = true;\n }\n\n if (providerConfig?.models && Array.isArray(providerConfig.models)) {\n for (const modelName of providerConfig.models) {\n const id = `${provider}/${modelName}`;\n models.push({\n id,\n provider,\n modelName,\n hasApiKey,\n apiKeyEnvVar: apiKeyEnvVar || undefined,\n useCount: useCounts[id] ?? 0,\n });\n }\n }\n }\n\n return models;\n } catch (error) {\n console.warn('Failed to load available models:', error);\n return [];\n }\n }\n\n private async getProviderApiKeyEnvVar(provider: string): Promise<string | undefined> {\n try {\n const { PROVIDER_REGISTRY } = await import('../llm/model/provider-registry.js');\n const registry = PROVIDER_REGISTRY as Record<string, { apiKeyEnvVar?: string | string[] }>;\n const envVars = registry[provider]?.apiKeyEnvVar;\n return Array.isArray(envVars) ? envVars[0] : envVars;\n } catch {\n return undefined;\n }\n }\n\n // ===========================================================================\n // Thread Management\n // ===========================================================================\n\n getCurrentThreadId(): string | null {\n return this.currentThreadId;\n }\n\n getResourceId(): string {\n return this.resourceId;\n }\n\n setResourceId({ resourceId }: { resourceId: string }): void {\n this.resourceId = resourceId;\n this.currentThreadId = null;\n }\n\n async createThread({ title }: { title?: string } = {}): Promise<HarnessThread> {\n const now = new Date();\n const thread: HarnessThread = {\n id: this.generateId(),\n resourceId: this.resourceId,\n title: title || 'New Thread',\n createdAt: now,\n updatedAt: now,\n };\n\n const currentStateModel = (this.state as any).currentModelId;\n const currentMode = this.getCurrentMode();\n const modelId = currentStateModel || currentMode.defaultModelId;\n\n const metadata: Record<string, unknown> = {};\n if (modelId) {\n metadata.currentModelId = modelId;\n metadata[`modeModelId_${this.currentModeId}`] = modelId;\n }\n\n // Auto-tag with projectPath from state so threads are scoped to the working directory\n const projectPath = (this.state as any).projectPath;\n if (projectPath) {\n metadata.projectPath = projectPath;\n }\n\n if (this.config.storage) {\n const memoryStorage = await this.getMemoryStorage();\n await memoryStorage.saveThread({\n thread: {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title!,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n },\n });\n }\n\n // Acquire lock on new thread before releasing old one.\n // If acquire fails, attempt to re-acquire the old lock before rethrowing.\n const oldThreadId = this.currentThreadId;\n if (this.config.threadLock) {\n try {\n this.config.threadLock.acquire(thread.id);\n } catch (err) {\n if (oldThreadId) {\n try {\n this.config.threadLock.acquire(oldThreadId);\n } catch {\n // Best-effort re-acquire; original error is more important\n }\n }\n throw err;\n }\n if (oldThreadId) {\n this.config.threadLock.release(oldThreadId);\n }\n }\n\n this.currentThreadId = thread.id;\n\n if (modelId && !currentStateModel) {\n void this.setState({ currentModelId: modelId } as Partial<z.infer<TState>>);\n }\n\n this.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n this.emit({ type: 'thread_created', thread });\n\n return thread;\n }\n\n async renameThread({ title }: { title: string }): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) return;\n\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n if (thread) {\n await memoryStorage.saveThread({\n thread: { ...thread, title, updatedAt: new Date() },\n });\n }\n }\n\n async switchThread({ threadId }: { threadId: string }): Promise<void> {\n this.abort();\n\n if (this.config.storage) {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId });\n if (!thread) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n }\n\n // Acquire lock on new thread before releasing old one\n this.config.threadLock?.acquire(threadId);\n\n const previousThreadId = this.currentThreadId;\n if (previousThreadId) {\n this.config.threadLock?.release(previousThreadId);\n }\n this.currentThreadId = threadId;\n\n await this.loadThreadMetadata();\n\n this.emit({ type: 'thread_changed', threadId, previousThreadId });\n }\n\n async listThreads(options?: { allResources?: boolean }): Promise<HarnessThread[]> {\n if (!this.config.storage) return [];\n\n const memoryStorage = await this.getMemoryStorage();\n const filter: { resourceId?: string } | undefined = options?.allResources\n ? undefined\n : { resourceId: this.resourceId };\n\n const result = await memoryStorage.listThreads({ filter });\n\n return result.threads.map((thread: StorageThreadType) => ({\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n metadata: thread.metadata,\n }));\n }\n\n async setThreadSetting({ key, value }: { key: string; value: unknown }): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n if (thread) {\n await memoryStorage.saveThread({\n thread: {\n ...thread,\n metadata: { ...thread.metadata, [key]: value },\n updatedAt: new Date(),\n },\n });\n }\n } catch {\n // Settings persistence is not critical\n }\n }\n\n private async deleteThreadSetting({ key }: { key: string }): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n if (thread && thread.metadata) {\n const metadata = { ...thread.metadata };\n delete metadata[key];\n await memoryStorage.saveThread({\n thread: {\n ...thread,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n updatedAt: new Date(),\n },\n });\n }\n } catch {\n // Settings removal is not critical\n }\n }\n\n private async loadThreadMetadata(): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) {\n this.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n return;\n }\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n\n // Load token usage\n const savedUsage = thread?.metadata?.tokenUsage as typeof this.tokenUsage | undefined;\n if (savedUsage) {\n this.tokenUsage = {\n promptTokens: savedUsage.promptTokens ?? 0,\n completionTokens: savedUsage.completionTokens ?? 0,\n totalTokens: savedUsage.totalTokens ?? 0,\n };\n } else {\n this.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n }\n\n const meta = thread?.metadata as Record<string, unknown> | undefined;\n const updates: Record<string, unknown> = {};\n\n // Load model ID: per-mode first, then global\n const modeModelKey = `modeModelId_${this.currentModeId}`;\n if (meta?.[modeModelKey]) {\n updates.currentModelId = meta[modeModelKey];\n } else if (meta?.currentModelId) {\n updates.currentModelId = meta.currentModelId;\n }\n\n // Restore mode\n if (meta?.currentModeId) {\n const savedModeId = meta.currentModeId as string;\n const modeExists = this.config.modes.some(m => m.id === savedModeId);\n if (modeExists && savedModeId !== this.currentModeId) {\n this.currentModeId = savedModeId;\n const restoredModeModelKey = `modeModelId_${savedModeId}`;\n if (meta[restoredModeModelKey]) {\n updates.currentModelId = meta[restoredModeModelKey];\n }\n this.emit({\n type: 'mode_changed',\n modeId: savedModeId,\n previousModeId: this.config.modes.find(m => m.default)?.id || this.config.modes[0]!.id,\n });\n }\n }\n\n if (Object.keys(updates).length > 0) {\n void this.setState(updates as Partial<z.infer<TState>>);\n }\n } catch {\n this.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n }\n }\n\n // ===========================================================================\n // Observational Memory\n // ===========================================================================\n\n /**\n * Load observational memory progress for the current thread.\n * Reads the OM record and recent messages to reconstruct status,\n * then emits an `om_status` event for the UI.\n */\n async loadOMProgress(): Promise<void> {\n if (!this.currentThreadId) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const record = await memoryStorage.getObservationalMemory(this.currentThreadId, this.resourceId);\n\n if (!record) return;\n\n const config = record.config as\n | {\n observationThreshold?: number | { min: number; max: number };\n reflectionThreshold?: number | { min: number; max: number };\n }\n | undefined;\n\n const getThreshold = (val: number | { min: number; max: number } | undefined, fallback: number): number => {\n if (!val) return fallback;\n if (typeof val === 'number') return val;\n return val.max;\n };\n\n let observationThreshold = getThreshold(config?.observationThreshold, 30_000);\n let reflectionThreshold = getThreshold(config?.reflectionThreshold, 40_000);\n\n let messageTokens = record.pendingMessageTokens ?? 0;\n let observationTokens = record.observationTokenCount ?? 0;\n let bufferedObs = {\n status: 'idle' as 'idle' | 'running' | 'complete',\n chunks: 0,\n messageTokens: 0,\n projectedMessageRemoval: 0,\n observationTokens: 0,\n };\n let bufferedRef = {\n status: 'idle' as 'idle' | 'running' | 'complete',\n inputObservationTokens: 0,\n observationTokens: 0,\n };\n let generationCount = 0;\n let stepNumber = 0;\n\n const messagesResult = await memoryStorage.listMessages({\n threadId: this.currentThreadId,\n perPage: 70,\n page: 0,\n orderBy: { field: 'createdAt', direction: 'DESC' },\n });\n const messages = messagesResult.messages;\n let foundStatus = false;\n for (const msg of messages) {\n if (msg.role !== 'assistant') continue;\n const content = msg.content as { parts?: Array<{ type?: string; data?: Record<string, unknown> }> } | string;\n if (typeof content === 'string' || !content?.parts) continue;\n\n for (let i = content.parts.length - 1; i >= 0; i--) {\n const part = content.parts[i] as { type?: string; data?: Record<string, unknown> };\n if (part.type === 'data-om-status' && part.data?.windows) {\n const w = part.data.windows as Record<string, Record<string, Record<string, unknown>>>;\n messageTokens = (w.active?.messages?.tokens as number) ?? messageTokens;\n observationTokens = (w.active?.observations?.tokens as number) ?? observationTokens;\n const msgThresh = w.active?.messages?.threshold as number | undefined;\n const obsThresh = w.active?.observations?.threshold as number | undefined;\n if (msgThresh) observationThreshold = msgThresh;\n if (obsThresh) reflectionThreshold = obsThresh;\n const bo = w.buffered?.observations as Record<string, unknown> | undefined;\n if (bo) {\n bufferedObs = {\n status: (bo.status as 'idle' | 'running' | 'complete') ?? 'idle',\n chunks: (bo.chunks as number) ?? 0,\n messageTokens: (bo.messageTokens as number) ?? 0,\n projectedMessageRemoval: (bo.projectedMessageRemoval as number) ?? 0,\n observationTokens: (bo.observationTokens as number) ?? 0,\n };\n }\n const br = w.buffered?.reflection as Record<string, unknown> | undefined;\n if (br) {\n bufferedRef = {\n status: (br.status as 'idle' | 'running' | 'complete') ?? 'idle',\n inputObservationTokens: (br.inputObservationTokens as number) ?? 0,\n observationTokens: (br.observationTokens as number) ?? 0,\n };\n }\n generationCount = (part.data.generationCount as number) ?? 0;\n stepNumber = (part.data.stepNumber as number) ?? 0;\n foundStatus = true;\n break;\n }\n }\n if (foundStatus) break;\n }\n\n this.emit({\n type: 'om_status',\n windows: {\n active: {\n messages: { tokens: messageTokens, threshold: observationThreshold },\n observations: { tokens: observationTokens, threshold: reflectionThreshold },\n },\n buffered: { observations: bufferedObs, reflection: bufferedRef },\n },\n recordId: record.id ?? '',\n threadId: this.currentThreadId,\n stepNumber,\n generationCount,\n });\n } catch {\n // OM not available or not initialized — that's fine\n }\n }\n\n async getObservationalMemoryRecord(): Promise<ObservationalMemoryRecord | null> {\n if (!this.currentThreadId) return null;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n return await memoryStorage.getObservationalMemory(this.currentThreadId, this.resourceId);\n } catch {\n return null;\n }\n }\n\n /**\n * Returns the observer model ID from state, falling back to omConfig defaults.\n */\n getObserverModelId(): string | undefined {\n return (this.state as any).observerModelId ?? this.config.omConfig?.defaultObserverModelId;\n }\n\n /**\n * Returns the reflector model ID from state, falling back to omConfig defaults.\n */\n getReflectorModelId(): string | undefined {\n return (this.state as any).reflectorModelId ?? this.config.omConfig?.defaultReflectorModelId;\n }\n\n /**\n * Returns the observation threshold from state, falling back to omConfig defaults.\n */\n getObservationThreshold(): number | undefined {\n return (this.state as any).observationThreshold ?? this.config.omConfig?.defaultObservationThreshold;\n }\n\n /**\n * Returns the reflection threshold from state, falling back to omConfig defaults.\n */\n getReflectionThreshold(): number | undefined {\n return (this.state as any).reflectionThreshold ?? this.config.omConfig?.defaultReflectionThreshold;\n }\n\n /**\n * Resolves the observer model ID to a language model instance via `resolveModel`.\n */\n getResolvedObserverModel() {\n const modelId = this.getObserverModelId();\n if (!modelId || !this.config.resolveModel) return undefined;\n return this.config.resolveModel(modelId);\n }\n\n /**\n * Resolves the reflector model ID to a language model instance via `resolveModel`.\n */\n getResolvedReflectorModel() {\n const modelId = this.getReflectorModelId();\n if (!modelId || !this.config.resolveModel) return undefined;\n return this.config.resolveModel(modelId);\n }\n\n /**\n * Switch the Observer model.\n */\n async switchObserverModel({ modelId }: { modelId: string }): Promise<void> {\n void this.setState({ observerModelId: modelId } as Partial<z.infer<TState>>);\n await this.setThreadSetting({ key: 'observerModelId', value: modelId });\n this.emit({ type: 'om_model_changed', role: 'observer', modelId } as HarnessEvent);\n }\n\n /**\n * Switch the Reflector model.\n */\n async switchReflectorModel({ modelId }: { modelId: string }): Promise<void> {\n void this.setState({ reflectorModelId: modelId } as Partial<z.infer<TState>>);\n await this.setThreadSetting({ key: 'reflectorModelId', value: modelId });\n this.emit({ type: 'om_model_changed', role: 'reflector', modelId } as HarnessEvent);\n }\n\n // ===========================================================================\n // Subagent Model Management\n // ===========================================================================\n\n getSubagentModelId({ agentType }: { agentType?: string } = {}): string | null {\n const state = this.state as Record<string, unknown>;\n if (agentType) {\n const perType = state[`subagentModelId_${agentType}`];\n if (typeof perType === 'string') return perType;\n }\n const global = state.subagentModelId;\n return typeof global === 'string' ? global : null;\n }\n\n async setSubagentModelId({ modelId, agentType }: { modelId: string; agentType?: string }): Promise<void> {\n const key = agentType ? `subagentModelId_${agentType}` : 'subagentModelId';\n void this.setState({ [key]: modelId } as Partial<z.infer<TState>>);\n await this.setThreadSetting({ key, value: modelId });\n this.emit({ type: 'subagent_model_changed', modelId, scope: 'thread', agentType } as HarnessEvent);\n }\n\n // ===========================================================================\n // Permissions\n // ===========================================================================\n\n grantSessionCategory({ category }: { category: ToolCategory }): void {\n this.sessionGrantedCategories.add(category);\n }\n\n grantSessionTool({ toolName }: { toolName: string }): void {\n this.sessionGrantedTools.add(toolName);\n }\n\n getSessionGrants(): { categories: ToolCategory[]; tools: string[] } {\n return {\n categories: [...this.sessionGrantedCategories] as ToolCategory[],\n tools: [...this.sessionGrantedTools],\n };\n }\n\n getToolCategory({ toolName }: { toolName: string }): ToolCategory | null {\n return this.config.toolCategoryResolver?.(toolName) ?? null;\n }\n\n setPermissionForCategory({ category, policy }: { category: ToolCategory; policy: PermissionPolicy }): void {\n const rules = this.getPermissionRules();\n rules.categories[category] = policy;\n void this.setState({ permissionRules: rules } as Partial<z.infer<TState>>);\n }\n\n setPermissionForTool({ toolName, policy }: { toolName: string; policy: PermissionPolicy }): void {\n const rules = this.getPermissionRules();\n rules.tools[toolName] = policy;\n void this.setState({ permissionRules: rules } as Partial<z.infer<TState>>);\n }\n\n getPermissionRules(): PermissionRules {\n const state = this.state as Record<string, unknown>;\n const rules = state.permissionRules as PermissionRules | undefined;\n return rules ?? { categories: {}, tools: {} };\n }\n\n /**\n * Resolve whether a tool call should be auto-approved, denied, or asked.\n * Resolution chain: yolo → per-tool policy → session tool grant →\n * session category grant → category policy → \"ask\"\n */\n private resolveToolApproval(toolName: string): PermissionPolicy {\n const state = this.state as Record<string, unknown>;\n if (state.yolo === true) return 'allow';\n\n const rules = this.getPermissionRules();\n\n const toolPolicy = rules.tools[toolName];\n if (toolPolicy) return toolPolicy;\n\n if (this.sessionGrantedTools.has(toolName)) return 'allow';\n\n const category = this.getToolCategory({ toolName });\n if (category) {\n if (this.sessionGrantedCategories.has(category)) return 'allow';\n const categoryPolicy = rules.categories[category];\n if (categoryPolicy) return categoryPolicy;\n }\n\n return 'ask';\n }\n\n // ===========================================================================\n // Message Handling\n // ===========================================================================\n\n /**\n * Send a message to the current agent.\n * Streams the response and emits events.\n */\n async sendMessage({\n content,\n images,\n }: {\n content: string;\n images?: Array<{ data: string; mimeType: string }>;\n }): Promise<void> {\n if (!this.currentThreadId) {\n const thread = await this.createThread();\n this.currentThreadId = thread.id;\n }\n\n const operationId = ++this.currentOperationId;\n this.abortController = new AbortController();\n const agent = this.getCurrentAgent();\n\n this.emit({ type: 'agent_start' });\n\n try {\n const requestContext = await this.buildRequestContext();\n\n const isYolo = (this.state as Record<string, unknown>).yolo === true;\n\n const streamOptions: Record<string, unknown> = {\n memory: { thread: this.currentThreadId, resource: this.resourceId },\n abortSignal: this.abortController.signal,\n requestContext,\n maxSteps: 1000,\n requireToolApproval: !isYolo,\n modelSettings: { temperature: 1 },\n };\n\n streamOptions.toolsets = await this.buildToolsets(requestContext);\n\n let messageInput: string | Record<string, unknown> = content;\n if (images?.length) {\n messageInput = {\n role: 'user',\n content: [\n { type: 'text', text: content },\n ...images.map((img: { data: string; mimeType: string }) => ({\n type: 'file',\n data: img.data,\n mediaType: img.mimeType,\n })),\n ],\n };\n }\n\n const response = await agent.stream(messageInput as any, streamOptions as any);\n await this.processStream(response);\n\n if (this.currentOperationId === operationId) {\n const reason = this.abortRequested ? 'aborted' : 'complete';\n this.emit({ type: 'agent_end', reason });\n }\n } catch (error) {\n if (this.currentOperationId !== operationId) return;\n\n if (error instanceof Error && error.name === 'AbortError') {\n this.emit({ type: 'agent_end', reason: 'aborted' });\n } else if (error instanceof Error && error.message.match(/^Tool .+ not found$/)) {\n const badTool = error.message.replace('Tool ', '').replace(' not found', '');\n this.emit({\n type: 'error',\n error: new Error(`Unknown tool \"${badTool}\".`),\n retryable: true,\n });\n this.followUpQueue.push(\n `[System] Your previous tool call used \"${badTool}\" which is not a valid tool. Please retry with the correct tool name.`,\n );\n this.emit({ type: 'agent_end', reason: 'error' });\n } else {\n const err = error instanceof Error ? error : new Error(String(error));\n this.emit({ type: 'error', error: err });\n this.emit({ type: 'agent_end', reason: 'error' });\n }\n } finally {\n if (this.currentOperationId === operationId) {\n this.abortController = null;\n this.abortRequested = false;\n }\n\n if (this.currentOperationId === operationId && this.followUpQueue.length > 0) {\n const next = this.followUpQueue.shift()!;\n await this.sendMessage({ content: next });\n }\n }\n }\n\n async listMessages(options?: { limit?: number }): Promise<HarnessMessage[]> {\n if (!this.currentThreadId) return [];\n return this.listMessagesForThread({ threadId: this.currentThreadId, limit: options?.limit });\n }\n\n async listMessagesForThread({ threadId, limit }: { threadId: string; limit?: number }): Promise<HarnessMessage[]> {\n if (!this.config.storage) return [];\n\n const memoryStorage = await this.getMemoryStorage();\n\n if (limit) {\n const result = await memoryStorage.listMessages({\n threadId,\n perPage: limit,\n page: 0,\n orderBy: { field: 'createdAt', direction: 'DESC' },\n });\n return result.messages.map(msg => this.convertToHarnessMessage(msg)).reverse();\n }\n\n const result = await memoryStorage.listMessages({ threadId, perPage: false });\n return result.messages.map(msg => this.convertToHarnessMessage(msg));\n }\n\n async getFirstUserMessageForThread({ threadId }: { threadId: string }): Promise<HarnessMessage | null> {\n if (!this.config.storage) return null;\n\n const memoryStorage = await this.getMemoryStorage();\n const result = await memoryStorage.listMessages({\n threadId,\n perPage: 5,\n page: 0,\n orderBy: { field: 'createdAt', direction: 'ASC' },\n });\n const userMsg = result.messages.find(m => m.role === 'user');\n return userMsg ? this.convertToHarnessMessage(userMsg) : null;\n }\n\n private convertToHarnessMessage(msg: {\n id: string;\n role: 'user' | 'assistant' | 'system';\n createdAt: Date;\n content: {\n parts: Array<{\n type: string;\n text?: string;\n reasoning?: string;\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n result?: unknown;\n isError?: boolean;\n toolInvocation?: {\n state: string;\n toolCallId: string;\n toolName: string;\n args?: unknown;\n result?: unknown;\n isError?: boolean;\n };\n [key: string]: unknown;\n }>;\n };\n }): HarnessMessage {\n const content: HarnessMessageContent[] = [];\n\n for (const part of msg.content.parts) {\n switch (part.type) {\n case 'text':\n if (part.text) {\n content.push({ type: 'text', text: part.text });\n }\n break;\n case 'reasoning':\n if (part.reasoning) {\n content.push({ type: 'thinking', thinking: part.reasoning });\n }\n break;\n case 'tool-invocation':\n if (part.toolInvocation) {\n const inv = part.toolInvocation;\n content.push({ type: 'tool_call', id: inv.toolCallId, name: inv.toolName, args: inv.args });\n if (inv.state === 'result' && inv.result !== undefined) {\n content.push({\n type: 'tool_result',\n id: inv.toolCallId,\n name: inv.toolName,\n result: inv.result,\n isError: inv.isError ?? false,\n });\n }\n } else if (part.toolCallId && part.toolName) {\n content.push({ type: 'tool_call', id: part.toolCallId, name: part.toolName, args: part.args });\n }\n break;\n case 'tool-call':\n if (part.toolCallId && part.toolName) {\n content.push({ type: 'tool_call', id: part.toolCallId, name: part.toolName, args: part.args });\n }\n break;\n case 'tool-result':\n if (part.toolCallId && part.toolName) {\n content.push({\n type: 'tool_result',\n id: part.toolCallId,\n name: part.toolName,\n result: part.result,\n isError: part.isError ?? false,\n });\n }\n break;\n case 'data-om-observation-start': {\n const data = (part as { data?: Record<string, unknown> }).data ?? {};\n content.push({\n type: 'om_observation_start',\n tokensToObserve: (data.tokensToObserve as number) ?? 0,\n operationType: (data.operationType as 'observation' | 'reflection') ?? 'observation',\n });\n break;\n }\n case 'data-om-observation-end': {\n const data = (part as { data?: Record<string, unknown> }).data ?? {};\n content.push({\n type: 'om_observation_end',\n tokensObserved: (data.tokensObserved as number) ?? 0,\n observationTokens: (data.observationTokens as number) ?? 0,\n durationMs: (data.durationMs as number) ?? 0,\n operationType: (data.operationType as 'observation' | 'reflection') ?? 'observation',\n observations: (data.observations as string) ?? undefined,\n currentTask: (data.currentTask as string) ?? undefined,\n suggestedResponse: (data.suggestedResponse as string) ?? undefined,\n });\n break;\n }\n case 'data-om-observation-failed': {\n const data = (part as { data?: Record<string, unknown> }).data ?? {};\n content.push({\n type: 'om_observation_failed',\n error: (data.error as string) ?? 'Unknown error',\n tokensAttempted: (data.tokensAttempted as number) ?? 0,\n operationType: (data.operationType as 'observation' | 'reflection') ?? 'observation',\n });\n break;\n }\n // Skip other part types (step-start, data-om-status, etc.)\n }\n }\n\n return { id: msg.id, role: msg.role, content, createdAt: msg.createdAt };\n }\n\n /**\n * Process a stream response (shared between sendMessage and tool approval).\n */\n private async processStream(response: { fullStream: AsyncIterable<any> }): Promise<{ message: HarnessMessage }> {\n let currentMessage: HarnessMessage = {\n id: this.generateId(),\n role: 'assistant',\n content: [],\n createdAt: new Date(),\n };\n\n const textContentById = new Map<string, { index: number; text: string }>();\n const thinkingContentById = new Map<string, { index: number; text: string }>();\n\n for await (const chunk of response.fullStream) {\n if ('runId' in chunk && chunk.runId) {\n this.currentRunId = chunk.runId;\n }\n\n switch (chunk.type) {\n case 'text-start': {\n const textIndex = currentMessage.content.length;\n currentMessage.content.push({ type: 'text', text: '' });\n textContentById.set(chunk.payload.id, { index: textIndex, text: '' });\n this.emit({ type: 'message_start', message: { ...currentMessage } });\n break;\n }\n\n case 'text-delta': {\n const textState = textContentById.get(chunk.payload.id);\n if (textState) {\n textState.text += chunk.payload.text;\n const textContent = currentMessage.content[textState.index];\n if (textContent && textContent.type === 'text') {\n textContent.text = textState.text;\n }\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n }\n break;\n }\n\n case 'reasoning-start': {\n const thinkingIndex = currentMessage.content.length;\n currentMessage.content.push({ type: 'thinking', thinking: '' });\n thinkingContentById.set(chunk.payload.id, { index: thinkingIndex, text: '' });\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n break;\n }\n\n case 'reasoning-delta': {\n const thinkingState = thinkingContentById.get(chunk.payload.id);\n if (thinkingState) {\n thinkingState.text += chunk.payload.text;\n const thinkingContent = currentMessage.content[thinkingState.index];\n if (thinkingContent && thinkingContent.type === 'thinking') {\n thinkingContent.thinking = thinkingState.text;\n }\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n }\n break;\n }\n\n case 'tool-call-input-streaming-start': {\n const { toolCallId, toolName } = chunk.payload;\n this.emit({ type: 'tool_input_start', toolCallId, toolName });\n break;\n }\n\n case 'tool-call-delta': {\n const { toolCallId, argsTextDelta, toolName } = chunk.payload;\n this.emit({ type: 'tool_input_delta', toolCallId, argsTextDelta, toolName });\n break;\n }\n\n case 'tool-call-input-streaming-end': {\n const { toolCallId } = chunk.payload;\n this.emit({ type: 'tool_input_end', toolCallId });\n break;\n }\n\n case 'tool-call': {\n const toolCall = chunk.payload;\n currentMessage.content.push({\n type: 'tool_call',\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n args: toolCall.args,\n });\n this.emit({\n type: 'tool_start',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: toolCall.args,\n });\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n break;\n }\n\n case 'tool-result': {\n const toolResult = chunk.payload;\n currentMessage.content.push({\n type: 'tool_result',\n id: toolResult.toolCallId,\n name: toolResult.toolName,\n result: toolResult.result,\n isError: toolResult.isError ?? false,\n });\n this.emit({\n type: 'tool_end',\n toolCallId: toolResult.toolCallId,\n result: toolResult.result,\n isError: toolResult.isError ?? false,\n });\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n break;\n }\n\n case 'tool-error': {\n const toolError = chunk.payload;\n this.emit({ type: 'tool_end', toolCallId: toolError.toolCallId, result: toolError.error, isError: true });\n break;\n }\n\n case 'tool-call-approval': {\n const toolCallId = chunk.payload.toolCallId;\n const toolName = chunk.payload.toolName;\n const toolArgs = chunk.payload.args;\n\n const policy = this.resolveToolApproval(toolName);\n\n if (policy === 'allow') {\n const result = await this.handleToolApprove(toolCallId);\n currentMessage = result.message;\n return { message: currentMessage };\n }\n\n if (policy === 'deny') {\n const result = await this.handleToolDecline(toolCallId);\n currentMessage = result.message;\n return { message: currentMessage };\n }\n\n this.pendingApprovalToolName = toolName;\n this.emit({ type: 'tool_approval_required', toolCallId, toolName, args: toolArgs });\n\n const decision = await new Promise<'approve' | 'decline'>(resolve => {\n this.pendingApprovalResolve = resolve;\n });\n this.pendingApprovalToolName = null;\n\n if (decision === 'approve') {\n const result = await this.handleToolApprove(toolCallId);\n currentMessage = result.message;\n return { message: currentMessage };\n } else {\n const result = await this.handleToolDecline(toolCallId);\n currentMessage = result.message;\n return { message: currentMessage };\n }\n }\n\n case 'error': {\n const streamError =\n chunk.payload.error instanceof Error ? chunk.payload.error : new Error(String(chunk.payload.error));\n this.emit({ type: 'error', error: streamError });\n break;\n }\n\n case 'step-finish': {\n const usage = chunk.payload?.output?.usage;\n if (usage) {\n const promptTokens = usage.promptTokens ?? 0;\n const completionTokens = usage.completionTokens ?? 0;\n const totalTokens = promptTokens + completionTokens;\n\n this.tokenUsage.promptTokens += promptTokens;\n this.tokenUsage.completionTokens += completionTokens;\n this.tokenUsage.totalTokens += totalTokens;\n\n this.persistTokenUsage().catch(() => {});\n this.emit({ type: 'usage_update', usage: { promptTokens, completionTokens, totalTokens } });\n }\n break;\n }\n\n case 'finish': {\n const finishReason = chunk.payload.stepResult?.reason;\n if (finishReason === 'stop' || finishReason === 'end-turn') {\n currentMessage.stopReason = 'complete';\n } else if (finishReason === 'tool-calls') {\n currentMessage.stopReason = 'tool_use';\n } else {\n currentMessage.stopReason = 'complete';\n }\n break;\n }\n\n // Observational Memory data parts\n // NOTE: OM data parts arrive as { type, data: { ... } } — NOT { type, payload }\n case 'data-om-status': {\n const d = (chunk as any).data as Record<string, any> | undefined;\n if (d?.windows) {\n const w = d.windows;\n const active = w.active ?? {};\n const msgs = active.messages ?? {};\n const obs = active.observations ?? {};\n const buffObs = w.buffered?.observations ?? {};\n const buffRef = w.buffered?.reflection ?? {};\n\n this.emit({\n type: 'om_status',\n windows: {\n active: {\n messages: { tokens: msgs.tokens ?? 0, threshold: msgs.threshold ?? 0 },\n observations: { tokens: obs.tokens ?? 0, threshold: obs.threshold ?? 0 },\n },\n buffered: {\n observations: {\n status: buffObs.status ?? 'idle',\n chunks: buffObs.chunks ?? 0,\n messageTokens: buffObs.messageTokens ?? 0,\n projectedMessageRemoval: buffObs.projectedMessageRemoval ?? 0,\n observationTokens: buffObs.observationTokens ?? 0,\n },\n reflection: {\n status: buffRef.status ?? 'idle',\n inputObservationTokens: buffRef.inputObservationTokens ?? 0,\n observationTokens: buffRef.observationTokens ?? 0,\n },\n },\n },\n recordId: d.recordId ?? '',\n threadId: d.threadId ?? '',\n stepNumber: d.stepNumber ?? 0,\n generationCount: d.generationCount ?? 0,\n });\n }\n break;\n }\n case 'data-om-observation-start': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n if (payload.operationType === 'observation') {\n this.emit({\n type: 'om_observation_start',\n cycleId: payload.cycleId,\n operationType: payload.operationType,\n tokensToObserve: payload.tokensToObserve ?? 0,\n });\n } else if (payload.operationType === 'reflection') {\n this.emit({\n type: 'om_reflection_start',\n cycleId: payload.cycleId,\n tokensToReflect: payload.tokensToObserve ?? 0,\n });\n }\n }\n break;\n }\n case 'data-om-observation-end': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n if (payload.operationType === 'reflection') {\n this.emit({\n type: 'om_reflection_end',\n cycleId: payload.cycleId,\n durationMs: payload.durationMs ?? 0,\n compressedTokens: payload.observationTokens ?? 0,\n observations: payload.observations,\n });\n } else {\n this.emit({\n type: 'om_observation_end',\n cycleId: payload.cycleId,\n durationMs: payload.durationMs ?? 0,\n tokensObserved: payload.tokensObserved ?? 0,\n observationTokens: payload.observationTokens ?? 0,\n observations: payload.observations,\n currentTask: payload.currentTask,\n suggestedResponse: payload.suggestedResponse,\n });\n }\n }\n break;\n }\n case 'data-om-observation-failed': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload) {\n if (payload.operationType === 'reflection') {\n this.emit({\n type: 'om_reflection_failed',\n cycleId: payload.cycleId ?? 'unknown',\n error: payload.error ?? 'Unknown error',\n durationMs: payload.durationMs ?? 0,\n });\n } else {\n this.emit({\n type: 'om_observation_failed',\n cycleId: payload.cycleId ?? 'unknown',\n error: payload.error ?? 'Unknown error',\n durationMs: payload.durationMs ?? 0,\n });\n }\n }\n break;\n }\n // Async buffering lifecycle\n case 'data-om-buffering-start': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n this.emit({\n type: 'om_buffering_start',\n cycleId: payload.cycleId,\n operationType: payload.operationType ?? 'observation',\n tokensToBuffer: payload.tokensToBuffer ?? 0,\n });\n }\n break;\n }\n case 'data-om-buffering-end': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n this.emit({\n type: 'om_buffering_end',\n cycleId: payload.cycleId,\n operationType: payload.operationType ?? 'observation',\n tokensBuffered: payload.tokensBuffered ?? 0,\n bufferedTokens: payload.bufferedTokens ?? 0,\n observations: payload.observations,\n });\n }\n break;\n }\n case 'data-om-buffering-failed': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n this.emit({\n type: 'om_buffering_failed',\n cycleId: payload.cycleId,\n operationType: payload.operationType ?? 'observation',\n error: payload.error ?? 'Unknown error',\n });\n }\n break;\n }\n case 'data-om-activation': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n this.emit({\n type: 'om_activation',\n cycleId: payload.cycleId,\n operationType: payload.operationType ?? 'observation',\n chunksActivated: payload.chunksActivated ?? 0,\n tokensActivated: payload.tokensActivated ?? 0,\n observationTokens: payload.observationTokens ?? 0,\n messagesActivated: payload.messagesActivated ?? 0,\n generationCount: payload.generationCount ?? 0,\n });\n }\n break;\n }\n\n default:\n break;\n }\n }\n\n this.emit({ type: 'message_end', message: currentMessage });\n return { message: currentMessage };\n }\n\n // ===========================================================================\n // Control\n // ===========================================================================\n\n /**\n * Abort the current operation.\n */\n abort(): void {\n if (this.abortController) {\n this.abortRequested = true;\n try {\n this.abortController.abort();\n } catch {}\n this.abortController = null;\n }\n }\n\n /**\n * Steer the agent mid-stream: aborts current run and sends a new message.\n */\n async steer({ content }: { content: string }): Promise<void> {\n this.abort();\n this.followUpQueue = [];\n await this.sendMessage({ content });\n }\n\n /**\n * Queue a follow-up message to be processed after the current operation completes.\n */\n async followUp({ content }: { content: string }): Promise<void> {\n if (this.isRunning()) {\n this.followUpQueue.push(content);\n this.emit({ type: 'follow_up_queued', count: this.followUpQueue.length });\n } else {\n await this.sendMessage({ content });\n }\n }\n\n getFollowUpCount(): number {\n return this.followUpQueue.length;\n }\n\n isRunning(): boolean {\n return this.abortController !== null;\n }\n\n getCurrentRunId(): string | null {\n return this.currentRunId;\n }\n\n // ===========================================================================\n // Display State\n // ===========================================================================\n\n /**\n * Returns a read-only snapshot of the canonical display state.\n * UIs should use this to render instead of building up state from raw events.\n */\n getDisplayState(): Readonly<HarnessDisplayState> {\n return this.displayState;\n }\n\n /**\n * Reset display state fields that are scoped to a thread.\n * Called on thread switch/creation.\n */\n private resetThreadDisplayState(): void {\n this.displayState.activeTools = new Map();\n this.displayState.toolInputBuffers = new Map();\n this.displayState.pendingApproval = null;\n this.displayState.pendingQuestion = null;\n this.displayState.pendingPlanApproval = null;\n this.displayState.activeSubagents = new Map();\n this.displayState.currentMessage = null;\n this.displayState.modifiedFiles = new Map();\n this.displayState.tasks = [];\n this.displayState.previousTasks = [];\n this.displayState.omProgress = defaultOMProgressState();\n this.displayState.bufferingMessages = false;\n this.displayState.bufferingObservations = false;\n }\n\n /**\n * Respond to a pending tool approval from the UI.\n * \"always_allow_category\" grants the tool's category for the rest of the session, then approves.\n */\n respondToToolApproval({ decision }: { decision: 'approve' | 'decline' | 'always_allow_category' }): void {\n if (!this.pendingApprovalResolve) return;\n\n if (decision === 'always_allow_category') {\n const tn = this.pendingApprovalToolName;\n if (tn) {\n const category = this.getToolCategory({ toolName: tn });\n if (category) {\n this.grantSessionCategory({ category });\n }\n }\n this.pendingApprovalResolve('approve');\n } else {\n this.pendingApprovalResolve(decision);\n }\n this.pendingApprovalResolve = null;\n }\n\n // ===========================================================================\n // Question & Plan Approval\n // ===========================================================================\n\n /**\n * Register a pending question resolver.\n * Called by agent tools (e.g., ask_user) to pause execution until the UI responds.\n */\n registerQuestion({ questionId, resolve }: { questionId: string; resolve: (answer: string) => void }): void {\n this.pendingQuestions.set(questionId, resolve);\n }\n\n /**\n * Resolve a pending question with the user's answer.\n * Called by the UI when the user responds to a question dialog.\n */\n respondToQuestion({ questionId, answer }: { questionId: string; answer: string }): void {\n const resolve = this.pendingQuestions.get(questionId);\n if (resolve) {\n this.pendingQuestions.delete(questionId);\n resolve(answer);\n }\n }\n\n /**\n * Register a pending plan approval resolver.\n * Called by agent tools (e.g., submit_plan) to pause execution until approval.\n */\n registerPlanApproval({\n planId,\n resolve,\n }: {\n planId: string;\n resolve: (result: { action: 'approved' | 'rejected'; feedback?: string }) => void;\n }): void {\n this.pendingPlanApprovals.set(planId, resolve);\n }\n\n /**\n * Respond to a pending plan approval.\n * On approval: switches to the default mode, then resolves the promise.\n * On rejection: resolves with feedback (stays in current mode).\n */\n async respondToPlanApproval({\n planId,\n response,\n }: {\n planId: string;\n response: { action: 'approved' | 'rejected'; feedback?: string };\n }): Promise<void> {\n const resolve = this.pendingPlanApprovals.get(planId);\n if (!resolve) return;\n\n if (response.action === 'approved') {\n const defaultMode = this.config.modes.find(m => m.default) ?? this.config.modes[0];\n if (defaultMode && defaultMode.id !== this.currentModeId) {\n await this.switchMode({ modeId: defaultMode.id });\n }\n }\n\n this.pendingPlanApprovals.delete(planId);\n resolve(response);\n }\n\n private async handleToolApprove(toolCallId?: string): Promise<{ message: HarnessMessage }> {\n if (!this.currentRunId) {\n throw new Error('No active run to approve tool call for');\n }\n\n const agent = this.getCurrentAgent();\n if (!this.abortController) {\n this.abortController = new AbortController();\n }\n\n const requestContext = await this.buildRequestContext();\n const response = await agent.approveToolCall({\n runId: this.currentRunId,\n toolCallId,\n requireToolApproval: true,\n memory: this.currentThreadId ? { thread: this.currentThreadId, resource: this.resourceId } : undefined,\n abortSignal: this.abortController.signal,\n requestContext,\n toolsets: await this.buildToolsets(requestContext),\n });\n\n return await this.processStream(response);\n }\n\n private async handleToolDecline(toolCallId?: string): Promise<{ message: HarnessMessage }> {\n if (!this.currentRunId) {\n throw new Error('No active run to decline tool call for');\n }\n\n const agent = this.getCurrentAgent();\n if (!this.abortController) {\n this.abortController = new AbortController();\n }\n\n const requestContext = await this.buildRequestContext();\n const response = await agent.declineToolCall({\n runId: this.currentRunId,\n toolCallId,\n requireToolApproval: true,\n memory: this.currentThreadId ? { thread: this.currentThreadId, resource: this.resourceId } : undefined,\n abortSignal: this.abortController.signal,\n requestContext,\n toolsets: await this.buildToolsets(requestContext),\n });\n\n return await this.processStream(response);\n }\n\n // ===========================================================================\n // Event System\n // ===========================================================================\n\n /**\n * Subscribe to harness events. Returns an unsubscribe function.\n */\n subscribe(listener: HarnessEventListener): () => void {\n this.listeners.push(listener);\n return () => {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n private emit(event: HarnessEvent): void {\n // Update display state based on the event (before dispatching to listeners)\n this.applyDisplayStateUpdate(event);\n\n this.dispatchToListeners(event);\n\n // After every event, emit display_state_changed so UIs that prefer a single\n // subscribe-and-render pattern can do so. We dispatch directly to listeners\n // (not through emit()) to avoid infinite recursion.\n if (event.type !== 'display_state_changed') {\n this.dispatchToListeners({\n type: 'display_state_changed',\n displayState: this.displayState,\n });\n }\n }\n\n private dispatchToListeners(event: HarnessEvent): void {\n for (const listener of this.listeners) {\n try {\n const result = listener(event);\n if (result && typeof result === 'object' && 'catch' in result) {\n (result as Promise<void>).catch(err => console.error('Error in harness event listener:', err));\n }\n } catch (err) {\n console.error('Error in harness event listener:', err);\n }\n }\n }\n\n /**\n * Apply a display state update based on an incoming event.\n * This is the centralized state machine that keeps HarnessDisplayState in sync\n * with every event the Harness emits.\n */\n private applyDisplayStateUpdate(event: HarnessEvent): void {\n const ds = this.displayState;\n\n switch (event.type) {\n // ── Agent lifecycle ────────────────────────────────────────────────\n case 'agent_start':\n ds.isRunning = true;\n ds.activeTools = new Map();\n ds.toolInputBuffers = new Map();\n ds.currentMessage = null;\n ds.pendingApproval = null;\n break;\n\n case 'agent_end':\n ds.isRunning = false;\n ds.pendingApproval = null;\n ds.pendingQuestion = null;\n ds.pendingPlanApproval = null;\n // Mark any still-running tools as errored (handles abort mid-run)\n for (const [, tool] of ds.activeTools) {\n if (tool.status === 'running' || tool.status === 'streaming_input') {\n tool.status = 'error';\n }\n }\n ds.activeSubagents = new Map();\n break;\n\n // ── Message streaming ──────────────────────────────────────────────\n case 'message_start':\n ds.currentMessage = event.message;\n break;\n\n case 'message_update':\n ds.currentMessage = event.message;\n break;\n\n case 'message_end':\n ds.currentMessage = event.message;\n break;\n\n // ── Tool lifecycle ─────────────────────────────────────────────────\n case 'tool_input_start': {\n ds.toolInputBuffers.set(event.toolCallId, { text: '', toolName: event.toolName });\n const existing = ds.activeTools.get(event.toolCallId);\n if (existing) {\n existing.status = 'streaming_input';\n } else {\n ds.activeTools.set(event.toolCallId, {\n name: event.toolName,\n args: {},\n status: 'streaming_input',\n });\n }\n break;\n }\n\n case 'tool_input_delta': {\n const buf = ds.toolInputBuffers.get(event.toolCallId);\n if (buf) {\n buf.text += event.argsTextDelta;\n }\n break;\n }\n\n case 'tool_input_end':\n ds.toolInputBuffers.delete(event.toolCallId);\n break;\n\n case 'tool_start': {\n const existingTool = ds.activeTools.get(event.toolCallId);\n if (existingTool) {\n existingTool.name = event.toolName;\n existingTool.args = event.args;\n existingTool.status = 'running';\n } else {\n ds.activeTools.set(event.toolCallId, {\n name: event.toolName,\n args: event.args,\n status: 'running',\n });\n }\n break;\n }\n\n case 'tool_update': {\n const tool = ds.activeTools.get(event.toolCallId);\n if (tool) {\n tool.partialResult =\n typeof event.partialResult === 'string' ? event.partialResult : JSON.stringify(event.partialResult);\n }\n break;\n }\n\n case 'tool_end': {\n const endedTool = ds.activeTools.get(event.toolCallId);\n if (endedTool) {\n endedTool.status = event.isError ? 'error' : 'completed';\n endedTool.result = event.result;\n endedTool.isError = event.isError;\n }\n // Track file modifications\n if (!event.isError) {\n const FILE_TOOLS = ['string_replace_lsp', 'write_file', 'ast_smart_edit'];\n const toolState = ds.activeTools.get(event.toolCallId);\n if (toolState && FILE_TOOLS.includes(toolState.name)) {\n const toolArgs = toolState.args as Record<string, unknown>;\n const filePath = toolArgs?.path as string;\n if (filePath) {\n const existing = ds.modifiedFiles.get(filePath);\n if (existing) {\n existing.operations.push(toolState.name);\n } else {\n ds.modifiedFiles.set(filePath, {\n operations: [toolState.name],\n firstModified: new Date(),\n });\n }\n }\n }\n }\n break;\n }\n\n case 'shell_output': {\n const shellTool = ds.activeTools.get(event.toolCallId);\n if (shellTool) {\n shellTool.shellOutput = (shellTool.shellOutput ?? '') + event.output;\n }\n break;\n }\n\n case 'tool_approval_required':\n ds.pendingApproval = {\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args,\n };\n break;\n\n // ── Interactive prompts ────────────────────────────────────────────\n case 'ask_question':\n ds.pendingQuestion = {\n questionId: event.questionId,\n question: event.question,\n options: event.options,\n };\n break;\n\n case 'plan_approval_required':\n ds.pendingPlanApproval = {\n planId: event.planId,\n title: event.title,\n plan: event.plan,\n };\n break;\n\n case 'plan_approved':\n ds.pendingPlanApproval = null;\n break;\n\n // ── Subagent tracking ──────────────────────────────────────────────\n case 'subagent_start':\n ds.activeSubagents.set(event.toolCallId, {\n agentType: event.agentType,\n task: event.task,\n modelId: event.modelId,\n toolCalls: [],\n textDelta: '',\n status: 'running',\n });\n break;\n\n case 'subagent_text_delta': {\n const sub = ds.activeSubagents.get(event.toolCallId);\n if (sub) {\n sub.textDelta += event.textDelta;\n }\n break;\n }\n\n case 'subagent_tool_start': {\n const subAgent = ds.activeSubagents.get(event.toolCallId);\n if (subAgent) {\n subAgent.toolCalls.push({ name: event.subToolName, isError: false });\n }\n break;\n }\n\n case 'subagent_tool_end': {\n const subTool = ds.activeSubagents.get(event.toolCallId);\n if (subTool) {\n const tc = subTool.toolCalls.find(t => t.name === event.subToolName && !t.isError);\n if (tc) {\n tc.isError = event.isError;\n }\n }\n break;\n }\n\n case 'subagent_end': {\n const endedSub = ds.activeSubagents.get(event.toolCallId);\n if (endedSub) {\n endedSub.status = event.isError ? 'error' : 'completed';\n endedSub.durationMs = event.durationMs;\n endedSub.result = event.result;\n }\n break;\n }\n\n // ── Observational Memory ───────────────────────────────────────────\n case 'om_status': {\n const w = event.windows;\n ds.omProgress.pendingTokens = w.active.messages.tokens;\n ds.omProgress.threshold = w.active.messages.threshold;\n ds.omProgress.thresholdPercent =\n w.active.messages.threshold > 0 ? (w.active.messages.tokens / w.active.messages.threshold) * 100 : 0;\n ds.omProgress.observationTokens = w.active.observations.tokens;\n ds.omProgress.reflectionThreshold = w.active.observations.threshold;\n ds.omProgress.reflectionThresholdPercent =\n w.active.observations.threshold > 0\n ? (w.active.observations.tokens / w.active.observations.threshold) * 100\n : 0;\n ds.omProgress.buffered = {\n observations: { ...w.buffered.observations },\n reflection: { ...w.buffered.reflection },\n };\n ds.omProgress.generationCount = event.generationCount;\n ds.omProgress.stepNumber = event.stepNumber;\n // Drive buffering animation flags from status fields\n ds.bufferingMessages = w.buffered.observations.status === 'running';\n ds.bufferingObservations = w.buffered.reflection.status === 'running';\n break;\n }\n\n case 'om_observation_start':\n ds.omProgress.status = 'observing';\n ds.omProgress.cycleId = event.cycleId;\n ds.omProgress.startTime = Date.now();\n break;\n\n case 'om_observation_end':\n ds.omProgress.status = 'idle';\n ds.omProgress.cycleId = undefined;\n ds.omProgress.startTime = undefined;\n ds.omProgress.observationTokens = event.observationTokens;\n // Messages have been observed — reset pending tokens\n ds.omProgress.pendingTokens = 0;\n ds.omProgress.thresholdPercent = 0;\n break;\n\n case 'om_observation_failed':\n ds.omProgress.status = 'idle';\n ds.omProgress.cycleId = undefined;\n ds.omProgress.startTime = undefined;\n break;\n\n case 'om_reflection_start':\n ds.omProgress.status = 'reflecting';\n ds.omProgress.cycleId = event.cycleId;\n ds.omProgress.startTime = Date.now();\n ds.omProgress.preReflectionTokens = ds.omProgress.observationTokens;\n ds.omProgress.observationTokens = event.tokensToReflect;\n ds.omProgress.reflectionThresholdPercent =\n ds.omProgress.reflectionThreshold > 0 ? (event.tokensToReflect / ds.omProgress.reflectionThreshold) * 100 : 0;\n break;\n\n case 'om_reflection_end':\n ds.omProgress.status = 'idle';\n ds.omProgress.cycleId = undefined;\n ds.omProgress.startTime = undefined;\n ds.omProgress.observationTokens = event.compressedTokens;\n ds.omProgress.reflectionThresholdPercent =\n ds.omProgress.reflectionThreshold > 0\n ? (event.compressedTokens / ds.omProgress.reflectionThreshold) * 100\n : 0;\n break;\n\n case 'om_reflection_failed':\n ds.omProgress.status = 'idle';\n ds.omProgress.cycleId = undefined;\n ds.omProgress.startTime = undefined;\n break;\n\n case 'om_buffering_start':\n if (event.operationType === 'observation') {\n ds.bufferingMessages = true;\n } else {\n ds.bufferingObservations = true;\n }\n break;\n\n case 'om_buffering_end':\n if (event.operationType === 'observation') {\n ds.bufferingMessages = false;\n } else {\n ds.bufferingObservations = false;\n }\n break;\n\n case 'om_buffering_failed':\n if (event.operationType === 'observation') {\n ds.bufferingMessages = false;\n } else {\n ds.bufferingObservations = false;\n }\n break;\n\n case 'om_activation':\n if (event.operationType === 'observation') {\n ds.bufferingMessages = false;\n } else {\n ds.bufferingObservations = false;\n }\n break;\n\n // ── Token usage ────────────────────────────────────────────────────\n case 'usage_update':\n ds.tokenUsage = {\n promptTokens: this.tokenUsage.promptTokens,\n completionTokens: this.tokenUsage.completionTokens,\n totalTokens: this.tokenUsage.totalTokens,\n };\n break;\n\n // ── Tasks ──────────────────────────────────────────────────────────\n case 'task_updated':\n ds.previousTasks = [...ds.tasks];\n ds.tasks = event.tasks;\n break;\n\n // ── Thread lifecycle ───────────────────────────────────────────────\n case 'thread_changed':\n this.resetThreadDisplayState();\n ds.tokenUsage = { ...this.tokenUsage };\n break;\n\n case 'thread_created':\n this.resetThreadDisplayState();\n ds.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n break;\n\n // ── State changes (for OM threshold overrides) ──────────────────────\n case 'state_changed': {\n const keys = event.changedKeys;\n if (keys.includes('observationThreshold')) {\n const value = (event.state as Record<string, unknown>).observationThreshold;\n if (typeof value === 'number') {\n ds.omProgress.threshold = value;\n ds.omProgress.thresholdPercent = value > 0 ? (ds.omProgress.pendingTokens / value) * 100 : 0;\n }\n }\n if (keys.includes('reflectionThreshold')) {\n const value = (event.state as Record<string, unknown>).reflectionThreshold;\n if (typeof value === 'number') {\n ds.omProgress.reflectionThreshold = value;\n ds.omProgress.reflectionThresholdPercent = value > 0 ? (ds.omProgress.observationTokens / value) * 100 : 0;\n }\n }\n break;\n }\n\n default:\n break;\n }\n }\n\n // ===========================================================================\n // Runtime Context\n // ===========================================================================\n\n /**\n * Build the toolsets object that includes built-in harness tools (ask_user, submit_plan,\n * and optionally subagent) plus any user-configured tools.\n * Used by sendMessage, handleToolApprove, and handleToolDecline.\n */\n private async buildToolsets(requestContext: RequestContext): Promise<ToolsetsInput> {\n const builtInTools: ToolsInput = {\n ask_user: askUserTool,\n submit_plan: submitPlanTool,\n task_write: taskWriteTool,\n task_check: taskCheckTool,\n };\n\n // Resolve user-configured harness tools (needed for both the harness toolset and subagent allowedHarnessTools)\n let resolvedHarnessTools = undefined;\n if (this.config.tools) {\n const tools =\n typeof this.config.tools === 'function' ? await this.config.tools({ requestContext }) : this.config.tools;\n if (tools) {\n resolvedHarnessTools = tools;\n }\n }\n\n // Auto-create subagent tool if subagent definitions are configured\n if (this.config.subagents?.length && this.config.resolveModel) {\n const currentMode = this.getCurrentMode();\n builtInTools.subagent = createSubagentTool({\n subagents: this.config.subagents,\n resolveModel: this.config.resolveModel,\n harnessTools: resolvedHarnessTools,\n fallbackModelId: currentMode?.defaultModelId,\n });\n }\n\n if (resolvedHarnessTools) {\n return { harnessBuiltIn: builtInTools, harness: resolvedHarnessTools };\n }\n return { harnessBuiltIn: builtInTools };\n }\n\n /**\n * Build request context for agent execution.\n * Tools can access harness state via requestContext.get('harness').\n */\n private async buildRequestContext(): Promise<RequestContext> {\n const harnessContext: HarnessRequestContext<TState> = {\n harnessId: this.id,\n state: this.getState(),\n getState: () => this.getState(),\n setState: updates => this.setState(updates),\n threadId: this.currentThreadId,\n resourceId: this.resourceId,\n modeId: this.currentModeId,\n abortSignal: this.abortController?.signal,\n workspace: this.workspace,\n emitEvent: event => this.emit(event),\n registerQuestion: params => this.registerQuestion(params),\n registerPlanApproval: params => this.registerPlanApproval(params),\n getSubagentModelId: params => this.getSubagentModelId(params),\n };\n\n const requestContext = new RequestContext([['harness', harnessContext]]) as RequestContext;\n\n if (this.workspaceFn) {\n harnessContext.workspace = await Promise.resolve(this.workspaceFn({ requestContext }));\n }\n\n return requestContext;\n }\n\n // ===========================================================================\n // Token Usage\n // ===========================================================================\n\n getTokenUsage(): { promptTokens: number; completionTokens: number; totalTokens: number } {\n return { ...this.tokenUsage };\n }\n\n private async persistTokenUsage(): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n if (thread) {\n await memoryStorage.saveThread({\n thread: {\n ...thread,\n metadata: { ...thread.metadata, tokenUsage: this.tokenUsage },\n updatedAt: new Date(),\n },\n });\n }\n } catch {\n // Token persistence is not critical\n }\n }\n\n // ===========================================================================\n // Workspace\n // ===========================================================================\n\n getWorkspace(): Workspace | undefined {\n return this.workspace;\n }\n\n hasWorkspace(): boolean {\n return this.config.workspace !== undefined;\n }\n\n isWorkspaceReady(): boolean {\n if (this.workspaceFn) return true;\n return this.workspaceInitialized && this.workspace !== undefined;\n }\n\n async destroyWorkspace(): Promise<void> {\n if (this.workspaceFn) return;\n if (this.workspace && this.workspaceInitialized) {\n try {\n this.emit({ type: 'workspace_status_changed', status: 'destroying' });\n await this.workspace.destroy();\n this.emit({ type: 'workspace_status_changed', status: 'destroyed' });\n } catch (error) {\n console.warn('Workspace destroy failed:', error);\n } finally {\n this.workspaceInitialized = false;\n }\n }\n }\n\n // ===========================================================================\n // Heartbeat Handlers\n // ===========================================================================\n\n private startHeartbeats(): void {\n const handlers = this.config.heartbeatHandlers;\n if (!handlers?.length) return;\n\n for (const hb of handlers) {\n if (this.heartbeatTimers.has(hb.id)) continue;\n\n const run = async () => {\n try {\n await hb.handler();\n } catch (error) {\n console.error(`[Heartbeat:${hb.id}] failed:`, error);\n }\n };\n\n if (hb.immediate !== false) {\n void run();\n }\n\n const timer = setInterval(run, hb.intervalMs);\n timer.unref();\n this.heartbeatTimers.set(hb.id, { timer, shutdown: hb.shutdown });\n }\n }\n\n registerHeartbeat(handler: HeartbeatHandler): void {\n void this.removeHeartbeat({ id: handler.id });\n\n const run = async () => {\n try {\n await handler.handler();\n } catch (error) {\n console.error(`[Heartbeat:${handler.id}] failed:`, error);\n }\n };\n\n if (handler.immediate !== false) {\n void run();\n }\n\n const timer = setInterval(run, handler.intervalMs);\n timer.unref();\n this.heartbeatTimers.set(handler.id, { timer, shutdown: handler.shutdown });\n }\n\n async removeHeartbeat({ id }: { id: string }): Promise<void> {\n const entry = this.heartbeatTimers.get(id);\n if (entry) {\n clearInterval(entry.timer);\n this.heartbeatTimers.delete(id);\n try {\n await entry.shutdown?.();\n } catch (error) {\n console.error(`[Heartbeat:${id}] shutdown failed:`, error);\n }\n }\n }\n\n async stopHeartbeats(): Promise<void> {\n const entries = [...this.heartbeatTimers.entries()];\n this.heartbeatTimers.clear();\n\n for (const [id, entry] of entries) {\n clearInterval(entry.timer);\n try {\n await entry.shutdown?.();\n } catch (error) {\n console.error(`[Heartbeat:${id}] shutdown failed:`, error);\n }\n }\n }\n\n // ===========================================================================\n // Session\n // ===========================================================================\n\n async getSession(): Promise<HarnessSession> {\n return {\n currentThreadId: this.currentThreadId,\n currentModeId: this.currentModeId,\n threads: await this.listThreads(),\n };\n }\n\n // ===========================================================================\n // Utilities\n // ===========================================================================\n\n private generateId(): string {\n if (this.config.idGenerator) {\n return this.config.idGenerator();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/harness/tools.ts","../../src/harness/types.ts","../../src/harness/harness.ts"],"names":["createTool","z","answer","Agent","durationMs","meta","Workspace","result","RequestContext"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod';\n\nimport { Agent } from '../agent';\nimport type { ToolsInput } from '../agent/types';\nimport type { MastraLanguageModel } from '../llm/model/shared.types';\nimport { createTool } from '../tools/tool';\n\nimport type { HarnessRequestContext, HarnessSubagent } from './types';\n\nlet questionCounter = 0;\nlet planCounter = 0;\n\n/**\n * Built-in harness tool: ask the user a question and wait for their response.\n * Supports single-select options and free-text input.\n * The tool pauses execution while the UI shows the dialog.\n */\nexport const askUserTool = createTool({\n id: 'ask_user',\n description:\n 'Ask the user a question and wait for their response. Use this when you need clarification, want to validate assumptions, or need the user to make a decision between options. Provide options for structured choices (2-4 options), or omit them for open-ended questions.',\n inputSchema: z.object({\n question: z.string().min(1).describe('The question to ask the user. Should be clear and specific.'),\n options: z\n .array(\n z.object({\n label: z.string().describe('Short display text for this option (1-5 words)'),\n description: z.string().optional().describe('Explanation of what this option means'),\n }),\n )\n .optional()\n .describe('Optional choices. If provided, shows a selection list. If omitted, shows a free-text input.'),\n }),\n execute: async ({ question, options }, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n if (!harnessCtx?.emitEvent || !harnessCtx?.registerQuestion) {\n return {\n content: `[Question for user]: ${question}${options ? '\\nOptions: ' + options.map(o => o.label).join(', ') : ''}`,\n isError: false,\n };\n }\n\n const questionId = `q_${++questionCounter}_${Date.now()}`;\n\n const answer = await new Promise<string>((resolve, reject) => {\n const signal = harnessCtx.abortSignal;\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n const onAbort = () => reject(new DOMException('Aborted', 'AbortError'));\n signal?.addEventListener('abort', onAbort, { once: true });\n\n harnessCtx.registerQuestion!({\n questionId,\n resolve: answer => {\n signal?.removeEventListener('abort', onAbort);\n resolve(answer);\n },\n });\n\n harnessCtx.emitEvent!({\n type: 'ask_question',\n questionId,\n question,\n options,\n });\n });\n\n return { content: `User answered: ${answer}`, isError: false };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { content: `Failed to ask user: ${msg}`, isError: true };\n }\n },\n});\n\n/**\n * Built-in harness tool: submit a plan for user review.\n * The plan renders in the UI with approve/reject options.\n * On approval, the harness switches to the default mode.\n */\nexport const submitPlanTool = createTool({\n id: 'submit_plan',\n description:\n 'Submit a completed implementation plan for user review. The plan will be rendered as markdown and the user can approve, reject, or request changes. Use this when your exploration is complete and you have a concrete plan ready for review. On approval, the system automatically switches to the default mode so you can implement.',\n inputSchema: z.object({\n title: z.string().optional().describe(\"Short title for the plan (e.g., 'Add dark mode toggle')\"),\n plan: z\n .string()\n .min(1)\n .describe('The full plan content in markdown format. Should include Overview, Steps, and Verification sections.'),\n }),\n execute: async ({ title, plan }, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n if (!harnessCtx?.emitEvent || !harnessCtx?.registerPlanApproval) {\n return {\n content: `[Plan submitted for review]\\n\\nTitle: ${title || 'Implementation Plan'}\\n\\n${plan}`,\n isError: false,\n };\n }\n\n const planId = `plan_${++planCounter}_${Date.now()}`;\n\n const result = await new Promise<{ action: 'approved' | 'rejected'; feedback?: string }>((resolve, reject) => {\n const signal = harnessCtx.abortSignal;\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n const onAbort = () => reject(new DOMException('Aborted', 'AbortError'));\n signal?.addEventListener('abort', onAbort, { once: true });\n\n harnessCtx.registerPlanApproval!({\n planId,\n resolve: res => {\n signal?.removeEventListener('abort', onAbort);\n resolve(res);\n },\n });\n\n harnessCtx.emitEvent!({\n type: 'plan_approval_required',\n planId,\n title: title || 'Implementation Plan',\n plan,\n });\n });\n\n if (result.action === 'approved') {\n return {\n content: 'Plan approved. Proceed with implementation following the approved plan.',\n isError: false,\n };\n }\n\n const feedback = result.feedback ? `\\n\\nUser feedback: ${result.feedback}` : '';\n return {\n content: `Plan was not approved. The user wants revisions.${feedback}\\n\\nPlease revise the plan based on the feedback and submit again with submit_plan.`,\n isError: false,\n };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return { content: `Failed to submit plan: ${msg}`, isError: true };\n }\n },\n});\n\n// =============================================================================\n// Task Tools\n// =============================================================================\n\nconst taskItemSchema = z.object({\n content: z.string().min(1).describe(\"Task description in imperative form (e.g., 'Fix authentication bug')\"),\n status: z.enum(['pending', 'in_progress', 'completed']).describe('Current task status'),\n activeForm: z\n .string()\n .min(1)\n .describe(\"Present continuous form shown during execution (e.g., 'Fixing authentication bug')\"),\n});\n\nexport type TaskItem = z.infer<typeof taskItemSchema>;\n\n/**\n * Built-in harness tool: manage a structured task list for the coding session.\n * Full-replacement semantics: each call replaces the entire task list.\n */\nexport const taskWriteTool = createTool({\n id: 'task_write',\n description: `Create and manage a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\n\nUsage:\n- Pass the FULL task list each time (replaces previous list)\n- Each task has: content (imperative), status (pending|in_progress|completed), activeForm (present continuous)\n- Mark tasks in_progress BEFORE starting work (only ONE at a time)\n- Mark tasks completed IMMEDIATELY after finishing\n- Use this for multi-step tasks requiring 3+ distinct actions\n\nStates:\n- pending: Not yet started\n- in_progress: Currently working on (limit to ONE)\n- completed: Finished successfully`,\n inputSchema: z.object({\n tasks: z.array(taskItemSchema).describe('The complete updated task list'),\n }),\n execute: async ({ tasks }, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n if (harnessCtx) {\n // Always update state\n await harnessCtx.setState({ tasks });\n\n // Always emit event immediately for real-time updates\n // The UI will handle deduplication if needed\n harnessCtx.emitEvent?.({\n type: 'task_updated',\n tasks,\n });\n }\n\n // Build summary for the model's context\n const completed = tasks.filter(t => t.status === 'completed').length;\n const inProgress = tasks.find(t => t.status === 'in_progress');\n const total = tasks.length;\n\n let summary = `Tasks updated: [${completed}/${total} completed]`;\n if (inProgress) {\n summary += `\\nCurrently: ${inProgress.activeForm}`;\n }\n\n return {\n content: summary,\n isError: false,\n };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `Failed to update tasks: ${msg}`,\n isError: true,\n };\n }\n },\n});\n\n/**\n * Built-in harness tool: check the completion status of the current task list.\n * Helps the agent determine if all tasks are completed before ending work.\n */\nexport const taskCheckTool = createTool({\n id: 'task_check',\n description: `Check the completion status of your current task list. Use this before deciding to end work on a task to ensure all tasks are completed.\n\nReturns:\n- Total number of tasks\n- Number of completed, in progress, and pending tasks\n- List of incomplete tasks (if any)\n- Boolean indicating if all tasks are done`,\n inputSchema: z.object({}), // No input needed\n execute: async ({}, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n if (!harnessCtx) {\n return {\n content: 'Unable to access task list (no harness context)',\n isError: true,\n };\n }\n\n // Get current state which includes tasks\n // Use getState() for live state instead of the snapshot\n const state = harnessCtx.getState ? harnessCtx.getState() : harnessCtx.state;\n const typedState = state as {\n tasks?: Array<{\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n };\n\n const tasks = typedState.tasks || [];\n\n if (tasks.length === 0) {\n return {\n content: 'No tasks found. Consider using task_write to create a task list for complex work.',\n isError: false,\n };\n }\n\n // Calculate statistics\n const completed = tasks.filter(t => t.status === 'completed');\n const inProgress = tasks.filter(t => t.status === 'in_progress');\n const pending = tasks.filter(t => t.status === 'pending');\n const incomplete = [...inProgress, ...pending];\n const allDone = incomplete.length === 0;\n\n // Build detailed response\n let response = `Task Status: [${completed.length}/${tasks.length} completed]\\n`;\n response += `- Completed: ${completed.length}\\n`;\n response += `- In Progress: ${inProgress.length}\\n`;\n response += `- Pending: ${pending.length}\\n`;\n response += `\\nAll tasks completed: ${allDone ? '✓ YES' : '✗ NO'}`;\n\n if (!allDone) {\n response += '\\n\\nIncomplete tasks:';\n if (inProgress.length > 0) {\n response += '\\n\\nIn Progress:';\n inProgress.forEach(t => {\n response += `\\n- ${t.content}`;\n });\n }\n if (pending.length > 0) {\n response += '\\n\\nPending:';\n pending.forEach(t => {\n response += `\\n- ${t.content}`;\n });\n }\n response += '\\n\\nContinue working on these tasks before ending.';\n }\n\n return {\n content: response,\n isError: false,\n };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `Failed to check tasks: ${msg}`,\n isError: true,\n };\n }\n },\n});\n\n// =============================================================================\n// Subagent Tool\n// =============================================================================\n\nexport interface CreateSubagentToolOptions {\n subagents: HarnessSubagent[];\n resolveModel: (modelId: string) => MastraLanguageModel;\n /** Resolved harness tools (already evaluated from DynamicArgument) */\n harnessTools?: ToolsInput;\n /** Fallback model ID when subagent definition has no defaultModelId */\n fallbackModelId?: string;\n}\n\n/**\n * Creates a `subagent` tool from registered subagent definitions.\n * The tool spawns a fresh Agent per invocation with constrained tools,\n * streams the response, and forwards events to the harness.\n */\nexport function createSubagentTool(opts: CreateSubagentToolOptions) {\n const { subagents, resolveModel, harnessTools, fallbackModelId } = opts;\n\n const subagentIds = subagents.map(s => s.id);\n\n const typeDescriptions = subagents.map(s => `- **${s.id}** (${s.name}): ${s.description}`).join('\\n');\n\n return createTool({\n id: 'subagent',\n description: `Delegate a focused task to a specialized subagent. The subagent runs independently with a constrained toolset, then returns its findings as text.\n\nAvailable agent types:\n${typeDescriptions}\n\nThe subagent runs in its own context — it does NOT see the parent conversation history. Write a clear, self-contained task description.\n\nUse this tool when:\n- You want to run multiple investigations in parallel\n- The task is self-contained and can be delegated`,\n inputSchema: z.object({\n agentType: z.enum(subagentIds as [string, ...string[]]).describe('Type of subagent to spawn'),\n task: z\n .string()\n .describe(\n 'Clear, self-contained description of what the subagent should do. Include all relevant context — the subagent cannot see the parent conversation.',\n ),\n modelId: z.string().optional().describe('Optional model ID override for this task.'),\n }),\n execute: async ({ agentType, task, modelId }, context) => {\n const definition = subagents.find(s => s.id === agentType);\n if (!definition) {\n return {\n content: `Unknown agent type: ${agentType}. Valid types: ${subagentIds.join(', ')}`,\n isError: true,\n };\n }\n\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n const emitEvent = harnessCtx?.emitEvent;\n const abortSignal = harnessCtx?.abortSignal;\n const toolCallId = context?.agent?.toolCallId ?? 'unknown';\n\n // Merge tools: subagent's own tools + filtered harness tools\n const mergedTools: ToolsInput = { ...definition.tools };\n if (definition.allowedHarnessTools && harnessTools) {\n for (const toolId of definition.allowedHarnessTools) {\n if (harnessTools[toolId] && !mergedTools[toolId]) {\n mergedTools[toolId] = harnessTools[toolId];\n }\n }\n }\n\n // Resolve model: explicit arg → harness setting → subagent default → fallback\n const harnessModelId = harnessCtx?.getSubagentModelId?.({ agentType }) ?? undefined;\n const resolvedModelId = modelId ?? harnessModelId ?? definition.defaultModelId ?? fallbackModelId;\n if (!resolvedModelId) {\n return { content: 'No model ID available for subagent. Configure defaultModelId.', isError: true };\n }\n\n let model: MastraLanguageModel;\n try {\n model = resolveModel(resolvedModelId);\n } catch (err) {\n return {\n content: `Failed to resolve model \"${resolvedModelId}\": ${err instanceof Error ? err.message : String(err)}`,\n isError: true,\n };\n }\n\n const subagent = new Agent({\n id: `subagent-${definition.id}`,\n name: `${definition.name} Subagent`,\n instructions: definition.instructions,\n model,\n tools: mergedTools,\n });\n\n const startTime = Date.now();\n\n emitEvent?.({\n type: 'subagent_start',\n toolCallId,\n agentType,\n task,\n modelId: resolvedModelId,\n });\n\n let partialText = '';\n const toolCallLog: Array<{ name: string; toolCallId: string; isError?: boolean }> = [];\n\n try {\n const response = await subagent.stream(task, {\n maxSteps: 50,\n abortSignal,\n requireToolApproval: false,\n });\n\n for await (const chunk of response.fullStream) {\n switch (chunk.type) {\n case 'text-delta':\n partialText += chunk.payload.text;\n emitEvent?.({\n type: 'subagent_text_delta',\n toolCallId,\n agentType,\n textDelta: chunk.payload.text,\n });\n break;\n\n case 'tool-call':\n toolCallLog.push({ name: chunk.payload.toolName, toolCallId: chunk.payload.toolCallId });\n emitEvent?.({\n type: 'subagent_tool_start',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolArgs: chunk.payload.args,\n });\n break;\n\n case 'tool-result': {\n const isErr = chunk.payload.isError ?? false;\n for (let i = toolCallLog.length - 1; i >= 0; i--) {\n if (toolCallLog[i]!.toolCallId === chunk.payload.toolCallId && toolCallLog[i]!.isError === undefined) {\n toolCallLog[i]!.isError = isErr;\n break;\n }\n }\n emitEvent?.({\n type: 'subagent_tool_end',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolResult: chunk.payload.result,\n isError: isErr,\n });\n break;\n }\n }\n }\n\n if (abortSignal?.aborted) {\n const durationMs = Date.now() - startTime;\n const abortResult = partialText\n ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}`\n : '[Aborted by user]';\n\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return { content: abortResult + meta, isError: false };\n }\n\n const fullOutput = await response.getFullOutput();\n const resultText = fullOutput.text || partialText;\n\n const durationMs = Date.now() - startTime;\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: resultText, isError: false, durationMs });\n\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return { content: resultText + meta, isError: false };\n } catch (err) {\n const isAbort =\n err instanceof Error &&\n (err.name === 'AbortError' || err.message?.includes('abort') || err.message?.includes('cancel'));\n const durationMs = Date.now() - startTime;\n\n if (isAbort) {\n const abortResult = partialText\n ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}`\n : '[Aborted by user]';\n\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return { content: abortResult + meta, isError: false };\n }\n\n const message = err instanceof Error ? err.message : String(err);\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: message, isError: true, durationMs });\n\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return { content: `Subagent \"${definition.name}\" failed: ${message}` + meta, isError: true };\n }\n },\n });\n}\n\n/**\n * Build a metadata tag appended to subagent results.\n * UIs can parse this to display model ID, duration, and tool calls\n * when loading from history (where live events aren't available).\n */\nfunction buildSubagentMeta(\n modelId: string,\n durationMs: number,\n toolCalls: Array<{ name: string; isError?: boolean }>,\n): string {\n const tools = toolCalls.map(tc => `${tc.name}:${tc.isError ? 'err' : 'ok'}`).join(',');\n return `\\n<subagent-meta modelId=\"${modelId}\" durationMs=\"${durationMs}\" tools=\"${tools}\" />`;\n}\n\n/**\n * Parse subagent metadata from a tool result string.\n * Returns the metadata and the cleaned result text (without the tag).\n */\nexport function parseSubagentMeta(content: string): {\n text: string;\n modelId?: string;\n durationMs?: number;\n toolCalls?: Array<{ name: string; isError: boolean }>;\n} {\n const match = content.match(/\\n<subagent-meta modelId=\"([^\"]*)\" durationMs=\"(\\d+)\" tools=\"([^\"]*)\" \\/>$/);\n if (!match) return { text: content };\n\n const text = content.slice(0, match.index!);\n const modelId = match[1];\n const durationMs = parseInt(match[2]!, 10);\n const toolCalls = match[3]\n ? match[3]\n .split(',')\n .filter(Boolean)\n .map(entry => {\n const [name, status] = entry.split(':');\n return { name: name!, isError: status === 'err' };\n })\n : [];\n\n return { text, modelId, durationMs, toolCalls };\n}\n","import type { z } from 'zod';\n\nimport type { Agent } from '../agent';\nimport type { ToolsInput } from '../agent/types';\nimport type { MastraLanguageModel } from '../llm/model/shared.types';\nimport type { MastraMemory } from '../memory/memory';\nimport type { MastraCompositeStore } from '../storage/base';\nimport type { DynamicArgument } from '../types';\nimport type { Workspace, WorkspaceConfig, WorkspaceStatus } from '../workspace';\n\n// =============================================================================\n// Heartbeat Handlers\n// =============================================================================\n\n/**\n * A periodic task that the Harness runs on a timer.\n * Heartbeat handlers start during `init()` and are cleaned up on `stopHeartbeats()`.\n */\nexport interface HeartbeatHandler {\n /** Unique identifier for this handler (used for dedup and logging) */\n id: string;\n /** Interval in milliseconds between invocations */\n intervalMs: number;\n /** The function to run on each tick */\n handler: () => void | Promise<void>;\n /** Whether to run the handler immediately on start (default: true) */\n immediate?: boolean;\n /** Called when the handler is removed or all heartbeats are stopped */\n shutdown?: () => void | Promise<void>;\n}\n\n// =============================================================================\n// Harness Configuration\n// =============================================================================\n\n/**\n * Configuration for a single agent mode within the harness.\n * Each mode represents a different \"personality\" or capability set.\n */\nexport interface HarnessMode<TState extends HarnessStateSchema = HarnessStateSchema> {\n /** Unique identifier for this mode (e.g., \"plan\", \"build\", \"review\") */\n id: string;\n\n /** Human-readable name for display */\n name?: string;\n\n /** Whether this is the default mode when harness starts */\n default?: boolean;\n\n /**\n * Default model ID for this mode (e.g., \"anthropic/claude-sonnet-4-20250514\").\n * Used when no per-mode model has been explicitly selected.\n */\n defaultModelId?: string;\n\n /** Hex color for the mode indicator (e.g., \"#7c3aed\") */\n color?: string;\n\n /**\n * The agent for this mode.\n * Can be a static Agent or a function that receives harness state.\n */\n agent: Agent | ((state: z.infer<TState>) => Agent);\n}\n\n// =============================================================================\n// Subagents\n// =============================================================================\n\n/**\n * Definition of a subagent that the Harness can spawn via the built-in `subagent` tool.\n * Each subagent runs as a fresh Agent with constrained tools and its own instructions.\n */\nexport interface HarnessSubagent {\n /** Unique identifier for this subagent type (e.g., \"explore\", \"plan\", \"execute\") */\n id: string;\n\n /** Human-readable name shown in tool output (e.g., \"Explore\") */\n name: string;\n\n /** Description of what this subagent does (used in auto-generated tool description) */\n description: string;\n\n /** System prompt for this subagent */\n instructions: string;\n\n /** Tools this subagent has direct access to */\n tools?: ToolsInput;\n\n /**\n * Tool IDs to pull from the harness's shared `tools` config.\n * Merged with `tools` above — allows subagents to use a subset of harness tools.\n */\n allowedHarnessTools?: string[];\n\n /** Default model ID for this subagent type (e.g., \"anthropic/claude-sonnet-4-20250514\") */\n defaultModelId?: string;\n}\n\n/**\n * Schema type for harness state - must be a Zod object schema.\n */\nexport type HarnessStateSchema = z.ZodObject<z.ZodRawShape>;\n\n/**\n * Configuration for creating a Harness instance.\n */\nexport interface HarnessConfig<TState extends HarnessStateSchema = HarnessStateSchema> {\n /** Unique identifier for this harness instance */\n id: string;\n\n /**\n * Resource ID for grouping threads (e.g., project identifier).\n * Threads are scoped to this resource ID.\n */\n resourceId?: string;\n\n /** Storage backend for persistence (threads, messages, state) */\n storage?: MastraCompositeStore;\n\n /** Zod schema defining the shape of harness state */\n stateSchema?: TState;\n\n /** Initial state values (must conform to schema) */\n initialState?: Partial<z.infer<TState>>;\n\n /** Memory configuration (shared across all modes) */\n memory?: MastraMemory;\n\n /** Available agent modes */\n modes: HarnessMode<TState>[];\n\n /**\n * Tools available to all agents across all modes.\n * Can be a static tools object or a dynamic function that receives\n * the request context and returns tools per-request.\n */\n tools?: DynamicArgument<ToolsInput | undefined>;\n\n /**\n * Workspace configuration.\n * Accepts a pre-constructed Workspace instance, a WorkspaceConfig for\n * Harness to construct internally, or a dynamic factory function that\n * receives the request context and returns a Workspace per-request.\n */\n workspace?: DynamicArgument<Workspace | undefined> | WorkspaceConfig;\n\n /**\n * Periodic heartbeat handlers started during `init()`.\n * Use for background tasks like gateway sync, cache refresh, etc.\n */\n heartbeatHandlers?: HeartbeatHandler[];\n\n /**\n * Custom ID generator for threads, messages, and other entities.\n * Defaults to a timestamp + random string generator.\n */\n idGenerator?: () => string;\n\n /**\n * Custom auth checker for model providers.\n * Lets the app layer provide additional auth sources (e.g., OAuth tokens)\n * beyond the default env var check from the provider registry.\n */\n modelAuthChecker?: ModelAuthChecker;\n\n /**\n * Provides per-model use counts for `listAvailableModels()` sorting/display.\n * Lets the app layer track and report how often each model has been used.\n */\n modelUseCountProvider?: ModelUseCountProvider;\n\n /**\n * Subagent definitions. The Harness auto-creates a `subagent` built-in tool\n * that parent agents can call to spawn focused subagents.\n */\n subagents?: HarnessSubagent[];\n\n /**\n * Converts a model ID string (e.g., \"anthropic/claude-sonnet-4-20250514\") to a\n * language model instance. Used by subagents and OM model resolution.\n */\n resolveModel?: (modelId: string) => MastraLanguageModel;\n\n /**\n * Observational Memory configuration defaults.\n * The Harness auto-manages OM state (model IDs, thresholds) internally\n * and provides accessors that Memory's dynamic model functions can close over.\n */\n omConfig?: HarnessOMConfig;\n\n /**\n * Maps tool names to permission categories.\n * Used by the permission system to resolve category-level policies.\n * If not provided, all tools default to the \"other\" category.\n */\n toolCategoryResolver?: (toolName: string) => ToolCategory | null;\n\n /**\n * Optional thread locking callbacks.\n * Called during selectOrCreateThread, createThread, and switchThread\n * to prevent concurrent access to the same thread from multiple processes.\n * `acquire` should throw if the lock is held by another process.\n */\n threadLock?: {\n acquire: (threadId: string) => void;\n release: (threadId: string) => void;\n };\n}\n\n/**\n * Default configuration for Observational Memory.\n * These values are used when harness state doesn't have explicit OM values\n * (e.g., fresh thread with no persisted OM settings).\n */\nexport interface HarnessOMConfig {\n /** Default model ID for the observer agent */\n defaultObserverModelId?: string;\n /** Default model ID for the reflector agent */\n defaultReflectorModelId?: string;\n /** Default observation threshold in tokens */\n defaultObservationThreshold?: number;\n /** Default reflection threshold in tokens */\n defaultReflectionThreshold?: number;\n}\n\n// =============================================================================\n// Permissions\n// =============================================================================\n\n/**\n * Tool category for permission grouping.\n * Consumers define how tool names map to categories via `toolCategoryResolver`.\n */\nexport type ToolCategory = 'read' | 'edit' | 'execute' | 'mcp' | 'other';\n\n/**\n * Permission policy for a tool or category.\n */\nexport type PermissionPolicy = 'allow' | 'ask' | 'deny';\n\n/**\n * Permission rules for controlling tool approval behavior.\n * Per-tool overrides take precedence over category policies.\n */\nexport interface PermissionRules {\n categories: Partial<Record<ToolCategory, PermissionPolicy>>;\n tools: Partial<Record<string, PermissionPolicy>>;\n}\n\n// =============================================================================\n// Model Discovery\n// =============================================================================\n\n/**\n * Auth status for a model's provider.\n */\nexport interface ModelAuthStatus {\n hasAuth: boolean;\n apiKeyEnvVar?: string;\n}\n\n/**\n * Info about an available model from the provider registry.\n */\nexport interface AvailableModel {\n /** Full model ID (e.g., \"anthropic/claude-sonnet-4-20250514\") */\n id: string;\n /** Provider prefix (e.g., \"anthropic\") */\n provider: string;\n /** Model name without provider prefix */\n modelName: string;\n /** Whether the provider has valid authentication */\n hasApiKey: boolean;\n /** Environment variable for the provider's API key */\n apiKeyEnvVar?: string;\n /** Number of times this model has been used (from external tracking) */\n useCount: number;\n}\n\n/**\n * Custom auth checker for model providers.\n * Called by `getCurrentModelAuthStatus()` and `listAvailableModels()` to determine\n * whether a provider has valid authentication beyond just env var checks\n * (e.g., OAuth tokens, stored credentials).\n *\n * Return `true` if the provider is authenticated, `false` if not,\n * or `undefined` to fall back to the default env var check.\n */\nexport type ModelAuthChecker = (provider: string) => boolean | undefined;\n\n/**\n * Provides per-model use counts for sorting in `listAvailableModels()`.\n * Return a map of model ID → use count.\n */\nexport type ModelUseCountProvider = () => Record<string, number>;\n\n// =============================================================================\n// Harness State\n// =============================================================================\n\n/**\n * Thread metadata stored in the harness.\n */\nexport interface HarnessThread {\n id: string;\n resourceId: string;\n title?: string;\n createdAt: Date;\n updatedAt: Date;\n tokenUsage?: TokenUsage;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Session info for the current harness instance.\n */\nexport interface HarnessSession {\n currentThreadId: string | null;\n currentModeId: string;\n threads: HarnessThread[];\n}\n\n// =============================================================================\n// Events\n// =============================================================================\n\n/**\n * Token usage statistics from the model.\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n// =============================================================================\n// Observational Memory Progress\n// =============================================================================\n\n/**\n * Status of the Observational Memory system.\n */\nexport type OMStatus = 'idle' | 'observing' | 'reflecting';\n\n/**\n * Status of a buffered OM operation (observation or reflection).\n */\nexport type OMBufferedStatus = 'idle' | 'running' | 'complete';\n\n/**\n * Full progress state for Observational Memory.\n * Maintained by the Harness and exposed via `HarnessDisplayState`.\n */\nexport interface OMProgressState {\n status: OMStatus;\n // Active window tokens/thresholds (from om_status events)\n pendingTokens: number;\n threshold: number;\n thresholdPercent: number;\n observationTokens: number;\n reflectionThreshold: number;\n reflectionThresholdPercent: number;\n // Buffered state (from om_status events)\n buffered: {\n observations: {\n status: OMBufferedStatus;\n chunks: number;\n messageTokens: number;\n projectedMessageRemoval: number;\n observationTokens: number;\n };\n reflection: {\n status: OMBufferedStatus;\n inputObservationTokens: number;\n observationTokens: number;\n };\n };\n generationCount: number;\n stepNumber: number;\n cycleId?: string;\n startTime?: number;\n /** Observation tokens before reflection compression (set on om_reflection_start) */\n preReflectionTokens: number;\n}\n\n// =============================================================================\n// Display State\n// =============================================================================\n\n/**\n * State of an active tool execution, tracked by the Harness for UI consumption.\n */\nexport interface ActiveToolState {\n name: string;\n args: unknown;\n status: 'streaming_input' | 'running' | 'completed' | 'error';\n partialResult?: string;\n result?: unknown;\n isError?: boolean;\n shellOutput?: string;\n}\n\n/**\n * State of an active subagent execution, tracked by the Harness for UI consumption.\n */\nexport interface ActiveSubagentState {\n agentType: string;\n task: string;\n modelId?: string;\n toolCalls: Array<{ name: string; isError: boolean }>;\n textDelta: string;\n status: 'running' | 'completed' | 'error';\n durationMs?: number;\n result?: string;\n}\n\n/**\n * Canonical display state maintained by the Harness.\n *\n * This is the single source of truth for *what to display*.\n * Any UI (TUI, web, desktop) can subscribe to snapshots of this state\n * instead of interpreting 35+ raw event types.\n *\n * The Harness updates this state alongside every event emission,\n * then emits a `display_state_changed` event so UIs can react.\n */\nexport interface HarnessDisplayState {\n // ── Agent lifecycle ──────────────────────────────────────────────────\n /** Whether an agent operation is currently in progress */\n isRunning: boolean;\n\n // ── Current streaming message ────────────────────────────────────────\n /** The message currently being streamed (null when idle) */\n currentMessage: HarnessMessage | null;\n\n // ── Token usage ──────────────────────────────────────────────────────\n /** Cumulative token usage for the current thread */\n tokenUsage: TokenUsage;\n\n // ── Tool execution tracking ──────────────────────────────────────────\n /** Active tool executions keyed by toolCallId */\n activeTools: Map<string, ActiveToolState>;\n\n // ── Streaming tool input ─────────────────────────────────────────────\n /** Partial JSON buffers for tools whose arguments are being streamed */\n toolInputBuffers: Map<string, { text: string; toolName: string }>;\n\n // ── Tool approval ────────────────────────────────────────────────────\n /** A tool awaiting user approval (null when no approval pending) */\n pendingApproval: {\n toolCallId: string;\n toolName: string;\n args: unknown;\n } | null;\n\n // ── Interactive prompts ──────────────────────────────────────────────\n /** A question from the agent awaiting user answer (null when none) */\n pendingQuestion: {\n questionId: string;\n question: string;\n options?: Array<{ label: string; description?: string }>;\n } | null;\n\n /** A plan awaiting user approval (null when none) */\n pendingPlanApproval: {\n planId: string;\n title?: string;\n plan: string;\n } | null;\n\n // ── Subagent tracking ────────────────────────────────────────────────\n /** Active subagent executions keyed by parent toolCallId */\n activeSubagents: Map<string, ActiveSubagentState>;\n\n // ── Observational Memory ─────────────────────────────────────────────\n /** Full OM progress state (status, tokens, thresholds, buffered) */\n omProgress: OMProgressState;\n\n /** Whether message buffering is currently running */\n bufferingMessages: boolean;\n\n /** Whether observation buffering is currently running */\n bufferingObservations: boolean;\n\n // ── File modifications ───────────────────────────────────────────────\n /** Files modified by tool executions (for /diff and similar features) */\n modifiedFiles: Map<string, { operations: string[]; firstModified: Date }>;\n\n // ── Tasks ────────────────────────────────────────────────────────────\n /** Current task list (from task_write tool) */\n tasks: Array<{\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n\n /** Previous task list snapshot (for diff detection) */\n previousTasks: Array<{\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n}\n\n/**\n * Creates the default/initial `HarnessDisplayState`.\n */\nexport function defaultDisplayState(): HarnessDisplayState {\n return {\n isRunning: false,\n currentMessage: null,\n tokenUsage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n activeTools: new Map(),\n toolInputBuffers: new Map(),\n pendingApproval: null,\n pendingQuestion: null,\n pendingPlanApproval: null,\n activeSubagents: new Map(),\n omProgress: defaultOMProgressState(),\n bufferingMessages: false,\n bufferingObservations: false,\n modifiedFiles: new Map(),\n tasks: [],\n previousTasks: [],\n };\n}\n\n/**\n * Creates the default OM progress state.\n */\nexport function defaultOMProgressState(): OMProgressState {\n return {\n status: 'idle',\n pendingTokens: 0,\n threshold: 30000,\n thresholdPercent: 0,\n observationTokens: 0,\n reflectionThreshold: 40000,\n reflectionThresholdPercent: 0,\n buffered: {\n observations: {\n status: 'idle',\n chunks: 0,\n messageTokens: 0,\n projectedMessageRemoval: 0,\n observationTokens: 0,\n },\n reflection: {\n status: 'idle',\n inputObservationTokens: 0,\n observationTokens: 0,\n },\n },\n generationCount: 0,\n stepNumber: 0,\n preReflectionTokens: 0,\n };\n}\n\n// =============================================================================\n// Events\n// =============================================================================\n\n/**\n * Events emitted by the harness that UIs can subscribe to.\n */\nexport type HarnessEvent =\n | { type: 'mode_changed'; modeId: string; previousModeId: string }\n | { type: 'model_changed'; modelId: string; scope?: 'global' | 'thread' | 'mode'; modeId?: string }\n | { type: 'thread_changed'; threadId: string; previousThreadId: string | null }\n | { type: 'thread_created'; thread: HarnessThread }\n | { type: 'state_changed'; state: Record<string, unknown>; changedKeys: string[] }\n | { type: 'agent_start' }\n | { type: 'agent_end'; reason?: 'complete' | 'aborted' | 'error' }\n | { type: 'message_start'; message: HarnessMessage }\n | { type: 'message_update'; message: HarnessMessage }\n | { type: 'message_end'; message: HarnessMessage }\n | { type: 'tool_start'; toolCallId: string; toolName: string; args: unknown }\n | { type: 'tool_approval_required'; toolCallId: string; toolName: string; args: unknown }\n | { type: 'tool_update'; toolCallId: string; partialResult: unknown }\n | { type: 'tool_end'; toolCallId: string; result: unknown; isError: boolean }\n | { type: 'tool_input_start'; toolCallId: string; toolName: string }\n | { type: 'tool_input_delta'; toolCallId: string; argsTextDelta: string; toolName?: string }\n | { type: 'tool_input_end'; toolCallId: string }\n | { type: 'shell_output'; toolCallId: string; output: string; stream: 'stdout' | 'stderr' }\n | { type: 'usage_update'; usage: TokenUsage }\n | { type: 'info'; message: string }\n | { type: 'error'; error: Error; errorType?: string; retryable?: boolean; retryDelay?: number }\n | { type: 'follow_up_queued'; count: number }\n | { type: 'workspace_status_changed'; status: WorkspaceStatus; error?: Error }\n | { type: 'workspace_ready'; workspaceId: string; workspaceName: string }\n | { type: 'workspace_error'; error: Error }\n | {\n type: 'om_status';\n windows: {\n active: {\n messages: { tokens: number; threshold: number };\n observations: { tokens: number; threshold: number };\n };\n buffered: {\n observations: {\n status: 'idle' | 'running' | 'complete';\n chunks: number;\n messageTokens: number;\n projectedMessageRemoval: number;\n observationTokens: number;\n };\n reflection: {\n status: 'idle' | 'running' | 'complete';\n inputObservationTokens: number;\n observationTokens: number;\n };\n };\n };\n recordId: string;\n threadId: string;\n stepNumber: number;\n generationCount: number;\n }\n | {\n type: 'om_observation_start';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n tokensToObserve: number;\n }\n | {\n type: 'om_observation_end';\n cycleId: string;\n durationMs: number;\n tokensObserved: number;\n observationTokens: number;\n observations?: string;\n currentTask?: string;\n suggestedResponse?: string;\n }\n | { type: 'om_observation_failed'; cycleId: string; error: string; durationMs: number }\n | { type: 'om_reflection_start'; cycleId: string; tokensToReflect: number }\n | {\n type: 'om_reflection_end';\n cycleId: string;\n durationMs: number;\n compressedTokens: number;\n observations?: string;\n }\n | { type: 'om_reflection_failed'; cycleId: string; error: string; durationMs: number }\n | { type: 'om_model_changed'; role: 'observer' | 'reflector'; modelId: string }\n | {\n type: 'om_buffering_start';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n tokensToBuffer: number;\n }\n | {\n type: 'om_buffering_end';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n tokensBuffered: number;\n bufferedTokens: number;\n observations?: string;\n }\n | {\n type: 'om_buffering_failed';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n error: string;\n }\n | {\n type: 'om_activation';\n cycleId: string;\n operationType: 'observation' | 'reflection';\n chunksActivated: number;\n tokensActivated: number;\n observationTokens: number;\n messagesActivated: number;\n generationCount: number;\n }\n | {\n type: 'ask_question';\n questionId: string;\n question: string;\n options?: Array<{ label: string; description?: string }>;\n }\n | {\n type: 'plan_approval_required';\n planId: string;\n title: string;\n plan: string;\n }\n | { type: 'plan_approved' }\n | { type: 'subagent_start'; toolCallId: string; agentType: string; task: string; modelId: string }\n | { type: 'subagent_text_delta'; toolCallId: string; agentType: string; textDelta: string }\n | {\n type: 'subagent_tool_start';\n toolCallId: string;\n agentType: string;\n subToolName: string;\n subToolArgs: unknown;\n }\n | {\n type: 'subagent_tool_end';\n toolCallId: string;\n agentType: string;\n subToolName: string;\n subToolResult: unknown;\n isError: boolean;\n }\n | {\n type: 'subagent_end';\n toolCallId: string;\n agentType: string;\n result: string;\n isError: boolean;\n durationMs: number;\n }\n | { type: 'subagent_model_changed'; modelId: string; scope: 'global' | 'thread'; agentType?: string }\n | {\n type: 'task_updated';\n tasks: Array<{\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n }\n | { type: 'display_state_changed'; displayState: HarnessDisplayState };\n\n/**\n * Listener function for harness events.\n */\nexport type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;\n\n// =============================================================================\n// Messages\n// =============================================================================\n\n/**\n * Simplified message type for UI consumption.\n * Maps from Mastra's internal message format.\n */\nexport interface HarnessMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: HarnessMessageContent[];\n createdAt: Date;\n stopReason?: 'complete' | 'tool_use' | 'aborted' | 'error';\n errorMessage?: string;\n}\n\nexport type HarnessMessageContent =\n | { type: 'text'; text: string }\n | { type: 'thinking'; thinking: string }\n | { type: 'tool_call'; id: string; name: string; args: unknown }\n | { type: 'tool_result'; id: string; name: string; result: unknown; isError: boolean }\n | { type: 'image'; data: string; mimeType: string }\n | {\n type: 'om_observation_start';\n tokensToObserve: number;\n operationType?: 'observation' | 'reflection';\n }\n | {\n type: 'om_observation_end';\n tokensObserved: number;\n observationTokens: number;\n durationMs: number;\n operationType?: 'observation' | 'reflection';\n observations?: string;\n currentTask?: string;\n suggestedResponse?: string;\n }\n | {\n type: 'om_observation_failed';\n error: string;\n tokensAttempted?: number;\n operationType?: 'observation' | 'reflection';\n };\n\n// =============================================================================\n// Request Context\n// =============================================================================\n\n/**\n * Harness-specific context set on the RequestContext under the 'harness' key.\n * Tools can access harness state and methods through requestContext.get('harness').\n */\nexport interface HarnessRequestContext<TState extends HarnessStateSchema = HarnessStateSchema> {\n /** The harness instance ID */\n harnessId: string;\n\n /** Current harness state (read-only snapshot) */\n state: z.infer<TState>;\n\n /** Get the current harness state (live, not snapshot) */\n getState: () => z.infer<TState>;\n\n /** Update harness state */\n setState: (updates: Partial<z.infer<TState>>) => Promise<void>;\n\n /** Current thread ID */\n threadId: string | null;\n\n /** Current resource ID */\n resourceId: string;\n\n /** Current mode ID */\n modeId: string;\n\n /** Abort signal for the current operation */\n abortSignal?: AbortSignal;\n\n /** Workspace instance (if configured on the Harness) */\n workspace?: Workspace;\n\n /** Emit a harness event (used by tools to forward events) */\n emitEvent?: (event: HarnessEvent) => void;\n\n /** Register a pending question resolver (used by ask_user tools) */\n registerQuestion?: (params: { questionId: string; resolve: (answer: string) => void }) => void;\n\n /** Register a pending plan approval resolver (used by submit_plan tools) */\n registerPlanApproval?: (params: {\n planId: string;\n resolve: (result: { action: 'approved' | 'rejected'; feedback?: string }) => void;\n }) => void;\n\n /** Get the configured subagent model ID for a specific agent type */\n getSubagentModelId?: (params?: { agentType?: string }) => string | null;\n}\n","import type { z } from 'zod';\n\nimport type { Agent } from '../agent';\nimport type { ToolsInput, ToolsetsInput } from '../agent/types';\nimport type { StorageThreadType } from '../memory/types';\nimport { RequestContext } from '../request-context';\nimport type { MemoryStorage } from '../storage/domains/memory/base';\nimport type { ObservationalMemoryRecord } from '../storage/types';\nimport { Workspace } from '../workspace/workspace';\nimport type { WorkspaceConfig } from '../workspace/workspace';\n\nimport { askUserTool, createSubagentTool, submitPlanTool, taskCheckTool, taskWriteTool } from './tools';\nimport { defaultDisplayState, defaultOMProgressState } from './types';\nimport type {\n AvailableModel,\n HeartbeatHandler,\n HarnessConfig,\n HarnessDisplayState,\n HarnessEvent,\n HarnessEventListener,\n HarnessMessage,\n HarnessMessageContent,\n HarnessMode,\n HarnessRequestContext,\n HarnessSession,\n HarnessStateSchema,\n HarnessThread,\n ModelAuthStatus,\n PermissionPolicy,\n PermissionRules,\n ToolCategory,\n} from './types';\n\n/**\n * The Harness orchestrates multiple agent modes, shared state, memory, and storage.\n * It's the core abstraction that a TUI (or other UI) controls.\n *\n * @example\n * ```ts\n * const harness = new Harness({\n * id: \"my-coding-agent\",\n * storage: new LibSQLStore({ url: \"file:./data.db\" }),\n * stateSchema: z.object({\n * currentModelId: z.string().optional(),\n * }),\n * modes: [\n * { id: \"plan\", name: \"Plan\", default: true, agent: planAgent },\n * { id: \"build\", name: \"Build\", agent: buildAgent },\n * ],\n * })\n *\n * harness.subscribe((event) => {\n * if (event.type === \"message_update\") renderMessage(event.message)\n * })\n *\n * await harness.init()\n * await harness.sendMessage({ content: \"Hello!\" })\n * ```\n */\nexport class Harness<TState extends HarnessStateSchema = HarnessStateSchema> {\n readonly id: string;\n\n private config: HarnessConfig<TState>;\n private state: z.infer<TState>;\n private currentModeId: string;\n private currentThreadId: string | null = null;\n private resourceId: string;\n private listeners: HarnessEventListener[] = [];\n private abortController: AbortController | null = null;\n private abortRequested: boolean = false;\n private currentRunId: string | null = null;\n private currentOperationId: number = 0;\n private followUpQueue: string[] = [];\n private pendingApprovalResolve: ((decision: 'approve' | 'decline') => void) | null = null;\n private pendingApprovalToolName: string | null = null;\n private pendingQuestions = new Map<string, (answer: string) => void>();\n private pendingPlanApprovals = new Map<\n string,\n (result: { action: 'approved' | 'rejected'; feedback?: string }) => void\n >();\n private workspace: Workspace | undefined = undefined;\n private workspaceFn:\n | ((ctx: { requestContext: RequestContext }) => Promise<Workspace | undefined> | Workspace | undefined)\n | undefined = undefined;\n private workspaceInitialized = false;\n private heartbeatTimers = new Map<string, { timer: NodeJS.Timeout; shutdown?: () => void | Promise<void> }>();\n private tokenUsage: { promptTokens: number; completionTokens: number; totalTokens: number } = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n private sessionGrantedCategories = new Set<string>();\n private sessionGrantedTools = new Set<string>();\n private displayState: HarnessDisplayState = defaultDisplayState();\n\n constructor(config: HarnessConfig<TState>) {\n this.id = config.id;\n this.config = config;\n this.resourceId = config.resourceId ?? config.id;\n\n // Initialize state from schema defaults + initial state\n this.state = {\n ...this.getSchemaDefaults(),\n ...config.initialState,\n } as z.infer<TState>;\n\n // Find default mode\n const defaultMode = config.modes.find(m => m.default) ?? config.modes[0];\n if (!defaultMode) {\n throw new Error('Harness requires at least one agent mode');\n }\n this.currentModeId = defaultMode.id;\n\n // Store workspace: pre-built instance, dynamic factory, or config (constructed in init())\n if (config.workspace instanceof Workspace) {\n this.workspace = config.workspace;\n } else if (typeof config.workspace === 'function') {\n this.workspaceFn = config.workspace;\n }\n\n // Seed model from mode default if not set\n const currentModel = (this.state as any).currentModelId;\n if (!currentModel && defaultMode.defaultModelId) {\n void this.setState({ currentModelId: defaultMode.defaultModelId } as Partial<z.infer<TState>>);\n }\n }\n\n // ===========================================================================\n // Initialization\n // ===========================================================================\n\n /**\n * Initialize the harness — loads storage and workspace.\n * Must be called before using the harness.\n */\n async init(): Promise<void> {\n if (this.config.storage) {\n await this.config.storage.init();\n }\n\n // Initialize workspace if configured (skip for dynamic factory — resolved per-request)\n if (this.config.workspace && !this.workspaceInitialized && !this.workspaceFn) {\n try {\n if (!this.workspace) {\n this.workspace = new Workspace(this.config.workspace as WorkspaceConfig);\n }\n\n this.emit({ type: 'workspace_status_changed', status: 'initializing' });\n await this.workspace.init();\n this.workspaceInitialized = true;\n\n this.emit({ type: 'workspace_status_changed', status: 'ready' });\n this.emit({\n type: 'workspace_ready',\n workspaceId: this.workspace.id,\n workspaceName: this.workspace.name,\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.workspace = undefined;\n this.workspaceInitialized = false;\n\n this.emit({ type: 'workspace_status_changed', status: 'error', error: err });\n this.emit({ type: 'workspace_error', error: err });\n }\n }\n\n // Propagate harness-level memory and workspace to mode agents (after workspace init)\n const workspaceForAgents = this.workspaceFn ?? this.workspace;\n for (const mode of this.config.modes) {\n const agent = typeof mode.agent === 'function' ? null : mode.agent;\n if (!agent) continue;\n\n if (this.config.memory && !agent.hasOwnMemory()) {\n agent.__setMemory(this.config.memory);\n }\n if (workspaceForAgents && !agent.hasOwnWorkspace()) {\n agent.__setWorkspace(workspaceForAgents);\n }\n }\n\n this.startHeartbeats();\n }\n\n /**\n * Select the most recent thread, or create one if none exist.\n */\n async selectOrCreateThread(): Promise<HarnessThread> {\n const threads = await this.listThreads();\n\n if (threads.length === 0) {\n return await this.createThread();\n }\n\n const sortedThreads = [...threads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n const mostRecent = sortedThreads[0]!;\n this.config.threadLock?.acquire(mostRecent.id);\n this.currentThreadId = mostRecent.id;\n await this.loadThreadMetadata();\n\n return mostRecent;\n }\n\n private async getMemoryStorage(): Promise<MemoryStorage> {\n if (!this.config.storage) {\n throw new Error('Storage is not configured on this Harness');\n }\n const memoryStorage = await this.config.storage.getStore('memory');\n if (!memoryStorage) {\n throw new Error('Storage does not have a memory domain configured');\n }\n return memoryStorage;\n }\n\n // ===========================================================================\n // State Management\n // ===========================================================================\n\n /**\n * Get current harness state (read-only snapshot).\n */\n getState(): Readonly<z.infer<TState>> {\n return { ...this.state };\n }\n\n /**\n * Update harness state. Validates against schema if provided.\n * Emits state_changed event.\n */\n async setState(updates: Partial<z.infer<TState>>): Promise<void> {\n const changedKeys = Object.keys(updates);\n const newState = { ...this.state, ...updates };\n\n if (this.config.stateSchema) {\n const result = this.config.stateSchema.safeParse(newState);\n if (!result.success) {\n throw new Error(`Invalid state update: ${result.error.message}`);\n }\n this.state = result.data as z.infer<TState>;\n } else {\n this.state = newState as z.infer<TState>;\n }\n\n this.emit({ type: 'state_changed', state: this.state, changedKeys });\n }\n\n private getSchemaDefaults(): Partial<z.infer<TState>> {\n if (!this.config.stateSchema) return {};\n\n const shape = this.config.stateSchema.shape;\n const defaults: Record<string, unknown> = {};\n\n for (const [key, field] of Object.entries(shape)) {\n try {\n const result = (field as any).safeParse(undefined);\n if (result.success && result.data !== undefined) {\n defaults[key] = result.data;\n }\n } catch {\n // field has no default or doesn't support safeParse — skip\n }\n }\n\n return defaults as Partial<z.infer<TState>>;\n }\n\n // ===========================================================================\n // Mode Management\n // ===========================================================================\n\n listModes(): HarnessMode<TState>[] {\n return this.config.modes;\n }\n\n getCurrentModeId(): string {\n return this.currentModeId;\n }\n\n getCurrentMode(): HarnessMode<TState> {\n const mode = this.config.modes.find(m => m.id === this.currentModeId);\n if (!mode) {\n throw new Error(`Mode not found: ${this.currentModeId}`);\n }\n return mode;\n }\n\n /**\n * Switch to a different mode.\n * Aborts any in-progress generation and switches to the mode's default model.\n */\n async switchMode({ modeId }: { modeId: string }): Promise<void> {\n const mode = this.config.modes.find(m => m.id === modeId);\n if (!mode) {\n throw new Error(`Mode not found: ${modeId}`);\n }\n\n this.abort();\n\n // Save current model to the outgoing mode before switching\n const currentModelId = this.getCurrentModelId();\n if (currentModelId) {\n await this.setThreadSetting({ key: `modeModelId_${this.currentModeId}`, value: currentModelId });\n }\n\n const previousModeId = this.currentModeId;\n this.currentModeId = modeId;\n\n await this.setThreadSetting({ key: 'currentModeId', value: modeId });\n\n // Load the incoming mode's model\n const modeModelId = await this.loadModeModelId(modeId);\n if (modeModelId) {\n void this.setState({ currentModelId: modeModelId } as Partial<z.infer<TState>>);\n this.emit({ type: 'model_changed', modelId: modeModelId } as HarnessEvent);\n }\n\n this.emit({ type: 'mode_changed', modeId, previousModeId });\n }\n\n /**\n * Load the stored model ID for a specific mode.\n * Falls back to: thread metadata -> mode's defaultModelId -> current model.\n */\n private async loadModeModelId(modeId: string): Promise<string | null> {\n if (this.currentThreadId && this.config.storage) {\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n const meta = thread?.metadata as Record<string, unknown> | undefined;\n const stored = meta?.[`modeModelId_${modeId}`] as string | undefined;\n if (stored) return stored;\n } catch {\n // Fall through to defaults\n }\n }\n\n const mode = this.config.modes.find(m => m.id === modeId);\n if (mode?.defaultModelId) return mode.defaultModelId;\n\n return null;\n }\n\n /**\n * Get the agent for the current mode.\n */\n private getCurrentAgent(): Agent {\n const mode = this.getCurrentMode();\n if (typeof mode.agent === 'function') {\n return mode.agent(this.state);\n }\n return mode.agent;\n }\n\n /**\n * Get a short display name from the current model ID.\n */\n getModelName(): string {\n const modelId = this.getCurrentModelId();\n if (!modelId || modelId === 'unknown') return modelId || 'unknown';\n const parts = modelId.split('/');\n return parts[parts.length - 1] || modelId;\n }\n\n /**\n * Get the full model ID (e.g., \"anthropic/claude-sonnet-4\").\n */\n getFullModelId(): string {\n return this.getCurrentModelId();\n }\n\n /**\n * Switch to a different model at runtime.\n */\n async switchModel({\n modelId,\n scope = 'thread',\n modeId,\n }: {\n modelId: string;\n scope?: 'global' | 'thread';\n modeId?: string;\n }): Promise<void> {\n const targetModeId = modeId ?? this.currentModeId;\n\n if (targetModeId === this.currentModeId) {\n void this.setState({ currentModelId: modelId } as Partial<z.infer<TState>>);\n }\n\n if (scope === 'thread') {\n await this.setThreadSetting({ key: `modeModelId_${targetModeId}`, value: modelId });\n }\n\n this.emit({ type: 'model_changed', modelId, scope, modeId: targetModeId } as HarnessEvent);\n }\n\n getCurrentModelId(): string {\n const state = this.getState() as { currentModelId?: string };\n return state.currentModelId ?? '';\n }\n\n hasModelSelected(): boolean {\n return this.getCurrentModelId() !== '';\n }\n\n /**\n * Check if the current model's provider has authentication configured.\n * Uses the provider registry's `apiKeyEnvVar` and the optional `modelAuthChecker` hook.\n */\n async getCurrentModelAuthStatus(): Promise<ModelAuthStatus> {\n const modelId = this.getCurrentModelId();\n const provider = modelId.split('/')[0];\n if (!provider) return { hasAuth: true };\n\n if (this.config.modelAuthChecker) {\n const result = this.config.modelAuthChecker(provider);\n if (result === true) return { hasAuth: true };\n if (result === false) {\n const apiKeyEnvVar = await this.getProviderApiKeyEnvVar(provider);\n return { hasAuth: false, apiKeyEnvVar };\n }\n }\n\n try {\n const { PROVIDER_REGISTRY } = await import('../llm/model/provider-registry.js');\n const registry = PROVIDER_REGISTRY as Record<string, { apiKeyEnvVar?: string | string[] }>;\n const providerConfig = registry[provider];\n const envVars = providerConfig?.apiKeyEnvVar;\n const apiKeyEnvVar = Array.isArray(envVars) ? envVars[0] : envVars;\n if (apiKeyEnvVar && process.env[apiKeyEnvVar]) {\n return { hasAuth: true };\n }\n return { hasAuth: false, apiKeyEnvVar: apiKeyEnvVar || undefined };\n } catch {\n return { hasAuth: true };\n }\n }\n\n /**\n * Get all available models from the provider registry with auth status.\n * Uses the optional `modelAuthChecker` and `modelUseCountProvider` hooks.\n */\n async listAvailableModels(): Promise<AvailableModel[]> {\n try {\n const { PROVIDER_REGISTRY } = await import('../llm/model/provider-registry.js');\n\n if (!PROVIDER_REGISTRY) return [];\n\n const registry = PROVIDER_REGISTRY as Record<\n string,\n { models?: string[]; name?: string; apiKeyEnvVar?: string | string[] }\n >;\n const providers = Object.keys(registry);\n const useCounts = this.config.modelUseCountProvider?.() ?? {};\n const models: AvailableModel[] = [];\n\n for (const provider of providers) {\n const providerConfig = registry[provider];\n const envVars = providerConfig?.apiKeyEnvVar;\n const apiKeyEnvVar = Array.isArray(envVars) ? envVars[0] : envVars;\n const hasEnvKey = apiKeyEnvVar ? !!process.env[apiKeyEnvVar] : false;\n\n let hasApiKey = hasEnvKey;\n if (!hasApiKey && this.config.modelAuthChecker) {\n const customAuth = this.config.modelAuthChecker(provider);\n if (customAuth === true) hasApiKey = true;\n }\n\n if (providerConfig?.models && Array.isArray(providerConfig.models)) {\n for (const modelName of providerConfig.models) {\n const id = `${provider}/${modelName}`;\n models.push({\n id,\n provider,\n modelName,\n hasApiKey,\n apiKeyEnvVar: apiKeyEnvVar || undefined,\n useCount: useCounts[id] ?? 0,\n });\n }\n }\n }\n\n return models;\n } catch (error) {\n console.warn('Failed to load available models:', error);\n return [];\n }\n }\n\n private async getProviderApiKeyEnvVar(provider: string): Promise<string | undefined> {\n try {\n const { PROVIDER_REGISTRY } = await import('../llm/model/provider-registry.js');\n const registry = PROVIDER_REGISTRY as Record<string, { apiKeyEnvVar?: string | string[] }>;\n const envVars = registry[provider]?.apiKeyEnvVar;\n return Array.isArray(envVars) ? envVars[0] : envVars;\n } catch {\n return undefined;\n }\n }\n\n // ===========================================================================\n // Thread Management\n // ===========================================================================\n\n getCurrentThreadId(): string | null {\n return this.currentThreadId;\n }\n\n getResourceId(): string {\n return this.resourceId;\n }\n\n setResourceId({ resourceId }: { resourceId: string }): void {\n this.resourceId = resourceId;\n this.currentThreadId = null;\n }\n\n async createThread({ title }: { title?: string } = {}): Promise<HarnessThread> {\n const now = new Date();\n const thread: HarnessThread = {\n id: this.generateId(),\n resourceId: this.resourceId,\n title: title || '',\n createdAt: now,\n updatedAt: now,\n };\n\n const currentStateModel = (this.state as any).currentModelId;\n const currentMode = this.getCurrentMode();\n const modelId = currentStateModel || currentMode.defaultModelId;\n\n const metadata: Record<string, unknown> = {};\n if (modelId) {\n metadata.currentModelId = modelId;\n metadata[`modeModelId_${this.currentModeId}`] = modelId;\n }\n\n // Auto-tag with projectPath from state so threads are scoped to the working directory\n const projectPath = (this.state as any).projectPath;\n if (projectPath) {\n metadata.projectPath = projectPath;\n }\n\n if (this.config.storage) {\n const memoryStorage = await this.getMemoryStorage();\n await memoryStorage.saveThread({\n thread: {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title!,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n },\n });\n }\n\n // Acquire lock on new thread before releasing old one.\n // If acquire fails, attempt to re-acquire the old lock before rethrowing.\n const oldThreadId = this.currentThreadId;\n if (this.config.threadLock) {\n try {\n this.config.threadLock.acquire(thread.id);\n } catch (err) {\n if (oldThreadId) {\n try {\n this.config.threadLock.acquire(oldThreadId);\n } catch {\n // Best-effort re-acquire; original error is more important\n }\n }\n throw err;\n }\n if (oldThreadId) {\n this.config.threadLock.release(oldThreadId);\n }\n }\n\n this.currentThreadId = thread.id;\n\n if (modelId && !currentStateModel) {\n void this.setState({ currentModelId: modelId } as Partial<z.infer<TState>>);\n }\n\n this.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n this.emit({ type: 'thread_created', thread });\n\n return thread;\n }\n\n async renameThread({ title }: { title: string }): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) return;\n\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n if (thread) {\n await memoryStorage.saveThread({\n thread: { ...thread, title, updatedAt: new Date() },\n });\n }\n }\n\n async switchThread({ threadId }: { threadId: string }): Promise<void> {\n this.abort();\n\n if (this.config.storage) {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId });\n if (!thread) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n }\n\n // Acquire lock on new thread before releasing old one\n this.config.threadLock?.acquire(threadId);\n\n const previousThreadId = this.currentThreadId;\n if (previousThreadId) {\n this.config.threadLock?.release(previousThreadId);\n }\n this.currentThreadId = threadId;\n\n await this.loadThreadMetadata();\n\n this.emit({ type: 'thread_changed', threadId, previousThreadId });\n }\n\n async listThreads(options?: { allResources?: boolean }): Promise<HarnessThread[]> {\n if (!this.config.storage) return [];\n\n const memoryStorage = await this.getMemoryStorage();\n const filter: { resourceId?: string } | undefined = options?.allResources\n ? undefined\n : { resourceId: this.resourceId };\n\n const result = await memoryStorage.listThreads({ filter });\n\n return result.threads.map((thread: StorageThreadType) => ({\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n metadata: thread.metadata,\n }));\n }\n\n async setThreadSetting({ key, value }: { key: string; value: unknown }): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n if (thread) {\n await memoryStorage.saveThread({\n thread: {\n ...thread,\n metadata: { ...thread.metadata, [key]: value },\n updatedAt: new Date(),\n },\n });\n }\n } catch {\n // Settings persistence is not critical\n }\n }\n\n private async deleteThreadSetting({ key }: { key: string }): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n if (thread && thread.metadata) {\n const metadata = { ...thread.metadata };\n delete metadata[key];\n await memoryStorage.saveThread({\n thread: {\n ...thread,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n updatedAt: new Date(),\n },\n });\n }\n } catch {\n // Settings removal is not critical\n }\n }\n\n private async loadThreadMetadata(): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) {\n this.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n return;\n }\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n\n // Load token usage\n const savedUsage = thread?.metadata?.tokenUsage as typeof this.tokenUsage | undefined;\n if (savedUsage) {\n this.tokenUsage = {\n promptTokens: savedUsage.promptTokens ?? 0,\n completionTokens: savedUsage.completionTokens ?? 0,\n totalTokens: savedUsage.totalTokens ?? 0,\n };\n } else {\n this.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n }\n\n const meta = thread?.metadata as Record<string, unknown> | undefined;\n const updates: Record<string, unknown> = {};\n\n // Load model ID: per-mode first, then global\n const modeModelKey = `modeModelId_${this.currentModeId}`;\n if (meta?.[modeModelKey]) {\n updates.currentModelId = meta[modeModelKey];\n } else if (meta?.currentModelId) {\n updates.currentModelId = meta.currentModelId;\n }\n\n // Restore mode\n if (meta?.currentModeId) {\n const savedModeId = meta.currentModeId as string;\n const modeExists = this.config.modes.some(m => m.id === savedModeId);\n if (modeExists && savedModeId !== this.currentModeId) {\n this.currentModeId = savedModeId;\n const restoredModeModelKey = `modeModelId_${savedModeId}`;\n if (meta[restoredModeModelKey]) {\n updates.currentModelId = meta[restoredModeModelKey];\n }\n this.emit({\n type: 'mode_changed',\n modeId: savedModeId,\n previousModeId: this.config.modes.find(m => m.default)?.id || this.config.modes[0]!.id,\n });\n }\n }\n\n if (Object.keys(updates).length > 0) {\n void this.setState(updates as Partial<z.infer<TState>>);\n }\n } catch {\n this.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n }\n }\n\n // ===========================================================================\n // Observational Memory\n // ===========================================================================\n\n /**\n * Load observational memory progress for the current thread.\n * Reads the OM record and recent messages to reconstruct status,\n * then emits an `om_status` event for the UI.\n */\n async loadOMProgress(): Promise<void> {\n if (!this.currentThreadId) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const record = await memoryStorage.getObservationalMemory(this.currentThreadId, this.resourceId);\n\n if (!record) return;\n\n const config = record.config as\n | {\n observationThreshold?: number | { min: number; max: number };\n reflectionThreshold?: number | { min: number; max: number };\n }\n | undefined;\n\n const getThreshold = (val: number | { min: number; max: number } | undefined, fallback: number): number => {\n if (!val) return fallback;\n if (typeof val === 'number') return val;\n return val.max;\n };\n\n let observationThreshold = getThreshold(config?.observationThreshold, 30_000);\n let reflectionThreshold = getThreshold(config?.reflectionThreshold, 40_000);\n\n let messageTokens = record.pendingMessageTokens ?? 0;\n let observationTokens = record.observationTokenCount ?? 0;\n let bufferedObs = {\n status: 'idle' as 'idle' | 'running' | 'complete',\n chunks: 0,\n messageTokens: 0,\n projectedMessageRemoval: 0,\n observationTokens: 0,\n };\n let bufferedRef = {\n status: 'idle' as 'idle' | 'running' | 'complete',\n inputObservationTokens: 0,\n observationTokens: 0,\n };\n let generationCount = 0;\n let stepNumber = 0;\n\n const messagesResult = await memoryStorage.listMessages({\n threadId: this.currentThreadId,\n perPage: 70,\n page: 0,\n orderBy: { field: 'createdAt', direction: 'DESC' },\n });\n const messages = messagesResult.messages;\n let foundStatus = false;\n for (const msg of messages) {\n if (msg.role !== 'assistant') continue;\n const content = msg.content as { parts?: Array<{ type?: string; data?: Record<string, unknown> }> } | string;\n if (typeof content === 'string' || !content?.parts) continue;\n\n for (let i = content.parts.length - 1; i >= 0; i--) {\n const part = content.parts[i] as { type?: string; data?: Record<string, unknown> };\n if (part.type === 'data-om-status' && part.data?.windows) {\n const w = part.data.windows as Record<string, Record<string, Record<string, unknown>>>;\n messageTokens = (w.active?.messages?.tokens as number) ?? messageTokens;\n observationTokens = (w.active?.observations?.tokens as number) ?? observationTokens;\n const msgThresh = w.active?.messages?.threshold as number | undefined;\n const obsThresh = w.active?.observations?.threshold as number | undefined;\n if (msgThresh) observationThreshold = msgThresh;\n if (obsThresh) reflectionThreshold = obsThresh;\n const bo = w.buffered?.observations as Record<string, unknown> | undefined;\n if (bo) {\n bufferedObs = {\n status: (bo.status as 'idle' | 'running' | 'complete') ?? 'idle',\n chunks: (bo.chunks as number) ?? 0,\n messageTokens: (bo.messageTokens as number) ?? 0,\n projectedMessageRemoval: (bo.projectedMessageRemoval as number) ?? 0,\n observationTokens: (bo.observationTokens as number) ?? 0,\n };\n }\n const br = w.buffered?.reflection as Record<string, unknown> | undefined;\n if (br) {\n bufferedRef = {\n status: (br.status as 'idle' | 'running' | 'complete') ?? 'idle',\n inputObservationTokens: (br.inputObservationTokens as number) ?? 0,\n observationTokens: (br.observationTokens as number) ?? 0,\n };\n }\n generationCount = (part.data.generationCount as number) ?? 0;\n stepNumber = (part.data.stepNumber as number) ?? 0;\n foundStatus = true;\n break;\n }\n }\n if (foundStatus) break;\n }\n\n this.emit({\n type: 'om_status',\n windows: {\n active: {\n messages: { tokens: messageTokens, threshold: observationThreshold },\n observations: { tokens: observationTokens, threshold: reflectionThreshold },\n },\n buffered: { observations: bufferedObs, reflection: bufferedRef },\n },\n recordId: record.id ?? '',\n threadId: this.currentThreadId,\n stepNumber,\n generationCount,\n });\n } catch {\n // OM not available or not initialized — that's fine\n }\n }\n\n async getObservationalMemoryRecord(): Promise<ObservationalMemoryRecord | null> {\n if (!this.currentThreadId) return null;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n return await memoryStorage.getObservationalMemory(this.currentThreadId, this.resourceId);\n } catch {\n return null;\n }\n }\n\n /**\n * Returns the observer model ID from state, falling back to omConfig defaults.\n */\n getObserverModelId(): string | undefined {\n return (this.state as any).observerModelId ?? this.config.omConfig?.defaultObserverModelId;\n }\n\n /**\n * Returns the reflector model ID from state, falling back to omConfig defaults.\n */\n getReflectorModelId(): string | undefined {\n return (this.state as any).reflectorModelId ?? this.config.omConfig?.defaultReflectorModelId;\n }\n\n /**\n * Returns the observation threshold from state, falling back to omConfig defaults.\n */\n getObservationThreshold(): number | undefined {\n return (this.state as any).observationThreshold ?? this.config.omConfig?.defaultObservationThreshold;\n }\n\n /**\n * Returns the reflection threshold from state, falling back to omConfig defaults.\n */\n getReflectionThreshold(): number | undefined {\n return (this.state as any).reflectionThreshold ?? this.config.omConfig?.defaultReflectionThreshold;\n }\n\n /**\n * Resolves the observer model ID to a language model instance via `resolveModel`.\n */\n getResolvedObserverModel() {\n const modelId = this.getObserverModelId();\n if (!modelId || !this.config.resolveModel) return undefined;\n return this.config.resolveModel(modelId);\n }\n\n /**\n * Resolves the reflector model ID to a language model instance via `resolveModel`.\n */\n getResolvedReflectorModel() {\n const modelId = this.getReflectorModelId();\n if (!modelId || !this.config.resolveModel) return undefined;\n return this.config.resolveModel(modelId);\n }\n\n /**\n * Switch the Observer model.\n */\n async switchObserverModel({ modelId }: { modelId: string }): Promise<void> {\n void this.setState({ observerModelId: modelId } as Partial<z.infer<TState>>);\n await this.setThreadSetting({ key: 'observerModelId', value: modelId });\n this.emit({ type: 'om_model_changed', role: 'observer', modelId } as HarnessEvent);\n }\n\n /**\n * Switch the Reflector model.\n */\n async switchReflectorModel({ modelId }: { modelId: string }): Promise<void> {\n void this.setState({ reflectorModelId: modelId } as Partial<z.infer<TState>>);\n await this.setThreadSetting({ key: 'reflectorModelId', value: modelId });\n this.emit({ type: 'om_model_changed', role: 'reflector', modelId } as HarnessEvent);\n }\n\n // ===========================================================================\n // Subagent Model Management\n // ===========================================================================\n\n getSubagentModelId({ agentType }: { agentType?: string } = {}): string | null {\n const state = this.state as Record<string, unknown>;\n if (agentType) {\n const perType = state[`subagentModelId_${agentType}`];\n if (typeof perType === 'string') return perType;\n }\n const global = state.subagentModelId;\n return typeof global === 'string' ? global : null;\n }\n\n async setSubagentModelId({ modelId, agentType }: { modelId: string; agentType?: string }): Promise<void> {\n const key = agentType ? `subagentModelId_${agentType}` : 'subagentModelId';\n void this.setState({ [key]: modelId } as Partial<z.infer<TState>>);\n await this.setThreadSetting({ key, value: modelId });\n this.emit({ type: 'subagent_model_changed', modelId, scope: 'thread', agentType } as HarnessEvent);\n }\n\n // ===========================================================================\n // Permissions\n // ===========================================================================\n\n grantSessionCategory({ category }: { category: ToolCategory }): void {\n this.sessionGrantedCategories.add(category);\n }\n\n grantSessionTool({ toolName }: { toolName: string }): void {\n this.sessionGrantedTools.add(toolName);\n }\n\n getSessionGrants(): { categories: ToolCategory[]; tools: string[] } {\n return {\n categories: [...this.sessionGrantedCategories] as ToolCategory[],\n tools: [...this.sessionGrantedTools],\n };\n }\n\n getToolCategory({ toolName }: { toolName: string }): ToolCategory | null {\n return this.config.toolCategoryResolver?.(toolName) ?? null;\n }\n\n setPermissionForCategory({ category, policy }: { category: ToolCategory; policy: PermissionPolicy }): void {\n const rules = this.getPermissionRules();\n rules.categories[category] = policy;\n void this.setState({ permissionRules: rules } as Partial<z.infer<TState>>);\n }\n\n setPermissionForTool({ toolName, policy }: { toolName: string; policy: PermissionPolicy }): void {\n const rules = this.getPermissionRules();\n rules.tools[toolName] = policy;\n void this.setState({ permissionRules: rules } as Partial<z.infer<TState>>);\n }\n\n getPermissionRules(): PermissionRules {\n const state = this.state as Record<string, unknown>;\n const rules = state.permissionRules as PermissionRules | undefined;\n return rules ?? { categories: {}, tools: {} };\n }\n\n /**\n * Resolve whether a tool call should be auto-approved, denied, or asked.\n * Resolution chain: yolo → per-tool policy → session tool grant →\n * session category grant → category policy → \"ask\"\n */\n private resolveToolApproval(toolName: string): PermissionPolicy {\n const state = this.state as Record<string, unknown>;\n if (state.yolo === true) return 'allow';\n\n const rules = this.getPermissionRules();\n\n const toolPolicy = rules.tools[toolName];\n if (toolPolicy) return toolPolicy;\n\n if (this.sessionGrantedTools.has(toolName)) return 'allow';\n\n const category = this.getToolCategory({ toolName });\n if (category) {\n if (this.sessionGrantedCategories.has(category)) return 'allow';\n const categoryPolicy = rules.categories[category];\n if (categoryPolicy) return categoryPolicy;\n }\n\n return 'ask';\n }\n\n // ===========================================================================\n // Message Handling\n // ===========================================================================\n\n /**\n * Send a message to the current agent.\n * Streams the response and emits events.\n */\n async sendMessage({\n content,\n images,\n }: {\n content: string;\n images?: Array<{ data: string; mimeType: string }>;\n }): Promise<void> {\n if (!this.currentThreadId) {\n const thread = await this.createThread();\n this.currentThreadId = thread.id;\n }\n\n const operationId = ++this.currentOperationId;\n this.abortController = new AbortController();\n const agent = this.getCurrentAgent();\n\n this.emit({ type: 'agent_start' });\n\n try {\n const requestContext = await this.buildRequestContext();\n\n const isYolo = (this.state as Record<string, unknown>).yolo === true;\n\n const streamOptions: Record<string, unknown> = {\n memory: { thread: this.currentThreadId, resource: this.resourceId },\n abortSignal: this.abortController.signal,\n requestContext,\n maxSteps: 1000,\n requireToolApproval: !isYolo,\n modelSettings: { temperature: 1 },\n };\n\n streamOptions.toolsets = await this.buildToolsets(requestContext);\n\n let messageInput: string | Record<string, unknown> = content;\n if (images?.length) {\n messageInput = {\n role: 'user',\n content: [\n { type: 'text', text: content },\n ...images.map((img: { data: string; mimeType: string }) => ({\n type: 'file',\n data: img.data,\n mediaType: img.mimeType,\n })),\n ],\n };\n }\n\n const response = await agent.stream(messageInput as any, streamOptions as any);\n await this.processStream(response);\n\n if (this.currentOperationId === operationId) {\n const reason = this.abortRequested ? 'aborted' : 'complete';\n this.emit({ type: 'agent_end', reason });\n }\n } catch (error) {\n if (this.currentOperationId !== operationId) return;\n\n if (error instanceof Error && error.name === 'AbortError') {\n this.emit({ type: 'agent_end', reason: 'aborted' });\n } else if (error instanceof Error && error.message.match(/^Tool .+ not found$/)) {\n const badTool = error.message.replace('Tool ', '').replace(' not found', '');\n this.emit({\n type: 'error',\n error: new Error(`Unknown tool \"${badTool}\".`),\n retryable: true,\n });\n this.followUpQueue.push(\n `[System] Your previous tool call used \"${badTool}\" which is not a valid tool. Please retry with the correct tool name.`,\n );\n this.emit({ type: 'agent_end', reason: 'error' });\n } else {\n const err = error instanceof Error ? error : new Error(String(error));\n this.emit({ type: 'error', error: err });\n this.emit({ type: 'agent_end', reason: 'error' });\n }\n } finally {\n if (this.currentOperationId === operationId) {\n this.abortController = null;\n this.abortRequested = false;\n }\n\n if (this.currentOperationId === operationId && this.followUpQueue.length > 0) {\n const next = this.followUpQueue.shift()!;\n await this.sendMessage({ content: next });\n }\n }\n }\n\n async listMessages(options?: { limit?: number }): Promise<HarnessMessage[]> {\n if (!this.currentThreadId) return [];\n return this.listMessagesForThread({ threadId: this.currentThreadId, limit: options?.limit });\n }\n\n async listMessagesForThread({ threadId, limit }: { threadId: string; limit?: number }): Promise<HarnessMessage[]> {\n if (!this.config.storage) return [];\n\n const memoryStorage = await this.getMemoryStorage();\n\n if (limit) {\n const result = await memoryStorage.listMessages({\n threadId,\n perPage: limit,\n page: 0,\n orderBy: { field: 'createdAt', direction: 'DESC' },\n });\n return result.messages.map(msg => this.convertToHarnessMessage(msg)).reverse();\n }\n\n const result = await memoryStorage.listMessages({ threadId, perPage: false });\n return result.messages.map(msg => this.convertToHarnessMessage(msg));\n }\n\n async getFirstUserMessageForThread({ threadId }: { threadId: string }): Promise<HarnessMessage | null> {\n if (!this.config.storage) return null;\n\n const memoryStorage = await this.getMemoryStorage();\n const result = await memoryStorage.listMessages({\n threadId,\n perPage: 5,\n page: 0,\n orderBy: { field: 'createdAt', direction: 'ASC' },\n });\n const userMsg = result.messages.find(m => m.role === 'user');\n return userMsg ? this.convertToHarnessMessage(userMsg) : null;\n }\n\n private convertToHarnessMessage(msg: {\n id: string;\n role: 'user' | 'assistant' | 'system';\n createdAt: Date;\n content: {\n parts: Array<{\n type: string;\n text?: string;\n reasoning?: string;\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n result?: unknown;\n isError?: boolean;\n toolInvocation?: {\n state: string;\n toolCallId: string;\n toolName: string;\n args?: unknown;\n result?: unknown;\n isError?: boolean;\n };\n [key: string]: unknown;\n }>;\n };\n }): HarnessMessage {\n const content: HarnessMessageContent[] = [];\n\n for (const part of msg.content.parts) {\n switch (part.type) {\n case 'text':\n if (part.text) {\n content.push({ type: 'text', text: part.text });\n }\n break;\n case 'reasoning':\n if (part.reasoning) {\n content.push({ type: 'thinking', thinking: part.reasoning });\n }\n break;\n case 'tool-invocation':\n if (part.toolInvocation) {\n const inv = part.toolInvocation;\n content.push({ type: 'tool_call', id: inv.toolCallId, name: inv.toolName, args: inv.args });\n if (inv.state === 'result' && inv.result !== undefined) {\n content.push({\n type: 'tool_result',\n id: inv.toolCallId,\n name: inv.toolName,\n result: inv.result,\n isError: inv.isError ?? false,\n });\n }\n } else if (part.toolCallId && part.toolName) {\n content.push({ type: 'tool_call', id: part.toolCallId, name: part.toolName, args: part.args });\n }\n break;\n case 'tool-call':\n if (part.toolCallId && part.toolName) {\n content.push({ type: 'tool_call', id: part.toolCallId, name: part.toolName, args: part.args });\n }\n break;\n case 'tool-result':\n if (part.toolCallId && part.toolName) {\n content.push({\n type: 'tool_result',\n id: part.toolCallId,\n name: part.toolName,\n result: part.result,\n isError: part.isError ?? false,\n });\n }\n break;\n case 'data-om-observation-start': {\n const data = (part as { data?: Record<string, unknown> }).data ?? {};\n content.push({\n type: 'om_observation_start',\n tokensToObserve: (data.tokensToObserve as number) ?? 0,\n operationType: (data.operationType as 'observation' | 'reflection') ?? 'observation',\n });\n break;\n }\n case 'data-om-observation-end': {\n const data = (part as { data?: Record<string, unknown> }).data ?? {};\n content.push({\n type: 'om_observation_end',\n tokensObserved: (data.tokensObserved as number) ?? 0,\n observationTokens: (data.observationTokens as number) ?? 0,\n durationMs: (data.durationMs as number) ?? 0,\n operationType: (data.operationType as 'observation' | 'reflection') ?? 'observation',\n observations: (data.observations as string) ?? undefined,\n currentTask: (data.currentTask as string) ?? undefined,\n suggestedResponse: (data.suggestedResponse as string) ?? undefined,\n });\n break;\n }\n case 'data-om-observation-failed': {\n const data = (part as { data?: Record<string, unknown> }).data ?? {};\n content.push({\n type: 'om_observation_failed',\n error: (data.error as string) ?? 'Unknown error',\n tokensAttempted: (data.tokensAttempted as number) ?? 0,\n operationType: (data.operationType as 'observation' | 'reflection') ?? 'observation',\n });\n break;\n }\n // Skip other part types (step-start, data-om-status, etc.)\n }\n }\n\n return { id: msg.id, role: msg.role, content, createdAt: msg.createdAt };\n }\n\n /**\n * Process a stream response (shared between sendMessage and tool approval).\n */\n private async processStream(response: { fullStream: AsyncIterable<any> }): Promise<{ message: HarnessMessage }> {\n let currentMessage: HarnessMessage = {\n id: this.generateId(),\n role: 'assistant',\n content: [],\n createdAt: new Date(),\n };\n\n const textContentById = new Map<string, { index: number; text: string }>();\n const thinkingContentById = new Map<string, { index: number; text: string }>();\n\n for await (const chunk of response.fullStream) {\n if ('runId' in chunk && chunk.runId) {\n this.currentRunId = chunk.runId;\n }\n\n switch (chunk.type) {\n case 'text-start': {\n const textIndex = currentMessage.content.length;\n currentMessage.content.push({ type: 'text', text: '' });\n textContentById.set(chunk.payload.id, { index: textIndex, text: '' });\n this.emit({ type: 'message_start', message: { ...currentMessage } });\n break;\n }\n\n case 'text-delta': {\n const textState = textContentById.get(chunk.payload.id);\n if (textState) {\n textState.text += chunk.payload.text;\n const textContent = currentMessage.content[textState.index];\n if (textContent && textContent.type === 'text') {\n textContent.text = textState.text;\n }\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n }\n break;\n }\n\n case 'reasoning-start': {\n const thinkingIndex = currentMessage.content.length;\n currentMessage.content.push({ type: 'thinking', thinking: '' });\n thinkingContentById.set(chunk.payload.id, { index: thinkingIndex, text: '' });\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n break;\n }\n\n case 'reasoning-delta': {\n const thinkingState = thinkingContentById.get(chunk.payload.id);\n if (thinkingState) {\n thinkingState.text += chunk.payload.text;\n const thinkingContent = currentMessage.content[thinkingState.index];\n if (thinkingContent && thinkingContent.type === 'thinking') {\n thinkingContent.thinking = thinkingState.text;\n }\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n }\n break;\n }\n\n case 'tool-call-input-streaming-start': {\n const { toolCallId, toolName } = chunk.payload;\n this.emit({ type: 'tool_input_start', toolCallId, toolName });\n break;\n }\n\n case 'tool-call-delta': {\n const { toolCallId, argsTextDelta, toolName } = chunk.payload;\n this.emit({ type: 'tool_input_delta', toolCallId, argsTextDelta, toolName });\n break;\n }\n\n case 'tool-call-input-streaming-end': {\n const { toolCallId } = chunk.payload;\n this.emit({ type: 'tool_input_end', toolCallId });\n break;\n }\n\n case 'tool-call': {\n const toolCall = chunk.payload;\n currentMessage.content.push({\n type: 'tool_call',\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n args: toolCall.args,\n });\n this.emit({\n type: 'tool_start',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: toolCall.args,\n });\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n break;\n }\n\n case 'tool-result': {\n const toolResult = chunk.payload;\n currentMessage.content.push({\n type: 'tool_result',\n id: toolResult.toolCallId,\n name: toolResult.toolName,\n result: toolResult.result,\n isError: toolResult.isError ?? false,\n });\n this.emit({\n type: 'tool_end',\n toolCallId: toolResult.toolCallId,\n result: toolResult.result,\n isError: toolResult.isError ?? false,\n });\n this.emit({ type: 'message_update', message: { ...currentMessage } });\n break;\n }\n\n case 'tool-error': {\n const toolError = chunk.payload;\n this.emit({ type: 'tool_end', toolCallId: toolError.toolCallId, result: toolError.error, isError: true });\n break;\n }\n\n case 'tool-call-approval': {\n const toolCallId = chunk.payload.toolCallId;\n const toolName = chunk.payload.toolName;\n const toolArgs = chunk.payload.args;\n\n const policy = this.resolveToolApproval(toolName);\n\n if (policy === 'allow') {\n const result = await this.handleToolApprove(toolCallId);\n currentMessage = result.message;\n return { message: currentMessage };\n }\n\n if (policy === 'deny') {\n const result = await this.handleToolDecline(toolCallId);\n currentMessage = result.message;\n return { message: currentMessage };\n }\n\n this.pendingApprovalToolName = toolName;\n this.emit({ type: 'tool_approval_required', toolCallId, toolName, args: toolArgs });\n\n const decision = await new Promise<'approve' | 'decline'>(resolve => {\n this.pendingApprovalResolve = resolve;\n });\n this.pendingApprovalToolName = null;\n\n if (decision === 'approve') {\n const result = await this.handleToolApprove(toolCallId);\n currentMessage = result.message;\n return { message: currentMessage };\n } else {\n const result = await this.handleToolDecline(toolCallId);\n currentMessage = result.message;\n return { message: currentMessage };\n }\n }\n\n case 'error': {\n const streamError =\n chunk.payload.error instanceof Error ? chunk.payload.error : new Error(String(chunk.payload.error));\n this.emit({ type: 'error', error: streamError });\n break;\n }\n\n case 'step-finish': {\n const usage = chunk.payload?.output?.usage;\n if (usage) {\n const promptTokens = usage.promptTokens ?? 0;\n const completionTokens = usage.completionTokens ?? 0;\n const totalTokens = promptTokens + completionTokens;\n\n this.tokenUsage.promptTokens += promptTokens;\n this.tokenUsage.completionTokens += completionTokens;\n this.tokenUsage.totalTokens += totalTokens;\n\n this.persistTokenUsage().catch(() => {});\n this.emit({ type: 'usage_update', usage: { promptTokens, completionTokens, totalTokens } });\n }\n break;\n }\n\n case 'finish': {\n const finishReason = chunk.payload.stepResult?.reason;\n if (finishReason === 'stop' || finishReason === 'end-turn') {\n currentMessage.stopReason = 'complete';\n } else if (finishReason === 'tool-calls') {\n currentMessage.stopReason = 'tool_use';\n } else {\n currentMessage.stopReason = 'complete';\n }\n break;\n }\n\n // Observational Memory data parts\n // NOTE: OM data parts arrive as { type, data: { ... } } — NOT { type, payload }\n case 'data-om-status': {\n const d = (chunk as any).data as Record<string, any> | undefined;\n if (d?.windows) {\n const w = d.windows;\n const active = w.active ?? {};\n const msgs = active.messages ?? {};\n const obs = active.observations ?? {};\n const buffObs = w.buffered?.observations ?? {};\n const buffRef = w.buffered?.reflection ?? {};\n\n this.emit({\n type: 'om_status',\n windows: {\n active: {\n messages: { tokens: msgs.tokens ?? 0, threshold: msgs.threshold ?? 0 },\n observations: { tokens: obs.tokens ?? 0, threshold: obs.threshold ?? 0 },\n },\n buffered: {\n observations: {\n status: buffObs.status ?? 'idle',\n chunks: buffObs.chunks ?? 0,\n messageTokens: buffObs.messageTokens ?? 0,\n projectedMessageRemoval: buffObs.projectedMessageRemoval ?? 0,\n observationTokens: buffObs.observationTokens ?? 0,\n },\n reflection: {\n status: buffRef.status ?? 'idle',\n inputObservationTokens: buffRef.inputObservationTokens ?? 0,\n observationTokens: buffRef.observationTokens ?? 0,\n },\n },\n },\n recordId: d.recordId ?? '',\n threadId: d.threadId ?? '',\n stepNumber: d.stepNumber ?? 0,\n generationCount: d.generationCount ?? 0,\n });\n }\n break;\n }\n case 'data-om-observation-start': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n if (payload.operationType === 'observation') {\n this.emit({\n type: 'om_observation_start',\n cycleId: payload.cycleId,\n operationType: payload.operationType,\n tokensToObserve: payload.tokensToObserve ?? 0,\n });\n } else if (payload.operationType === 'reflection') {\n this.emit({\n type: 'om_reflection_start',\n cycleId: payload.cycleId,\n tokensToReflect: payload.tokensToObserve ?? 0,\n });\n }\n }\n break;\n }\n case 'data-om-observation-end': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n if (payload.operationType === 'reflection') {\n this.emit({\n type: 'om_reflection_end',\n cycleId: payload.cycleId,\n durationMs: payload.durationMs ?? 0,\n compressedTokens: payload.observationTokens ?? 0,\n observations: payload.observations,\n });\n } else {\n this.emit({\n type: 'om_observation_end',\n cycleId: payload.cycleId,\n durationMs: payload.durationMs ?? 0,\n tokensObserved: payload.tokensObserved ?? 0,\n observationTokens: payload.observationTokens ?? 0,\n observations: payload.observations,\n currentTask: payload.currentTask,\n suggestedResponse: payload.suggestedResponse,\n });\n }\n }\n break;\n }\n case 'data-om-observation-failed': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload) {\n if (payload.operationType === 'reflection') {\n this.emit({\n type: 'om_reflection_failed',\n cycleId: payload.cycleId ?? 'unknown',\n error: payload.error ?? 'Unknown error',\n durationMs: payload.durationMs ?? 0,\n });\n } else {\n this.emit({\n type: 'om_observation_failed',\n cycleId: payload.cycleId ?? 'unknown',\n error: payload.error ?? 'Unknown error',\n durationMs: payload.durationMs ?? 0,\n });\n }\n }\n break;\n }\n // Async buffering lifecycle\n case 'data-om-buffering-start': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n this.emit({\n type: 'om_buffering_start',\n cycleId: payload.cycleId,\n operationType: payload.operationType ?? 'observation',\n tokensToBuffer: payload.tokensToBuffer ?? 0,\n });\n }\n break;\n }\n case 'data-om-buffering-end': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n this.emit({\n type: 'om_buffering_end',\n cycleId: payload.cycleId,\n operationType: payload.operationType ?? 'observation',\n tokensBuffered: payload.tokensBuffered ?? 0,\n bufferedTokens: payload.bufferedTokens ?? 0,\n observations: payload.observations,\n });\n }\n break;\n }\n case 'data-om-buffering-failed': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n this.emit({\n type: 'om_buffering_failed',\n cycleId: payload.cycleId,\n operationType: payload.operationType ?? 'observation',\n error: payload.error ?? 'Unknown error',\n });\n }\n break;\n }\n case 'data-om-activation': {\n const payload = (chunk as any).data as Record<string, any> | undefined;\n if (payload && payload.cycleId) {\n this.emit({\n type: 'om_activation',\n cycleId: payload.cycleId,\n operationType: payload.operationType ?? 'observation',\n chunksActivated: payload.chunksActivated ?? 0,\n tokensActivated: payload.tokensActivated ?? 0,\n observationTokens: payload.observationTokens ?? 0,\n messagesActivated: payload.messagesActivated ?? 0,\n generationCount: payload.generationCount ?? 0,\n });\n }\n break;\n }\n\n default:\n break;\n }\n }\n\n this.emit({ type: 'message_end', message: currentMessage });\n return { message: currentMessage };\n }\n\n // ===========================================================================\n // Control\n // ===========================================================================\n\n /**\n * Abort the current operation.\n */\n abort(): void {\n if (this.abortController) {\n this.abortRequested = true;\n try {\n this.abortController.abort();\n } catch {}\n this.abortController = null;\n }\n }\n\n /**\n * Steer the agent mid-stream: aborts current run and sends a new message.\n */\n async steer({ content }: { content: string }): Promise<void> {\n this.abort();\n this.followUpQueue = [];\n await this.sendMessage({ content });\n }\n\n /**\n * Queue a follow-up message to be processed after the current operation completes.\n */\n async followUp({ content }: { content: string }): Promise<void> {\n if (this.isRunning()) {\n this.followUpQueue.push(content);\n this.emit({ type: 'follow_up_queued', count: this.followUpQueue.length });\n } else {\n await this.sendMessage({ content });\n }\n }\n\n getFollowUpCount(): number {\n return this.followUpQueue.length;\n }\n\n isRunning(): boolean {\n return this.abortController !== null;\n }\n\n getCurrentRunId(): string | null {\n return this.currentRunId;\n }\n\n // ===========================================================================\n // Display State\n // ===========================================================================\n\n /**\n * Returns a read-only snapshot of the canonical display state.\n * UIs should use this to render instead of building up state from raw events.\n */\n getDisplayState(): Readonly<HarnessDisplayState> {\n return this.displayState;\n }\n\n /**\n * Reset display state fields that are scoped to a thread.\n * Called on thread switch/creation.\n */\n private resetThreadDisplayState(): void {\n this.displayState.activeTools = new Map();\n this.displayState.toolInputBuffers = new Map();\n this.displayState.pendingApproval = null;\n this.displayState.pendingQuestion = null;\n this.displayState.pendingPlanApproval = null;\n this.displayState.activeSubagents = new Map();\n this.displayState.currentMessage = null;\n this.displayState.modifiedFiles = new Map();\n this.displayState.tasks = [];\n this.displayState.previousTasks = [];\n this.displayState.omProgress = defaultOMProgressState();\n this.displayState.bufferingMessages = false;\n this.displayState.bufferingObservations = false;\n }\n\n /**\n * Respond to a pending tool approval from the UI.\n * \"always_allow_category\" grants the tool's category for the rest of the session, then approves.\n */\n respondToToolApproval({ decision }: { decision: 'approve' | 'decline' | 'always_allow_category' }): void {\n if (!this.pendingApprovalResolve) return;\n\n if (decision === 'always_allow_category') {\n const tn = this.pendingApprovalToolName;\n if (tn) {\n const category = this.getToolCategory({ toolName: tn });\n if (category) {\n this.grantSessionCategory({ category });\n }\n }\n this.pendingApprovalResolve('approve');\n } else {\n this.pendingApprovalResolve(decision);\n }\n this.pendingApprovalResolve = null;\n }\n\n // ===========================================================================\n // Question & Plan Approval\n // ===========================================================================\n\n /**\n * Register a pending question resolver.\n * Called by agent tools (e.g., ask_user) to pause execution until the UI responds.\n */\n registerQuestion({ questionId, resolve }: { questionId: string; resolve: (answer: string) => void }): void {\n this.pendingQuestions.set(questionId, resolve);\n }\n\n /**\n * Resolve a pending question with the user's answer.\n * Called by the UI when the user responds to a question dialog.\n */\n respondToQuestion({ questionId, answer }: { questionId: string; answer: string }): void {\n const resolve = this.pendingQuestions.get(questionId);\n if (resolve) {\n this.pendingQuestions.delete(questionId);\n resolve(answer);\n }\n }\n\n /**\n * Register a pending plan approval resolver.\n * Called by agent tools (e.g., submit_plan) to pause execution until approval.\n */\n registerPlanApproval({\n planId,\n resolve,\n }: {\n planId: string;\n resolve: (result: { action: 'approved' | 'rejected'; feedback?: string }) => void;\n }): void {\n this.pendingPlanApprovals.set(planId, resolve);\n }\n\n /**\n * Respond to a pending plan approval.\n * On approval: switches to the default mode, then resolves the promise.\n * On rejection: resolves with feedback (stays in current mode).\n */\n async respondToPlanApproval({\n planId,\n response,\n }: {\n planId: string;\n response: { action: 'approved' | 'rejected'; feedback?: string };\n }): Promise<void> {\n const resolve = this.pendingPlanApprovals.get(planId);\n if (!resolve) return;\n\n if (response.action === 'approved') {\n const defaultMode = this.config.modes.find(m => m.default) ?? this.config.modes[0];\n if (defaultMode && defaultMode.id !== this.currentModeId) {\n await this.switchMode({ modeId: defaultMode.id });\n }\n }\n\n this.pendingPlanApprovals.delete(planId);\n resolve(response);\n }\n\n private async handleToolApprove(toolCallId?: string): Promise<{ message: HarnessMessage }> {\n if (!this.currentRunId) {\n throw new Error('No active run to approve tool call for');\n }\n\n const agent = this.getCurrentAgent();\n if (!this.abortController) {\n this.abortController = new AbortController();\n }\n\n const requestContext = await this.buildRequestContext();\n const response = await agent.approveToolCall({\n runId: this.currentRunId,\n toolCallId,\n requireToolApproval: true,\n memory: this.currentThreadId ? { thread: this.currentThreadId, resource: this.resourceId } : undefined,\n abortSignal: this.abortController.signal,\n requestContext,\n toolsets: await this.buildToolsets(requestContext),\n });\n\n return await this.processStream(response);\n }\n\n private async handleToolDecline(toolCallId?: string): Promise<{ message: HarnessMessage }> {\n if (!this.currentRunId) {\n throw new Error('No active run to decline tool call for');\n }\n\n const agent = this.getCurrentAgent();\n if (!this.abortController) {\n this.abortController = new AbortController();\n }\n\n const requestContext = await this.buildRequestContext();\n const response = await agent.declineToolCall({\n runId: this.currentRunId,\n toolCallId,\n requireToolApproval: true,\n memory: this.currentThreadId ? { thread: this.currentThreadId, resource: this.resourceId } : undefined,\n abortSignal: this.abortController.signal,\n requestContext,\n toolsets: await this.buildToolsets(requestContext),\n });\n\n return await this.processStream(response);\n }\n\n // ===========================================================================\n // Event System\n // ===========================================================================\n\n /**\n * Subscribe to harness events. Returns an unsubscribe function.\n */\n subscribe(listener: HarnessEventListener): () => void {\n this.listeners.push(listener);\n return () => {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n private emit(event: HarnessEvent): void {\n // Update display state based on the event (before dispatching to listeners)\n this.applyDisplayStateUpdate(event);\n\n this.dispatchToListeners(event);\n\n // After every event, emit display_state_changed so UIs that prefer a single\n // subscribe-and-render pattern can do so. We dispatch directly to listeners\n // (not through emit()) to avoid infinite recursion.\n if (event.type !== 'display_state_changed') {\n this.dispatchToListeners({\n type: 'display_state_changed',\n displayState: this.displayState,\n });\n }\n }\n\n private dispatchToListeners(event: HarnessEvent): void {\n for (const listener of this.listeners) {\n try {\n const result = listener(event);\n if (result && typeof result === 'object' && 'catch' in result) {\n (result as Promise<void>).catch(err => console.error('Error in harness event listener:', err));\n }\n } catch (err) {\n console.error('Error in harness event listener:', err);\n }\n }\n }\n\n /**\n * Apply a display state update based on an incoming event.\n * This is the centralized state machine that keeps HarnessDisplayState in sync\n * with every event the Harness emits.\n */\n private applyDisplayStateUpdate(event: HarnessEvent): void {\n const ds = this.displayState;\n\n switch (event.type) {\n // ── Agent lifecycle ────────────────────────────────────────────────\n case 'agent_start':\n ds.isRunning = true;\n ds.activeTools = new Map();\n ds.toolInputBuffers = new Map();\n ds.currentMessage = null;\n ds.pendingApproval = null;\n break;\n\n case 'agent_end':\n ds.isRunning = false;\n ds.pendingApproval = null;\n ds.pendingQuestion = null;\n ds.pendingPlanApproval = null;\n // Mark any still-running tools as errored (handles abort mid-run)\n for (const [, tool] of ds.activeTools) {\n if (tool.status === 'running' || tool.status === 'streaming_input') {\n tool.status = 'error';\n }\n }\n ds.activeSubagents = new Map();\n break;\n\n // ── Message streaming ──────────────────────────────────────────────\n case 'message_start':\n ds.currentMessage = event.message;\n break;\n\n case 'message_update':\n ds.currentMessage = event.message;\n break;\n\n case 'message_end':\n ds.currentMessage = event.message;\n break;\n\n // ── Tool lifecycle ─────────────────────────────────────────────────\n case 'tool_input_start': {\n ds.toolInputBuffers.set(event.toolCallId, { text: '', toolName: event.toolName });\n const existing = ds.activeTools.get(event.toolCallId);\n if (existing) {\n existing.status = 'streaming_input';\n } else {\n ds.activeTools.set(event.toolCallId, {\n name: event.toolName,\n args: {},\n status: 'streaming_input',\n });\n }\n break;\n }\n\n case 'tool_input_delta': {\n const buf = ds.toolInputBuffers.get(event.toolCallId);\n if (buf) {\n buf.text += event.argsTextDelta;\n }\n break;\n }\n\n case 'tool_input_end':\n ds.toolInputBuffers.delete(event.toolCallId);\n break;\n\n case 'tool_start': {\n const existingTool = ds.activeTools.get(event.toolCallId);\n if (existingTool) {\n existingTool.name = event.toolName;\n existingTool.args = event.args;\n existingTool.status = 'running';\n } else {\n ds.activeTools.set(event.toolCallId, {\n name: event.toolName,\n args: event.args,\n status: 'running',\n });\n }\n break;\n }\n\n case 'tool_update': {\n const tool = ds.activeTools.get(event.toolCallId);\n if (tool) {\n tool.partialResult =\n typeof event.partialResult === 'string' ? event.partialResult : JSON.stringify(event.partialResult);\n }\n break;\n }\n\n case 'tool_end': {\n const endedTool = ds.activeTools.get(event.toolCallId);\n if (endedTool) {\n endedTool.status = event.isError ? 'error' : 'completed';\n endedTool.result = event.result;\n endedTool.isError = event.isError;\n }\n // Track file modifications\n if (!event.isError) {\n const FILE_TOOLS = ['string_replace_lsp', 'write_file', 'ast_smart_edit'];\n const toolState = ds.activeTools.get(event.toolCallId);\n if (toolState && FILE_TOOLS.includes(toolState.name)) {\n const toolArgs = toolState.args as Record<string, unknown>;\n const filePath = toolArgs?.path as string;\n if (filePath) {\n const existing = ds.modifiedFiles.get(filePath);\n if (existing) {\n existing.operations.push(toolState.name);\n } else {\n ds.modifiedFiles.set(filePath, {\n operations: [toolState.name],\n firstModified: new Date(),\n });\n }\n }\n }\n }\n break;\n }\n\n case 'shell_output': {\n const shellTool = ds.activeTools.get(event.toolCallId);\n if (shellTool) {\n shellTool.shellOutput = (shellTool.shellOutput ?? '') + event.output;\n }\n break;\n }\n\n case 'tool_approval_required':\n ds.pendingApproval = {\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args,\n };\n break;\n\n // ── Interactive prompts ────────────────────────────────────────────\n case 'ask_question':\n ds.pendingQuestion = {\n questionId: event.questionId,\n question: event.question,\n options: event.options,\n };\n break;\n\n case 'plan_approval_required':\n ds.pendingPlanApproval = {\n planId: event.planId,\n title: event.title,\n plan: event.plan,\n };\n break;\n\n case 'plan_approved':\n ds.pendingPlanApproval = null;\n break;\n\n // ── Subagent tracking ──────────────────────────────────────────────\n case 'subagent_start':\n ds.activeSubagents.set(event.toolCallId, {\n agentType: event.agentType,\n task: event.task,\n modelId: event.modelId,\n toolCalls: [],\n textDelta: '',\n status: 'running',\n });\n break;\n\n case 'subagent_text_delta': {\n const sub = ds.activeSubagents.get(event.toolCallId);\n if (sub) {\n sub.textDelta += event.textDelta;\n }\n break;\n }\n\n case 'subagent_tool_start': {\n const subAgent = ds.activeSubagents.get(event.toolCallId);\n if (subAgent) {\n subAgent.toolCalls.push({ name: event.subToolName, isError: false });\n }\n break;\n }\n\n case 'subagent_tool_end': {\n const subTool = ds.activeSubagents.get(event.toolCallId);\n if (subTool) {\n const tc = subTool.toolCalls.find(t => t.name === event.subToolName && !t.isError);\n if (tc) {\n tc.isError = event.isError;\n }\n }\n break;\n }\n\n case 'subagent_end': {\n const endedSub = ds.activeSubagents.get(event.toolCallId);\n if (endedSub) {\n endedSub.status = event.isError ? 'error' : 'completed';\n endedSub.durationMs = event.durationMs;\n endedSub.result = event.result;\n }\n break;\n }\n\n // ── Observational Memory ───────────────────────────────────────────\n case 'om_status': {\n const w = event.windows;\n ds.omProgress.pendingTokens = w.active.messages.tokens;\n ds.omProgress.threshold = w.active.messages.threshold;\n ds.omProgress.thresholdPercent =\n w.active.messages.threshold > 0 ? (w.active.messages.tokens / w.active.messages.threshold) * 100 : 0;\n ds.omProgress.observationTokens = w.active.observations.tokens;\n ds.omProgress.reflectionThreshold = w.active.observations.threshold;\n ds.omProgress.reflectionThresholdPercent =\n w.active.observations.threshold > 0\n ? (w.active.observations.tokens / w.active.observations.threshold) * 100\n : 0;\n ds.omProgress.buffered = {\n observations: { ...w.buffered.observations },\n reflection: { ...w.buffered.reflection },\n };\n ds.omProgress.generationCount = event.generationCount;\n ds.omProgress.stepNumber = event.stepNumber;\n // Drive buffering animation flags from status fields\n ds.bufferingMessages = w.buffered.observations.status === 'running';\n ds.bufferingObservations = w.buffered.reflection.status === 'running';\n break;\n }\n\n case 'om_observation_start':\n ds.omProgress.status = 'observing';\n ds.omProgress.cycleId = event.cycleId;\n ds.omProgress.startTime = Date.now();\n break;\n\n case 'om_observation_end':\n ds.omProgress.status = 'idle';\n ds.omProgress.cycleId = undefined;\n ds.omProgress.startTime = undefined;\n ds.omProgress.observationTokens = event.observationTokens;\n // Messages have been observed — reset pending tokens\n ds.omProgress.pendingTokens = 0;\n ds.omProgress.thresholdPercent = 0;\n break;\n\n case 'om_observation_failed':\n ds.omProgress.status = 'idle';\n ds.omProgress.cycleId = undefined;\n ds.omProgress.startTime = undefined;\n break;\n\n case 'om_reflection_start':\n ds.omProgress.status = 'reflecting';\n ds.omProgress.cycleId = event.cycleId;\n ds.omProgress.startTime = Date.now();\n ds.omProgress.preReflectionTokens = ds.omProgress.observationTokens;\n ds.omProgress.observationTokens = event.tokensToReflect;\n ds.omProgress.reflectionThresholdPercent =\n ds.omProgress.reflectionThreshold > 0 ? (event.tokensToReflect / ds.omProgress.reflectionThreshold) * 100 : 0;\n break;\n\n case 'om_reflection_end':\n ds.omProgress.status = 'idle';\n ds.omProgress.cycleId = undefined;\n ds.omProgress.startTime = undefined;\n ds.omProgress.observationTokens = event.compressedTokens;\n ds.omProgress.reflectionThresholdPercent =\n ds.omProgress.reflectionThreshold > 0\n ? (event.compressedTokens / ds.omProgress.reflectionThreshold) * 100\n : 0;\n break;\n\n case 'om_reflection_failed':\n ds.omProgress.status = 'idle';\n ds.omProgress.cycleId = undefined;\n ds.omProgress.startTime = undefined;\n break;\n\n case 'om_buffering_start':\n if (event.operationType === 'observation') {\n ds.bufferingMessages = true;\n } else {\n ds.bufferingObservations = true;\n }\n break;\n\n case 'om_buffering_end':\n if (event.operationType === 'observation') {\n ds.bufferingMessages = false;\n } else {\n ds.bufferingObservations = false;\n }\n break;\n\n case 'om_buffering_failed':\n if (event.operationType === 'observation') {\n ds.bufferingMessages = false;\n } else {\n ds.bufferingObservations = false;\n }\n break;\n\n case 'om_activation':\n if (event.operationType === 'observation') {\n ds.bufferingMessages = false;\n } else {\n ds.bufferingObservations = false;\n }\n break;\n\n // ── Token usage ────────────────────────────────────────────────────\n case 'usage_update':\n ds.tokenUsage = {\n promptTokens: this.tokenUsage.promptTokens,\n completionTokens: this.tokenUsage.completionTokens,\n totalTokens: this.tokenUsage.totalTokens,\n };\n break;\n\n // ── Tasks ──────────────────────────────────────────────────────────\n case 'task_updated':\n ds.previousTasks = [...ds.tasks];\n ds.tasks = event.tasks;\n break;\n\n // ── Thread lifecycle ───────────────────────────────────────────────\n case 'thread_changed':\n this.resetThreadDisplayState();\n ds.tokenUsage = { ...this.tokenUsage };\n break;\n\n case 'thread_created':\n this.resetThreadDisplayState();\n ds.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n break;\n\n // ── State changes (for OM threshold overrides) ──────────────────────\n case 'state_changed': {\n const keys = event.changedKeys;\n if (keys.includes('observationThreshold')) {\n const value = (event.state as Record<string, unknown>).observationThreshold;\n if (typeof value === 'number') {\n ds.omProgress.threshold = value;\n ds.omProgress.thresholdPercent = value > 0 ? (ds.omProgress.pendingTokens / value) * 100 : 0;\n }\n }\n if (keys.includes('reflectionThreshold')) {\n const value = (event.state as Record<string, unknown>).reflectionThreshold;\n if (typeof value === 'number') {\n ds.omProgress.reflectionThreshold = value;\n ds.omProgress.reflectionThresholdPercent = value > 0 ? (ds.omProgress.observationTokens / value) * 100 : 0;\n }\n }\n break;\n }\n\n default:\n break;\n }\n }\n\n // ===========================================================================\n // Runtime Context\n // ===========================================================================\n\n /**\n * Build the toolsets object that includes built-in harness tools (ask_user, submit_plan,\n * and optionally subagent) plus any user-configured tools.\n * Used by sendMessage, handleToolApprove, and handleToolDecline.\n */\n private async buildToolsets(requestContext: RequestContext): Promise<ToolsetsInput> {\n const builtInTools: ToolsInput = {\n ask_user: askUserTool,\n submit_plan: submitPlanTool,\n task_write: taskWriteTool,\n task_check: taskCheckTool,\n };\n\n // Resolve user-configured harness tools (needed for both the harness toolset and subagent allowedHarnessTools)\n let resolvedHarnessTools = undefined;\n if (this.config.tools) {\n const tools =\n typeof this.config.tools === 'function' ? await this.config.tools({ requestContext }) : this.config.tools;\n if (tools) {\n resolvedHarnessTools = tools;\n }\n }\n\n // Auto-create subagent tool if subagent definitions are configured\n if (this.config.subagents?.length && this.config.resolveModel) {\n const currentMode = this.getCurrentMode();\n builtInTools.subagent = createSubagentTool({\n subagents: this.config.subagents,\n resolveModel: this.config.resolveModel,\n harnessTools: resolvedHarnessTools,\n fallbackModelId: currentMode?.defaultModelId,\n });\n }\n\n if (resolvedHarnessTools) {\n return { harnessBuiltIn: builtInTools, harness: resolvedHarnessTools };\n }\n return { harnessBuiltIn: builtInTools };\n }\n\n /**\n * Build request context for agent execution.\n * Tools can access harness state via requestContext.get('harness').\n */\n private async buildRequestContext(): Promise<RequestContext> {\n const harnessContext: HarnessRequestContext<TState> = {\n harnessId: this.id,\n state: this.getState(),\n getState: () => this.getState(),\n setState: updates => this.setState(updates),\n threadId: this.currentThreadId,\n resourceId: this.resourceId,\n modeId: this.currentModeId,\n abortSignal: this.abortController?.signal,\n workspace: this.workspace,\n emitEvent: event => this.emit(event),\n registerQuestion: params => this.registerQuestion(params),\n registerPlanApproval: params => this.registerPlanApproval(params),\n getSubagentModelId: params => this.getSubagentModelId(params),\n };\n\n const requestContext = new RequestContext([['harness', harnessContext]]) as RequestContext;\n\n if (this.workspaceFn) {\n const resolved = await Promise.resolve(this.workspaceFn({ requestContext }));\n harnessContext.workspace = resolved;\n // Cache for getWorkspace() so callers outside request flow (e.g. /skills) can access it\n this.workspace = resolved;\n }\n\n return requestContext;\n }\n\n // ===========================================================================\n // Token Usage\n // ===========================================================================\n\n getTokenUsage(): { promptTokens: number; completionTokens: number; totalTokens: number } {\n return { ...this.tokenUsage };\n }\n\n private async persistTokenUsage(): Promise<void> {\n if (!this.currentThreadId || !this.config.storage) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n if (thread) {\n await memoryStorage.saveThread({\n thread: {\n ...thread,\n metadata: { ...thread.metadata, tokenUsage: this.tokenUsage },\n updatedAt: new Date(),\n },\n });\n }\n } catch {\n // Token persistence is not critical\n }\n }\n\n // ===========================================================================\n // Workspace\n // ===========================================================================\n\n getWorkspace(): Workspace | undefined {\n return this.workspace;\n }\n\n /**\n * Eagerly resolve the workspace. For dynamic workspaces (factory function),\n * this triggers resolution and caches the result so getWorkspace() returns it.\n * Useful for code paths outside the request flow (e.g. slash commands).\n */\n async resolveWorkspace(): Promise<Workspace | undefined> {\n if (this.workspace) return this.workspace;\n if (this.workspaceFn) {\n // buildRequestContext resolves the workspace and caches it on this.workspace\n await this.buildRequestContext();\n return this.workspace;\n }\n return undefined;\n }\n\n hasWorkspace(): boolean {\n return this.config.workspace !== undefined;\n }\n\n isWorkspaceReady(): boolean {\n if (this.workspaceFn) return true;\n return this.workspaceInitialized && this.workspace !== undefined;\n }\n\n async destroyWorkspace(): Promise<void> {\n if (this.workspaceFn) return;\n if (this.workspace && this.workspaceInitialized) {\n try {\n this.emit({ type: 'workspace_status_changed', status: 'destroying' });\n await this.workspace.destroy();\n this.emit({ type: 'workspace_status_changed', status: 'destroyed' });\n } catch (error) {\n console.warn('Workspace destroy failed:', error);\n } finally {\n this.workspaceInitialized = false;\n }\n }\n }\n\n // ===========================================================================\n // Heartbeat Handlers\n // ===========================================================================\n\n private startHeartbeats(): void {\n const handlers = this.config.heartbeatHandlers;\n if (!handlers?.length) return;\n\n for (const hb of handlers) {\n if (this.heartbeatTimers.has(hb.id)) continue;\n\n const run = async () => {\n try {\n await hb.handler();\n } catch (error) {\n console.error(`[Heartbeat:${hb.id}] failed:`, error);\n }\n };\n\n if (hb.immediate !== false) {\n void run();\n }\n\n const timer = setInterval(run, hb.intervalMs);\n timer.unref();\n this.heartbeatTimers.set(hb.id, { timer, shutdown: hb.shutdown });\n }\n }\n\n registerHeartbeat(handler: HeartbeatHandler): void {\n void this.removeHeartbeat({ id: handler.id });\n\n const run = async () => {\n try {\n await handler.handler();\n } catch (error) {\n console.error(`[Heartbeat:${handler.id}] failed:`, error);\n }\n };\n\n if (handler.immediate !== false) {\n void run();\n }\n\n const timer = setInterval(run, handler.intervalMs);\n timer.unref();\n this.heartbeatTimers.set(handler.id, { timer, shutdown: handler.shutdown });\n }\n\n async removeHeartbeat({ id }: { id: string }): Promise<void> {\n const entry = this.heartbeatTimers.get(id);\n if (entry) {\n clearInterval(entry.timer);\n this.heartbeatTimers.delete(id);\n try {\n await entry.shutdown?.();\n } catch (error) {\n console.error(`[Heartbeat:${id}] shutdown failed:`, error);\n }\n }\n }\n\n async stopHeartbeats(): Promise<void> {\n const entries = [...this.heartbeatTimers.entries()];\n this.heartbeatTimers.clear();\n\n for (const [id, entry] of entries) {\n clearInterval(entry.timer);\n try {\n await entry.shutdown?.();\n } catch (error) {\n console.error(`[Heartbeat:${id}] shutdown failed:`, error);\n }\n }\n }\n\n // ===========================================================================\n // Session\n // ===========================================================================\n\n async getSession(): Promise<HarnessSession> {\n return {\n currentThreadId: this.currentThreadId,\n currentModeId: this.currentModeId,\n threads: await this.listThreads(),\n };\n }\n\n // ===========================================================================\n // Utilities\n // ===========================================================================\n\n private generateId(): string {\n if (this.config.idGenerator) {\n return this.config.idGenerator();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n }\n}\n"]}
|