@tangle-network/agent-runtime 0.131.6 → 0.131.7

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.
Files changed (78) hide show
  1. package/dist/{activation-D-gsrgSq.js → activation-CDKatOlp.js} +3 -3
  2. package/dist/{activation-D-gsrgSq.js.map → activation-CDKatOlp.js.map} +1 -1
  3. package/dist/agent.d.ts +2 -2
  4. package/dist/agent.js +2 -2
  5. package/dist/analyst-loop.d.ts +1 -1
  6. package/dist/{authoring-DI778qK7.js → authoring-B-Oe8VUf.js} +2 -2
  7. package/dist/{authoring-DI778qK7.js.map → authoring-B-Oe8VUf.js.map} +1 -1
  8. package/dist/candidate-execution/index.js +4 -4
  9. package/dist/{candidate-execution-BNxKr-Bu.js → candidate-execution-DxL_I3xx.js} +4 -4
  10. package/dist/{candidate-execution-BNxKr-Bu.js.map → candidate-execution-DxL_I3xx.js.map} +1 -1
  11. package/dist/conversation.d.ts +1 -1
  12. package/dist/{environment-provider-CxvSd1W6.d.ts → environment-provider-DZihBZx6.d.ts} +3 -3
  13. package/dist/{environment-provider-Dyg8DtLK.js → environment-provider-mDsjfGjY.js} +2 -2
  14. package/dist/{environment-provider-Dyg8DtLK.js.map → environment-provider-mDsjfGjY.js.map} +1 -1
  15. package/dist/environment-provider.d.ts +1 -1
  16. package/dist/environment-provider.js +1 -1
  17. package/dist/{graph-CoN60QtH.js → graph-DOfL9TLn.js} +3 -3
  18. package/dist/{graph-CoN60QtH.js.map → graph-DOfL9TLn.js.map} +1 -1
  19. package/dist/{improvement-cycle-BGF0osPC.js → improvement-cycle-XtFD7dCv.js} +4 -4
  20. package/dist/{improvement-cycle-BGF0osPC.js.map → improvement-cycle-XtFD7dCv.js.map} +1 -1
  21. package/dist/{index-DwGtu9nc.d.ts → index-C-IJR7pR.d.ts} +4 -4
  22. package/dist/{index-CoO7atyo.d.ts → index-D7UJIX2x.d.ts} +3087 -3064
  23. package/dist/{index-qYHpsmG2.d.ts → index-qKm5g7mI.d.ts} +3 -3
  24. package/dist/index.d.ts +9 -9
  25. package/dist/index.js +12 -12
  26. package/dist/index.js.map +1 -1
  27. package/dist/intelligence.d.ts +5 -5
  28. package/dist/intelligence.js +6 -6
  29. package/dist/kernel.d.ts +7 -7
  30. package/dist/kernel.js +9 -9
  31. package/dist/{knowledge-D4zNvxw5.js → knowledge-DPDhKnOz.js} +5 -5
  32. package/dist/{knowledge-D4zNvxw5.js.map → knowledge-DPDhKnOz.js.map} +1 -1
  33. package/dist/knowledge.d.ts +1 -1
  34. package/dist/knowledge.js +1 -1
  35. package/dist/{loop-runner-bin-BwgZ8m_7.d.ts → loop-runner-bin-B6g4vOil.d.ts} +3 -3
  36. package/dist/{loop-runner-bin-CI9Y0sxT.js → loop-runner-bin-DCBho3GJ.js} +3 -3
  37. package/dist/{loop-runner-bin-CI9Y0sxT.js.map → loop-runner-bin-DCBho3GJ.js.map} +1 -1
  38. package/dist/loop-runner-bin.d.ts +1 -1
  39. package/dist/loop-runner-bin.js +1 -1
  40. package/dist/mcp/bin.js +3 -3
  41. package/dist/mcp/index.d.ts +5 -5
  42. package/dist/mcp/index.js +5 -5
  43. package/dist/{openai-tools-CupeHJEv.js → openai-tools-BeVFVJlX.js} +2 -2
  44. package/dist/{openai-tools-CupeHJEv.js.map → openai-tools-BeVFVJlX.js.map} +1 -1
  45. package/dist/{openai-tools-D3oMyVGl.d.ts → openai-tools-CzEiSbPW.d.ts} +2 -2
  46. package/dist/{prepare-DYWjVcPx.js → prepare-BQ82nG06.js} +2 -2
  47. package/dist/{prepare-DYWjVcPx.js.map → prepare-BQ82nG06.js.map} +1 -1
  48. package/dist/primeintellect/index.d.ts +1 -1
  49. package/dist/profiles.d.ts +1 -1
  50. package/dist/{protected-model-port-48ALLGxT.js → protected-model-port-BAOj4gQN.js} +2 -2
  51. package/dist/{protected-model-port-48ALLGxT.js.map → protected-model-port-BAOj4gQN.js.map} +1 -1
  52. package/dist/{redact-9_Gf-8m3.d.ts → redact-CwupS9H2.d.ts} +3 -3
  53. package/dist/{runtime-ZNVnT8h1.js → runtime-BVKEU5jc.js} +131 -28
  54. package/dist/runtime-BVKEU5jc.js.map +1 -0
  55. package/dist/{runtime-D-QfLbSd.d.ts → runtime-DgJZUxql.d.ts} +4 -4
  56. package/dist/{spawn-journal-saHQzqYi.js → spawn-journal-Cd5L-Ie9.js} +20 -9
  57. package/dist/spawn-journal-Cd5L-Ie9.js.map +1 -0
  58. package/dist/{stream-agent-turn-C852AgMT.d.ts → stream-agent-turn-DcDznEnq.d.ts} +3 -3
  59. package/dist/{structural-rollout-n089ZP33.js → structural-rollout-v8o_EO8_.js} +3 -3
  60. package/dist/{structural-rollout-n089ZP33.js.map → structural-rollout-v8o_EO8_.js.map} +1 -1
  61. package/dist/{supervise-msTRhTN7.js → supervise-DzLi985l.js} +24 -6
  62. package/dist/supervise-DzLi985l.js.map +1 -0
  63. package/dist/{supervisor-C16p9KqO.js → supervisor-CMtutocL.js} +92 -81
  64. package/dist/supervisor-CMtutocL.js.map +1 -0
  65. package/dist/testing.d.ts +2 -2
  66. package/dist/testing.js +12 -12
  67. package/dist/{types-ebIY0dMG.d.ts → types-6zHo67jn.d.ts} +13 -1
  68. package/dist/{types-C6Q-J0Dt.d.ts → types-CIg5DBNF.d.ts} +12 -3
  69. package/dist/{util-Bw6srryQ.js → util-Dr--8wAL.js} +32 -3
  70. package/dist/util-Dr--8wAL.js.map +1 -0
  71. package/dist/{workspace-archive-aOfJ47ms.js → workspace-archive-CGcXL3zA.js} +2 -2
  72. package/dist/{workspace-archive-aOfJ47ms.js.map → workspace-archive-CGcXL3zA.js.map} +1 -1
  73. package/package.json +4 -4
  74. package/dist/runtime-ZNVnT8h1.js.map +0 -1
  75. package/dist/spawn-journal-saHQzqYi.js.map +0 -1
  76. package/dist/supervise-msTRhTN7.js.map +0 -1
  77. package/dist/supervisor-C16p9KqO.js.map +0 -1
  78. package/dist/util-Bw6srryQ.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { V as AgentExecutionBackend, rt as RuntimeSessionStore } from "./types-ebIY0dMG.js";
2
- import { d as ExecutorFactory } from "./types-C6Q-J0Dt.js";
1
+ import { V as AgentExecutionBackend, rt as RuntimeSessionStore } from "./types-6zHo67jn.js";
2
+ import { d as ExecutorFactory } from "./types-CIg5DBNF.js";
3
3
  import { AgentProfile, MaximumCharge } from "@tangle-network/agent-eval";
4
4
  import { ProfileDispatchFn, Scenario } from "@tangle-network/agent-eval/campaign";
5
5
  import { AgentProfile as AgentProfile$1 } from "@tangle-network/agent-interface";
@@ -686,4 +686,4 @@ declare function turnId(runId: string, index: number, speaker: string): string;
686
686
  declare function slugifySpeaker(speaker: string): string;
687
687
  //#endregion
688
688
  export { sleep as $, RunConversationOptions as A, buildForwardHeaders as B, ConversationResult as C, HaltPredicate as D, HaltContext as E, InMemoryConversationJournal as F, CircuitBreakerState as G, readDepth as H, DEFAULT_MAX_DEPTH as I, RetryBackoff as J, CircuitOpenError as K, FORWARD_HEADERS as L, ConversationJournal as M, ConversationJournalEntry as N, HaltReason as O, FileConversationJournal as P, makePerAttemptSignal as Q, ForwardHeaderName as R, ConversationPolicy as S, ConversationTurn as T, BackendCallPolicy as U, isDepthExceeded as V, CircuitBreakerConfig as W, computeBackoff as X, RetryableErrorPredicate as Y, defaultIsRetryable as Z, createConversationBackend as _, RunPersonaConfig as a, ConversationDriveState as b, runPersonaDispatch as c, D1DatabaseLike as d, createProfileExecutionBackend as et, D1StmtLike as f, defineConversation as g, d1ToSqlAdapter as h, PersonaDriver as i, TurnOrder as j, HaltSignal as k, runConversation as l, SqlConversationJournal as m, turnId as n, RunPersonaConversationOptions as o, SqlAdapter as p, DeadlineExceededError as q, PersonaConversationResult as r, runPersonaConversation as s, slugifySpeaker as t, runConversationStream as u, AuthSource as v, ConversationStreamEvent as w, ConversationParticipant as x, Conversation as y, PropagatedHeaders as z };
689
- //# sourceMappingURL=index-qYHpsmG2.d.ts.map
689
+ //# sourceMappingURL=index-qKm5g7mI.d.ts.map
package/dist/index.d.ts CHANGED
@@ -1,18 +1,18 @@
1
- import { $ as OpenAIChatToolChoice, A as RuntimeRunCompleteInput, B as AgentBackendInput, F as RuntimeRunRow, G as AgentTaskContext, H as AgentKnowledgeProvider, I as RuntimeRunStatus, J as AgentTaskStatus, K as AgentTaskRunResult, L as startRuntimeRun, M as RuntimeRunHandle, N as RuntimeRunOptions, P as RuntimeRunPersistenceAdapter, Q as OpenAIChatTool, R as AgentAdapter, U as AgentRuntimeEvent, V as AgentExecutionBackend, W as AgentRuntimeEventSink, X as KnowledgeReadinessDecision, Y as BackendErrorDetail, Z as OpenAIChatResponseFormat, et as RunAgentTaskOptions, it as RuntimeStreamEvent, j as RuntimeRunCost, m as LoopResult, nt as RuntimeSession, q as AgentTaskSpec, r as Driver, rt as RuntimeSessionStore, tt as RunAgentTaskStreamOptions, z as AgentBackendContext } from "./types-ebIY0dMG.js";
1
+ import { $ as OpenAIChatToolChoice, A as RuntimeRunCompleteInput, B as AgentBackendInput, F as RuntimeRunRow, G as AgentTaskContext, H as AgentKnowledgeProvider, I as RuntimeRunStatus, J as AgentTaskStatus, K as AgentTaskRunResult, L as startRuntimeRun, M as RuntimeRunHandle, N as RuntimeRunOptions, P as RuntimeRunPersistenceAdapter, Q as OpenAIChatTool, R as AgentAdapter, U as AgentRuntimeEvent, V as AgentExecutionBackend, W as AgentRuntimeEventSink, X as KnowledgeReadinessDecision, Y as BackendErrorDetail, Z as OpenAIChatResponseFormat, et as RunAgentTaskOptions, it as RuntimeStreamEvent, j as RuntimeRunCost, m as LoopResult, nt as RuntimeSession, q as AgentTaskSpec, r as Driver, rt as RuntimeSessionStore, tt as RunAgentTaskStreamOptions, z as AgentBackendContext } from "./types-6zHo67jn.js";
2
2
  import { i as SurfaceImprovementEdit } from "./improvement-adapter-D5gwwoXQ.js";
3
3
  import { o as ImprovementProposalSource } from "./types-zWfqDjeL.js";
4
- import { Bd as PlannerError, Fd as AgentEvalErrorCode, Hd as ValidationError, Id as BackendTransportError, Ld as ConfigError, Pd as AgentEvalError, Rd as JudgeError, Vd as RuntimeRunStateError, cl as AnalystRegistry, dr as FinalizeContext, ml as CoordinationEvent, ni as StructuralRolloutPolicy, pr as SupervisorFinalizer, zd as NotFoundError } from "./index-CoO7atyo.js";
4
+ import { Bd as ConfigError, Bn as StructuralRolloutPolicy, Do as FinalizeContext, Gd as ValidationError, Hd as NotFoundError, Ld as AgentEvalError, Rd as AgentEvalErrorCode, Ud as PlannerError, Vd as JudgeError, Wd as RuntimeRunStateError, _l as CoordinationEvent, dl as AnalystRegistry, ko as SupervisorFinalizer, zd as BackendTransportError } from "./index-D7UJIX2x.js";
5
5
  import { a as RuntimeHookErrorContext, c as RuntimeHookTarget, d as defineRuntimeHooks, f as notifyRuntimeDecisionPoint, i as RuntimeHookContext, l as RuntimeHooks, n as RuntimeDecisionKind, o as RuntimeHookEvent, p as notifyRuntimeHookEvent, r as RuntimeDecisionPoint, s as RuntimeHookPhase, t as RuntimeDecisionEvidenceRef, u as composeRuntimeHooks } from "./runtime-hooks-sbRpjStq.js";
6
- import { At as RuntimeEventCollector, B as Spend, Bt as sanitizeKnowledgeReadinessReport, Ct as createOtelExporter, Dt as padSpanId, Et as loopEventToOtelSpan, Ft as SanitizedKnowledgeReadinessReport, H as SupervisedResult, It as SanitizedKnowledgeRequirement, Lt as createRuntimeEventCollector, Mt as RuntimeStreamEventSink, N as Scope, Nt as RuntimeStreamEventSummary, Ot as padTraceId, P as Settled, Pt as RuntimeTelemetryOptions, Rt as createRuntimeStreamEventCollector, St as createOpenInferenceFileExporter, Tt as generateSpanId, U as Supervisor, Vt as sanitizeRuntimeStreamEvent, X as WorkerTraceEvidence, Z as WorkerTraceUnavailableReason, _t as OtelSpan, bt as buildLoopSpanNodes, ct as EvalRunEvent, dt as EvalRunsExportResult, ft as INTELLIGENCE_WIRE_VERSION, gt as OtelExporter, ht as OtelExportConfig, i as Budget, jt as RuntimeStreamEventCollector, kt as toOtelAttributes, lt as EvalRunGeneration, m as ExecutorRegistry, mt as OtelAttribute, pt as LoopSpanNode, r as AgentSpec, s as Executor, ut as EvalRunsExportConfig, vt as RuntimeEventOtelOptions, wt as exportEvalRuns, xt as buildRuntimeEventOtelSpans, yt as buildLoopOtelSpans, zt as sanitizeAgentRuntimeEvent } from "./types-C6Q-J0Dt.js";
7
- import { x as WorktreeCheckRunner } from "./runtime-D-QfLbSd.js";
6
+ import { At as RuntimeEventCollector, B as Spend, Bt as sanitizeKnowledgeReadinessReport, Ct as createOtelExporter, Dt as padSpanId, Et as loopEventToOtelSpan, Ft as SanitizedKnowledgeReadinessReport, H as SupervisedResult, It as SanitizedKnowledgeRequirement, Lt as createRuntimeEventCollector, Mt as RuntimeStreamEventSink, N as Scope, Nt as RuntimeStreamEventSummary, Ot as padTraceId, P as Settled, Pt as RuntimeTelemetryOptions, Rt as createRuntimeStreamEventCollector, St as createOpenInferenceFileExporter, Tt as generateSpanId, U as Supervisor, Vt as sanitizeRuntimeStreamEvent, X as WorkerTraceEvidence, Z as WorkerTraceUnavailableReason, _t as OtelSpan, bt as buildLoopSpanNodes, ct as EvalRunEvent, dt as EvalRunsExportResult, ft as INTELLIGENCE_WIRE_VERSION, gt as OtelExporter, ht as OtelExportConfig, i as Budget, jt as RuntimeStreamEventCollector, kt as toOtelAttributes, lt as EvalRunGeneration, m as ExecutorRegistry, mt as OtelAttribute, pt as LoopSpanNode, r as AgentSpec, s as Executor, ut as EvalRunsExportConfig, vt as RuntimeEventOtelOptions, wt as exportEvalRuns, xt as buildRuntimeEventOtelSpans, yt as buildLoopOtelSpans, zt as sanitizeAgentRuntimeEvent } from "./types-CIg5DBNF.js";
7
+ import { x as WorktreeCheckRunner } from "./runtime-DgJZUxql.js";
8
8
  import { C as AgentCandidateCodeSurfaceSource, D as AgentCandidateBundleInput, E as buildAgentCandidateBundle, O as sealAgentCandidateBundle, S as AgentCandidateCodeSource, T as BuildAgentCandidateBundleInput, _ as exactProcessProviderAsCandidateExecutor, a as captureAgentCandidateWorkspace, b as FileAgentCandidateExecutionClaimStore, c as AGENT_CANDIDATE_EXECUTION_SUPPORT, d as recoverExpiredAgentCandidateExecution, f as persistCandidateOutputArtifact, g as ExactProcessCandidateExecutorOptions, h as candidateKnowledgeExecutionPaths, i as CreateAgentCandidateWorkspacePortOptions, l as verifyAgentCandidateBundle, m as CANDIDATE_KNOWLEDGE_ROOT_ENV, n as CaptureAgentCandidateWorkspaceOptions, o as captureAgentCandidateWorkspaceFiles, p as CANDIDATE_KNOWLEDGE_RETRIEVAL_CONFIG_ENV, r as CapturedAgentCandidateWorkspace, s as createAgentCandidateWorkspacePort, t as AgentCandidateWorkspaceArchiveLimits, u as RecoverExpiredAgentCandidateOptions, v as DisposePreparedAgentCandidateOptions, w as AgentCandidateProfileSource, x as FileAgentCandidateExecutionClaimStoreOptions, y as disposePreparedAgentCandidateExecution } from "./index-B3bHsVLw.js";
9
9
  import { A as AgentCandidateExecutionPhase, B as AgentCandidatePreparationEvidence, C as AgentCandidateExecutionClaim, D as AgentCandidateExecutionFailureClass, E as AgentCandidateExecutionCleanupHandles, F as AgentCandidateExecutionTerminalResult, I as AgentCandidateRetryRejection, L as InMemoryAgentCandidateExecutionClaimStore, M as AgentCandidateExecutionRecoveryEvidence, N as AgentCandidateExecutionStageResult, O as AgentCandidateExecutionFinishResult, P as AgentCandidateExecutionTerminalRecord, R as InMemoryAgentCandidateExecutionClaimStoreOptions, S as AgentCandidateExecutionAttemptRef, T as AgentCandidateExecutionClaimStore, _ as PrepareAgentCandidateExecutionOptions, a as AgentCandidateModelGrantSettleInput, b as executePreparedAgentCandidate, c as agentCandidateProfileAsAgentProfile, d as freezeGenericAgentCandidateProfile, f as omitUndefinedObjectFields, g as parseExactCandidateProfile, h as parseExactAgentProfileDiff, i as AgentCandidateModelGrantReserveInput, j as AgentCandidateExecutionPhaseResult, k as AgentCandidateExecutionLease, l as applyExactAgentProfileDiff, m as parseExactAgentProfile, n as AgentCandidateModelGrantClient, o as CreateProtectedAgentCandidateModelPortOptions, r as AgentCandidateModelGrantReservation, s as createProtectedAgentCandidateModelPort, t as AgentCandidateModelGrantActivateInput, u as assertCandidateProfileBinding, v as prepareAgentCandidateExecution, w as AgentCandidateExecutionClaimResult, x as AgentCandidateExecutionAttemptRecord, y as ExecutePreparedAgentCandidateOptions, z as candidateExecutionClaim } from "./protected-model-port-CoJOiINX.js";
10
10
  import { A as CANDIDATE_TRACE_ENV, B as VerifiedAgentCandidate, C as AgentCandidateProtectedModelSettlement, D as AgentCandidateTaskExecution, E as AgentCandidateRunFinalization, F as PreparedAgentCandidateInstruction, I as PreparedAgentCandidateKnowledge, L as PreparedAgentCandidateLaunch, M as CanonicalCandidateDocument, N as PersistedTaskOutcomeEvidence, O as AgentCandidateVerificationPorts, P as PreparedAgentCandidateExecution, R as PreparedAgentCandidateTrace, S as AgentCandidateProtectedModelReservation, T as AgentCandidateRepositoryPort, V as VerifiedAgentCandidateTaskOutcome, _ as AgentCandidateModelLimits, a as AgentCandidateExecutionPorts, b as AgentCandidateOutputPurpose, c as AgentCandidateExecutorPort, d as AgentCandidateExecutorStopRequest, f as AgentCandidateExecutorTaskOutcomeCapture, g as AgentCandidateMemoryResetResult, h as AgentCandidateMemoryPort, i as AgentCandidateContainerPort, j as CANDIDATE_TRACE_TAGS, k as AgentCandidateWorkspacePort, l as AgentCandidateExecutorProfileFile, m as AgentCandidateExecutorWorkspaceInput, n as AgentCandidateBenchmarkGraderIdentity, o as AgentCandidateExecutorFinalCapture, p as AgentCandidateExecutorWorkspaceFile, r as AgentCandidateBenchmarkGraderPort, s as AgentCandidateExecutorMemoryCapture, t as AgentCandidateArtifactPort, u as AgentCandidateExecutorRequest, v as AgentCandidateModelPort, w as AgentCandidateProtectedRunCapture, x as AgentCandidateProtectedModelActivation, y as AgentCandidateOutputArtifactPort, z as ResolvedAgentCandidateContainer } from "./types-BaIpb0XT.js";
11
- import { $ as sleep, A as RunConversationOptions, B as buildForwardHeaders, C as ConversationResult, D as HaltPredicate, E as HaltContext, F as InMemoryConversationJournal, G as CircuitBreakerState, H as readDepth, I as DEFAULT_MAX_DEPTH, J as RetryBackoff, K as CircuitOpenError, L as FORWARD_HEADERS, M as ConversationJournal, N as ConversationJournalEntry, O as HaltReason, P as FileConversationJournal, Q as makePerAttemptSignal, R as ForwardHeaderName, S as ConversationPolicy, T as ConversationTurn, U as BackendCallPolicy, V as isDepthExceeded, W as CircuitBreakerConfig, X as computeBackoff, Y as RetryableErrorPredicate, Z as defaultIsRetryable, _ as createConversationBackend, a as RunPersonaConfig, b as ConversationDriveState, c as runPersonaDispatch, d as D1DatabaseLike, et as createProfileExecutionBackend, f as D1StmtLike, g as defineConversation, h as d1ToSqlAdapter, i as PersonaDriver, j as TurnOrder, k as HaltSignal, l as runConversation, m as SqlConversationJournal, n as turnId, o as RunPersonaConversationOptions, p as SqlAdapter, q as DeadlineExceededError, r as PersonaConversationResult, s as runPersonaConversation, t as slugifySpeaker, u as runConversationStream, v as AuthSource, w as ConversationStreamEvent, x as ConversationParticipant, y as Conversation, z as PropagatedHeaders } from "./index-qYHpsmG2.js";
12
- import { A as ImprovementCandidate, B as Verifier, C as ImproveProfileComponents, D as ImproveScenarioPartitions, E as ImproveRuntimeCodeGeneratorOptions, F as AgenticGeneratorExecutorForWorktree, G as CandidateGenerator, H as agenticGenerator, I as AgenticGeneratorOptions, L as AgenticGeneratorShotDisposition, M as ImprovementProfileCandidate, N as DeepReadonly, O as ImproveSkillsOptions, P as ReadonlyAgentProfile, R as AgenticGeneratorShotExecution, S as ImproveProfileAgent, T as ImproveResult, U as commandVerifier, V as VerifyResult, W as defaultBuildPrompt, _ as ImproveMethodOptions, a as ImproveCandidateValidationInput, b as ImproveOptimizationRunOptions, c as ImproveCodeOptions, d as ImproveCost, f as ImproveCustomCodeGeneratorOptions, g as ImproveMethodLineage, h as ImproveMethodFactory, i as improve, j as ImprovementCodeCandidate, k as ImproveSurface, l as ImproveCodeResult, m as ImproveMethodContext, o as ImproveCandidateValidator, p as ImproveLineage, s as ImproveCodeBaseOptions, t as Redactor, u as ImproveCodeRunOptions, v as ImproveMethodResult, w as ImproveProfileSurface, x as ImproveOptions, y as ImproveMethodSource, z as AgenticGeneratorShotReceipt } from "./redact-9_Gf-8m3.js";
13
- import { C as KnowledgeImprovementActivationExecutor, S as CreateKnowledgeImprovementActivationExecutorOptions, _ as SupervisedKnowledgeUpdater, a as KnowledgeImprovementJobResult, b as knowledgeReadinessDeliverable, c as createAgentKnowledgeReadinessCheck, d as KnowledgeReadinessCheckInput, f as KnowledgeReadinessCheckResult, g as SupervisedKnowledgeUpdateResult, h as SupervisedKnowledgeUpdateOptions, i as KnowledgeImprovementJobMeasurement, l as runKnowledgeImprovementJob, m as SupervisedKnowledgeUpdateInput, n as KnowledgeImprovementCandidatePair, o as RunKnowledgeImprovementJobOptions, p as RESEARCH_SUPERVISOR_SYSTEM_PROMPT, r as KnowledgeImprovementExperimentBundles, s as buildKnowledgeImprovementExperimentBundles, t as AgentKnowledgeReadinessCheckOptions, u as KnowledgeReadinessCheck, v as createSupervisedKnowledgeUpdater, w as createKnowledgeImprovementActivationExecutor, x as runSupervisedKnowledgeUpdate, y as formatSupervisedKnowledgeTask } from "./index-DwGtu9nc.js";
14
- import { _ as researchLoopRunner, a as DELEGATED_LOOP_MODES, c as DelegatedLoopResult, d as ResearchLoopRunnerOptions, f as RunDelegatedLoopOptions, g as isDelegatedLoopMode, h as auditLoopRunner, i as runLoopRunnerCli, l as DelegatedLoopRunner, m as WorktreeLoopRunnerOptions, n as LoopRunnerCliResult, o as DelegatedLoopMode, p as VetoedFact, r as parseLoopRunnerArgv, s as DelegatedLoopRegistry, t as LoopRunnerCliArgs, u as ResearchLoopResult, v as runDelegatedLoop, y as worktreeLoopRunner } from "./loop-runner-bin-BwgZ8m_7.js";
15
- import { n as mcpToolsForRuntimeMcpSubset, t as mcpToolsForRuntimeMcp } from "./openai-tools-D3oMyVGl.js";
11
+ import { $ as sleep, A as RunConversationOptions, B as buildForwardHeaders, C as ConversationResult, D as HaltPredicate, E as HaltContext, F as InMemoryConversationJournal, G as CircuitBreakerState, H as readDepth, I as DEFAULT_MAX_DEPTH, J as RetryBackoff, K as CircuitOpenError, L as FORWARD_HEADERS, M as ConversationJournal, N as ConversationJournalEntry, O as HaltReason, P as FileConversationJournal, Q as makePerAttemptSignal, R as ForwardHeaderName, S as ConversationPolicy, T as ConversationTurn, U as BackendCallPolicy, V as isDepthExceeded, W as CircuitBreakerConfig, X as computeBackoff, Y as RetryableErrorPredicate, Z as defaultIsRetryable, _ as createConversationBackend, a as RunPersonaConfig, b as ConversationDriveState, c as runPersonaDispatch, d as D1DatabaseLike, et as createProfileExecutionBackend, f as D1StmtLike, g as defineConversation, h as d1ToSqlAdapter, i as PersonaDriver, j as TurnOrder, k as HaltSignal, l as runConversation, m as SqlConversationJournal, n as turnId, o as RunPersonaConversationOptions, p as SqlAdapter, q as DeadlineExceededError, r as PersonaConversationResult, s as runPersonaConversation, t as slugifySpeaker, u as runConversationStream, v as AuthSource, w as ConversationStreamEvent, x as ConversationParticipant, y as Conversation, z as PropagatedHeaders } from "./index-qKm5g7mI.js";
12
+ import { A as ImprovementCandidate, B as Verifier, C as ImproveProfileComponents, D as ImproveScenarioPartitions, E as ImproveRuntimeCodeGeneratorOptions, F as AgenticGeneratorExecutorForWorktree, G as CandidateGenerator, H as agenticGenerator, I as AgenticGeneratorOptions, L as AgenticGeneratorShotDisposition, M as ImprovementProfileCandidate, N as DeepReadonly, O as ImproveSkillsOptions, P as ReadonlyAgentProfile, R as AgenticGeneratorShotExecution, S as ImproveProfileAgent, T as ImproveResult, U as commandVerifier, V as VerifyResult, W as defaultBuildPrompt, _ as ImproveMethodOptions, a as ImproveCandidateValidationInput, b as ImproveOptimizationRunOptions, c as ImproveCodeOptions, d as ImproveCost, f as ImproveCustomCodeGeneratorOptions, g as ImproveMethodLineage, h as ImproveMethodFactory, i as improve, j as ImprovementCodeCandidate, k as ImproveSurface, l as ImproveCodeResult, m as ImproveMethodContext, o as ImproveCandidateValidator, p as ImproveLineage, s as ImproveCodeBaseOptions, t as Redactor, u as ImproveCodeRunOptions, v as ImproveMethodResult, w as ImproveProfileSurface, x as ImproveOptions, y as ImproveMethodSource, z as AgenticGeneratorShotReceipt } from "./redact-CwupS9H2.js";
13
+ import { C as KnowledgeImprovementActivationExecutor, S as CreateKnowledgeImprovementActivationExecutorOptions, _ as SupervisedKnowledgeUpdater, a as KnowledgeImprovementJobResult, b as knowledgeReadinessDeliverable, c as createAgentKnowledgeReadinessCheck, d as KnowledgeReadinessCheckInput, f as KnowledgeReadinessCheckResult, g as SupervisedKnowledgeUpdateResult, h as SupervisedKnowledgeUpdateOptions, i as KnowledgeImprovementJobMeasurement, l as runKnowledgeImprovementJob, m as SupervisedKnowledgeUpdateInput, n as KnowledgeImprovementCandidatePair, o as RunKnowledgeImprovementJobOptions, p as RESEARCH_SUPERVISOR_SYSTEM_PROMPT, r as KnowledgeImprovementExperimentBundles, s as buildKnowledgeImprovementExperimentBundles, t as AgentKnowledgeReadinessCheckOptions, u as KnowledgeReadinessCheck, v as createSupervisedKnowledgeUpdater, w as createKnowledgeImprovementActivationExecutor, x as runSupervisedKnowledgeUpdate, y as formatSupervisedKnowledgeTask } from "./index-C-IJR7pR.js";
14
+ import { _ as researchLoopRunner, a as DELEGATED_LOOP_MODES, c as DelegatedLoopResult, d as ResearchLoopRunnerOptions, f as RunDelegatedLoopOptions, g as isDelegatedLoopMode, h as auditLoopRunner, i as runLoopRunnerCli, l as DelegatedLoopRunner, m as WorktreeLoopRunnerOptions, n as LoopRunnerCliResult, o as DelegatedLoopMode, p as VetoedFact, r as parseLoopRunnerArgv, s as DelegatedLoopRegistry, t as LoopRunnerCliArgs, u as ResearchLoopResult, v as runDelegatedLoop, y as worktreeLoopRunner } from "./loop-runner-bin-B6g4vOil.js";
15
+ import { n as mcpToolsForRuntimeMcpSubset, t as mcpToolsForRuntimeMcp } from "./openai-tools-CzEiSbPW.js";
16
16
  import { ControlBudget, ControlDecision, ControlEvalResult, ControlEvalResult as ControlEvalResult$1, ControlRunResult, ControlStep, DataAcquisitionPlan, KnowledgeReadinessReport, KnowledgeReadinessReport as KnowledgeReadinessReport$1, KnowledgeRequirement, ProposalFinding, RunRecord, RunRecord as RunRecord$1 } from "@tangle-network/agent-eval";
17
17
  import { GepaOptimizationMethodConfig, SkillOptOptimizationMethodConfig } from "@tangle-network/agent-eval/campaign";
18
18
  import { AgentProfile as AgentProfile$1 } from "@tangle-network/agent-interface";
package/dist/index.js CHANGED
@@ -1,19 +1,19 @@
1
1
  import { a as JudgeError, c as RuntimeRunStateError, i as ConfigError, o as NotFoundError, r as BackendTransportError, s as PlannerError, t as AgentEvalError, u as ValidationError } from "./errors-DEAvWQPy.js";
2
2
  import { a as normalizeBackendStreamEvent, c as nowIso, i as createSandboxPromptBackend, l as startOrResumeRuntimeSession, o as InMemoryRuntimeSessionStore, r as createIterableBackend, u as touchSession } from "./stream-agent-turn-DE8_alvm.js";
3
- import { $ as parseExactAgentProfile, G as agentCandidateProfileAsAgentProfile, K as applyExactAgentProfileDiff, S as CANDIDATE_TRACE_TAGS, Y as freezeGenericAgentCandidateProfile, Z as omitUndefinedObjectFields, _ as candidateExecutionClaim, a as persistCandidateOutputArtifact, c as CANDIDATE_KNOWLEDGE_ROOT_ENV, et as parseExactAgentProfileDiff, f as verifyAgentCandidateBundle, h as InMemoryAgentCandidateExecutionClaimStore, l as candidateKnowledgeExecutionPaths, n as executePreparedAgentCandidate, q as assertCandidateProfileBinding, rt as canonicalCandidateDigest, s as CANDIDATE_KNOWLEDGE_RETRIEVAL_CONFIG_ENV, t as prepareAgentCandidateExecution, tt as parseExactCandidateProfile, u as AGENT_CANDIDATE_EXECUTION_SUPPORT, x as CANDIDATE_TRACE_ENV } from "./prepare-DYWjVcPx.js";
4
- import { i as sealAgentCandidateBundle, n as captureAgentCandidateWorkspaceFiles, r as createAgentCandidateWorkspacePort, t as captureAgentCandidateWorkspace } from "./workspace-archive-aOfJ47ms.js";
5
- import { i as buildAgentCandidateBundle, n as disposePreparedAgentCandidateExecution, r as FileAgentCandidateExecutionClaimStore, t as recoverExpiredAgentCandidateExecution } from "./candidate-execution-BNxKr-Bu.js";
6
- import { n as exactProcessProviderAsCandidateExecutor, t as createProtectedAgentCandidateModelPort } from "./protected-model-port-48ALLGxT.js";
3
+ import { $ as parseExactAgentProfile, G as agentCandidateProfileAsAgentProfile, K as applyExactAgentProfileDiff, S as CANDIDATE_TRACE_TAGS, Y as freezeGenericAgentCandidateProfile, Z as omitUndefinedObjectFields, _ as candidateExecutionClaim, a as persistCandidateOutputArtifact, c as CANDIDATE_KNOWLEDGE_ROOT_ENV, et as parseExactAgentProfileDiff, f as verifyAgentCandidateBundle, h as InMemoryAgentCandidateExecutionClaimStore, l as candidateKnowledgeExecutionPaths, n as executePreparedAgentCandidate, q as assertCandidateProfileBinding, rt as canonicalCandidateDigest, s as CANDIDATE_KNOWLEDGE_RETRIEVAL_CONFIG_ENV, t as prepareAgentCandidateExecution, tt as parseExactCandidateProfile, u as AGENT_CANDIDATE_EXECUTION_SUPPORT, x as CANDIDATE_TRACE_ENV } from "./prepare-BQ82nG06.js";
4
+ import { i as sealAgentCandidateBundle, n as captureAgentCandidateWorkspaceFiles, r as createAgentCandidateWorkspacePort, t as captureAgentCandidateWorkspace } from "./workspace-archive-CGcXL3zA.js";
5
+ import { i as buildAgentCandidateBundle, n as disposePreparedAgentCandidateExecution, r as FileAgentCandidateExecutionClaimStore, t as recoverExpiredAgentCandidateExecution } from "./candidate-execution-DxL_I3xx.js";
6
+ import { n as exactProcessProviderAsCandidateExecutor, t as createProtectedAgentCandidateModelPort } from "./protected-model-port-BAOj4gQN.js";
7
7
  import { C as makePerAttemptSignal, S as defaultIsRetryable, T as createProfileExecutionBackend, _ as readDepth, a as FileConversationJournal, b as DeadlineExceededError, c as createConversationBackend, d as slugifySpeaker, f as turnId, g as isDepthExceeded, h as buildForwardHeaders, i as d1ToSqlAdapter, l as runConversation, m as FORWARD_HEADERS, n as runPersonaDispatch, o as InMemoryConversationJournal, p as DEFAULT_MAX_DEPTH, r as SqlConversationJournal, s as defineConversation, t as runPersonaConversation, u as runConversationStream, v as CircuitBreakerState, w as sleep, x as computeBackoff, y as CircuitOpenError } from "./conversation-9ZmilKp8.js";
8
- import { Ct as sanitizeAgentRuntimeEvent, St as createRuntimeStreamEventCollector, Tt as sanitizeRuntimeStreamEvent, _t as loopEventToOtelSpan, bt as toOtelAttributes, ct as INTELLIGENCE_WIRE_VERSION, dt as buildRuntimeEventOtelSpans, ft as createOpenInferenceFileExporter, gt as generateSpanId, lt as buildLoopOtelSpans, mt as exportEvalRuns, pt as createOtelExporter, ut as buildLoopSpanNodes, vt as padSpanId, wt as sanitizeKnowledgeReadinessReport, xt as createRuntimeEventCollector, yt as padTraceId } from "./supervisor-C16p9KqO.js";
8
+ import { Ct as sanitizeAgentRuntimeEvent, St as createRuntimeStreamEventCollector, Tt as sanitizeRuntimeStreamEvent, _t as loopEventToOtelSpan, bt as toOtelAttributes, ct as INTELLIGENCE_WIRE_VERSION, dt as buildRuntimeEventOtelSpans, ft as createOpenInferenceFileExporter, gt as generateSpanId, lt as buildLoopOtelSpans, mt as exportEvalRuns, pt as createOtelExporter, ut as buildLoopSpanNodes, vt as padSpanId, wt as sanitizeKnowledgeReadinessReport, xt as createRuntimeEventCollector, yt as padTraceId } from "./supervisor-CMtutocL.js";
9
9
  import { i as notifyRuntimeHookEvent, n as defineRuntimeHooks, r as notifyRuntimeDecisionPoint, t as composeRuntimeHooks } from "./runtime-hooks-C7iJOWm3.js";
10
- import { D as optimizerMethod, O as strategyAuthorMethod } from "./structural-rollout-n089ZP33.js";
11
- import { A as improve, B as commandVerifier, F as normalizeRolloutPolicy, I as parseRolloutPolicy, L as serializeRolloutPolicy, M as rawTraceDistiller, N as ROLLOUT_POLICY_EXTENSION, P as applyRolloutPolicyToProfile, R as structuralRolloutPolicyFromProfile, V as defaultBuildPrompt, j as withMethodRuntimeControls, z as agenticGenerator } from "./improvement-cycle-BGF0osPC.js";
12
- import { Dt as McpSpawnFault, Ot as connectStdioMcp } from "./runtime-ZNVnT8h1.js";
10
+ import { D as optimizerMethod, O as strategyAuthorMethod } from "./structural-rollout-v8o_EO8_.js";
11
+ import { A as improve, B as commandVerifier, F as normalizeRolloutPolicy, I as parseRolloutPolicy, L as serializeRolloutPolicy, M as rawTraceDistiller, N as ROLLOUT_POLICY_EXTENSION, P as applyRolloutPolicyToProfile, R as structuralRolloutPolicyFromProfile, V as defaultBuildPrompt, j as withMethodRuntimeControls, z as agenticGenerator } from "./improvement-cycle-XtFD7dCv.js";
12
+ import { Ot as McpSpawnFault, kt as connectStdioMcp } from "./runtime-BVKEU5jc.js";
13
13
  import { n as defaultRedactorIdentityMaterial, r as resolveRedactor, t as defaultRedactor } from "./redact-D-u-rrcn.js";
14
- import { a as createSupervisedKnowledgeUpdater, c as runSupervisedKnowledgeUpdate, i as RESEARCH_SUPERVISOR_SYSTEM_PROMPT, l as createKnowledgeImprovementActivationExecutor, n as createAgentKnowledgeReadinessCheck, o as formatSupervisedKnowledgeTask, r as runKnowledgeImprovementJob, s as knowledgeReadinessDeliverable, t as buildKnowledgeImprovementExperimentBundles } from "./knowledge-D4zNvxw5.js";
15
- import { a as isDelegatedLoopMode, c as worktreeLoopRunner, i as auditLoopRunner, n as runLoopRunnerCli, o as researchLoopRunner, r as DELEGATED_LOOP_MODES, s as runDelegatedLoop, t as parseLoopRunnerArgv } from "./loop-runner-bin-CI9Y0sxT.js";
16
- import { n as mcpToolsForRuntimeMcpSubset, t as mcpToolsForRuntimeMcp } from "./openai-tools-CupeHJEv.js";
14
+ import { a as createSupervisedKnowledgeUpdater, c as runSupervisedKnowledgeUpdate, i as RESEARCH_SUPERVISOR_SYSTEM_PROMPT, l as createKnowledgeImprovementActivationExecutor, n as createAgentKnowledgeReadinessCheck, o as formatSupervisedKnowledgeTask, r as runKnowledgeImprovementJob, s as knowledgeReadinessDeliverable, t as buildKnowledgeImprovementExperimentBundles } from "./knowledge-DPDhKnOz.js";
15
+ import { a as isDelegatedLoopMode, c as worktreeLoopRunner, i as auditLoopRunner, n as runLoopRunnerCli, o as researchLoopRunner, r as DELEGATED_LOOP_MODES, s as runDelegatedLoop, t as parseLoopRunnerArgv } from "./loop-runner-bin-DCBho3GJ.js";
16
+ import { n as mcpToolsForRuntimeMcpSubset, t as mcpToolsForRuntimeMcp } from "./openai-tools-BeVFVJlX.js";
17
17
  import { FAILURE_CLASSES, acquisitionPlansForKnowledgeGaps, blockingKnowledgeEval, canonicalJson, runAgentControlLoop, scoreKnowledgeReadiness, userQuestionsForKnowledgeGaps } from "@tangle-network/agent-eval";
18
18
  import { gepaOptimizationMethod, skillOptOptimizationMethod } from "@tangle-network/agent-eval/campaign";
19
19
  import { spawnSync } from "node:child_process";
@@ -140,7 +140,7 @@ function mcpServeVerifier(spec) {
140
140
  //#region src/improvement/official-optimizers.ts
141
141
  const defaultMaxFindingsChars = 5e4;
142
142
  const pythonClientDocs = "https://github.com/tangle-network/agent-eval/tree/main/clients/python";
143
- const bridgeInstall = "`python -m pip install \"agent-eval-rpc==0.144.8\"`";
143
+ const bridgeInstall = "`python -m pip install \"agent-eval-rpc==0.144.10\"`";
144
144
  const gepaWheelInstall = "`python -m pip install \"gepa[full]==0.1.4\"`";
145
145
  const gepaSourceInstall = "`python -m pip install \"gepa[full] @ git+https://github.com/gepa-ai/gepa.git@f919db0a622e2e9f9204779b81fe00cc1b2d808f\"`";
146
146
  const skillOptInstall = `${bridgeInstall}, then \`python -m pip install "skillopt @ git+https://github.com/microsoft/SkillOpt.git@61735e3922efc2b90c6d6cab561e62e98452ca90"\``;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/improvement/build-prompts.ts","../src/improvement/mcp-serve-verifier.ts","../src/improvement/official-optimizers.ts","../src/improvement/reflective-generator.ts","../src/model-resolution.ts","../src/readiness.ts","../src/run.ts","../src/runtime-run.ts","../src/sse.ts"],"sourcesContent":["/**\n * Build-prompt starting points for the two buildable artifact types. There is\n * NO `toolGenerator`/`mcpGenerator` wrapper — the factory is `agenticGenerator`\n * + a verifier (docs/artifact-lifecycle-frontier.md), so a tool or an MCP\n * server is built by composing the pieces directly:\n *\n * // a tool:\n * agenticGenerator({ profile, executorForWorktree, buildPrompt: toolBuildPrompt,\n * verify: commandVerifier('pnpm', ['test']) })\n * // an MCP server:\n * agenticGenerator({ profile, executorForWorktree, buildPrompt: mcpBuildPrompt,\n * verify: mcpServeVerifier({ command: 'node', args: ['server.mjs'] }) })\n *\n * These are the only type-specific bit (the phrasing that points the agent at a\n * tool vs. an MCP); the worktree, resume-on-failure loop, and improvement-loop\n * wrapper are shared. MCP is the load-bearing target — it is how a harness\n * acquires tools; raw tools matter where we control the loader.\n */\n\nimport type { ProposalFinding } from '@tangle-network/agent-eval'\nimport { optimizerMethod } from './optimizer-prompt'\n\n/** Evidence supplied to a generated tool or MCP build instruction. */\nexport interface BuildPromptFindingsInput {\n findings: ReadonlyArray<ProposalFinding>\n}\n\n/** Render findings as the ranked-evidence block every build prompt ends with. */\nexport function findingLines(findings: ReadonlyArray<ProposalFinding>): string[] {\n return findings.map((f) => {\n const where = f.subject ? ` [${f.subject}]` : ''\n const action = f.recommended_action ? ` → ${f.recommended_action}` : ''\n return `- (${f.severity})${where} ${f.claim}${action}`\n })\n}\n\n/** Build the starting instruction for a coder agent tasked with implementing a new tool. */\nexport function toolBuildPrompt(args: BuildPromptFindingsInput): string {\n return [\n 'You are building a new TOOL for this codebase — a capability the agent measurably lacks,',\n 'evidenced by the failure findings at the bottom. The tool is an experiment: after it is',\n 'built and verified, its marginal lift is measured on held-out tasks, and only a real lift',\n 'promotes it.',\n '',\n optimizerMethod,\n '',\n 'THE SURFACE — what a deliverable tool looks like here:',\n '- ONE small, self-contained module PLUS tests that exercise its contract (what callers rely',\n ' on), not its internals. The tests are the experiment for sub-goal correctness — write the',\n ' test that would fail if your hypothesis about the gap were wrong.',\n '- It must compile and its tests must pass — they run automatically; on failure you get the',\n ' verifier output and another attempt, resuming on top of your own edits (fix in place, do',\n ' not start over).',\n '- Match the codebase grain: reuse its existing helpers, style, and test framework; a tool',\n ' that fights the codebase is the wrong tool even if it passes.',\n '- Do not commit; leave the changes in the working tree.',\n '',\n 'FINDINGS — ranked evidence from real failed runs (the gaps the tool must close):',\n ...findingLines(args.findings),\n ].join('\\n')\n}\n\n/** Build the starting instruction for a coder agent tasked with implementing a new MCP server. */\nexport function mcpBuildPrompt(args: BuildPromptFindingsInput): string {\n return [\n 'You are building a new MCP SERVER (Model Context Protocol) exposing tool(s) that close the',\n 'capability gaps evidenced by the failure findings at the bottom, so any harness can mount',\n 'them. The server is an experiment: after it is built and boot-verified, its marginal lift is',\n 'measured on held-out tasks, and only a real lift promotes it.',\n '',\n optimizerMethod,\n '',\n 'RESEARCH FIRST — ADOPT BEFORE BUILD: you may discover and ADOPT an existing external MCP',\n 'server if it fits the gaps better than building one. Registries and vendor docs list',\n 'maintained servers for most common capabilities (web search, fetch, GitHub, filesystems,',\n 'databases). To adopt, deliver a short adoption note instead of an implementation: the',\n \"server's launch command or HTTP endpoint, and the API key it needs BY NAME (e.g.\",\n 'EXA_API_KEY) — never a key value; provisioning injects the value at materialize time. If',\n 'your environment has no web access, decide from what you already know and say so.',\n '',\n 'THE SURFACE — what a deliverable MCP server looks like here (checked by BOOTING it):',\n '- it starts over stdio and answers the MCP `initialize` handshake,',\n '- `tools/list` returns at least one tool with a valid input schema,',\n '- newline-delimited JSON-RPC 2.0, protocol version 2024-11-05,',\n '- a clear start command (a package.json `start` script or an obvious entrypoint).',\n 'Design the tool surface for the FINDINGS, not for generality: each exposed tool should map to',\n 'a named failure mechanism, with a description that tells the agent when to reach for it (a',\n 'tool the agent never calls measures zero). If the boot-and-probe fails you get the error and',\n 'another attempt, resuming on top of your own edits. Do not commit; leave the changes in the',\n 'working tree.',\n '',\n 'FINDINGS — ranked evidence from real failed runs (the capabilities the server must provide):',\n ...findingLines(args.findings),\n ].join('\\n')\n}\n","/**\n * `mcpServeVerifier` — the intrinsic verifier for a built MCP server: the\n * boot-and-probe checker named in docs/artifact-lifecycle-frontier.md. A\n * generated MCP server is only a candidate if it actually *serves* — so this\n * boots it over stdio (the default local MCP transport) and runs the real\n * handshake: `initialize` → `notifications/initialized` → `tools/list`, and\n * asserts the server answers with at least `minTools` tools.\n *\n * The spawn + handshake is the SHARED same-host stdio connection\n * (`connectStdioMcp`) — the same code path that later serves the built server\n * LIVE to a scored run (`materializeLocalMcp`), so \"verified it serves\" and\n * \"served while scored\" can never drift apart.\n *\n * Outcomes follow the `Verifier` contract: a server that fails to start, exits\n * early, errors the handshake, times out, or exposes no tools is a FAILED\n * candidate (`{ok:false}`, fed back into the next generation shot); a missing\n * start binary or spawn fault THROWS (a setup bug, never a silent fallback).\n */\n\nimport {\n connectStdioMcp,\n McpSpawnFault,\n type StdioMcpConnection,\n} from '../runtime/stdio-mcp-client'\nimport type { Verifier, VerifyResult } from './agentic-generator'\n\nexport interface McpServeSpec {\n /** Command that starts the built MCP server in the worktree (stdio transport). */\n command: string\n args?: string[]\n /** Extra env for the server process (merged over `process.env`). */\n env?: Record<string, string>\n /** Handshake timeout (ms). Default 30s. */\n timeoutMs?: number\n /** Minimum tools the server must expose to pass. Default 1. */\n minTools?: number\n}\n\n/** Build a `Verifier` that boots a generated MCP server over stdio and checks it exposes tools. */\nexport function mcpServeVerifier(spec: McpServeSpec): Verifier {\n const minTools = spec.minTools ?? 1\n\n return async (worktreePath: string): Promise<VerifyResult> => {\n let conn: StdioMcpConnection\n try {\n conn = await connectStdioMcp({\n command: spec.command,\n ...(spec.args ? { args: spec.args } : {}),\n cwd: worktreePath,\n ...(spec.env ? { env: spec.env } : {}),\n ...(spec.timeoutMs !== undefined ? { timeoutMs: spec.timeoutMs } : {}),\n })\n } catch (err) {\n if (err instanceof McpSpawnFault) {\n throw new Error(`mcpServeVerifier: ${err.message}`)\n }\n // Crash-on-boot / handshake error / timeout: a failed candidate, with the\n // connection's stderr-tailed message as the feedback for the next shot.\n return { ok: false, feedback: err instanceof Error ? err.message : String(err) }\n }\n try {\n if (conn.tools.length < minTools) {\n return {\n ok: false,\n feedback: `tools/list returned ${conn.tools.length} tool(s), need >= ${minTools}`,\n }\n }\n return { ok: true }\n } finally {\n await conn.close()\n }\n }\n}\n","import { isDeepStrictEqual } from 'node:util'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type GepaOptimizationMethodConfig,\n gepaOptimizationMethod,\n type JudgeScore,\n type OptimizationMethod,\n type SkillOptOptimizationMethodConfig,\n skillOptOptimizationMethod,\n} from '@tangle-network/agent-eval/campaign'\nimport { canonicalCandidateDigest } from '../candidate-execution/digest'\nimport { ConfigError } from '../errors'\nimport {\n defaultRedactor,\n defaultRedactorIdentityMaterial,\n type Redactor,\n resolveRedactor,\n} from '../redact'\nimport type {\n ImproveCandidateValidationInput,\n ImproveMethodContext,\n ImproveMethodFactory,\n} from './improve'\nimport { withMethodRuntimeControls } from './method-controls'\n\nconst defaultMaxFindingsChars = 50_000\nconst pythonClientDocs = 'https://github.com/tangle-network/agent-eval/tree/main/clients/python'\nconst bridgeInstall = '`python -m pip install \"agent-eval-rpc==0.144.8\"`'\nconst gepaWheelInstall = '`python -m pip install \"gepa[full]==0.1.4\"`'\nconst gepaSourceInstall =\n '`python -m pip install \"gepa[full] @ git+https://github.com/gepa-ai/gepa.git@f919db0a622e2e9f9204779b81fe00cc1b2d808f\"`'\nconst skillOptInstall =\n `${bridgeInstall}, then ` +\n '`python -m pip install \"skillopt @ git+https://github.com/microsoft/SkillOpt.git@61735e3922efc2b90c6d6cab561e62e98452ca90\"`'\n\n/** Runtime context appended to an official optimizer's own configuration. */\nexport interface OfficialOptimizerContextOptions {\n /** Context supplied to the optimizer before Runtime appends the profile surface and findings. */\n background?: string\n /** Include current trace or analyst findings in the optimizer background. Default true. */\n includeFindings?: boolean\n /** Reject oversized serialized findings before starting Python. Default 50,000 characters. */\n maxFindingsChars?: number\n /**\n * Redact caller-supplied context and descriptors before they leave Runtime.\n * The built-in redactor is the default. Pass `false` only for public data\n * that has already been reviewed.\n */\n redact?: Redactor | false\n /** Authorize one exact candidate containing structurally sensitive fields.\n * The callback must return true for every accepted baseline and candidate. */\n authorizeSensitiveCandidate?: (input: OfficialSensitiveCandidateInput) => boolean\n}\n\nexport interface OfficialSensitiveCandidateInput extends ImproveCandidateValidationInput {\n sensitivePaths: readonly string[]\n}\n\n/** Official GEPA configuration plus bounded Runtime findings context. */\nexport type OfficialGepaOptions<\n TScenario extends { id: string; kind: string },\n TArtifact = unknown,\n> = Omit<GepaOptimizationMethodConfig<TScenario, TArtifact>, 'background' | 'evaluationId'> &\n OfficialOptimizerContextOptions\n\n/** Official SkillOpt configuration plus bounded Runtime findings context. */\nexport type OfficialSkillOptOptions<\n TScenario extends { id: string; kind: string },\n TArtifact = unknown,\n> = Omit<SkillOptOptimizationMethodConfig<TScenario, TArtifact>, 'background' | 'evaluationId'> &\n OfficialOptimizerContextOptions\n\n/** Missing optional Python dependencies for an official optimizer. */\nexport class OfficialOptimizerUnavailableError extends ConfigError {\n readonly optimizer: 'gepa' | 'skillopt'\n\n constructor(optimizer: 'gepa' | 'skillopt', cause: unknown) {\n const detail = cause instanceof Error ? cause.message : String(cause)\n const install =\n optimizer === 'gepa'\n ? [\n `Install the Python bridge: ${bridgeInstall}.`,\n `The direct GEPA engine uses the published wheel: ${gepaWheelInstall}.`,\n `Composed recipes and source-only engines use the tested source revision: ${gepaSourceInstall}.`,\n ].join(' ')\n : `Install Microsoft SkillOpt: ${skillOptInstall}.`\n super(\n [\n `Official ${optimizer === 'gepa' ? 'GEPA' : 'SkillOpt'} could not start.`,\n 'Runtime did not use a local fallback.',\n install,\n `Setup: ${pythonClientDocs}.`,\n `Cause: ${detail}`,\n ].join(' '),\n { cause },\n )\n this.optimizer = optimizer\n }\n}\n\n/**\n * Build a complete method backed by GEPA's official Optimize Anything API.\n *\n * The recipe is passed through unchanged. Use `engine`, `sequential`,\n * `adaptive-sequential`, `best-of`, `vote`, or `omni` explicitly.\n */\nexport function officialGepa<TScenario extends { id: string; kind: string }, TArtifact = unknown>(\n options: OfficialGepaOptions<TScenario, TArtifact>,\n): ImproveMethodFactory<TScenario, TArtifact> {\n const {\n background,\n includeFindings = true,\n maxFindingsChars,\n describeScenario,\n describeArtifact,\n redact,\n authorizeSensitiveCandidate,\n ...config\n } = options\n const redactor = resolveRedactor(redact)\n const redactionPolicyRef = optimizerRedactionPolicyRef(redact)\n assertMaxFindingsChars('officialGepa', maxFindingsChars)\n const objective = redactOptimizerText('officialGepa', 'objective', config.objective, redactor)\n return (context) => {\n const externalEvaluationRef = optimizerEvidencePolicyRef({\n runtimeEvaluationRef: context.evaluationRef,\n redactionPolicyRef,\n describeScenario,\n describeArtifact,\n authorizeSensitiveCandidate,\n })\n const method = withDependencyHelp(\n 'gepa',\n externalEvaluationRef,\n redactor,\n redactionPolicyRef,\n gepaOptimizationMethod<TScenario, TArtifact>({\n ...config,\n objective,\n evaluationId: externalEvaluationRef,\n background: methodBackground({\n context,\n background,\n includeFindings,\n maxFindingsChars,\n label: 'officialGepa',\n redactor,\n }),\n ...(describeScenario\n ? {\n describeScenario: (scenario) =>\n redactOptimizerEvidence(\n 'officialGepa',\n 'scenario descriptor',\n describeScenario(scenario),\n redactor,\n ),\n }\n : {}),\n ...(describeArtifact\n ? {\n describeArtifact: (artifact, scenario) =>\n redactOptimizerEvidence(\n 'officialGepa',\n 'artifact descriptor',\n describeArtifact(artifact, scenario),\n redactor,\n ),\n }\n : {}),\n }),\n )\n return withMethodRuntimeControls(method, {\n costAttribution: 'optimizer-run',\n validateCandidate: (input) =>\n assertSafeOptimizerCandidate('officialGepa', input, authorizeSensitiveCandidate),\n })\n }\n}\n\n/** Build a complete method backed by Microsoft's official SkillOpt trainer. */\nexport function officialSkillOpt<\n TScenario extends { id: string; kind: string },\n TArtifact = unknown,\n>(\n options: OfficialSkillOptOptions<TScenario, TArtifact>,\n): ImproveMethodFactory<TScenario, TArtifact> {\n const {\n background,\n includeFindings = true,\n maxFindingsChars,\n describeScenario,\n describeArtifact,\n redact,\n authorizeSensitiveCandidate,\n ...config\n } = options\n const redactor = resolveRedactor(redact)\n const redactionPolicyRef = optimizerRedactionPolicyRef(redact)\n assertMaxFindingsChars('officialSkillOpt', maxFindingsChars)\n const objective = redactOptimizerText('officialSkillOpt', 'objective', config.objective, redactor)\n return (context) => {\n const externalEvaluationRef = optimizerEvidencePolicyRef({\n runtimeEvaluationRef: context.evaluationRef,\n redactionPolicyRef,\n describeScenario,\n describeArtifact,\n authorizeSensitiveCandidate,\n })\n const method = withDependencyHelp(\n 'skillopt',\n externalEvaluationRef,\n redactor,\n redactionPolicyRef,\n skillOptOptimizationMethod<TScenario, TArtifact>({\n ...config,\n objective,\n evaluationId: externalEvaluationRef,\n background: methodBackground({\n context,\n background,\n includeFindings,\n maxFindingsChars,\n label: 'officialSkillOpt',\n redactor,\n }),\n ...(describeScenario\n ? {\n describeScenario: (scenario) =>\n redactOptimizerEvidence(\n 'officialSkillOpt',\n 'scenario descriptor',\n describeScenario(scenario),\n redactor,\n ),\n }\n : {}),\n ...(describeArtifact\n ? {\n describeArtifact: (artifact, scenario) =>\n redactOptimizerEvidence(\n 'officialSkillOpt',\n 'artifact descriptor',\n describeArtifact(artifact, scenario),\n redactor,\n ),\n }\n : {}),\n }),\n )\n return withMethodRuntimeControls(method, {\n costAttribution: 'optimizer-run',\n validateCandidate: (input) =>\n assertSafeOptimizerCandidate('officialSkillOpt', input, authorizeSensitiveCandidate),\n })\n }\n}\n\nfunction assertMaxFindingsChars(label: string, value: number | undefined): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new ConfigError(`${label}: maxFindingsChars must be a positive safe integer`)\n }\n}\n\nfunction methodBackground(options: {\n context: ImproveMethodContext\n background: string | undefined\n includeFindings: boolean\n maxFindingsChars: number | undefined\n label: string\n redactor: Redactor\n}): string {\n const {\n context,\n background,\n includeFindings,\n maxFindingsChars = defaultMaxFindingsChars,\n label,\n redactor,\n } = options\n const safeBackground =\n background === undefined\n ? undefined\n : redactOptimizerText(label, 'background', background, redactor)\n const safeProfileName =\n context.profile.name === undefined\n ? undefined\n : redactOptimizerText(label, 'profile name', context.profile.name, redactor)\n const sections = [\n safeBackground?.trim(),\n safeProfileName\n ? `Agent profile: ${safeProfileName}. Surface: ${context.surface}.`\n : `Agent surface: ${context.surface}.`,\n ].filter((value): value is string => Boolean(value))\n if (includeFindings && context.findings.length > 0) {\n let serialized: string\n try {\n serialized = canonicalJson(\n redactOptimizerEvidence(label, 'findings', context.findings, redactor),\n )\n } catch (cause) {\n throw new ConfigError(`${label}: findings must be JSON-serializable`, { cause })\n }\n if (serialized.length > maxFindingsChars) {\n throw new ConfigError(\n `${label}: serialized findings exceed maxFindingsChars (${serialized.length} > ${maxFindingsChars})`,\n )\n }\n sections.push(`Observed failures:\\n${serialized}`)\n }\n return sections.join('\\n\\n')\n}\n\nfunction assertSafeOptimizerCandidate(\n label: string,\n input: ImproveCandidateValidationInput,\n authorizeSensitiveCandidate: ((input: OfficialSensitiveCandidateInput) => boolean) | undefined,\n): void {\n const redactedValue = defaultRedactor(input.value)\n const redactedSurface = defaultRedactor(input.candidateSurface)\n if (\n !isDeepStrictEqual(input.value, redactedValue) ||\n !isDeepStrictEqual(input.candidateSurface, redactedSurface)\n ) {\n throw new ConfigError(\n `${label}: the selected profile surface contains a common credential or private value. ` +\n 'Store live credentials as provider references, or remove private data before starting an external optimizer.',\n )\n }\n const sensitivePaths = sensitiveProfileSurfacePaths(input)\n if (sensitivePaths.length === 0) return\n let authorized = false\n if (authorizeSensitiveCandidate) {\n try {\n authorized =\n authorizeSensitiveCandidate(\n Object.freeze({\n ...input,\n sensitivePaths: Object.freeze([...sensitivePaths]),\n }),\n ) === true\n } catch (cause) {\n throw new ConfigError(`${label}: sensitive candidate authorization failed`, { cause })\n }\n }\n if (!authorized) {\n throw new ConfigError(\n `${label}: the selected profile surface contains fields that may carry private values: ` +\n `${sensitivePaths.slice(0, 8).join(', ')}. Remove them, replace values with safe references, ` +\n 'or authorize the exact profile with authorizeSensitiveCandidate.',\n )\n }\n}\n\nfunction sensitiveProfileSurfacePaths(input: ImproveCandidateValidationInput): string[] {\n const paths = new Set<string>()\n if (\n input.surface === 'tools' ||\n input.surface === 'mcp' ||\n input.surface === 'hooks' ||\n input.surface === 'subagents' ||\n input.surface === 'agent-profile'\n ) {\n paths.add('$')\n }\n const seen = new WeakSet<object>()\n const visit = (current: unknown, path: string): void => {\n if (current === null || typeof current !== 'object') return\n if (seen.has(current)) return\n seen.add(current)\n if (Array.isArray(current)) {\n current.forEach((child, index) => {\n visit(child, `${path}[${index}]`)\n })\n return\n }\n for (const [key, child] of Object.entries(current as Record<string, unknown>)) {\n const childPath = `${path}.${key}`\n if (['env', 'headers', 'url', 'metadata', 'extensions'].includes(key.toLowerCase())) {\n paths.add(childPath)\n continue\n }\n visit(child, childPath)\n }\n }\n visit(input.value, '$')\n return [...paths]\n}\n\nfunction redactOptimizerEvidence(\n label: string,\n field: string,\n value: unknown,\n redactor: Redactor,\n): unknown {\n try {\n return redactor(value)\n } catch (cause) {\n throw new ConfigError(`${label}: ${field} redaction failed`, { cause })\n }\n}\n\nfunction redactOptimizerText(\n label: string,\n field: string,\n value: string,\n redactor: Redactor,\n): string {\n const redacted = redactOptimizerEvidence(label, field, value, redactor)\n if (typeof redacted !== 'string' || !redacted.trim()) {\n throw new ConfigError(`${label}: ${field} redaction must return a non-empty string`)\n }\n return redacted\n}\n\nfunction redactJudgeScore(score: JudgeScore, redactor: Redactor): JudgeScore {\n const notes = redactOptimizerEvidence('official optimizer', 'judge notes', score.notes, redactor)\n return {\n ...score,\n notes: typeof notes === 'string' ? notes : '[redacted]',\n }\n}\n\nexport function optimizerRedactionPolicyRef(\n redact: Redactor | false | undefined,\n builtInIdentity: unknown = defaultRedactorIdentityMaterial(),\n): string {\n if (redact === false) return 'caller-approved-raw'\n return canonicalCandidateDigest({\n kind: redact === undefined ? 'default-redactor' : 'caller-redactor-with-default',\n builtIn: builtInIdentity,\n ...(redact === undefined\n ? {}\n : {\n callerSource: Function.prototype.toString.call(redact),\n composition: Function.prototype.toString.call(resolveRedactor),\n }),\n })\n}\n\nfunction optimizerEvidencePolicyRef(input: {\n runtimeEvaluationRef: ImproveMethodContext['evaluationRef']\n redactionPolicyRef: string\n describeScenario: unknown\n describeArtifact: unknown\n authorizeSensitiveCandidate: unknown\n}): ReturnType<typeof canonicalCandidateDigest> {\n return canonicalCandidateDigest({\n runtimeEvaluationRef: input.runtimeEvaluationRef,\n redactionPolicyRef: input.redactionPolicyRef,\n describeScenario: callbackSource(input.describeScenario),\n describeArtifact: callbackSource(input.describeArtifact),\n authorizeSensitiveCandidate: callbackSource(input.authorizeSensitiveCandidate),\n })\n}\n\nfunction callbackSource(callback: unknown): string | null {\n return typeof callback === 'function' ? Function.prototype.toString.call(callback) : null\n}\n\nfunction withDependencyHelp<TScenario extends { id: string; kind: string }, TArtifact>(\n optimizer: 'gepa' | 'skillopt',\n evaluationRef: ImproveMethodContext['evaluationRef'],\n redactor: Redactor,\n redactionPolicyRef: string,\n method: OptimizationMethod<TScenario, TArtifact>,\n): OptimizationMethod<TScenario, TArtifact> {\n return {\n ...method,\n async optimize(input) {\n try {\n const judges = input.judges.map((judge) =>\n Object.freeze({\n ...judge,\n judgeVersion: canonicalCandidateDigest({\n evaluationRef,\n name: judge.name,\n dimensions: judge.dimensions,\n judgeVersion: judge.judgeVersion ?? null,\n outwardEvidence: redactionPolicyRef,\n }),\n async score(scoreInput: Parameters<typeof judge.score>[0]) {\n return redactJudgeScore(await judge.score(scoreInput), redactor)\n },\n }),\n )\n return await method.optimize({\n ...input,\n judges: Object.freeze(judges),\n })\n } catch (cause) {\n if (isMissingDependency(optimizer, cause)) {\n throw new OfficialOptimizerUnavailableError(optimizer, cause)\n }\n throw cause\n }\n },\n }\n}\n\nfunction isMissingDependency(optimizer: 'gepa' | 'skillopt', cause: unknown): boolean {\n const message = cause instanceof Error ? cause.message : String(cause)\n const common = [\n `${optimizer === 'gepa' ? 'GEPA' : 'SkillOpt'} bridge could not start`,\n 'source inspection could not start',\n \"No module named 'agent_eval_rpc'\",\n `No module named 'agent_eval_rpc.${optimizer === 'gepa' ? 'gepa_bridge' : 'skillopt_bridge'}'`,\n ]\n const specific =\n optimizer === 'gepa'\n ? [\n 'requires GEPA',\n \"requires GEPA's Optimize Anything\",\n \"No module named 'gepa'\",\n 'gepa is importable but its package metadata is unavailable',\n ]\n : [\n 'requires skillopt',\n 'requires SkillOpt',\n \"No module named 'skillopt'\",\n 'skillopt is importable but its package metadata is unavailable',\n ]\n return [...common, ...specific].some((fragment) => message.includes(fragment))\n}\n","/**\n *\n * `reflectiveGenerator` — the cheap, no-sandbox `CandidateGenerator`. It drafts\n * surface edits via the existing improvement proposer (`proposeFromFindings`,\n * one LLM patch per finding) and applies them as ONE coherent improvement into\n * the candidate worktree. `maxShots` is ignored — reflection is single-shot by\n * construction (the patches are already drafted).\n *\n * This is the `shots=1, sandbox=off` code-candidate setting.\n * `agenticGenerator` supplies the multi-shot verify-in-session setting.\n *\n * @stable\n */\n\nimport { spawnSync } from 'node:child_process'\nimport type { SurfaceImprovementEdit } from '../agent/improvement-adapter'\nimport type { ImprovementProposalSource } from '../analyst-loop/types'\nimport type { CandidateGenerator } from './improvement-driver'\n\nexport interface ReflectiveGeneratorOptions {\n improvementProposalSource: ImprovementProposalSource<SurfaceImprovementEdit>\n}\n\n/** Cheap no-sandbox `CandidateGenerator` (the `shots=1` setting): draft surface edits via the improvement adapter and apply them as one coherent candidate. */\nexport function reflectiveGenerator(opts: ReflectiveGeneratorOptions): CandidateGenerator {\n return {\n kind: 'reflective',\n async generate({ worktreePath, findings }) {\n const batch = await opts.improvementProposalSource.proposeFromFindings(findings)\n if (batch.edits.length === 0) return { applied: false, summary: '' }\n\n let applied = 0\n for (const edit of batch.edits) {\n if (applyPatch(edit.patch, worktreePath)) applied++\n }\n if (applied === 0) return { applied: false, summary: '' }\n\n const summary =\n batch.edits.length === 1\n ? batch.edits[0]!.summary\n : `analyst: ${applied} surface edit${applied === 1 ? '' : 's'}`\n return { applied: true, summary }\n },\n }\n}\n\n/** Apply a proposed patch inside the isolated candidate worktree.\n * candidate worktree (a fresh checkout of baseRef, so `-p0` paths match). */\nfunction applyPatch(patch: string, cwd: string): boolean {\n const result = spawnSync('git', ['apply', '--whitespace=fix', '-p0', '-'], {\n cwd,\n input: patch,\n encoding: 'utf-8',\n })\n return result.status === 0\n}\n","/**\n *\n * Chat-model resolution + catalog validation — the shared primitive every\n * product chat handler needs and was, until now, hand-rolling. Lifts the\n * router `/v1/models` fetch, the fail-closed id validation, and the\n * precedence resolver out of four near-identical per-repo copies.\n *\n * Policy-free by design: callers pass their own precedence order\n * (`resolveChatModel`) and their own known-good `allowlist`\n * (`validateChatModelId`), so each product keeps its resolution policy while\n * sharing the catalog fetch, the malformed-id guard, and the fail-closed\n * admission rule. No React, no `process.env` assumption — `env` is an\n * explicit narrow record so this runs unchanged in Node and in Workers.\n *\n * @stable\n */\n\n/**\n * A model entry as returned by the Tangle Router `/v1/models` endpoint.\n * Intentionally minimal — only the fields resolution + validation read.\n */\nexport interface ModelInfo {\n id: string\n name?: string\n description?: string\n /** Provider slug, when the router exposes it (`provider` or `_provider`). */\n provider?: string\n _provider?: string\n architecture?: {\n modality?: string\n input_modalities?: string[]\n output_modalities?: string[]\n }\n}\n\n/** Env keys the router base URL is resolved from. */\nexport interface RouterEnv {\n TANGLE_ROUTER_URL?: string\n TANGLE_ROUTER_BASE_URL?: string\n}\n\n/** Default Tangle Router base URL used when no env override is set. */\nexport const DEFAULT_ROUTER_BASE_URL = 'https://router.tangle.tools'\n\n/** Resolve the router base URL from env, normalised — no trailing `/v1` or `/`. */\nexport function resolveRouterBaseUrl(env: RouterEnv = {}): string {\n return (env.TANGLE_ROUTER_URL ?? env.TANGLE_ROUTER_BASE_URL ?? DEFAULT_ROUTER_BASE_URL)\n .replace(/\\/v1\\/?$/, '')\n .replace(/\\/$/, '')\n}\n\n/**\n * Fetch the model catalog from the router's `/v1/models`. Throws on a non-2xx\n * response — callers decide whether to fail open (empty catalog) or closed.\n */\nexport async function getModels(\n routerBaseUrl: string = DEFAULT_ROUTER_BASE_URL,\n): Promise<ModelInfo[]> {\n const res = await fetch(`${routerBaseUrl}/v1/models`, {\n headers: { Accept: 'application/json' },\n })\n if (!res.ok) throw new Error(`router /v1/models ${res.status}`)\n const body = (await res.json()) as { data?: ModelInfo[] }\n return Array.isArray(body.data) ? body.data : []\n}\n\n/** Trim a candidate model id; `undefined` for non-strings and blanks. */\nexport function cleanModelId(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nexport interface ChatModelCandidate {\n /** Stable label for telemetry — e.g. `request`, `workspace`, `env`. */\n source: string\n model: string | undefined\n}\n\nexport interface ResolvedChatModel {\n source: string\n model: string\n}\n\n/**\n * Resolve a chat model by precedence: the first candidate carrying a\n * non-blank model wins, else `fallback`. The caller owns the precedence\n * order, so each product keeps its own policy (request → workspace → env,\n * etc.) while the first-non-blank logic and the telemetry shape stay shared.\n */\nexport function resolveChatModel(\n candidates: ChatModelCandidate[],\n fallback: ResolvedChatModel,\n): ResolvedChatModel {\n for (const candidate of candidates) {\n const model = cleanModelId(candidate.model)\n if (model) return { source: candidate.source, model }\n }\n return fallback\n}\n\nexport type ChatModelValidation =\n | { succeeded: true; value: string }\n | { succeeded: false; error: string }\n\nconst WELL_FORMED_MODEL_ID = /^[A-Za-z0-9._/@:-]+$/\n\nfunction isWellFormedModelId(modelId: string): boolean {\n return modelId.length <= 200 && WELL_FORMED_MODEL_ID.test(modelId)\n}\n\n/**\n * Every id a catalog entry can be addressed by — its bare id, plus a\n * `provider/id` form when the router exposes a separate provider slug.\n */\nfunction catalogIdsForModel(model: ModelInfo): string[] {\n const ids = new Set<string>()\n const id = cleanModelId(model.id)\n if (id) ids.add(id)\n const provider = cleanModelId(model._provider) ?? cleanModelId(model.provider)\n if (provider && id && !id.includes('/')) ids.add(`${provider}/${id}`)\n return [...ids]\n}\n\n/**\n * Validate a caller-supplied chat-model id. Rejects non-strings, malformed\n * ids, and ids absent from both the caller's `allowlist` and the live router\n * catalog. Fails closed: when the catalog cannot be fetched, an unverifiable\n * id is rejected rather than admitted — a bad model never reaches the agent.\n */\nexport async function validateChatModelId(\n modelId: unknown,\n options: {\n /**\n * Known-good ids that skip the catalog round trip — e.g. the product's\n * default model plus any env-configured ids.\n */\n allowlist?: string[]\n routerBaseUrl?: string\n /** Injectable catalog loader — overridden in tests. */\n loadModels?: (routerBaseUrl: string) => Promise<ModelInfo[]>\n } = {},\n): Promise<ChatModelValidation> {\n const {\n allowlist = [],\n routerBaseUrl = DEFAULT_ROUTER_BASE_URL,\n loadModels = getModels,\n } = options\n\n const cleaned = cleanModelId(modelId)\n if (!cleaned) return { succeeded: false, error: 'Model id must be a non-empty string.' }\n if (!isWellFormedModelId(cleaned)) {\n return { succeeded: false, error: `Model id is malformed: ${cleaned}` }\n }\n if (allowlist.some((id) => cleanModelId(id) === cleaned)) {\n return { succeeded: true, value: cleaned }\n }\n\n let catalog: ModelInfo[]\n try {\n catalog = await loadModels(routerBaseUrl)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { succeeded: false, error: `Could not validate model catalog: ${message}` }\n }\n\n const ids = new Set(catalog.flatMap(catalogIdsForModel))\n if (!ids.has(cleaned)) return { succeeded: false, error: `Model is not available: ${cleaned}` }\n return { succeeded: true, value: cleaned }\n}\n","/**\n *\n * Pure readiness-decision helper. Maps a `KnowledgeReadinessReport` from\n * `@tangle-network/agent-eval` to a three-state branch (`ready` / `blocked` /\n * `caveat`) the runtime, route handlers, and UI shells can all switch on.\n *\n * Default `minimumScore` of 0.7 mirrors the readiness scoring scale in\n * agent-eval; callers tightening or loosening this should keep it consistent\n * across all entry points for the same product so the UI / metrics agree on\n * what \"caveat\" means.\n *\n * @stable\n */\n\nimport type { KnowledgeReadinessReport } from '@tangle-network/agent-eval'\n\nimport { ValidationError } from './errors'\nimport type { KnowledgeReadinessDecision } from './types'\n\nconst DEFAULT_MINIMUM_READINESS_SCORE = 0.7\n\n/**\n * Map a `KnowledgeReadinessReport` to a three-state branch (`ready` / `blocked` / `caveat`) the runtime, route handlers, and UI shells all switch on.\n *\n * @stable\n */\nexport function decideKnowledgeReadiness(\n report: KnowledgeReadinessReport,\n options: { minimumScore?: number } = {},\n): KnowledgeReadinessDecision {\n const minimumScore = options.minimumScore ?? DEFAULT_MINIMUM_READINESS_SCORE\n if (!Number.isFinite(minimumScore) || minimumScore < 0 || minimumScore > 1) {\n throw new ValidationError(\n `minimumScore must be a finite number in [0, 1]; received ${String(minimumScore)}`,\n )\n }\n const blockingGapIds = report.blockingMissingRequirements.map((requirement) => requirement.id)\n const nonBlockingGapIds = report.nonBlockingGaps.map((requirement) => requirement.id)\n if (blockingGapIds.length > 0) {\n return {\n passed: false,\n status: 'blocked',\n reason: report.reason,\n readinessScore: report.readinessScore,\n recommendedAction: report.recommendedAction,\n severity: report.severity,\n blockingGapIds,\n nonBlockingGapIds,\n }\n }\n if (report.readinessScore < minimumScore) {\n return {\n passed: false,\n status: 'caveat',\n reason: `Knowledge readiness score ${report.readinessScore.toFixed(3)} is below minimum ${minimumScore.toFixed(3)}.`,\n readinessScore: report.readinessScore,\n recommendedAction: report.recommendedAction,\n severity: report.severity,\n blockingGapIds,\n nonBlockingGapIds,\n }\n }\n return {\n passed: true,\n status: 'ready',\n reason: report.reason,\n readinessScore: report.readinessScore,\n recommendedAction: report.recommendedAction,\n severity: report.severity,\n blockingGapIds,\n nonBlockingGapIds,\n }\n}\n","/**\n *\n * The two top-level entry points:\n *\n * - `runAgentTask` — single-shot lifecycle for adapter-driven tasks.\n * - `runAgentTaskStream` — streaming lifecycle that delegates execution to an\n * `AgentExecutionBackend` (model API, sandbox, or custom iterable).\n *\n * Both gate the run on `KnowledgeReadinessReport` from `agent-eval`, emit the\n * same lifecycle event vocabulary (under different shapes — see `types.ts`),\n * and route session lifecycle through a pluggable `RuntimeSessionStore`.\n *\n * @stable\n */\n\nimport {\n acquisitionPlansForKnowledgeGaps,\n blockingKnowledgeEval,\n type ControlContext,\n type ControlEvalResult,\n type ControlRunResult,\n type DataAcquisitionPlan,\n FAILURE_CLASSES,\n type FailureClass,\n type KnowledgeReadinessReport,\n type RunRecord,\n runAgentControlLoop,\n scoreKnowledgeReadiness,\n type UserQuestion,\n userQuestionsForKnowledgeGaps,\n} from '@tangle-network/agent-eval'\n\nconst FAILURE_CLASS_SET = new Set<string>(FAILURE_CLASSES)\n\n/** True when a free-form control failure string is a canonical taxonomy\n * class — so only real taxonomy tags are promoted to the cross-agent\n * `RunRecord.failureClass` key; novel strings stay as `failureMode` detail. */\nfunction asFailureClass(value: string | undefined): FailureClass | undefined {\n return value && FAILURE_CLASS_SET.has(value) ? (value as FailureClass) : undefined\n}\n\n/** Stamp cross-cutting defaults onto adapter-projected RunRecords without\n * overriding anything the adapter set explicitly:\n * - `scenarioId` — the run's scenario, when the record omits one.\n * - `failureClass` — the control layer's failure classification promoted\n * onto the canonical cross-agent key, but ONLY when it's a real taxonomy\n * class. This is what lets the substrate aggregate failures across every\n * agent in one vocabulary instead of per-agent ad-hoc strings. */\nexport function applyRunRecordDefaults(\n records: RunRecord[],\n scenarioId: string,\n controlFailureClass: string | undefined,\n): RunRecord[] {\n const fc = asFailureClass(controlFailureClass)\n return records.map((record) => {\n let r = record\n if (r.scenarioId === undefined) r = { ...r, scenarioId }\n if (r.failureClass === undefined && fc) r = { ...r, failureClass: fc }\n return r\n })\n}\n\nimport { normalizeBackendStreamEvent } from './backends'\nimport { BackendTransportError } from './errors'\nimport { decideKnowledgeReadiness } from './readiness'\nimport { nowIso, startOrResumeRuntimeSession, touchSession } from './sessions'\nimport type {\n AgentBackendInput,\n AgentKnowledgeProvider,\n AgentRuntimeEventSink,\n AgentTaskContext,\n AgentTaskRunResult,\n AgentTaskSpec,\n AgentTaskStatus,\n BackendErrorDetail,\n RunAgentTaskOptions,\n RunAgentTaskStreamOptions,\n RuntimeStreamEvent,\n} from './types'\n\n/**\n * Single-shot task lifecycle for adapter-driven tasks: readiness-gated, emits the runtime lifecycle event vocabulary, session-store pluggable.\n *\n * @stable\n */\nexport async function runAgentTask<\n TState,\n TAction,\n TActionResult,\n TEval extends ControlEvalResult = ControlEvalResult,\n>(\n options: RunAgentTaskOptions<TState, TAction, TActionResult, TEval>,\n): Promise<AgentTaskRunResult<TState, TAction, TActionResult, TEval>> {\n const task = options.task\n await emit(options.onEvent, { type: 'task_start', task })\n await emit(options.onEvent, { type: 'readiness_start', task })\n let knowledge = await buildReadiness(task, options.knowledge)\n await emit(options.onEvent, { type: 'readiness_end', task, knowledge })\n const questions = userQuestionsForKnowledgeGaps(knowledge.blockingMissingRequirements)\n const acquisitionPlans = acquisitionPlansForKnowledgeGaps([\n ...knowledge.blockingMissingRequirements,\n ...knowledge.nonBlockingGaps,\n ])\n const preflight = await runKnowledgePreflight(\n task,\n questions,\n acquisitionPlans,\n options.knowledge,\n options.onEvent,\n )\n if (\n options.knowledge?.refreshReadiness &&\n (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)\n ) {\n await emit(options.onEvent, { type: 'readiness_start', task })\n knowledge = await options.knowledge.refreshReadiness({\n task,\n previous: knowledge,\n userAnswers: preflight.userAnswers,\n acquiredEvidenceIds: preflight.acquiredEvidenceIds,\n })\n await emit(options.onEvent, { type: 'readiness_end', task, knowledge })\n }\n\n await emit(options.onEvent, { type: 'control_start', task, knowledge })\n const scenarioId = options.scenarioId ?? task.id\n const control = await runAgentControlLoop<TState, TAction, TActionResult, TEval>({\n intent: task.intent,\n budget: task.budget,\n signal: options.signal,\n store: options.store,\n scenarioId,\n projectId: options.projectId,\n variantId: options.variantId,\n observe: ({ history, abortSignal }) =>\n options.adapter.observe({ task, knowledge, history, abortSignal }),\n validate: async ({ state, history, abortSignal }) => {\n const readinessEval = blockingKnowledgeEval(knowledge, {\n minimumScore: options.minimumReadinessScore,\n })\n const evals = await options.adapter.validate({\n task,\n knowledge,\n state,\n history,\n abortSignal,\n })\n return [readinessEval as TEval, ...evals]\n },\n decide: (ctx) => {\n if (isKnowledgeBlocked(ctx.evals)) {\n return (\n options.adapter.onKnowledgeBlocked?.({\n task,\n knowledge,\n questions,\n acquisitionPlans,\n }) ?? {\n type: 'stop',\n pass: false,\n score: knowledge.readinessScore,\n reason: `knowledge readiness blocked: ${knowledge.reason}`,\n }\n )\n }\n return options.adapter.decide(toAgentContext(task, knowledge, ctx))\n },\n act: (action, ctx) => options.adapter.act(action, toAgentContext(task, knowledge, ctx)),\n shouldStop: options.adapter.shouldStop\n ? (ctx) => options.adapter.shouldStop!(toAgentContext(task, knowledge, ctx))\n : undefined,\n getActionCostUsd: options.adapter.getActionCostUsd\n ? ({ action, result, state, evals, history }) =>\n options.adapter.getActionCostUsd!({ action, result, task, state, evals, history })\n : undefined,\n onStep: (step) => emit(options.onEvent, { type: 'control_step', task, step }),\n })\n await emit(options.onEvent, { type: 'control_end', task, control })\n const status = statusFromControl(control)\n await emit(options.onEvent, { type: 'task_end', task, status, reason: control.reason })\n\n return {\n task,\n status,\n knowledge,\n questions,\n acquisitionPlans,\n userAnswers: preflight.userAnswers,\n acquiredEvidenceIds: preflight.acquiredEvidenceIds,\n control,\n runRecords: applyRunRecordDefaults(\n options.adapter.projectRunRecords?.(control, task) ?? [],\n scenarioId,\n control.failureClass,\n ),\n }\n}\n\n/**\n * Streaming task lifecycle: delegates execution to an `AgentExecutionBackend` (model API, sandbox, or custom iterable) and yields lifecycle events as they happen.\n *\n * @stable\n */\nexport async function* runAgentTaskStream<TInput extends AgentBackendInput = AgentBackendInput>(\n options: RunAgentTaskStreamOptions<TInput>,\n): AsyncIterable<RuntimeStreamEvent> {\n const task = options.task\n const input = { task, ...(options.input ?? {}) } as TInput\n yield streamEvent({ type: 'task_start', task })\n\n yield streamEvent({ type: 'readiness_start', task })\n let knowledge = await buildReadiness(task, options.knowledge)\n const questions = userQuestionsForKnowledgeGaps(knowledge.blockingMissingRequirements)\n const acquisitionPlans = acquisitionPlansForKnowledgeGaps([\n ...knowledge.blockingMissingRequirements,\n ...knowledge.nonBlockingGaps,\n ])\n const preflight = await runKnowledgePreflightStream(\n task,\n questions,\n acquisitionPlans,\n options.knowledge,\n )\n for (const event of preflight.events) yield event\n if (\n options.knowledge?.refreshReadiness &&\n (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)\n ) {\n yield streamEvent({ type: 'readiness_start', task })\n knowledge = await options.knowledge.refreshReadiness({\n task,\n previous: knowledge,\n userAnswers: preflight.userAnswers,\n acquiredEvidenceIds: preflight.acquiredEvidenceIds,\n })\n }\n const decision = decideKnowledgeReadiness(knowledge, {\n minimumScore: options.minimumReadinessScore,\n })\n yield streamEvent({ type: 'readiness_end', task, knowledge, decision })\n if (!decision.passed && decision.status === 'blocked') {\n const reason = `knowledge readiness blocked: ${decision.reason}`\n yield streamEvent({ type: 'task_end', task, status: 'blocked', reason })\n yield streamEvent({ type: 'final', task, status: 'blocked', reason })\n return\n }\n\n const store = options.sessionStore\n const opened = await startOrResumeRuntimeSession({\n backend: options.backend,\n input,\n context: { task, knowledge, signal: options.signal },\n store,\n sessionId: options.sessionId,\n resume: options.resume,\n })\n let session = opened.session\n const shouldResume = opened.resumed\n const sessionEvent = streamEvent({\n type: shouldResume ? 'session_resumed' : 'session_created',\n task,\n session,\n })\n await store?.appendEvent?.(session.id, sessionEvent)\n yield sessionEvent\n\n const backendStart = streamEvent({\n type: 'backend_start',\n task,\n session,\n backend: options.backend.kind,\n })\n await store?.appendEvent?.(session.id, backendStart)\n yield backendStart\n\n let finalText = ''\n try {\n for await (const rawEvent of options.backend.stream(opened.input, {\n task,\n knowledge,\n session,\n signal: options.signal,\n })) {\n const event = normalizeBackendStreamEvent(rawEvent, task, session)\n if (event.type === 'text_delta') finalText += event.text\n await store?.appendEvent?.(session.id, event)\n yield event\n }\n const completedStatus: AgentTaskStatus = 'completed'\n session = touchSession({ ...session, status: completedStatus })\n await store?.put(session)\n const backendEnd = streamEvent({\n type: 'backend_end',\n task,\n session,\n backend: options.backend.kind,\n })\n await store?.appendEvent?.(session.id, backendEnd)\n yield backendEnd\n const reason = 'backend completed'\n const taskEnd = streamEvent({ type: 'task_end', task, status: completedStatus, reason })\n await store?.appendEvent?.(session.id, taskEnd)\n yield taskEnd\n const final = streamEvent({\n type: 'final',\n task,\n session,\n status: completedStatus,\n reason,\n text: finalText || undefined,\n })\n await store?.appendEvent?.(session.id, final)\n yield final\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n session = touchSession({ ...session, status: options.signal?.aborted ? 'aborted' : 'failed' })\n await store?.put(session)\n let stopErrorMessage: string | undefined\n try {\n await options.backend.stop?.(session, message)\n } catch (stopErr) {\n stopErrorMessage = stopErr instanceof Error ? stopErr.message : String(stopErr)\n }\n const combinedMessage = stopErrorMessage\n ? `${message}; backend stop failed: ${stopErrorMessage}`\n : message\n // Typed transport detail — preserves status code + truncated body so\n // consumers can map onto `RunRecord.error` without re-parsing the log\n // string. Required by the runtime's fail-loud contract: silent empty\n // output for a 402 / 401 / 5xx hides the real failure mode.\n const errorDetail: BackendErrorDetail =\n err instanceof BackendTransportError\n ? {\n kind: 'transport',\n message: combinedMessage,\n status: err.status,\n body: err.body,\n }\n : { kind: 'backend', message: combinedMessage }\n const backendError = streamEvent({\n type: 'backend_error',\n task,\n session,\n backend: options.backend.kind,\n message: combinedMessage,\n recoverable: !options.signal?.aborted,\n error: errorDetail,\n })\n await store?.appendEvent?.(session.id, backendError)\n yield backendError\n const status: AgentTaskStatus = options.signal?.aborted ? 'aborted' : 'failed'\n const taskEnd = streamEvent({ type: 'task_end', task, status, reason: message })\n await store?.appendEvent?.(session.id, taskEnd)\n yield taskEnd\n const final = streamEvent({\n type: 'final',\n task,\n session,\n status,\n reason: message,\n text: finalText || undefined,\n error: errorDetail,\n })\n await store?.appendEvent?.(session.id, final)\n yield final\n }\n}\n\nasync function runKnowledgePreflight<\n TState,\n TAction,\n TActionResult,\n TEval extends ControlEvalResult,\n>(\n task: AgentTaskSpec,\n questions: UserQuestion[],\n acquisitionPlans: DataAcquisitionPlan[],\n provider: AgentKnowledgeProvider | undefined,\n onEvent: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval> | undefined,\n): Promise<{ userAnswers: Record<string, string>; acquiredEvidenceIds: string[] }> {\n let userAnswers: Record<string, string> = {}\n let acquiredEvidenceIds: string[] = []\n if (questions.length > 0 && provider?.answerQuestions) {\n await emit(onEvent, { type: 'questions_start', task, questions })\n userAnswers = await provider.answerQuestions(questions, task)\n await emit(onEvent, { type: 'questions_end', task, questions, userAnswers })\n }\n if (acquisitionPlans.length > 0 && provider?.executeAcquisitionPlans) {\n await emit(onEvent, { type: 'acquisition_start', task, acquisitionPlans })\n acquiredEvidenceIds = await provider.executeAcquisitionPlans(acquisitionPlans, task)\n await emit(onEvent, {\n type: 'acquisition_end',\n task,\n acquisitionPlans,\n acquiredEvidenceIds,\n })\n }\n return { userAnswers, acquiredEvidenceIds }\n}\n\nasync function runKnowledgePreflightStream(\n task: AgentTaskSpec,\n questions: UserQuestion[],\n acquisitionPlans: DataAcquisitionPlan[],\n provider: AgentKnowledgeProvider | undefined,\n): Promise<{\n userAnswers: Record<string, string>\n acquiredEvidenceIds: string[]\n events: RuntimeStreamEvent[]\n}> {\n const events: RuntimeStreamEvent[] = []\n let userAnswers: Record<string, string> = {}\n let acquiredEvidenceIds: string[] = []\n if (questions.length > 0 && provider?.answerQuestions) {\n events.push(streamEvent({ type: 'questions_start', task, questions }))\n userAnswers = await provider.answerQuestions(questions, task)\n events.push(streamEvent({ type: 'questions_end', task, questions, userAnswers }))\n }\n if (acquisitionPlans.length > 0 && provider?.executeAcquisitionPlans) {\n events.push(streamEvent({ type: 'acquisition_start', task, acquisitionPlans }))\n acquiredEvidenceIds = await provider.executeAcquisitionPlans(acquisitionPlans, task)\n events.push(\n streamEvent({ type: 'acquisition_end', task, acquisitionPlans, acquiredEvidenceIds }),\n )\n }\n return { userAnswers, acquiredEvidenceIds, events }\n}\n\nfunction streamEvent<T extends Omit<RuntimeStreamEvent, 'timestamp'>>(\n event: T,\n): T & { timestamp: string } {\n return { ...event, timestamp: nowIso() }\n}\n\nfunction buildReadiness(\n task: AgentTaskSpec,\n provider: AgentKnowledgeProvider | undefined,\n): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport {\n if (provider?.buildReadiness) return provider.buildReadiness(task)\n return scoreKnowledgeReadiness({\n taskId: task.id,\n requirements: task.requiredKnowledge ?? [],\n metadata: { domain: task.domain, ...task.metadata },\n })\n}\n\nfunction isKnowledgeBlocked(evals: ControlEvalResult[]): boolean {\n return evals.some((evalResult) => evalResult.id === 'knowledge-ready' && !evalResult.passed)\n}\n\nfunction statusFromControl(\n control: ControlRunResult<unknown, unknown, unknown, ControlEvalResult>,\n): AgentTaskStatus {\n if (control.stoppedBy === 'abort') return 'aborted'\n if (control.reason.includes('knowledge readiness blocked')) return 'blocked'\n if (control.pass) return 'completed'\n return 'failed'\n}\n\nasync function emit<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n sink: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval> | undefined,\n event: Parameters<AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>>[0],\n): Promise<void> {\n await sink?.(event)\n}\n\nfunction toAgentContext<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n task: AgentTaskSpec,\n knowledge: KnowledgeReadinessReport,\n ctx: ControlContext<TState, TAction, TActionResult, TEval>,\n): AgentTaskContext<TState, TAction, TActionResult, TEval> {\n return {\n task,\n knowledge,\n state: ctx.state,\n evals: ctx.evals,\n history: ctx.history,\n budget: ctx.budget,\n stepIndex: ctx.stepIndex,\n wallMs: ctx.wallMs,\n spentCostUsd: ctx.spentCostUsd,\n remainingCostUsd: ctx.remainingCostUsd,\n abortSignal: ctx.abortSignal,\n }\n}\n","/**\n *\n * Production-run lifecycle: record what the agent did on behalf of a customer,\n * what it cost, and how it ended.\n *\n * Three concerns live in this module:\n *\n * 1. **Lifecycle state machine** — `running` -> `completed | failed | cancelled`,\n * enforced by `RuntimeRunStateError`. Completion is idempotent for the same\n * status (a second `complete()` call is a no-op so retries / cleanup paths\n * don't double-fire side effects). A different terminal status is a state\n * error.\n *\n * 2. **Cost ledger** — every `llm_call` event the handle observes contributes\n * `tokensIn`, `tokensOut`, `costUsd`, and bumps `llmCalls`. Wall time is\n * measured from `startRuntimeRun()` to `complete()`. Surface via\n * `handle.cost()` for cost-per-task dashboards.\n *\n * 3. **Persistence adapter** — `RuntimeRunPersistenceAdapter` is the seam\n * consumers plug in to write a `RuntimeRunRow` to their D1 / postgres /\n * KV store. The adapter receives a sanitized row shape; no telemetry\n * payload bytes flow through it unless the consumer opts in via\n * `RuntimeRunOptions.telemetryEvents`.\n *\n * @stable\n */\n\nimport { RuntimeRunStateError, ValidationError } from './errors'\nimport type { AgentTaskSpec, RuntimeStreamEvent } from './types'\n\n/** @stable */\nexport type RuntimeRunStatus = 'running' | 'completed' | 'failed' | 'cancelled'\n\n/** @stable */\nexport interface RuntimeRunCost {\n /** Cumulative input tokens across every observed `llm_call` event. */\n tokensIn: number\n /** Cumulative output tokens across every observed `llm_call` event. */\n tokensOut: number\n /** Sum of `costUsd` from every observed `llm_call` event. */\n costUsd: number\n /** Wall time from `startRuntimeRun()` to `complete()` (or `now()` if not yet completed). */\n wallMs: number\n /** Count of `llm_call` events observed during the run. */\n llmCalls: number\n}\n\n/** @stable */\nexport interface RuntimeRunCompleteInput {\n status: Exclude<RuntimeRunStatus, 'running'>\n resultSummary?: string\n /** Optional explicit cost override; if omitted, the accumulated ledger is used. */\n cost?: Partial<RuntimeRunCost>\n /** Stable error message when `status === 'failed'`. */\n error?: string\n /** Additional adapter-specific fields merged into the persisted row. */\n metadata?: Record<string, unknown>\n}\n\n/** @stable */\nexport interface RuntimeRunRow {\n /** Stable runtime-side identifier. Adapters may translate to their own primary key. */\n id: string\n workspaceId: string\n sessionId?: string\n agentId?: string\n domain?: string\n taskId: string\n scenarioId?: string\n status: RuntimeRunStatus\n resultSummary?: string\n error?: string\n cost: RuntimeRunCost\n startedAt: string\n completedAt?: string\n metadata?: Record<string, unknown>\n}\n\n/** @stable */\nexport interface RuntimeRunPersistenceAdapter {\n /**\n * Called once when `handle.persist()` runs. Implementations write `row` to\n * their durable store (D1, postgres, KV) and return whatever the consumer\n * wants the caller to see (often the storage-side row id). Errors thrown\n * here propagate out of `persist()` so the caller can decide whether to\n * retry or log-and-continue.\n */\n upsert(row: RuntimeRunRow): Promise<void> | void\n}\n\n/** @stable */\nexport interface RuntimeRunOptions {\n workspaceId: string\n sessionId?: string\n agentId?: string\n taskSpec: AgentTaskSpec\n scenarioId?: string\n /** Optional persistence adapter; if omitted, `persist()` is a no-op. */\n adapter?: RuntimeRunPersistenceAdapter\n /** Override the row id; default = `${taskSpec.id}:${random suffix}`. */\n id?: string\n /** Override the clock; default = `Date.now()`. Useful for deterministic tests. */\n now?: () => number\n}\n\n/** @stable */\nexport interface RuntimeRunHandle {\n /** Stable id assigned at start. */\n readonly id: string\n readonly workspaceId: string\n readonly sessionId: string | undefined\n readonly taskSpec: AgentTaskSpec\n readonly status: RuntimeRunStatus\n\n /**\n * Observe a single `RuntimeStreamEvent`. The handle ignores non-cost events\n * (text deltas, tool calls) silently so consumers can pipe the whole stream\n * through `handle.observe`. `llm_call` events update the ledger.\n */\n observe(event: RuntimeStreamEvent): void\n\n /** Snapshot of the current cost ledger. Safe to call at any time. */\n cost(): RuntimeRunCost\n\n /**\n * Transition to a terminal state. Idempotent for the same status; throws\n * `RuntimeRunStateError` for a different terminal status (state machines\n * don't time-travel).\n */\n complete(input: RuntimeRunCompleteInput): void\n\n /** Build the current row without writing it. Useful for tests + dry runs. */\n toRow(metadata?: Record<string, unknown>): RuntimeRunRow\n\n /**\n * Persist the current row via the configured adapter. Must be called after\n * `complete()`. Idempotent for the same terminal state (the adapter sees\n * the same row on retry).\n */\n persist(metadata?: Record<string, unknown>): Promise<void>\n}\n\n/**\n *\n * Construct a runtime-run handle. The returned handle is mutable across its\n * lifetime; consumers should not share it across requests.\n *\n * @stable\n */\nexport function startRuntimeRun(options: RuntimeRunOptions): RuntimeRunHandle {\n if (!options.workspaceId) {\n throw new ValidationError('startRuntimeRun: workspaceId is required')\n }\n if (!options.taskSpec?.id) {\n throw new ValidationError('startRuntimeRun: taskSpec.id is required')\n }\n const now = options.now ?? Date.now\n const startedAtMs = now()\n const startedAt = new Date(startedAtMs).toISOString()\n const id = options.id ?? `${options.taskSpec.id}:${randomSuffix()}`\n\n let status: RuntimeRunStatus = 'running'\n let completedAtMs: number | undefined\n let resultSummary: string | undefined\n let error: string | undefined\n let completionMetadata: Record<string, unknown> | undefined\n\n const ledger: RuntimeRunCost = {\n tokensIn: 0,\n tokensOut: 0,\n costUsd: 0,\n wallMs: 0,\n llmCalls: 0,\n }\n\n const snapshotCost = (): RuntimeRunCost => ({\n tokensIn: ledger.tokensIn,\n tokensOut: ledger.tokensOut,\n costUsd: ledger.costUsd,\n wallMs: (completedAtMs ?? now()) - startedAtMs,\n llmCalls: ledger.llmCalls,\n })\n\n const buildRow = (extraMetadata?: Record<string, unknown>): RuntimeRunRow => ({\n id,\n workspaceId: options.workspaceId,\n sessionId: options.sessionId,\n agentId: options.agentId,\n domain: options.taskSpec.domain,\n taskId: options.taskSpec.id,\n scenarioId: options.scenarioId,\n status,\n resultSummary,\n error,\n cost: snapshotCost(),\n startedAt,\n completedAt: completedAtMs !== undefined ? new Date(completedAtMs).toISOString() : undefined,\n metadata: mergeMetadata(completionMetadata, extraMetadata),\n })\n\n return {\n id,\n workspaceId: options.workspaceId,\n sessionId: options.sessionId,\n taskSpec: options.taskSpec,\n get status() {\n return status\n },\n observe(event) {\n if (event.type !== 'llm_call') return\n ledger.llmCalls += 1\n if (typeof event.tokensIn === 'number' && Number.isFinite(event.tokensIn)) {\n ledger.tokensIn += event.tokensIn\n }\n if (typeof event.tokensOut === 'number' && Number.isFinite(event.tokensOut)) {\n ledger.tokensOut += event.tokensOut\n }\n if (typeof event.costUsd === 'number' && Number.isFinite(event.costUsd)) {\n ledger.costUsd += event.costUsd\n }\n },\n cost: snapshotCost,\n complete(input) {\n // JS callers can bypass the `Exclude<…, 'running'>` type; enforce the\n // state machine at runtime as well.\n if ((input.status as RuntimeRunStatus) === 'running') {\n throw new ValidationError('complete() requires a terminal status, got \"running\"')\n }\n if (status !== 'running') {\n if (status === input.status) return\n throw new RuntimeRunStateError(\n `Cannot transition runtime run from \"${status}\" to \"${input.status}\"`,\n )\n }\n status = input.status\n completedAtMs = now()\n resultSummary = input.resultSummary\n error = input.error\n completionMetadata = input.metadata\n if (input.cost) {\n if (typeof input.cost.tokensIn === 'number' && Number.isFinite(input.cost.tokensIn)) {\n ledger.tokensIn = input.cost.tokensIn\n }\n if (typeof input.cost.tokensOut === 'number' && Number.isFinite(input.cost.tokensOut)) {\n ledger.tokensOut = input.cost.tokensOut\n }\n if (typeof input.cost.costUsd === 'number' && Number.isFinite(input.cost.costUsd)) {\n ledger.costUsd = input.cost.costUsd\n }\n if (typeof input.cost.llmCalls === 'number' && Number.isFinite(input.cost.llmCalls)) {\n ledger.llmCalls = input.cost.llmCalls\n }\n }\n },\n toRow(metadata) {\n return buildRow(metadata)\n },\n async persist(metadata) {\n if (status === 'running') {\n throw new RuntimeRunStateError('Cannot persist a runtime run before complete() is called')\n }\n if (!options.adapter) return\n await options.adapter.upsert(buildRow(metadata))\n },\n }\n}\n\nfunction mergeMetadata(\n base: Record<string, unknown> | undefined,\n extra: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!base && !extra) return undefined\n return { ...(base ?? {}), ...(extra ?? {}) }\n}\n\nfunction randomSuffix(): string {\n // 8 chars of base36 — sufficient for in-process uniqueness. Callers needing\n // stronger guarantees pass `options.id` explicitly.\n return Math.random().toString(36).slice(2, 10)\n}\n","/**\n *\n * Server-Sent Events serialization for runtime telemetry streams.\n *\n * Newline-safe by construction: any newline in `id` or `event` is collapsed to\n * a space (browsers terminate fields on newline), and multi-line `data`\n * payloads are split into one `data:` line per source line so JSON.stringify\n * output transports cleanly.\n *\n * @stable\n */\n\nimport type { KnowledgeReadinessReport } from '@tangle-network/agent-eval'\nimport type { RuntimeTelemetryOptions } from './sanitize'\nimport { sanitizeKnowledgeReadinessReport, sanitizeRuntimeStreamEvent } from './sanitize'\nimport type { RuntimeStreamEvent } from './types'\n\n/** @stable */\nexport interface ServerSentEventOptions {\n event?: string\n id?: string\n retry?: number\n}\n\n/** @stable */\nexport function encodeServerSentEvent(data: unknown, options: ServerSentEventOptions = {}): string {\n const lines: string[] = []\n if (options.id) lines.push(`id: ${stripNewlines(options.id)}`)\n if (options.event) lines.push(`event: ${stripNewlines(options.event)}`)\n if (typeof options.retry === 'number' && Number.isFinite(options.retry) && options.retry >= 0) {\n lines.push(`retry: ${Math.floor(options.retry)}`)\n }\n\n const payload = typeof data === 'string' ? data : JSON.stringify(data)\n for (const line of payload.split(/\\r?\\n/)) {\n lines.push(`data: ${line}`)\n }\n return `${lines.join('\\n')}\\n\\n`\n}\n\n/** Serialize a `KnowledgeReadinessReport` as a Server-Sent Event string. @stable */\nexport function readinessServerSentEvent(\n report: KnowledgeReadinessReport,\n options: RuntimeTelemetryOptions & ServerSentEventOptions = {},\n): string {\n const { event, id, retry, ...telemetryOptions } = options\n return encodeServerSentEvent(\n {\n type: 'readiness',\n readiness: sanitizeKnowledgeReadinessReport(report, telemetryOptions),\n },\n { event, id, retry },\n )\n}\n\n/** Serialize a `RuntimeStreamEvent` as a Server-Sent Event string. @stable */\nexport function runtimeStreamServerSentEvent(\n event: RuntimeStreamEvent,\n options: RuntimeTelemetryOptions & ServerSentEventOptions = {},\n): string {\n const { event: sseEvent, id, retry, ...telemetryOptions } = options\n return encodeServerSentEvent(sanitizeRuntimeStreamEvent(event, telemetryOptions), {\n event: sseEvent,\n id,\n retry,\n })\n}\n\nfunction stripNewlines(value: string): string {\n return value.replace(/[\\r\\n]/g, ' ')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/improvement/build-prompts.ts","../src/improvement/mcp-serve-verifier.ts","../src/improvement/official-optimizers.ts","../src/improvement/reflective-generator.ts","../src/model-resolution.ts","../src/readiness.ts","../src/run.ts","../src/runtime-run.ts","../src/sse.ts"],"sourcesContent":["/**\n * Build-prompt starting points for the two buildable artifact types. There is\n * NO `toolGenerator`/`mcpGenerator` wrapper — the factory is `agenticGenerator`\n * + a verifier (docs/artifact-lifecycle-frontier.md), so a tool or an MCP\n * server is built by composing the pieces directly:\n *\n * // a tool:\n * agenticGenerator({ profile, executorForWorktree, buildPrompt: toolBuildPrompt,\n * verify: commandVerifier('pnpm', ['test']) })\n * // an MCP server:\n * agenticGenerator({ profile, executorForWorktree, buildPrompt: mcpBuildPrompt,\n * verify: mcpServeVerifier({ command: 'node', args: ['server.mjs'] }) })\n *\n * These are the only type-specific bit (the phrasing that points the agent at a\n * tool vs. an MCP); the worktree, resume-on-failure loop, and improvement-loop\n * wrapper are shared. MCP is the load-bearing target — it is how a harness\n * acquires tools; raw tools matter where we control the loader.\n */\n\nimport type { ProposalFinding } from '@tangle-network/agent-eval'\nimport { optimizerMethod } from './optimizer-prompt'\n\n/** Evidence supplied to a generated tool or MCP build instruction. */\nexport interface BuildPromptFindingsInput {\n findings: ReadonlyArray<ProposalFinding>\n}\n\n/** Render findings as the ranked-evidence block every build prompt ends with. */\nexport function findingLines(findings: ReadonlyArray<ProposalFinding>): string[] {\n return findings.map((f) => {\n const where = f.subject ? ` [${f.subject}]` : ''\n const action = f.recommended_action ? ` → ${f.recommended_action}` : ''\n return `- (${f.severity})${where} ${f.claim}${action}`\n })\n}\n\n/** Build the starting instruction for a coder agent tasked with implementing a new tool. */\nexport function toolBuildPrompt(args: BuildPromptFindingsInput): string {\n return [\n 'You are building a new TOOL for this codebase — a capability the agent measurably lacks,',\n 'evidenced by the failure findings at the bottom. The tool is an experiment: after it is',\n 'built and verified, its marginal lift is measured on held-out tasks, and only a real lift',\n 'promotes it.',\n '',\n optimizerMethod,\n '',\n 'THE SURFACE — what a deliverable tool looks like here:',\n '- ONE small, self-contained module PLUS tests that exercise its contract (what callers rely',\n ' on), not its internals. The tests are the experiment for sub-goal correctness — write the',\n ' test that would fail if your hypothesis about the gap were wrong.',\n '- It must compile and its tests must pass — they run automatically; on failure you get the',\n ' verifier output and another attempt, resuming on top of your own edits (fix in place, do',\n ' not start over).',\n '- Match the codebase grain: reuse its existing helpers, style, and test framework; a tool',\n ' that fights the codebase is the wrong tool even if it passes.',\n '- Do not commit; leave the changes in the working tree.',\n '',\n 'FINDINGS — ranked evidence from real failed runs (the gaps the tool must close):',\n ...findingLines(args.findings),\n ].join('\\n')\n}\n\n/** Build the starting instruction for a coder agent tasked with implementing a new MCP server. */\nexport function mcpBuildPrompt(args: BuildPromptFindingsInput): string {\n return [\n 'You are building a new MCP SERVER (Model Context Protocol) exposing tool(s) that close the',\n 'capability gaps evidenced by the failure findings at the bottom, so any harness can mount',\n 'them. The server is an experiment: after it is built and boot-verified, its marginal lift is',\n 'measured on held-out tasks, and only a real lift promotes it.',\n '',\n optimizerMethod,\n '',\n 'RESEARCH FIRST — ADOPT BEFORE BUILD: you may discover and ADOPT an existing external MCP',\n 'server if it fits the gaps better than building one. Registries and vendor docs list',\n 'maintained servers for most common capabilities (web search, fetch, GitHub, filesystems,',\n 'databases). To adopt, deliver a short adoption note instead of an implementation: the',\n \"server's launch command or HTTP endpoint, and the API key it needs BY NAME (e.g.\",\n 'EXA_API_KEY) — never a key value; provisioning injects the value at materialize time. If',\n 'your environment has no web access, decide from what you already know and say so.',\n '',\n 'THE SURFACE — what a deliverable MCP server looks like here (checked by BOOTING it):',\n '- it starts over stdio and answers the MCP `initialize` handshake,',\n '- `tools/list` returns at least one tool with a valid input schema,',\n '- newline-delimited JSON-RPC 2.0, protocol version 2024-11-05,',\n '- a clear start command (a package.json `start` script or an obvious entrypoint).',\n 'Design the tool surface for the FINDINGS, not for generality: each exposed tool should map to',\n 'a named failure mechanism, with a description that tells the agent when to reach for it (a',\n 'tool the agent never calls measures zero). If the boot-and-probe fails you get the error and',\n 'another attempt, resuming on top of your own edits. Do not commit; leave the changes in the',\n 'working tree.',\n '',\n 'FINDINGS — ranked evidence from real failed runs (the capabilities the server must provide):',\n ...findingLines(args.findings),\n ].join('\\n')\n}\n","/**\n * `mcpServeVerifier` — the intrinsic verifier for a built MCP server: the\n * boot-and-probe checker named in docs/artifact-lifecycle-frontier.md. A\n * generated MCP server is only a candidate if it actually *serves* — so this\n * boots it over stdio (the default local MCP transport) and runs the real\n * handshake: `initialize` → `notifications/initialized` → `tools/list`, and\n * asserts the server answers with at least `minTools` tools.\n *\n * The spawn + handshake is the SHARED same-host stdio connection\n * (`connectStdioMcp`) — the same code path that later serves the built server\n * LIVE to a scored run (`materializeLocalMcp`), so \"verified it serves\" and\n * \"served while scored\" can never drift apart.\n *\n * Outcomes follow the `Verifier` contract: a server that fails to start, exits\n * early, errors the handshake, times out, or exposes no tools is a FAILED\n * candidate (`{ok:false}`, fed back into the next generation shot); a missing\n * start binary or spawn fault THROWS (a setup bug, never a silent fallback).\n */\n\nimport {\n connectStdioMcp,\n McpSpawnFault,\n type StdioMcpConnection,\n} from '../runtime/stdio-mcp-client'\nimport type { Verifier, VerifyResult } from './agentic-generator'\n\nexport interface McpServeSpec {\n /** Command that starts the built MCP server in the worktree (stdio transport). */\n command: string\n args?: string[]\n /** Extra env for the server process (merged over `process.env`). */\n env?: Record<string, string>\n /** Handshake timeout (ms). Default 30s. */\n timeoutMs?: number\n /** Minimum tools the server must expose to pass. Default 1. */\n minTools?: number\n}\n\n/** Build a `Verifier` that boots a generated MCP server over stdio and checks it exposes tools. */\nexport function mcpServeVerifier(spec: McpServeSpec): Verifier {\n const minTools = spec.minTools ?? 1\n\n return async (worktreePath: string): Promise<VerifyResult> => {\n let conn: StdioMcpConnection\n try {\n conn = await connectStdioMcp({\n command: spec.command,\n ...(spec.args ? { args: spec.args } : {}),\n cwd: worktreePath,\n ...(spec.env ? { env: spec.env } : {}),\n ...(spec.timeoutMs !== undefined ? { timeoutMs: spec.timeoutMs } : {}),\n })\n } catch (err) {\n if (err instanceof McpSpawnFault) {\n throw new Error(`mcpServeVerifier: ${err.message}`)\n }\n // Crash-on-boot / handshake error / timeout: a failed candidate, with the\n // connection's stderr-tailed message as the feedback for the next shot.\n return { ok: false, feedback: err instanceof Error ? err.message : String(err) }\n }\n try {\n if (conn.tools.length < minTools) {\n return {\n ok: false,\n feedback: `tools/list returned ${conn.tools.length} tool(s), need >= ${minTools}`,\n }\n }\n return { ok: true }\n } finally {\n await conn.close()\n }\n }\n}\n","import { isDeepStrictEqual } from 'node:util'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type GepaOptimizationMethodConfig,\n gepaOptimizationMethod,\n type JudgeScore,\n type OptimizationMethod,\n type SkillOptOptimizationMethodConfig,\n skillOptOptimizationMethod,\n} from '@tangle-network/agent-eval/campaign'\nimport { canonicalCandidateDigest } from '../candidate-execution/digest'\nimport { ConfigError } from '../errors'\nimport {\n defaultRedactor,\n defaultRedactorIdentityMaterial,\n type Redactor,\n resolveRedactor,\n} from '../redact'\nimport type {\n ImproveCandidateValidationInput,\n ImproveMethodContext,\n ImproveMethodFactory,\n} from './improve'\nimport { withMethodRuntimeControls } from './method-controls'\n\nconst defaultMaxFindingsChars = 50_000\nconst pythonClientDocs = 'https://github.com/tangle-network/agent-eval/tree/main/clients/python'\nconst bridgeInstall = '`python -m pip install \"agent-eval-rpc==0.144.10\"`'\nconst gepaWheelInstall = '`python -m pip install \"gepa[full]==0.1.4\"`'\nconst gepaSourceInstall =\n '`python -m pip install \"gepa[full] @ git+https://github.com/gepa-ai/gepa.git@f919db0a622e2e9f9204779b81fe00cc1b2d808f\"`'\nconst skillOptInstall =\n `${bridgeInstall}, then ` +\n '`python -m pip install \"skillopt @ git+https://github.com/microsoft/SkillOpt.git@61735e3922efc2b90c6d6cab561e62e98452ca90\"`'\n\n/** Runtime context appended to an official optimizer's own configuration. */\nexport interface OfficialOptimizerContextOptions {\n /** Context supplied to the optimizer before Runtime appends the profile surface and findings. */\n background?: string\n /** Include current trace or analyst findings in the optimizer background. Default true. */\n includeFindings?: boolean\n /** Reject oversized serialized findings before starting Python. Default 50,000 characters. */\n maxFindingsChars?: number\n /**\n * Redact caller-supplied context and descriptors before they leave Runtime.\n * The built-in redactor is the default. Pass `false` only for public data\n * that has already been reviewed.\n */\n redact?: Redactor | false\n /** Authorize one exact candidate containing structurally sensitive fields.\n * The callback must return true for every accepted baseline and candidate. */\n authorizeSensitiveCandidate?: (input: OfficialSensitiveCandidateInput) => boolean\n}\n\nexport interface OfficialSensitiveCandidateInput extends ImproveCandidateValidationInput {\n sensitivePaths: readonly string[]\n}\n\n/** Official GEPA configuration plus bounded Runtime findings context. */\nexport type OfficialGepaOptions<\n TScenario extends { id: string; kind: string },\n TArtifact = unknown,\n> = Omit<GepaOptimizationMethodConfig<TScenario, TArtifact>, 'background' | 'evaluationId'> &\n OfficialOptimizerContextOptions\n\n/** Official SkillOpt configuration plus bounded Runtime findings context. */\nexport type OfficialSkillOptOptions<\n TScenario extends { id: string; kind: string },\n TArtifact = unknown,\n> = Omit<SkillOptOptimizationMethodConfig<TScenario, TArtifact>, 'background' | 'evaluationId'> &\n OfficialOptimizerContextOptions\n\n/** Missing optional Python dependencies for an official optimizer. */\nexport class OfficialOptimizerUnavailableError extends ConfigError {\n readonly optimizer: 'gepa' | 'skillopt'\n\n constructor(optimizer: 'gepa' | 'skillopt', cause: unknown) {\n const detail = cause instanceof Error ? cause.message : String(cause)\n const install =\n optimizer === 'gepa'\n ? [\n `Install the Python bridge: ${bridgeInstall}.`,\n `The direct GEPA engine uses the published wheel: ${gepaWheelInstall}.`,\n `Composed recipes and source-only engines use the tested source revision: ${gepaSourceInstall}.`,\n ].join(' ')\n : `Install Microsoft SkillOpt: ${skillOptInstall}.`\n super(\n [\n `Official ${optimizer === 'gepa' ? 'GEPA' : 'SkillOpt'} could not start.`,\n 'Runtime did not use a local fallback.',\n install,\n `Setup: ${pythonClientDocs}.`,\n `Cause: ${detail}`,\n ].join(' '),\n { cause },\n )\n this.optimizer = optimizer\n }\n}\n\n/**\n * Build a complete method backed by GEPA's official Optimize Anything API.\n *\n * The recipe is passed through unchanged. Use `engine`, `sequential`,\n * `adaptive-sequential`, `best-of`, `vote`, or `omni` explicitly.\n */\nexport function officialGepa<TScenario extends { id: string; kind: string }, TArtifact = unknown>(\n options: OfficialGepaOptions<TScenario, TArtifact>,\n): ImproveMethodFactory<TScenario, TArtifact> {\n const {\n background,\n includeFindings = true,\n maxFindingsChars,\n describeScenario,\n describeArtifact,\n redact,\n authorizeSensitiveCandidate,\n ...config\n } = options\n const redactor = resolveRedactor(redact)\n const redactionPolicyRef = optimizerRedactionPolicyRef(redact)\n assertMaxFindingsChars('officialGepa', maxFindingsChars)\n const objective = redactOptimizerText('officialGepa', 'objective', config.objective, redactor)\n return (context) => {\n const externalEvaluationRef = optimizerEvidencePolicyRef({\n runtimeEvaluationRef: context.evaluationRef,\n redactionPolicyRef,\n describeScenario,\n describeArtifact,\n authorizeSensitiveCandidate,\n })\n const method = withDependencyHelp(\n 'gepa',\n externalEvaluationRef,\n redactor,\n redactionPolicyRef,\n gepaOptimizationMethod<TScenario, TArtifact>({\n ...config,\n objective,\n evaluationId: externalEvaluationRef,\n background: methodBackground({\n context,\n background,\n includeFindings,\n maxFindingsChars,\n label: 'officialGepa',\n redactor,\n }),\n ...(describeScenario\n ? {\n describeScenario: (scenario) =>\n redactOptimizerEvidence(\n 'officialGepa',\n 'scenario descriptor',\n describeScenario(scenario),\n redactor,\n ),\n }\n : {}),\n ...(describeArtifact\n ? {\n describeArtifact: (artifact, scenario) =>\n redactOptimizerEvidence(\n 'officialGepa',\n 'artifact descriptor',\n describeArtifact(artifact, scenario),\n redactor,\n ),\n }\n : {}),\n }),\n )\n return withMethodRuntimeControls(method, {\n costAttribution: 'optimizer-run',\n validateCandidate: (input) =>\n assertSafeOptimizerCandidate('officialGepa', input, authorizeSensitiveCandidate),\n })\n }\n}\n\n/** Build a complete method backed by Microsoft's official SkillOpt trainer. */\nexport function officialSkillOpt<\n TScenario extends { id: string; kind: string },\n TArtifact = unknown,\n>(\n options: OfficialSkillOptOptions<TScenario, TArtifact>,\n): ImproveMethodFactory<TScenario, TArtifact> {\n const {\n background,\n includeFindings = true,\n maxFindingsChars,\n describeScenario,\n describeArtifact,\n redact,\n authorizeSensitiveCandidate,\n ...config\n } = options\n const redactor = resolveRedactor(redact)\n const redactionPolicyRef = optimizerRedactionPolicyRef(redact)\n assertMaxFindingsChars('officialSkillOpt', maxFindingsChars)\n const objective = redactOptimizerText('officialSkillOpt', 'objective', config.objective, redactor)\n return (context) => {\n const externalEvaluationRef = optimizerEvidencePolicyRef({\n runtimeEvaluationRef: context.evaluationRef,\n redactionPolicyRef,\n describeScenario,\n describeArtifact,\n authorizeSensitiveCandidate,\n })\n const method = withDependencyHelp(\n 'skillopt',\n externalEvaluationRef,\n redactor,\n redactionPolicyRef,\n skillOptOptimizationMethod<TScenario, TArtifact>({\n ...config,\n objective,\n evaluationId: externalEvaluationRef,\n background: methodBackground({\n context,\n background,\n includeFindings,\n maxFindingsChars,\n label: 'officialSkillOpt',\n redactor,\n }),\n ...(describeScenario\n ? {\n describeScenario: (scenario) =>\n redactOptimizerEvidence(\n 'officialSkillOpt',\n 'scenario descriptor',\n describeScenario(scenario),\n redactor,\n ),\n }\n : {}),\n ...(describeArtifact\n ? {\n describeArtifact: (artifact, scenario) =>\n redactOptimizerEvidence(\n 'officialSkillOpt',\n 'artifact descriptor',\n describeArtifact(artifact, scenario),\n redactor,\n ),\n }\n : {}),\n }),\n )\n return withMethodRuntimeControls(method, {\n costAttribution: 'optimizer-run',\n validateCandidate: (input) =>\n assertSafeOptimizerCandidate('officialSkillOpt', input, authorizeSensitiveCandidate),\n })\n }\n}\n\nfunction assertMaxFindingsChars(label: string, value: number | undefined): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new ConfigError(`${label}: maxFindingsChars must be a positive safe integer`)\n }\n}\n\nfunction methodBackground(options: {\n context: ImproveMethodContext\n background: string | undefined\n includeFindings: boolean\n maxFindingsChars: number | undefined\n label: string\n redactor: Redactor\n}): string {\n const {\n context,\n background,\n includeFindings,\n maxFindingsChars = defaultMaxFindingsChars,\n label,\n redactor,\n } = options\n const safeBackground =\n background === undefined\n ? undefined\n : redactOptimizerText(label, 'background', background, redactor)\n const safeProfileName =\n context.profile.name === undefined\n ? undefined\n : redactOptimizerText(label, 'profile name', context.profile.name, redactor)\n const sections = [\n safeBackground?.trim(),\n safeProfileName\n ? `Agent profile: ${safeProfileName}. Surface: ${context.surface}.`\n : `Agent surface: ${context.surface}.`,\n ].filter((value): value is string => Boolean(value))\n if (includeFindings && context.findings.length > 0) {\n let serialized: string\n try {\n serialized = canonicalJson(\n redactOptimizerEvidence(label, 'findings', context.findings, redactor),\n )\n } catch (cause) {\n throw new ConfigError(`${label}: findings must be JSON-serializable`, { cause })\n }\n if (serialized.length > maxFindingsChars) {\n throw new ConfigError(\n `${label}: serialized findings exceed maxFindingsChars (${serialized.length} > ${maxFindingsChars})`,\n )\n }\n sections.push(`Observed failures:\\n${serialized}`)\n }\n return sections.join('\\n\\n')\n}\n\nfunction assertSafeOptimizerCandidate(\n label: string,\n input: ImproveCandidateValidationInput,\n authorizeSensitiveCandidate: ((input: OfficialSensitiveCandidateInput) => boolean) | undefined,\n): void {\n const redactedValue = defaultRedactor(input.value)\n const redactedSurface = defaultRedactor(input.candidateSurface)\n if (\n !isDeepStrictEqual(input.value, redactedValue) ||\n !isDeepStrictEqual(input.candidateSurface, redactedSurface)\n ) {\n throw new ConfigError(\n `${label}: the selected profile surface contains a common credential or private value. ` +\n 'Store live credentials as provider references, or remove private data before starting an external optimizer.',\n )\n }\n const sensitivePaths = sensitiveProfileSurfacePaths(input)\n if (sensitivePaths.length === 0) return\n let authorized = false\n if (authorizeSensitiveCandidate) {\n try {\n authorized =\n authorizeSensitiveCandidate(\n Object.freeze({\n ...input,\n sensitivePaths: Object.freeze([...sensitivePaths]),\n }),\n ) === true\n } catch (cause) {\n throw new ConfigError(`${label}: sensitive candidate authorization failed`, { cause })\n }\n }\n if (!authorized) {\n throw new ConfigError(\n `${label}: the selected profile surface contains fields that may carry private values: ` +\n `${sensitivePaths.slice(0, 8).join(', ')}. Remove them, replace values with safe references, ` +\n 'or authorize the exact profile with authorizeSensitiveCandidate.',\n )\n }\n}\n\nfunction sensitiveProfileSurfacePaths(input: ImproveCandidateValidationInput): string[] {\n const paths = new Set<string>()\n if (\n input.surface === 'tools' ||\n input.surface === 'mcp' ||\n input.surface === 'hooks' ||\n input.surface === 'subagents' ||\n input.surface === 'agent-profile'\n ) {\n paths.add('$')\n }\n const seen = new WeakSet<object>()\n const visit = (current: unknown, path: string): void => {\n if (current === null || typeof current !== 'object') return\n if (seen.has(current)) return\n seen.add(current)\n if (Array.isArray(current)) {\n current.forEach((child, index) => {\n visit(child, `${path}[${index}]`)\n })\n return\n }\n for (const [key, child] of Object.entries(current as Record<string, unknown>)) {\n const childPath = `${path}.${key}`\n if (['env', 'headers', 'url', 'metadata', 'extensions'].includes(key.toLowerCase())) {\n paths.add(childPath)\n continue\n }\n visit(child, childPath)\n }\n }\n visit(input.value, '$')\n return [...paths]\n}\n\nfunction redactOptimizerEvidence(\n label: string,\n field: string,\n value: unknown,\n redactor: Redactor,\n): unknown {\n try {\n return redactor(value)\n } catch (cause) {\n throw new ConfigError(`${label}: ${field} redaction failed`, { cause })\n }\n}\n\nfunction redactOptimizerText(\n label: string,\n field: string,\n value: string,\n redactor: Redactor,\n): string {\n const redacted = redactOptimizerEvidence(label, field, value, redactor)\n if (typeof redacted !== 'string' || !redacted.trim()) {\n throw new ConfigError(`${label}: ${field} redaction must return a non-empty string`)\n }\n return redacted\n}\n\nfunction redactJudgeScore(score: JudgeScore, redactor: Redactor): JudgeScore {\n const notes = redactOptimizerEvidence('official optimizer', 'judge notes', score.notes, redactor)\n return {\n ...score,\n notes: typeof notes === 'string' ? notes : '[redacted]',\n }\n}\n\nexport function optimizerRedactionPolicyRef(\n redact: Redactor | false | undefined,\n builtInIdentity: unknown = defaultRedactorIdentityMaterial(),\n): string {\n if (redact === false) return 'caller-approved-raw'\n return canonicalCandidateDigest({\n kind: redact === undefined ? 'default-redactor' : 'caller-redactor-with-default',\n builtIn: builtInIdentity,\n ...(redact === undefined\n ? {}\n : {\n callerSource: Function.prototype.toString.call(redact),\n composition: Function.prototype.toString.call(resolveRedactor),\n }),\n })\n}\n\nfunction optimizerEvidencePolicyRef(input: {\n runtimeEvaluationRef: ImproveMethodContext['evaluationRef']\n redactionPolicyRef: string\n describeScenario: unknown\n describeArtifact: unknown\n authorizeSensitiveCandidate: unknown\n}): ReturnType<typeof canonicalCandidateDigest> {\n return canonicalCandidateDigest({\n runtimeEvaluationRef: input.runtimeEvaluationRef,\n redactionPolicyRef: input.redactionPolicyRef,\n describeScenario: callbackSource(input.describeScenario),\n describeArtifact: callbackSource(input.describeArtifact),\n authorizeSensitiveCandidate: callbackSource(input.authorizeSensitiveCandidate),\n })\n}\n\nfunction callbackSource(callback: unknown): string | null {\n return typeof callback === 'function' ? Function.prototype.toString.call(callback) : null\n}\n\nfunction withDependencyHelp<TScenario extends { id: string; kind: string }, TArtifact>(\n optimizer: 'gepa' | 'skillopt',\n evaluationRef: ImproveMethodContext['evaluationRef'],\n redactor: Redactor,\n redactionPolicyRef: string,\n method: OptimizationMethod<TScenario, TArtifact>,\n): OptimizationMethod<TScenario, TArtifact> {\n return {\n ...method,\n async optimize(input) {\n try {\n const judges = input.judges.map((judge) =>\n Object.freeze({\n ...judge,\n judgeVersion: canonicalCandidateDigest({\n evaluationRef,\n name: judge.name,\n dimensions: judge.dimensions,\n judgeVersion: judge.judgeVersion ?? null,\n outwardEvidence: redactionPolicyRef,\n }),\n async score(scoreInput: Parameters<typeof judge.score>[0]) {\n return redactJudgeScore(await judge.score(scoreInput), redactor)\n },\n }),\n )\n return await method.optimize({\n ...input,\n judges: Object.freeze(judges),\n })\n } catch (cause) {\n if (isMissingDependency(optimizer, cause)) {\n throw new OfficialOptimizerUnavailableError(optimizer, cause)\n }\n throw cause\n }\n },\n }\n}\n\nfunction isMissingDependency(optimizer: 'gepa' | 'skillopt', cause: unknown): boolean {\n const message = cause instanceof Error ? cause.message : String(cause)\n const common = [\n `${optimizer === 'gepa' ? 'GEPA' : 'SkillOpt'} bridge could not start`,\n 'source inspection could not start',\n \"No module named 'agent_eval_rpc'\",\n `No module named 'agent_eval_rpc.${optimizer === 'gepa' ? 'gepa_bridge' : 'skillopt_bridge'}'`,\n ]\n const specific =\n optimizer === 'gepa'\n ? [\n 'requires GEPA',\n \"requires GEPA's Optimize Anything\",\n \"No module named 'gepa'\",\n 'gepa is importable but its package metadata is unavailable',\n ]\n : [\n 'requires skillopt',\n 'requires SkillOpt',\n \"No module named 'skillopt'\",\n 'skillopt is importable but its package metadata is unavailable',\n ]\n return [...common, ...specific].some((fragment) => message.includes(fragment))\n}\n","/**\n *\n * `reflectiveGenerator` — the cheap, no-sandbox `CandidateGenerator`. It drafts\n * surface edits via the existing improvement proposer (`proposeFromFindings`,\n * one LLM patch per finding) and applies them as ONE coherent improvement into\n * the candidate worktree. `maxShots` is ignored — reflection is single-shot by\n * construction (the patches are already drafted).\n *\n * This is the `shots=1, sandbox=off` code-candidate setting.\n * `agenticGenerator` supplies the multi-shot verify-in-session setting.\n *\n * @stable\n */\n\nimport { spawnSync } from 'node:child_process'\nimport type { SurfaceImprovementEdit } from '../agent/improvement-adapter'\nimport type { ImprovementProposalSource } from '../analyst-loop/types'\nimport type { CandidateGenerator } from './improvement-driver'\n\nexport interface ReflectiveGeneratorOptions {\n improvementProposalSource: ImprovementProposalSource<SurfaceImprovementEdit>\n}\n\n/** Cheap no-sandbox `CandidateGenerator` (the `shots=1` setting): draft surface edits via the improvement adapter and apply them as one coherent candidate. */\nexport function reflectiveGenerator(opts: ReflectiveGeneratorOptions): CandidateGenerator {\n return {\n kind: 'reflective',\n async generate({ worktreePath, findings }) {\n const batch = await opts.improvementProposalSource.proposeFromFindings(findings)\n if (batch.edits.length === 0) return { applied: false, summary: '' }\n\n let applied = 0\n for (const edit of batch.edits) {\n if (applyPatch(edit.patch, worktreePath)) applied++\n }\n if (applied === 0) return { applied: false, summary: '' }\n\n const summary =\n batch.edits.length === 1\n ? batch.edits[0]!.summary\n : `analyst: ${applied} surface edit${applied === 1 ? '' : 's'}`\n return { applied: true, summary }\n },\n }\n}\n\n/** Apply a proposed patch inside the isolated candidate worktree.\n * candidate worktree (a fresh checkout of baseRef, so `-p0` paths match). */\nfunction applyPatch(patch: string, cwd: string): boolean {\n const result = spawnSync('git', ['apply', '--whitespace=fix', '-p0', '-'], {\n cwd,\n input: patch,\n encoding: 'utf-8',\n })\n return result.status === 0\n}\n","/**\n *\n * Chat-model resolution + catalog validation — the shared primitive every\n * product chat handler needs and was, until now, hand-rolling. Lifts the\n * router `/v1/models` fetch, the fail-closed id validation, and the\n * precedence resolver out of four near-identical per-repo copies.\n *\n * Policy-free by design: callers pass their own precedence order\n * (`resolveChatModel`) and their own known-good `allowlist`\n * (`validateChatModelId`), so each product keeps its resolution policy while\n * sharing the catalog fetch, the malformed-id guard, and the fail-closed\n * admission rule. No React, no `process.env` assumption — `env` is an\n * explicit narrow record so this runs unchanged in Node and in Workers.\n *\n * @stable\n */\n\n/**\n * A model entry as returned by the Tangle Router `/v1/models` endpoint.\n * Intentionally minimal — only the fields resolution + validation read.\n */\nexport interface ModelInfo {\n id: string\n name?: string\n description?: string\n /** Provider slug, when the router exposes it (`provider` or `_provider`). */\n provider?: string\n _provider?: string\n architecture?: {\n modality?: string\n input_modalities?: string[]\n output_modalities?: string[]\n }\n}\n\n/** Env keys the router base URL is resolved from. */\nexport interface RouterEnv {\n TANGLE_ROUTER_URL?: string\n TANGLE_ROUTER_BASE_URL?: string\n}\n\n/** Default Tangle Router base URL used when no env override is set. */\nexport const DEFAULT_ROUTER_BASE_URL = 'https://router.tangle.tools'\n\n/** Resolve the router base URL from env, normalised — no trailing `/v1` or `/`. */\nexport function resolveRouterBaseUrl(env: RouterEnv = {}): string {\n return (env.TANGLE_ROUTER_URL ?? env.TANGLE_ROUTER_BASE_URL ?? DEFAULT_ROUTER_BASE_URL)\n .replace(/\\/v1\\/?$/, '')\n .replace(/\\/$/, '')\n}\n\n/**\n * Fetch the model catalog from the router's `/v1/models`. Throws on a non-2xx\n * response — callers decide whether to fail open (empty catalog) or closed.\n */\nexport async function getModels(\n routerBaseUrl: string = DEFAULT_ROUTER_BASE_URL,\n): Promise<ModelInfo[]> {\n const res = await fetch(`${routerBaseUrl}/v1/models`, {\n headers: { Accept: 'application/json' },\n })\n if (!res.ok) throw new Error(`router /v1/models ${res.status}`)\n const body = (await res.json()) as { data?: ModelInfo[] }\n return Array.isArray(body.data) ? body.data : []\n}\n\n/** Trim a candidate model id; `undefined` for non-strings and blanks. */\nexport function cleanModelId(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nexport interface ChatModelCandidate {\n /** Stable label for telemetry — e.g. `request`, `workspace`, `env`. */\n source: string\n model: string | undefined\n}\n\nexport interface ResolvedChatModel {\n source: string\n model: string\n}\n\n/**\n * Resolve a chat model by precedence: the first candidate carrying a\n * non-blank model wins, else `fallback`. The caller owns the precedence\n * order, so each product keeps its own policy (request → workspace → env,\n * etc.) while the first-non-blank logic and the telemetry shape stay shared.\n */\nexport function resolveChatModel(\n candidates: ChatModelCandidate[],\n fallback: ResolvedChatModel,\n): ResolvedChatModel {\n for (const candidate of candidates) {\n const model = cleanModelId(candidate.model)\n if (model) return { source: candidate.source, model }\n }\n return fallback\n}\n\nexport type ChatModelValidation =\n | { succeeded: true; value: string }\n | { succeeded: false; error: string }\n\nconst WELL_FORMED_MODEL_ID = /^[A-Za-z0-9._/@:-]+$/\n\nfunction isWellFormedModelId(modelId: string): boolean {\n return modelId.length <= 200 && WELL_FORMED_MODEL_ID.test(modelId)\n}\n\n/**\n * Every id a catalog entry can be addressed by — its bare id, plus a\n * `provider/id` form when the router exposes a separate provider slug.\n */\nfunction catalogIdsForModel(model: ModelInfo): string[] {\n const ids = new Set<string>()\n const id = cleanModelId(model.id)\n if (id) ids.add(id)\n const provider = cleanModelId(model._provider) ?? cleanModelId(model.provider)\n if (provider && id && !id.includes('/')) ids.add(`${provider}/${id}`)\n return [...ids]\n}\n\n/**\n * Validate a caller-supplied chat-model id. Rejects non-strings, malformed\n * ids, and ids absent from both the caller's `allowlist` and the live router\n * catalog. Fails closed: when the catalog cannot be fetched, an unverifiable\n * id is rejected rather than admitted — a bad model never reaches the agent.\n */\nexport async function validateChatModelId(\n modelId: unknown,\n options: {\n /**\n * Known-good ids that skip the catalog round trip — e.g. the product's\n * default model plus any env-configured ids.\n */\n allowlist?: string[]\n routerBaseUrl?: string\n /** Injectable catalog loader — overridden in tests. */\n loadModels?: (routerBaseUrl: string) => Promise<ModelInfo[]>\n } = {},\n): Promise<ChatModelValidation> {\n const {\n allowlist = [],\n routerBaseUrl = DEFAULT_ROUTER_BASE_URL,\n loadModels = getModels,\n } = options\n\n const cleaned = cleanModelId(modelId)\n if (!cleaned) return { succeeded: false, error: 'Model id must be a non-empty string.' }\n if (!isWellFormedModelId(cleaned)) {\n return { succeeded: false, error: `Model id is malformed: ${cleaned}` }\n }\n if (allowlist.some((id) => cleanModelId(id) === cleaned)) {\n return { succeeded: true, value: cleaned }\n }\n\n let catalog: ModelInfo[]\n try {\n catalog = await loadModels(routerBaseUrl)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { succeeded: false, error: `Could not validate model catalog: ${message}` }\n }\n\n const ids = new Set(catalog.flatMap(catalogIdsForModel))\n if (!ids.has(cleaned)) return { succeeded: false, error: `Model is not available: ${cleaned}` }\n return { succeeded: true, value: cleaned }\n}\n","/**\n *\n * Pure readiness-decision helper. Maps a `KnowledgeReadinessReport` from\n * `@tangle-network/agent-eval` to a three-state branch (`ready` / `blocked` /\n * `caveat`) the runtime, route handlers, and UI shells can all switch on.\n *\n * Default `minimumScore` of 0.7 mirrors the readiness scoring scale in\n * agent-eval; callers tightening or loosening this should keep it consistent\n * across all entry points for the same product so the UI / metrics agree on\n * what \"caveat\" means.\n *\n * @stable\n */\n\nimport type { KnowledgeReadinessReport } from '@tangle-network/agent-eval'\n\nimport { ValidationError } from './errors'\nimport type { KnowledgeReadinessDecision } from './types'\n\nconst DEFAULT_MINIMUM_READINESS_SCORE = 0.7\n\n/**\n * Map a `KnowledgeReadinessReport` to a three-state branch (`ready` / `blocked` / `caveat`) the runtime, route handlers, and UI shells all switch on.\n *\n * @stable\n */\nexport function decideKnowledgeReadiness(\n report: KnowledgeReadinessReport,\n options: { minimumScore?: number } = {},\n): KnowledgeReadinessDecision {\n const minimumScore = options.minimumScore ?? DEFAULT_MINIMUM_READINESS_SCORE\n if (!Number.isFinite(minimumScore) || minimumScore < 0 || minimumScore > 1) {\n throw new ValidationError(\n `minimumScore must be a finite number in [0, 1]; received ${String(minimumScore)}`,\n )\n }\n const blockingGapIds = report.blockingMissingRequirements.map((requirement) => requirement.id)\n const nonBlockingGapIds = report.nonBlockingGaps.map((requirement) => requirement.id)\n if (blockingGapIds.length > 0) {\n return {\n passed: false,\n status: 'blocked',\n reason: report.reason,\n readinessScore: report.readinessScore,\n recommendedAction: report.recommendedAction,\n severity: report.severity,\n blockingGapIds,\n nonBlockingGapIds,\n }\n }\n if (report.readinessScore < minimumScore) {\n return {\n passed: false,\n status: 'caveat',\n reason: `Knowledge readiness score ${report.readinessScore.toFixed(3)} is below minimum ${minimumScore.toFixed(3)}.`,\n readinessScore: report.readinessScore,\n recommendedAction: report.recommendedAction,\n severity: report.severity,\n blockingGapIds,\n nonBlockingGapIds,\n }\n }\n return {\n passed: true,\n status: 'ready',\n reason: report.reason,\n readinessScore: report.readinessScore,\n recommendedAction: report.recommendedAction,\n severity: report.severity,\n blockingGapIds,\n nonBlockingGapIds,\n }\n}\n","/**\n *\n * The two top-level entry points:\n *\n * - `runAgentTask` — single-shot lifecycle for adapter-driven tasks.\n * - `runAgentTaskStream` — streaming lifecycle that delegates execution to an\n * `AgentExecutionBackend` (model API, sandbox, or custom iterable).\n *\n * Both gate the run on `KnowledgeReadinessReport` from `agent-eval`, emit the\n * same lifecycle event vocabulary (under different shapes — see `types.ts`),\n * and route session lifecycle through a pluggable `RuntimeSessionStore`.\n *\n * @stable\n */\n\nimport {\n acquisitionPlansForKnowledgeGaps,\n blockingKnowledgeEval,\n type ControlContext,\n type ControlEvalResult,\n type ControlRunResult,\n type DataAcquisitionPlan,\n FAILURE_CLASSES,\n type FailureClass,\n type KnowledgeReadinessReport,\n type RunRecord,\n runAgentControlLoop,\n scoreKnowledgeReadiness,\n type UserQuestion,\n userQuestionsForKnowledgeGaps,\n} from '@tangle-network/agent-eval'\n\nconst FAILURE_CLASS_SET = new Set<string>(FAILURE_CLASSES)\n\n/** True when a free-form control failure string is a canonical taxonomy\n * class — so only real taxonomy tags are promoted to the cross-agent\n * `RunRecord.failureClass` key; novel strings stay as `failureMode` detail. */\nfunction asFailureClass(value: string | undefined): FailureClass | undefined {\n return value && FAILURE_CLASS_SET.has(value) ? (value as FailureClass) : undefined\n}\n\n/** Stamp cross-cutting defaults onto adapter-projected RunRecords without\n * overriding anything the adapter set explicitly:\n * - `scenarioId` — the run's scenario, when the record omits one.\n * - `failureClass` — the control layer's failure classification promoted\n * onto the canonical cross-agent key, but ONLY when it's a real taxonomy\n * class. This is what lets the substrate aggregate failures across every\n * agent in one vocabulary instead of per-agent ad-hoc strings. */\nexport function applyRunRecordDefaults(\n records: RunRecord[],\n scenarioId: string,\n controlFailureClass: string | undefined,\n): RunRecord[] {\n const fc = asFailureClass(controlFailureClass)\n return records.map((record) => {\n let r = record\n if (r.scenarioId === undefined) r = { ...r, scenarioId }\n if (r.failureClass === undefined && fc) r = { ...r, failureClass: fc }\n return r\n })\n}\n\nimport { normalizeBackendStreamEvent } from './backends'\nimport { BackendTransportError } from './errors'\nimport { decideKnowledgeReadiness } from './readiness'\nimport { nowIso, startOrResumeRuntimeSession, touchSession } from './sessions'\nimport type {\n AgentBackendInput,\n AgentKnowledgeProvider,\n AgentRuntimeEventSink,\n AgentTaskContext,\n AgentTaskRunResult,\n AgentTaskSpec,\n AgentTaskStatus,\n BackendErrorDetail,\n RunAgentTaskOptions,\n RunAgentTaskStreamOptions,\n RuntimeStreamEvent,\n} from './types'\n\n/**\n * Single-shot task lifecycle for adapter-driven tasks: readiness-gated, emits the runtime lifecycle event vocabulary, session-store pluggable.\n *\n * @stable\n */\nexport async function runAgentTask<\n TState,\n TAction,\n TActionResult,\n TEval extends ControlEvalResult = ControlEvalResult,\n>(\n options: RunAgentTaskOptions<TState, TAction, TActionResult, TEval>,\n): Promise<AgentTaskRunResult<TState, TAction, TActionResult, TEval>> {\n const task = options.task\n await emit(options.onEvent, { type: 'task_start', task })\n await emit(options.onEvent, { type: 'readiness_start', task })\n let knowledge = await buildReadiness(task, options.knowledge)\n await emit(options.onEvent, { type: 'readiness_end', task, knowledge })\n const questions = userQuestionsForKnowledgeGaps(knowledge.blockingMissingRequirements)\n const acquisitionPlans = acquisitionPlansForKnowledgeGaps([\n ...knowledge.blockingMissingRequirements,\n ...knowledge.nonBlockingGaps,\n ])\n const preflight = await runKnowledgePreflight(\n task,\n questions,\n acquisitionPlans,\n options.knowledge,\n options.onEvent,\n )\n if (\n options.knowledge?.refreshReadiness &&\n (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)\n ) {\n await emit(options.onEvent, { type: 'readiness_start', task })\n knowledge = await options.knowledge.refreshReadiness({\n task,\n previous: knowledge,\n userAnswers: preflight.userAnswers,\n acquiredEvidenceIds: preflight.acquiredEvidenceIds,\n })\n await emit(options.onEvent, { type: 'readiness_end', task, knowledge })\n }\n\n await emit(options.onEvent, { type: 'control_start', task, knowledge })\n const scenarioId = options.scenarioId ?? task.id\n const control = await runAgentControlLoop<TState, TAction, TActionResult, TEval>({\n intent: task.intent,\n budget: task.budget,\n signal: options.signal,\n store: options.store,\n scenarioId,\n projectId: options.projectId,\n variantId: options.variantId,\n observe: ({ history, abortSignal }) =>\n options.adapter.observe({ task, knowledge, history, abortSignal }),\n validate: async ({ state, history, abortSignal }) => {\n const readinessEval = blockingKnowledgeEval(knowledge, {\n minimumScore: options.minimumReadinessScore,\n })\n const evals = await options.adapter.validate({\n task,\n knowledge,\n state,\n history,\n abortSignal,\n })\n return [readinessEval as TEval, ...evals]\n },\n decide: (ctx) => {\n if (isKnowledgeBlocked(ctx.evals)) {\n return (\n options.adapter.onKnowledgeBlocked?.({\n task,\n knowledge,\n questions,\n acquisitionPlans,\n }) ?? {\n type: 'stop',\n pass: false,\n score: knowledge.readinessScore,\n reason: `knowledge readiness blocked: ${knowledge.reason}`,\n }\n )\n }\n return options.adapter.decide(toAgentContext(task, knowledge, ctx))\n },\n act: (action, ctx) => options.adapter.act(action, toAgentContext(task, knowledge, ctx)),\n shouldStop: options.adapter.shouldStop\n ? (ctx) => options.adapter.shouldStop!(toAgentContext(task, knowledge, ctx))\n : undefined,\n getActionCostUsd: options.adapter.getActionCostUsd\n ? ({ action, result, state, evals, history }) =>\n options.adapter.getActionCostUsd!({ action, result, task, state, evals, history })\n : undefined,\n onStep: (step) => emit(options.onEvent, { type: 'control_step', task, step }),\n })\n await emit(options.onEvent, { type: 'control_end', task, control })\n const status = statusFromControl(control)\n await emit(options.onEvent, { type: 'task_end', task, status, reason: control.reason })\n\n return {\n task,\n status,\n knowledge,\n questions,\n acquisitionPlans,\n userAnswers: preflight.userAnswers,\n acquiredEvidenceIds: preflight.acquiredEvidenceIds,\n control,\n runRecords: applyRunRecordDefaults(\n options.adapter.projectRunRecords?.(control, task) ?? [],\n scenarioId,\n control.failureClass,\n ),\n }\n}\n\n/**\n * Streaming task lifecycle: delegates execution to an `AgentExecutionBackend` (model API, sandbox, or custom iterable) and yields lifecycle events as they happen.\n *\n * @stable\n */\nexport async function* runAgentTaskStream<TInput extends AgentBackendInput = AgentBackendInput>(\n options: RunAgentTaskStreamOptions<TInput>,\n): AsyncIterable<RuntimeStreamEvent> {\n const task = options.task\n const input = { task, ...(options.input ?? {}) } as TInput\n yield streamEvent({ type: 'task_start', task })\n\n yield streamEvent({ type: 'readiness_start', task })\n let knowledge = await buildReadiness(task, options.knowledge)\n const questions = userQuestionsForKnowledgeGaps(knowledge.blockingMissingRequirements)\n const acquisitionPlans = acquisitionPlansForKnowledgeGaps([\n ...knowledge.blockingMissingRequirements,\n ...knowledge.nonBlockingGaps,\n ])\n const preflight = await runKnowledgePreflightStream(\n task,\n questions,\n acquisitionPlans,\n options.knowledge,\n )\n for (const event of preflight.events) yield event\n if (\n options.knowledge?.refreshReadiness &&\n (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)\n ) {\n yield streamEvent({ type: 'readiness_start', task })\n knowledge = await options.knowledge.refreshReadiness({\n task,\n previous: knowledge,\n userAnswers: preflight.userAnswers,\n acquiredEvidenceIds: preflight.acquiredEvidenceIds,\n })\n }\n const decision = decideKnowledgeReadiness(knowledge, {\n minimumScore: options.minimumReadinessScore,\n })\n yield streamEvent({ type: 'readiness_end', task, knowledge, decision })\n if (!decision.passed && decision.status === 'blocked') {\n const reason = `knowledge readiness blocked: ${decision.reason}`\n yield streamEvent({ type: 'task_end', task, status: 'blocked', reason })\n yield streamEvent({ type: 'final', task, status: 'blocked', reason })\n return\n }\n\n const store = options.sessionStore\n const opened = await startOrResumeRuntimeSession({\n backend: options.backend,\n input,\n context: { task, knowledge, signal: options.signal },\n store,\n sessionId: options.sessionId,\n resume: options.resume,\n })\n let session = opened.session\n const shouldResume = opened.resumed\n const sessionEvent = streamEvent({\n type: shouldResume ? 'session_resumed' : 'session_created',\n task,\n session,\n })\n await store?.appendEvent?.(session.id, sessionEvent)\n yield sessionEvent\n\n const backendStart = streamEvent({\n type: 'backend_start',\n task,\n session,\n backend: options.backend.kind,\n })\n await store?.appendEvent?.(session.id, backendStart)\n yield backendStart\n\n let finalText = ''\n try {\n for await (const rawEvent of options.backend.stream(opened.input, {\n task,\n knowledge,\n session,\n signal: options.signal,\n })) {\n const event = normalizeBackendStreamEvent(rawEvent, task, session)\n if (event.type === 'text_delta') finalText += event.text\n await store?.appendEvent?.(session.id, event)\n yield event\n }\n const completedStatus: AgentTaskStatus = 'completed'\n session = touchSession({ ...session, status: completedStatus })\n await store?.put(session)\n const backendEnd = streamEvent({\n type: 'backend_end',\n task,\n session,\n backend: options.backend.kind,\n })\n await store?.appendEvent?.(session.id, backendEnd)\n yield backendEnd\n const reason = 'backend completed'\n const taskEnd = streamEvent({ type: 'task_end', task, status: completedStatus, reason })\n await store?.appendEvent?.(session.id, taskEnd)\n yield taskEnd\n const final = streamEvent({\n type: 'final',\n task,\n session,\n status: completedStatus,\n reason,\n text: finalText || undefined,\n })\n await store?.appendEvent?.(session.id, final)\n yield final\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n session = touchSession({ ...session, status: options.signal?.aborted ? 'aborted' : 'failed' })\n await store?.put(session)\n let stopErrorMessage: string | undefined\n try {\n await options.backend.stop?.(session, message)\n } catch (stopErr) {\n stopErrorMessage = stopErr instanceof Error ? stopErr.message : String(stopErr)\n }\n const combinedMessage = stopErrorMessage\n ? `${message}; backend stop failed: ${stopErrorMessage}`\n : message\n // Typed transport detail — preserves status code + truncated body so\n // consumers can map onto `RunRecord.error` without re-parsing the log\n // string. Required by the runtime's fail-loud contract: silent empty\n // output for a 402 / 401 / 5xx hides the real failure mode.\n const errorDetail: BackendErrorDetail =\n err instanceof BackendTransportError\n ? {\n kind: 'transport',\n message: combinedMessage,\n status: err.status,\n body: err.body,\n }\n : { kind: 'backend', message: combinedMessage }\n const backendError = streamEvent({\n type: 'backend_error',\n task,\n session,\n backend: options.backend.kind,\n message: combinedMessage,\n recoverable: !options.signal?.aborted,\n error: errorDetail,\n })\n await store?.appendEvent?.(session.id, backendError)\n yield backendError\n const status: AgentTaskStatus = options.signal?.aborted ? 'aborted' : 'failed'\n const taskEnd = streamEvent({ type: 'task_end', task, status, reason: message })\n await store?.appendEvent?.(session.id, taskEnd)\n yield taskEnd\n const final = streamEvent({\n type: 'final',\n task,\n session,\n status,\n reason: message,\n text: finalText || undefined,\n error: errorDetail,\n })\n await store?.appendEvent?.(session.id, final)\n yield final\n }\n}\n\nasync function runKnowledgePreflight<\n TState,\n TAction,\n TActionResult,\n TEval extends ControlEvalResult,\n>(\n task: AgentTaskSpec,\n questions: UserQuestion[],\n acquisitionPlans: DataAcquisitionPlan[],\n provider: AgentKnowledgeProvider | undefined,\n onEvent: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval> | undefined,\n): Promise<{ userAnswers: Record<string, string>; acquiredEvidenceIds: string[] }> {\n let userAnswers: Record<string, string> = {}\n let acquiredEvidenceIds: string[] = []\n if (questions.length > 0 && provider?.answerQuestions) {\n await emit(onEvent, { type: 'questions_start', task, questions })\n userAnswers = await provider.answerQuestions(questions, task)\n await emit(onEvent, { type: 'questions_end', task, questions, userAnswers })\n }\n if (acquisitionPlans.length > 0 && provider?.executeAcquisitionPlans) {\n await emit(onEvent, { type: 'acquisition_start', task, acquisitionPlans })\n acquiredEvidenceIds = await provider.executeAcquisitionPlans(acquisitionPlans, task)\n await emit(onEvent, {\n type: 'acquisition_end',\n task,\n acquisitionPlans,\n acquiredEvidenceIds,\n })\n }\n return { userAnswers, acquiredEvidenceIds }\n}\n\nasync function runKnowledgePreflightStream(\n task: AgentTaskSpec,\n questions: UserQuestion[],\n acquisitionPlans: DataAcquisitionPlan[],\n provider: AgentKnowledgeProvider | undefined,\n): Promise<{\n userAnswers: Record<string, string>\n acquiredEvidenceIds: string[]\n events: RuntimeStreamEvent[]\n}> {\n const events: RuntimeStreamEvent[] = []\n let userAnswers: Record<string, string> = {}\n let acquiredEvidenceIds: string[] = []\n if (questions.length > 0 && provider?.answerQuestions) {\n events.push(streamEvent({ type: 'questions_start', task, questions }))\n userAnswers = await provider.answerQuestions(questions, task)\n events.push(streamEvent({ type: 'questions_end', task, questions, userAnswers }))\n }\n if (acquisitionPlans.length > 0 && provider?.executeAcquisitionPlans) {\n events.push(streamEvent({ type: 'acquisition_start', task, acquisitionPlans }))\n acquiredEvidenceIds = await provider.executeAcquisitionPlans(acquisitionPlans, task)\n events.push(\n streamEvent({ type: 'acquisition_end', task, acquisitionPlans, acquiredEvidenceIds }),\n )\n }\n return { userAnswers, acquiredEvidenceIds, events }\n}\n\nfunction streamEvent<T extends Omit<RuntimeStreamEvent, 'timestamp'>>(\n event: T,\n): T & { timestamp: string } {\n return { ...event, timestamp: nowIso() }\n}\n\nfunction buildReadiness(\n task: AgentTaskSpec,\n provider: AgentKnowledgeProvider | undefined,\n): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport {\n if (provider?.buildReadiness) return provider.buildReadiness(task)\n return scoreKnowledgeReadiness({\n taskId: task.id,\n requirements: task.requiredKnowledge ?? [],\n metadata: { domain: task.domain, ...task.metadata },\n })\n}\n\nfunction isKnowledgeBlocked(evals: ControlEvalResult[]): boolean {\n return evals.some((evalResult) => evalResult.id === 'knowledge-ready' && !evalResult.passed)\n}\n\nfunction statusFromControl(\n control: ControlRunResult<unknown, unknown, unknown, ControlEvalResult>,\n): AgentTaskStatus {\n if (control.stoppedBy === 'abort') return 'aborted'\n if (control.reason.includes('knowledge readiness blocked')) return 'blocked'\n if (control.pass) return 'completed'\n return 'failed'\n}\n\nasync function emit<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n sink: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval> | undefined,\n event: Parameters<AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>>[0],\n): Promise<void> {\n await sink?.(event)\n}\n\nfunction toAgentContext<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n task: AgentTaskSpec,\n knowledge: KnowledgeReadinessReport,\n ctx: ControlContext<TState, TAction, TActionResult, TEval>,\n): AgentTaskContext<TState, TAction, TActionResult, TEval> {\n return {\n task,\n knowledge,\n state: ctx.state,\n evals: ctx.evals,\n history: ctx.history,\n budget: ctx.budget,\n stepIndex: ctx.stepIndex,\n wallMs: ctx.wallMs,\n spentCostUsd: ctx.spentCostUsd,\n remainingCostUsd: ctx.remainingCostUsd,\n abortSignal: ctx.abortSignal,\n }\n}\n","/**\n *\n * Production-run lifecycle: record what the agent did on behalf of a customer,\n * what it cost, and how it ended.\n *\n * Three concerns live in this module:\n *\n * 1. **Lifecycle state machine** — `running` -> `completed | failed | cancelled`,\n * enforced by `RuntimeRunStateError`. Completion is idempotent for the same\n * status (a second `complete()` call is a no-op so retries / cleanup paths\n * don't double-fire side effects). A different terminal status is a state\n * error.\n *\n * 2. **Cost ledger** — every `llm_call` event the handle observes contributes\n * `tokensIn`, `tokensOut`, `costUsd`, and bumps `llmCalls`. Wall time is\n * measured from `startRuntimeRun()` to `complete()`. Surface via\n * `handle.cost()` for cost-per-task dashboards.\n *\n * 3. **Persistence adapter** — `RuntimeRunPersistenceAdapter` is the seam\n * consumers plug in to write a `RuntimeRunRow` to their D1 / postgres /\n * KV store. The adapter receives a sanitized row shape; no telemetry\n * payload bytes flow through it unless the consumer opts in via\n * `RuntimeRunOptions.telemetryEvents`.\n *\n * @stable\n */\n\nimport { RuntimeRunStateError, ValidationError } from './errors'\nimport type { AgentTaskSpec, RuntimeStreamEvent } from './types'\n\n/** @stable */\nexport type RuntimeRunStatus = 'running' | 'completed' | 'failed' | 'cancelled'\n\n/** @stable */\nexport interface RuntimeRunCost {\n /** Cumulative input tokens across every observed `llm_call` event. */\n tokensIn: number\n /** Cumulative output tokens across every observed `llm_call` event. */\n tokensOut: number\n /** Sum of `costUsd` from every observed `llm_call` event. */\n costUsd: number\n /** Wall time from `startRuntimeRun()` to `complete()` (or `now()` if not yet completed). */\n wallMs: number\n /** Count of `llm_call` events observed during the run. */\n llmCalls: number\n}\n\n/** @stable */\nexport interface RuntimeRunCompleteInput {\n status: Exclude<RuntimeRunStatus, 'running'>\n resultSummary?: string\n /** Optional explicit cost override; if omitted, the accumulated ledger is used. */\n cost?: Partial<RuntimeRunCost>\n /** Stable error message when `status === 'failed'`. */\n error?: string\n /** Additional adapter-specific fields merged into the persisted row. */\n metadata?: Record<string, unknown>\n}\n\n/** @stable */\nexport interface RuntimeRunRow {\n /** Stable runtime-side identifier. Adapters may translate to their own primary key. */\n id: string\n workspaceId: string\n sessionId?: string\n agentId?: string\n domain?: string\n taskId: string\n scenarioId?: string\n status: RuntimeRunStatus\n resultSummary?: string\n error?: string\n cost: RuntimeRunCost\n startedAt: string\n completedAt?: string\n metadata?: Record<string, unknown>\n}\n\n/** @stable */\nexport interface RuntimeRunPersistenceAdapter {\n /**\n * Called once when `handle.persist()` runs. Implementations write `row` to\n * their durable store (D1, postgres, KV) and return whatever the consumer\n * wants the caller to see (often the storage-side row id). Errors thrown\n * here propagate out of `persist()` so the caller can decide whether to\n * retry or log-and-continue.\n */\n upsert(row: RuntimeRunRow): Promise<void> | void\n}\n\n/** @stable */\nexport interface RuntimeRunOptions {\n workspaceId: string\n sessionId?: string\n agentId?: string\n taskSpec: AgentTaskSpec\n scenarioId?: string\n /** Optional persistence adapter; if omitted, `persist()` is a no-op. */\n adapter?: RuntimeRunPersistenceAdapter\n /** Override the row id; default = `${taskSpec.id}:${random suffix}`. */\n id?: string\n /** Override the clock; default = `Date.now()`. Useful for deterministic tests. */\n now?: () => number\n}\n\n/** @stable */\nexport interface RuntimeRunHandle {\n /** Stable id assigned at start. */\n readonly id: string\n readonly workspaceId: string\n readonly sessionId: string | undefined\n readonly taskSpec: AgentTaskSpec\n readonly status: RuntimeRunStatus\n\n /**\n * Observe a single `RuntimeStreamEvent`. The handle ignores non-cost events\n * (text deltas, tool calls) silently so consumers can pipe the whole stream\n * through `handle.observe`. `llm_call` events update the ledger.\n */\n observe(event: RuntimeStreamEvent): void\n\n /** Snapshot of the current cost ledger. Safe to call at any time. */\n cost(): RuntimeRunCost\n\n /**\n * Transition to a terminal state. Idempotent for the same status; throws\n * `RuntimeRunStateError` for a different terminal status (state machines\n * don't time-travel).\n */\n complete(input: RuntimeRunCompleteInput): void\n\n /** Build the current row without writing it. Useful for tests + dry runs. */\n toRow(metadata?: Record<string, unknown>): RuntimeRunRow\n\n /**\n * Persist the current row via the configured adapter. Must be called after\n * `complete()`. Idempotent for the same terminal state (the adapter sees\n * the same row on retry).\n */\n persist(metadata?: Record<string, unknown>): Promise<void>\n}\n\n/**\n *\n * Construct a runtime-run handle. The returned handle is mutable across its\n * lifetime; consumers should not share it across requests.\n *\n * @stable\n */\nexport function startRuntimeRun(options: RuntimeRunOptions): RuntimeRunHandle {\n if (!options.workspaceId) {\n throw new ValidationError('startRuntimeRun: workspaceId is required')\n }\n if (!options.taskSpec?.id) {\n throw new ValidationError('startRuntimeRun: taskSpec.id is required')\n }\n const now = options.now ?? Date.now\n const startedAtMs = now()\n const startedAt = new Date(startedAtMs).toISOString()\n const id = options.id ?? `${options.taskSpec.id}:${randomSuffix()}`\n\n let status: RuntimeRunStatus = 'running'\n let completedAtMs: number | undefined\n let resultSummary: string | undefined\n let error: string | undefined\n let completionMetadata: Record<string, unknown> | undefined\n\n const ledger: RuntimeRunCost = {\n tokensIn: 0,\n tokensOut: 0,\n costUsd: 0,\n wallMs: 0,\n llmCalls: 0,\n }\n\n const snapshotCost = (): RuntimeRunCost => ({\n tokensIn: ledger.tokensIn,\n tokensOut: ledger.tokensOut,\n costUsd: ledger.costUsd,\n wallMs: (completedAtMs ?? now()) - startedAtMs,\n llmCalls: ledger.llmCalls,\n })\n\n const buildRow = (extraMetadata?: Record<string, unknown>): RuntimeRunRow => ({\n id,\n workspaceId: options.workspaceId,\n sessionId: options.sessionId,\n agentId: options.agentId,\n domain: options.taskSpec.domain,\n taskId: options.taskSpec.id,\n scenarioId: options.scenarioId,\n status,\n resultSummary,\n error,\n cost: snapshotCost(),\n startedAt,\n completedAt: completedAtMs !== undefined ? new Date(completedAtMs).toISOString() : undefined,\n metadata: mergeMetadata(completionMetadata, extraMetadata),\n })\n\n return {\n id,\n workspaceId: options.workspaceId,\n sessionId: options.sessionId,\n taskSpec: options.taskSpec,\n get status() {\n return status\n },\n observe(event) {\n if (event.type !== 'llm_call') return\n ledger.llmCalls += 1\n if (typeof event.tokensIn === 'number' && Number.isFinite(event.tokensIn)) {\n ledger.tokensIn += event.tokensIn\n }\n if (typeof event.tokensOut === 'number' && Number.isFinite(event.tokensOut)) {\n ledger.tokensOut += event.tokensOut\n }\n if (typeof event.costUsd === 'number' && Number.isFinite(event.costUsd)) {\n ledger.costUsd += event.costUsd\n }\n },\n cost: snapshotCost,\n complete(input) {\n // JS callers can bypass the `Exclude<…, 'running'>` type; enforce the\n // state machine at runtime as well.\n if ((input.status as RuntimeRunStatus) === 'running') {\n throw new ValidationError('complete() requires a terminal status, got \"running\"')\n }\n if (status !== 'running') {\n if (status === input.status) return\n throw new RuntimeRunStateError(\n `Cannot transition runtime run from \"${status}\" to \"${input.status}\"`,\n )\n }\n status = input.status\n completedAtMs = now()\n resultSummary = input.resultSummary\n error = input.error\n completionMetadata = input.metadata\n if (input.cost) {\n if (typeof input.cost.tokensIn === 'number' && Number.isFinite(input.cost.tokensIn)) {\n ledger.tokensIn = input.cost.tokensIn\n }\n if (typeof input.cost.tokensOut === 'number' && Number.isFinite(input.cost.tokensOut)) {\n ledger.tokensOut = input.cost.tokensOut\n }\n if (typeof input.cost.costUsd === 'number' && Number.isFinite(input.cost.costUsd)) {\n ledger.costUsd = input.cost.costUsd\n }\n if (typeof input.cost.llmCalls === 'number' && Number.isFinite(input.cost.llmCalls)) {\n ledger.llmCalls = input.cost.llmCalls\n }\n }\n },\n toRow(metadata) {\n return buildRow(metadata)\n },\n async persist(metadata) {\n if (status === 'running') {\n throw new RuntimeRunStateError('Cannot persist a runtime run before complete() is called')\n }\n if (!options.adapter) return\n await options.adapter.upsert(buildRow(metadata))\n },\n }\n}\n\nfunction mergeMetadata(\n base: Record<string, unknown> | undefined,\n extra: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!base && !extra) return undefined\n return { ...(base ?? {}), ...(extra ?? {}) }\n}\n\nfunction randomSuffix(): string {\n // 8 chars of base36 — sufficient for in-process uniqueness. Callers needing\n // stronger guarantees pass `options.id` explicitly.\n return Math.random().toString(36).slice(2, 10)\n}\n","/**\n *\n * Server-Sent Events serialization for runtime telemetry streams.\n *\n * Newline-safe by construction: any newline in `id` or `event` is collapsed to\n * a space (browsers terminate fields on newline), and multi-line `data`\n * payloads are split into one `data:` line per source line so JSON.stringify\n * output transports cleanly.\n *\n * @stable\n */\n\nimport type { KnowledgeReadinessReport } from '@tangle-network/agent-eval'\nimport type { RuntimeTelemetryOptions } from './sanitize'\nimport { sanitizeKnowledgeReadinessReport, sanitizeRuntimeStreamEvent } from './sanitize'\nimport type { RuntimeStreamEvent } from './types'\n\n/** @stable */\nexport interface ServerSentEventOptions {\n event?: string\n id?: string\n retry?: number\n}\n\n/** @stable */\nexport function encodeServerSentEvent(data: unknown, options: ServerSentEventOptions = {}): string {\n const lines: string[] = []\n if (options.id) lines.push(`id: ${stripNewlines(options.id)}`)\n if (options.event) lines.push(`event: ${stripNewlines(options.event)}`)\n if (typeof options.retry === 'number' && Number.isFinite(options.retry) && options.retry >= 0) {\n lines.push(`retry: ${Math.floor(options.retry)}`)\n }\n\n const payload = typeof data === 'string' ? data : JSON.stringify(data)\n for (const line of payload.split(/\\r?\\n/)) {\n lines.push(`data: ${line}`)\n }\n return `${lines.join('\\n')}\\n\\n`\n}\n\n/** Serialize a `KnowledgeReadinessReport` as a Server-Sent Event string. @stable */\nexport function readinessServerSentEvent(\n report: KnowledgeReadinessReport,\n options: RuntimeTelemetryOptions & ServerSentEventOptions = {},\n): string {\n const { event, id, retry, ...telemetryOptions } = options\n return encodeServerSentEvent(\n {\n type: 'readiness',\n readiness: sanitizeKnowledgeReadinessReport(report, telemetryOptions),\n },\n { event, id, retry },\n )\n}\n\n/** Serialize a `RuntimeStreamEvent` as a Server-Sent Event string. @stable */\nexport function runtimeStreamServerSentEvent(\n event: RuntimeStreamEvent,\n options: RuntimeTelemetryOptions & ServerSentEventOptions = {},\n): string {\n const { event: sseEvent, id, retry, ...telemetryOptions } = options\n return encodeServerSentEvent(sanitizeRuntimeStreamEvent(event, telemetryOptions), {\n event: sseEvent,\n id,\n retry,\n })\n}\n\nfunction stripNewlines(value: string): string {\n return value.replace(/[\\r\\n]/g, ' ')\n}\n"],"mappings":"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"}