@tangle-network/agent-runtime 0.5.2 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/docs/product-runtime-kernel.md +49 -17
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -185,13 +185,18 @@ async function* runAgentTaskStream(options) {
|
|
|
185
185
|
const message = err instanceof Error ? err.message : String(err);
|
|
186
186
|
session = touchSession({ ...session, status: options.signal?.aborted ? "aborted" : "failed" });
|
|
187
187
|
await store?.put(session);
|
|
188
|
-
|
|
188
|
+
let stopErrorMessage;
|
|
189
|
+
try {
|
|
190
|
+
await options.backend.stop?.(session, message);
|
|
191
|
+
} catch (stopErr) {
|
|
192
|
+
stopErrorMessage = stopErr instanceof Error ? stopErr.message : String(stopErr);
|
|
193
|
+
}
|
|
189
194
|
const backendError = streamEvent({
|
|
190
195
|
type: "backend_error",
|
|
191
196
|
task,
|
|
192
197
|
session,
|
|
193
198
|
backend: options.backend.kind,
|
|
194
|
-
message,
|
|
199
|
+
message: stopErrorMessage ? `${message}; backend stop failed: ${stopErrorMessage}` : message,
|
|
195
200
|
recoverable: !options.signal?.aborted
|
|
196
201
|
});
|
|
197
202
|
await store?.appendEvent?.(session.id, backendError);
|
|
@@ -200,7 +205,9 @@ async function* runAgentTaskStream(options) {
|
|
|
200
205
|
const taskEnd = streamEvent({ type: "task_end", task, status, reason: message });
|
|
201
206
|
await store?.appendEvent?.(session.id, taskEnd);
|
|
202
207
|
yield taskEnd;
|
|
203
|
-
|
|
208
|
+
const final = streamEvent({ type: "final", task, session, status, reason: message, text: finalText || void 0 });
|
|
209
|
+
await store?.appendEvent?.(session.id, final);
|
|
210
|
+
yield final;
|
|
204
211
|
}
|
|
205
212
|
}
|
|
206
213
|
function decideKnowledgeReadiness(report, options = {}) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n acquisitionPlansForKnowledgeGaps,\n blockingKnowledgeEval,\n runAgentControlLoop,\n scoreKnowledgeReadiness,\n userQuestionsForKnowledgeGaps,\n type ControlBudget,\n type ControlContext,\n type ControlDecision,\n type ControlEvalResult,\n type ControlRunResult,\n type ControlStep,\n type DataAcquisitionPlan,\n type KnowledgeReadinessReport,\n type KnowledgeRequirement,\n type RunRecord,\n type TraceStore,\n type UserQuestion,\n} from '@tangle-network/agent-eval'\n\nexport interface AgentTaskSpec {\n id: string\n intent: string\n /** Domain is metadata, not an architectural boundary: tax, legal, gtm, creative, blueprint, redteam, etc. */\n domain?: string\n inputs?: Record<string, unknown>\n requiredKnowledge?: KnowledgeRequirement[]\n budget?: Partial<ControlBudget>\n metadata?: Record<string, unknown>\n}\n\nexport interface AgentKnowledgeProvider {\n buildReadiness?(task: AgentTaskSpec): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport\n answerQuestions?(questions: UserQuestion[], task: AgentTaskSpec): Promise<Record<string, string>> | Record<string, string>\n executeAcquisitionPlans?(plans: DataAcquisitionPlan[], task: AgentTaskSpec): Promise<string[]> | string[]\n refreshReadiness?(input: {\n task: AgentTaskSpec\n previous: KnowledgeReadinessReport\n userAnswers: Record<string, string>\n acquiredEvidenceIds: string[]\n }): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport\n}\n\nexport interface AgentTaskContext<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n budget: ControlBudget\n stepIndex: number\n wallMs: number\n spentCostUsd: number\n remainingCostUsd?: number\n abortSignal: AbortSignal\n}\n\nexport interface AgentAdapter<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n observe(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }): Promise<TState> | TState\n\n validate(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n state: TState\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }): Promise<TEval[]> | TEval[]\n\n decide(ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<ControlDecision<TAction>> | ControlDecision<TAction>\n\n act(action: TAction, ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<TActionResult> | TActionResult\n\n shouldStop?(ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<{\n stop: boolean\n pass: boolean\n reason: string\n score?: number\n }> | {\n stop: boolean\n pass: boolean\n reason: string\n score?: number\n }\n\n onKnowledgeBlocked?(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n }): Promise<ControlDecision<TAction>> | ControlDecision<TAction>\n\n getActionCostUsd?(ctx: {\n action: TAction\n result: TActionResult\n task: AgentTaskSpec\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n }): number | undefined\n\n projectRunRecords?(result: ControlRunResult<TState, TAction, TActionResult, TEval>, task: AgentTaskSpec): RunRecord[]\n}\n\nexport type AgentTaskStatus =\n | 'completed'\n | 'blocked'\n | 'failed'\n | 'aborted'\n\nexport type AgentRuntimeEvent<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> =\n | { type: 'task_start'; task: AgentTaskSpec }\n | { type: 'readiness_start'; task: AgentTaskSpec }\n | { type: 'readiness_end'; task: AgentTaskSpec; knowledge: KnowledgeReadinessReport }\n | { type: 'questions_start'; task: AgentTaskSpec; questions: UserQuestion[] }\n | { type: 'questions_end'; task: AgentTaskSpec; questions: UserQuestion[]; userAnswers: Record<string, string> }\n | { type: 'acquisition_start'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[] }\n | { type: 'acquisition_end'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[]; acquiredEvidenceIds: string[] }\n | { type: 'control_start'; task: AgentTaskSpec; knowledge: KnowledgeReadinessReport }\n | { type: 'control_step'; task: AgentTaskSpec; step: ControlStep<TState, TAction, TActionResult, TEval> }\n | { type: 'control_end'; task: AgentTaskSpec; control: ControlRunResult<TState, TAction, TActionResult, TEval> }\n | { type: 'task_end'; task: AgentTaskSpec; status: AgentTaskStatus; reason: string }\n\nexport type AgentRuntimeEventSink<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> = (\n event: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>,\n) => Promise<void> | void\n\nexport type RuntimeStreamEvent =\n | { type: 'task_start'; task: AgentTaskSpec; timestamp: string }\n | { type: 'readiness_start'; task: AgentTaskSpec; timestamp: string }\n | { type: 'readiness_end'; task: AgentTaskSpec; knowledge: KnowledgeReadinessReport; decision: KnowledgeReadinessDecision; timestamp: string }\n | { type: 'questions_start'; task: AgentTaskSpec; questions: UserQuestion[]; timestamp: string }\n | { type: 'questions_end'; task: AgentTaskSpec; questions: UserQuestion[]; userAnswers: Record<string, string>; timestamp: string }\n | { type: 'acquisition_start'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[]; timestamp: string }\n | { type: 'acquisition_end'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[]; acquiredEvidenceIds: string[]; timestamp: string }\n | { type: 'session_created'; task: AgentTaskSpec; session: RuntimeSession; timestamp: string }\n | { type: 'session_resumed'; task: AgentTaskSpec; session: RuntimeSession; timestamp: string }\n | { type: 'backend_start'; task: AgentTaskSpec; session: RuntimeSession; backend: string; timestamp: string }\n | { type: 'text_delta'; task?: AgentTaskSpec; session?: RuntimeSession; text: string; timestamp?: string }\n | { type: 'reasoning_delta'; task?: AgentTaskSpec; session?: RuntimeSession; text: string; timestamp?: string }\n | { type: 'tool_call'; task?: AgentTaskSpec; session?: RuntimeSession; toolName: string; toolCallId?: string; args?: unknown; timestamp?: string }\n | { type: 'tool_result'; task?: AgentTaskSpec; session?: RuntimeSession; toolName: string; toolCallId?: string; result?: unknown; timestamp?: string }\n | { type: 'artifact'; task?: AgentTaskSpec; session?: RuntimeSession; artifactId: string; name?: string; mimeType?: string; uri?: string; metadata?: Record<string, unknown>; timestamp?: string }\n | { type: 'backend_error'; task: AgentTaskSpec; session?: RuntimeSession; backend: string; message: string; recoverable: boolean; timestamp: string }\n | { type: 'backend_end'; task: AgentTaskSpec; session: RuntimeSession; backend: string; timestamp: string }\n | { type: 'task_end'; task: AgentTaskSpec; status: AgentTaskStatus; reason: string; timestamp: string }\n | { type: 'final'; task: AgentTaskSpec; session?: RuntimeSession; status: AgentTaskStatus; reason: string; text?: string; metadata?: Record<string, unknown>; timestamp: string }\n\nexport interface RuntimeSession {\n id: string\n backend: string\n status: 'active' | 'completed' | 'failed' | 'aborted'\n resumeToken?: string\n createdAt: string\n updatedAt: string\n metadata?: Record<string, unknown>\n}\n\nexport interface RuntimeSessionStore {\n get(sessionId: string): Promise<RuntimeSession | undefined> | RuntimeSession | undefined\n put(session: RuntimeSession): Promise<void> | void\n appendEvent?(sessionId: string, event: RuntimeStreamEvent): Promise<void> | void\n listEvents?(sessionId: string): Promise<RuntimeStreamEvent[]> | RuntimeStreamEvent[]\n}\n\nexport interface AgentBackendInput {\n task: AgentTaskSpec\n message?: string\n messages?: Array<{ role: string; content: string }>\n inputs?: Record<string, unknown>\n}\n\nexport interface AgentBackendContext {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n session: RuntimeSession\n signal?: AbortSignal\n}\n\nexport interface AgentExecutionBackend<TInput extends AgentBackendInput = AgentBackendInput> {\n kind: string\n start?(input: TInput, context: Omit<AgentBackendContext, 'session'> & { requestedSessionId?: string }): Promise<RuntimeSession> | RuntimeSession\n resume?(session: RuntimeSession, input: TInput, context: Omit<AgentBackendContext, 'session'>): Promise<RuntimeSession> | RuntimeSession\n stream(input: TInput, context: AgentBackendContext): AsyncIterable<RuntimeStreamEvent>\n stop?(session: RuntimeSession, reason: string): Promise<void> | void\n}\n\nexport interface RunAgentTaskStreamOptions<TInput extends AgentBackendInput = AgentBackendInput> {\n task: AgentTaskSpec\n backend: AgentExecutionBackend<TInput>\n input?: Omit<TInput, 'task'>\n knowledge?: AgentKnowledgeProvider\n sessionStore?: RuntimeSessionStore\n sessionId?: string\n resume?: boolean\n signal?: AbortSignal\n minimumReadinessScore?: number\n}\n\nexport interface RunAgentTaskOptions<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n adapter: AgentAdapter<TState, TAction, TActionResult, TEval>\n knowledge?: AgentKnowledgeProvider\n onEvent?: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>\n store?: TraceStore\n signal?: AbortSignal\n scenarioId?: string\n projectId?: string\n variantId?: string\n minimumReadinessScore?: number\n}\n\nexport interface AgentTaskRunResult<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n status: AgentTaskStatus\n knowledge: KnowledgeReadinessReport\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n userAnswers: Record<string, string>\n acquiredEvidenceIds: string[]\n control: ControlRunResult<TState, TAction, TActionResult, TEval>\n runRecords: RunRecord[]\n}\n\nexport interface RuntimeTelemetryOptions {\n /**\n * Include raw task inputs. Off by default because task inputs often\n * contain customer facts, credentials, source text, or internal IDs.\n */\n includeInputs?: boolean\n /** Include requirement descriptions. Secret requirements are always redacted. */\n includeRequirementDescriptions?: boolean\n /** Include evidence IDs. Off by default; counts are safer for shared reports. */\n includeEvidenceIds?: boolean\n /** Include user answers from question preflight. Off by default. */\n includeUserAnswers?: boolean\n /** Include action payloads and action results for control steps. Off by default. */\n includeControlPayloads?: boolean\n /** Include task metadata. Off by default because metadata may carry IDs or policy internals. */\n includeMetadata?: boolean\n /** Include eval detail/evidence strings. Off by default because validators may echo private input. */\n includeEvalDetails?: boolean\n}\n\nexport interface SanitizedKnowledgeRequirement {\n id: string\n description?: string\n requiredFor: string[]\n category: KnowledgeRequirement['category']\n acquisitionMode: KnowledgeRequirement['acquisitionMode']\n importance: KnowledgeRequirement['importance']\n freshness: KnowledgeRequirement['freshness']\n sensitivity: KnowledgeRequirement['sensitivity']\n confidenceNeeded: number\n currentConfidence: number\n evidenceCount: number\n evidenceIds?: string[]\n fallbackPolicy: KnowledgeRequirement['fallbackPolicy']\n}\n\nexport interface SanitizedKnowledgeReadinessReport {\n taskId: string\n readinessScore: number\n recommendedAction: KnowledgeReadinessReport['recommendedAction']\n severity: KnowledgeReadinessReport['severity']\n reason: string\n blockingMissingRequirements: SanitizedKnowledgeRequirement[]\n nonBlockingGaps: SanitizedKnowledgeRequirement[]\n evidenceCount: number\n evidenceIds?: string[]\n missingRequirementIds: string[]\n}\n\nexport interface AgentTaskRunSummary {\n taskId: string\n domain?: string\n status: AgentTaskStatus\n reason: string\n readinessStatus: KnowledgeReadinessDecision['status']\n readinessScore: number\n recommendedAction: KnowledgeReadinessReport['recommendedAction']\n blockingGapIds: string[]\n nonBlockingGapIds: string[]\n questionCount: number\n acquisitionPlanCount: number\n acquiredEvidenceCount: number\n controlStepCount: number\n pass: boolean\n failureClass?: string\n wallMs: number\n costUsd: number\n}\n\nexport interface KnowledgeReadinessDecision {\n passed: boolean\n status: 'ready' | 'blocked' | 'caveat'\n reason: string\n readinessScore: number\n recommendedAction: KnowledgeReadinessReport['recommendedAction']\n severity: KnowledgeReadinessReport['severity']\n blockingGapIds: string[]\n nonBlockingGapIds: string[]\n}\n\nexport interface RuntimeEventCollector<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> {\n onEvent: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>\n events: Array<Record<string, unknown>>\n}\n\nexport interface ServerSentEventOptions {\n event?: string\n id?: string\n retry?: number\n}\n\nexport class InMemoryRuntimeSessionStore implements RuntimeSessionStore {\n private readonly sessions = new Map<string, RuntimeSession>()\n private readonly events = new Map<string, RuntimeStreamEvent[]>()\n\n get(sessionId: string): RuntimeSession | undefined {\n return this.sessions.get(sessionId)\n }\n\n put(session: RuntimeSession): void {\n this.sessions.set(session.id, session)\n }\n\n appendEvent(sessionId: string, event: RuntimeStreamEvent): void {\n const existing = this.events.get(sessionId) ?? []\n existing.push(event)\n this.events.set(sessionId, existing)\n }\n\n listEvents(sessionId: string): RuntimeStreamEvent[] {\n return [...(this.events.get(sessionId) ?? [])]\n }\n}\n\nexport async function runAgentTask<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult>(\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(task, questions, acquisitionPlans, options.knowledge, options.onEvent)\n if (options.knowledge?.refreshReadiness && (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)) {\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 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: options.scenarioId ?? task.id,\n projectId: options.projectId,\n variantId: options.variantId,\n observe: ({ history, abortSignal }) => options.adapter.observe({ task, knowledge, history, abortSignal }),\n validate: async ({ state, history, abortSignal }) => {\n const readinessEval = blockingKnowledgeEval(knowledge, { minimumScore: options.minimumReadinessScore })\n const evals = await options.adapter.validate({ task, knowledge, state, history, abortSignal })\n return [readinessEval as TEval, ...evals]\n },\n decide: (ctx) => {\n if (isKnowledgeBlocked(ctx.evals)) {\n return options.adapter.onKnowledgeBlocked?.({ task, knowledge, questions, acquisitionPlans }) ?? {\n type: 'stop',\n pass: false,\n score: knowledge.readinessScore,\n reason: `knowledge readiness blocked: ${knowledge.reason}`,\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 }) => 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: options.adapter.projectRunRecords?.(control, task) ?? [],\n }\n}\n\nexport function summarizeAgentTaskRun<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n result: AgentTaskRunResult<TState, TAction, TActionResult, TEval>,\n): AgentTaskRunSummary {\n return {\n taskId: result.task.id,\n domain: result.task.domain,\n status: result.status,\n reason: result.control.reason,\n readinessStatus: decideKnowledgeReadiness(result.knowledge).status,\n readinessScore: result.knowledge.readinessScore,\n recommendedAction: result.knowledge.recommendedAction,\n blockingGapIds: result.knowledge.blockingMissingRequirements.map((requirement) => requirement.id),\n nonBlockingGapIds: result.knowledge.nonBlockingGaps.map((requirement) => requirement.id),\n questionCount: result.questions.length,\n acquisitionPlanCount: result.acquisitionPlans.length,\n acquiredEvidenceCount: result.acquiredEvidenceIds.length,\n controlStepCount: result.control.steps.length,\n pass: result.control.pass,\n failureClass: result.control.failureClass,\n wallMs: result.control.wallMs,\n costUsd: result.control.spentCostUsd,\n }\n}\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 const started = streamEvent({ type: 'task_start', task })\n yield started\n\n const readinessStart = streamEvent({ type: 'readiness_start', task })\n yield readinessStart\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(task, questions, acquisitionPlans, options.knowledge)\n for (const event of preflight.events) yield event\n if (options.knowledge?.refreshReadiness && (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)) {\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, { minimumScore: options.minimumReadinessScore })\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 existing = options.sessionId ? await store?.get(options.sessionId) : undefined\n const shouldResume = Boolean(options.resume && existing)\n let session = shouldResume && existing\n ? await resumeBackendSession(options.backend, existing, input, { task, knowledge, signal: options.signal })\n : await startBackendSession(options.backend, input, { task, knowledge, signal: options.signal }, options.sessionId)\n await store?.put(session)\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({ type: 'backend_start', task, session, backend: options.backend.kind })\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(input, { task, knowledge, session, signal: options.signal })) {\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({ type: 'backend_end', task, session, backend: options.backend.kind })\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({ type: 'final', task, session, status: completedStatus, reason, text: finalText || undefined })\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 await options.backend.stop?.(session, message)\n const backendError = streamEvent({\n type: 'backend_error',\n task,\n session,\n backend: options.backend.kind,\n message,\n recoverable: !options.signal?.aborted,\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 yield streamEvent({ type: 'final', task, session, status, reason: message, text: finalText || undefined })\n }\n}\n\nexport function decideKnowledgeReadiness(\n report: KnowledgeReadinessReport,\n options: { minimumScore?: number } = {},\n): KnowledgeReadinessDecision {\n const minimumScore = options.minimumScore ?? 0.7\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\nexport function sanitizeKnowledgeReadinessReport(\n report: KnowledgeReadinessReport,\n options: RuntimeTelemetryOptions = {},\n): SanitizedKnowledgeReadinessReport {\n return {\n taskId: report.taskId,\n readinessScore: report.readinessScore,\n recommendedAction: report.recommendedAction,\n severity: report.severity,\n reason: report.reason,\n blockingMissingRequirements: report.blockingMissingRequirements.map((requirement) =>\n sanitizeKnowledgeRequirement(requirement, options),\n ),\n nonBlockingGaps: report.nonBlockingGaps.map((requirement) =>\n sanitizeKnowledgeRequirement(requirement, options),\n ),\n evidenceCount: report.bundle.evidenceIds.length,\n evidenceIds: options.includeEvidenceIds ? report.bundle.evidenceIds : undefined,\n missingRequirementIds: report.bundle.missing.map((requirement) => requirement.id),\n }\n}\n\nexport function sanitizeAgentRuntimeEvent<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n event: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>,\n options: RuntimeTelemetryOptions = {},\n): Record<string, unknown> {\n const base = { type: event.type, task: sanitizeTask(event.task, options) }\n if (event.type === 'readiness_start' || event.type === 'task_start' || event.type === 'control_start') {\n return event.type === 'control_start'\n ? { ...base, knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options) }\n : base\n }\n if (event.type === 'readiness_end') {\n return { ...base, knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options) }\n }\n if (event.type === 'questions_start') {\n return { ...base, questions: event.questions.map((question) => sanitizeQuestion(question, options)) }\n }\n if (event.type === 'questions_end') {\n return {\n ...base,\n questions: event.questions.map((question) => sanitizeQuestion(question, options)),\n userAnswers: options.includeUserAnswers ? event.userAnswers : redactRecord(event.userAnswers),\n }\n }\n if (event.type === 'acquisition_start') {\n return { ...base, acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan) }\n }\n if (event.type === 'acquisition_end') {\n return {\n ...base,\n acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan),\n acquiredEvidenceCount: event.acquiredEvidenceIds.length,\n acquiredEvidenceIds: options.includeEvidenceIds ? event.acquiredEvidenceIds : undefined,\n }\n }\n if (event.type === 'control_step') {\n return { ...base, step: sanitizeControlStep(event.step, options) }\n }\n if (event.type === 'control_end') {\n return { ...base, control: sanitizeControlRun(event.control, options) }\n }\n return { ...base, status: event.status, reason: event.reason }\n}\n\nexport function sanitizeRuntimeStreamEvent(\n event: RuntimeStreamEvent,\n options: RuntimeTelemetryOptions = {},\n): Record<string, unknown> {\n const withTask = 'task' in event && event.task\n ? { task: sanitizeTask(event.task, options) }\n : {}\n const withSession = 'session' in event && event.session\n ? { session: sanitizeRuntimeSession(event.session, options) }\n : {}\n\n if (event.type === 'readiness_end') {\n return {\n type: event.type,\n ...withTask,\n timestamp: event.timestamp,\n decision: event.decision,\n knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options),\n }\n }\n if (event.type === 'questions_start') {\n return { type: event.type, ...withTask, timestamp: event.timestamp, questions: event.questions.map((question) => sanitizeQuestion(question, options)) }\n }\n if (event.type === 'questions_end') {\n return {\n type: event.type,\n ...withTask,\n timestamp: event.timestamp,\n questions: event.questions.map((question) => sanitizeQuestion(question, options)),\n userAnswers: options.includeUserAnswers ? event.userAnswers : redactRecord(event.userAnswers),\n }\n }\n if (event.type === 'acquisition_start') {\n return { type: event.type, ...withTask, timestamp: event.timestamp, acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan) }\n }\n if (event.type === 'acquisition_end') {\n return {\n type: event.type,\n ...withTask,\n timestamp: event.timestamp,\n acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan),\n acquiredEvidenceCount: event.acquiredEvidenceIds.length,\n acquiredEvidenceIds: options.includeEvidenceIds ? event.acquiredEvidenceIds : undefined,\n }\n }\n if (event.type === 'tool_call') {\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: event.timestamp,\n toolName: event.toolName,\n toolCallId: event.toolCallId,\n args: options.includeControlPayloads ? event.args : undefined,\n }\n }\n if (event.type === 'tool_result') {\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: event.timestamp,\n toolName: event.toolName,\n toolCallId: event.toolCallId,\n result: options.includeControlPayloads ? event.result : undefined,\n }\n }\n if (event.type === 'artifact') {\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: event.timestamp,\n artifactId: event.artifactId,\n name: event.name,\n mimeType: event.mimeType,\n uri: options.includeEvidenceIds ? event.uri : undefined,\n metadata: options.includeMetadata ? event.metadata : undefined,\n }\n }\n if (event.type === 'final') {\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: event.timestamp,\n status: event.status,\n reason: event.reason,\n text: options.includeControlPayloads ? event.text : undefined,\n metadata: options.includeMetadata ? event.metadata : undefined,\n }\n }\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: 'timestamp' in event ? event.timestamp : undefined,\n ...pickPublicStreamFields(event),\n }\n}\n\nexport function createRuntimeEventCollector<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult>(\n options: RuntimeTelemetryOptions = {},\n): RuntimeEventCollector<TState, TAction, TActionResult, TEval> {\n const events: Array<Record<string, unknown>> = []\n return {\n events,\n onEvent: (event) => {\n events.push(sanitizeAgentRuntimeEvent(event, options))\n },\n }\n}\n\nexport function encodeServerSentEvent(\n data: unknown,\n options: ServerSentEventOptions = {},\n): 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\nexport function readinessServerSentEvent(\n report: KnowledgeReadinessReport,\n options: RuntimeTelemetryOptions & ServerSentEventOptions = {},\n): string {\n const { event, id, retry, ...telemetryOptions } = options\n return encodeServerSentEvent({\n type: 'readiness',\n readiness: sanitizeKnowledgeReadinessReport(report, telemetryOptions),\n }, { event, id, retry })\n}\n\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), { event: sseEvent, id, retry })\n}\n\nexport function createIterableBackend<TInput extends AgentBackendInput>(\n options: {\n kind: string\n start?: AgentExecutionBackend<TInput>['start']\n resume?: AgentExecutionBackend<TInput>['resume']\n stream: AgentExecutionBackend<TInput>['stream']\n stop?: AgentExecutionBackend<TInput>['stop']\n },\n): AgentExecutionBackend<TInput> {\n return options\n}\n\nexport function createSandboxPromptBackend<TBox, TInput extends AgentBackendInput = AgentBackendInput>(\n options: {\n kind?: string\n getBox(input: TInput, context: Omit<AgentBackendContext, 'session'>): Promise<TBox> | TBox\n streamPrompt(box: TBox, message: string, context: AgentBackendContext): AsyncIterable<unknown>\n mapEvent?: (event: unknown, context: AgentBackendContext) => RuntimeStreamEvent | undefined\n getSessionId?: (box: TBox, input: TInput) => string | undefined\n },\n): AgentExecutionBackend<TInput> {\n return {\n kind: options.kind ?? 'sandbox',\n async start(input, context) {\n const box = await options.getBox(input, context)\n return newRuntimeSession(options.kind ?? 'sandbox', options.getSessionId?.(box, input) ?? context.requestedSessionId, {\n resumable: true,\n })\n },\n resume(session) {\n return touchSession({ ...session, status: 'active' })\n },\n async *stream(input, context) {\n const box = await options.getBox(input, context)\n const message = input.message ?? input.messages?.at(-1)?.content ?? context.task.intent\n for await (const event of options.streamPrompt(box, message, context)) {\n const mapped = options.mapEvent?.(event, context) ?? mapCommonBackendEvent(event, context)\n if (mapped) yield mapped\n }\n },\n }\n}\n\nexport function createCliBridgeBackend<TInput extends AgentBackendInput = AgentBackendInput>(\n options: {\n url: string\n bearer?: string\n kind?: string\n fetchImpl?: typeof fetch\n },\n): AgentExecutionBackend<TInput> {\n const fetcher = options.fetchImpl ?? fetch\n return {\n kind: options.kind ?? 'cli-bridge',\n start(_input, context) {\n return newRuntimeSession(options.kind ?? 'cli-bridge', context.requestedSessionId, { resumable: true })\n },\n resume(session) {\n return touchSession({ ...session, status: 'active' })\n },\n async *stream(input, context) {\n const response = await fetcher(options.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(options.bearer ? { Authorization: `Bearer ${options.bearer}` } : {}),\n },\n body: JSON.stringify({\n sessionId: context.session.id,\n resumeToken: context.session.resumeToken,\n task: input.task,\n message: input.message,\n messages: input.messages,\n inputs: input.inputs,\n }),\n signal: context.signal,\n })\n if (!response.ok) throw new Error(`cli bridge returned ${response.status}`)\n yield* streamResponseEvents(response, context)\n },\n }\n}\n\nexport function createOpenAICompatibleBackend<TInput extends AgentBackendInput = AgentBackendInput>(\n options: {\n apiKey: string\n baseUrl: string\n model: string\n kind?: string\n fetchImpl?: typeof fetch\n },\n): AgentExecutionBackend<TInput> {\n const fetcher = options.fetchImpl ?? fetch\n return {\n kind: options.kind ?? 'tcloud',\n start(_input, context) {\n return newRuntimeSession(options.kind ?? 'tcloud', context.requestedSessionId)\n },\n async *stream(input, context) {\n const response = await fetcher(`${options.baseUrl.replace(/\\/$/, '')}/chat/completions`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: options.model,\n stream: true,\n messages: input.messages ?? [{ role: 'user', content: input.message ?? context.task.intent }],\n }),\n signal: context.signal,\n })\n if (!response.ok) throw new Error(`chat backend returned ${response.status}`)\n yield* streamResponseEvents(response, context)\n },\n }\n}\n\nasync function runKnowledgePreflight<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\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, { type: 'acquisition_end', task, acquisitionPlans, acquiredEvidenceIds })\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(streamEvent({ type: 'acquisition_end', task, acquisitionPlans, acquiredEvidenceIds }))\n }\n return { userAnswers, acquiredEvidenceIds, events }\n}\n\nfunction sanitizeTask(task: AgentTaskSpec, options: RuntimeTelemetryOptions): Record<string, unknown> {\n return {\n id: task.id,\n intent: task.intent,\n domain: task.domain,\n inputs: options.includeInputs ? task.inputs : task.inputs ? '[redacted]' : undefined,\n requiredKnowledge: task.requiredKnowledge?.map((requirement) =>\n sanitizeKnowledgeRequirement(requirement, options),\n ),\n metadata: options.includeMetadata ? task.metadata : task.metadata ? '[redacted]' : undefined,\n }\n}\n\nfunction sanitizeRuntimeSession(session: RuntimeSession, options: RuntimeTelemetryOptions): Record<string, unknown> {\n return {\n id: session.id,\n backend: session.backend,\n status: session.status,\n hasResumeToken: Boolean(session.resumeToken),\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n metadata: options.includeMetadata ? session.metadata : session.metadata ? '[redacted]' : undefined,\n }\n}\n\nfunction sanitizeKnowledgeRequirement(\n requirement: KnowledgeRequirement,\n options: RuntimeTelemetryOptions,\n): SanitizedKnowledgeRequirement {\n const includeDescription = options.includeRequirementDescriptions && requirement.sensitivity !== 'secret'\n return {\n id: requirement.id,\n description: includeDescription ? requirement.description : undefined,\n requiredFor: requirement.requiredFor,\n category: requirement.category,\n acquisitionMode: requirement.acquisitionMode,\n importance: requirement.importance,\n freshness: requirement.freshness,\n sensitivity: requirement.sensitivity,\n confidenceNeeded: requirement.confidenceNeeded,\n currentConfidence: requirement.currentConfidence,\n evidenceCount: requirement.evidenceIds.length,\n evidenceIds: options.includeEvidenceIds ? requirement.evidenceIds : undefined,\n fallbackPolicy: requirement.fallbackPolicy,\n }\n}\n\nfunction sanitizeQuestion(question: UserQuestion, options: RuntimeTelemetryOptions): Record<string, unknown> {\n return {\n id: question.id,\n question: options.includeRequirementDescriptions && question.answerType !== 'credential'\n ? question.question\n : undefined,\n reason: options.includeRequirementDescriptions ? question.reason : undefined,\n requirementId: question.requirementId,\n importance: question.importance,\n answerType: question.answerType,\n impactIfUnknown: options.includeRequirementDescriptions ? question.impactIfUnknown : undefined,\n optionCount: question.options?.length ?? 0,\n }\n}\n\nfunction sanitizeAcquisitionPlan(plan: DataAcquisitionPlan): Record<string, unknown> {\n return {\n id: plan.id,\n requirementIds: plan.requirementIds,\n mode: plan.mode,\n priority: plan.priority,\n expectedEvidenceCount: plan.expectedEvidenceIds?.length ?? 0,\n questionCount: plan.questions?.length ?? 0,\n }\n}\n\nfunction sanitizeControlStep<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n step: ControlStep<TState, TAction, TActionResult, TEval>,\n options: RuntimeTelemetryOptions,\n): Record<string, unknown> {\n const actionOutcome = step.actionOutcome\n return {\n index: step.index,\n decisionType: step.decision.type,\n reason: step.decision.reason,\n action: options.includeControlPayloads && step.decision.type === 'continue' ? step.decision.action : undefined,\n result: options.includeControlPayloads && actionOutcome?.ok ? actionOutcome.result : undefined,\n actionOk: actionOutcome?.ok,\n actionError: actionOutcome?.ok === false ? actionOutcome.error : undefined,\n durationMs: actionOutcome?.durationMs,\n evalsBefore: summarizeEvals(step.evalsBefore, options),\n evalsAfter: summarizeEvals(step.evalsAfter, options),\n startedAt: step.startedAt,\n endedAt: step.endedAt,\n }\n}\n\nfunction sanitizeControlRun<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n control: ControlRunResult<TState, TAction, TActionResult, TEval>,\n options: RuntimeTelemetryOptions,\n): Record<string, unknown> {\n return {\n pass: control.pass,\n completed: control.completed,\n reason: control.reason,\n score: control.score,\n stepCount: control.steps.length,\n wallMs: control.wallMs,\n spentCostUsd: control.spentCostUsd,\n failureClass: control.failureClass,\n stoppedBy: control.stoppedBy,\n runId: control.runId,\n runtimeErrorCount: control.runtimeErrors.length,\n finalEvals: summarizeEvals(control.finalEvals, options),\n }\n}\n\nfunction summarizeEvals(evals: ControlEvalResult[], options: RuntimeTelemetryOptions): Array<Record<string, unknown>> {\n return evals.map((evalResult) => ({\n id: evalResult.id,\n passed: evalResult.passed,\n score: evalResult.score,\n severity: evalResult.severity,\n objective: evalResult.objective,\n detail: options.includeEvalDetails ? evalResult.detail : undefined,\n evidence: options.includeEvalDetails ? evalResult.evidence : undefined,\n }))\n}\n\nfunction redactRecord(record: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.keys(record).map((key) => [key, '[redacted]']))\n}\n\nfunction stripNewlines(value: string): string {\n return value.replace(/[\\r\\n]/g, ' ')\n}\n\nfunction timestamp(): string {\n return new Date().toISOString()\n}\n\nfunction streamEvent<T extends Omit<RuntimeStreamEvent, 'timestamp'>>(event: T): T & { timestamp: string } {\n return { ...event, timestamp: timestamp() }\n}\n\nfunction newRuntimeSession(backend: string, requestedId?: string, metadata?: Record<string, unknown>): RuntimeSession {\n const now = timestamp()\n return {\n id: requestedId || crypto.randomUUID(),\n backend,\n status: 'active',\n createdAt: now,\n updatedAt: now,\n metadata,\n }\n}\n\nfunction touchSession(session: RuntimeSession): RuntimeSession {\n return { ...session, updatedAt: timestamp() }\n}\n\nasync function startBackendSession<TInput extends AgentBackendInput>(\n backend: AgentExecutionBackend<TInput>,\n input: TInput,\n context: Omit<AgentBackendContext, 'session'>,\n requestedSessionId?: string,\n): Promise<RuntimeSession> {\n if (backend.start) return backend.start(input, { ...context, requestedSessionId })\n return newRuntimeSession(backend.kind, requestedSessionId)\n}\n\nasync function resumeBackendSession<TInput extends AgentBackendInput>(\n backend: AgentExecutionBackend<TInput>,\n session: RuntimeSession,\n input: TInput,\n context: Omit<AgentBackendContext, 'session'>,\n): Promise<RuntimeSession> {\n if (session.backend !== backend.kind) {\n throw new Error(`Cannot resume ${session.backend} session with ${backend.kind} backend`)\n }\n if (backend.resume) return backend.resume(session, input, context)\n return touchSession({ ...session, status: 'active' })\n}\n\nfunction normalizeBackendStreamEvent(event: RuntimeStreamEvent, task: AgentTaskSpec, session: RuntimeSession): RuntimeStreamEvent {\n if ('task' in event && event.task && 'session' in event && event.session && 'timestamp' in event && event.timestamp) return event\n return {\n ...event,\n task: 'task' in event && event.task ? event.task : task,\n session: 'session' in event && event.session ? event.session : session,\n timestamp: 'timestamp' in event && event.timestamp ? event.timestamp : timestamp(),\n } as RuntimeStreamEvent\n}\n\nfunction pickPublicStreamFields(event: RuntimeStreamEvent): Record<string, unknown> {\n if (event.type === 'session_created' || event.type === 'session_resumed') return {}\n if (event.type === 'backend_start' || event.type === 'backend_end') return { backend: event.backend }\n if (event.type === 'backend_error') return { backend: event.backend, message: event.message, recoverable: event.recoverable }\n if (event.type === 'task_end') return { status: event.status, reason: event.reason }\n if (event.type === 'text_delta' || event.type === 'reasoning_delta') return { text: event.text }\n return {}\n}\n\nfunction mapCommonBackendEvent(event: unknown, context: AgentBackendContext): RuntimeStreamEvent | undefined {\n if (!event || typeof event !== 'object') return undefined\n const record = event as Record<string, unknown>\n const type = String(record.type ?? '')\n const data = record.data && typeof record.data === 'object' ? record.data as Record<string, unknown> : record\n if (type === 'message.part.updated' || type === 'text_delta' || type === 'delta') {\n const text = stringValue(data.text) ?? stringValue(data.delta) ?? stringValue(record.text)\n return text ? { type: 'text_delta', task: context.task, session: context.session, text, timestamp: timestamp() } : undefined\n }\n if (type === 'reasoning_delta') {\n const text = stringValue(data.text) ?? stringValue(record.text)\n return text ? { type: 'reasoning_delta', task: context.task, session: context.session, text, timestamp: timestamp() } : undefined\n }\n if (type === 'tool_call') {\n return {\n type: 'tool_call',\n task: context.task,\n session: context.session,\n toolName: stringValue(data.name) ?? stringValue(record.toolName) ?? 'tool',\n toolCallId: stringValue(data.id) ?? stringValue(record.toolCallId),\n args: data.args ?? data.input ?? record.args,\n timestamp: timestamp(),\n }\n }\n if (type === 'tool_result') {\n return {\n type: 'tool_result',\n task: context.task,\n session: context.session,\n toolName: stringValue(data.name) ?? stringValue(record.toolName) ?? 'tool',\n toolCallId: stringValue(data.id) ?? stringValue(record.toolCallId),\n result: data.result ?? data.output ?? record.result,\n timestamp: timestamp(),\n }\n }\n if (type === 'result' || type === 'final') {\n const text = stringValue(data.finalText) ?? stringValue(data.text) ?? stringValue(record.text)\n return text ? { type: 'text_delta', task: context.task, session: context.session, text, timestamp: timestamp() } : undefined\n }\n return undefined\n}\n\nasync function* streamResponseEvents(response: Response, context: AgentBackendContext): AsyncIterable<RuntimeStreamEvent> {\n const body = response.body\n if (!body) return\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, '\\n')\n for (const event of drainStreamBuffer(false)) yield event\n }\n buffer += decoder.decode().replace(/\\r\\n/g, '\\n')\n for (const event of drainStreamBuffer(true)) yield event\n if (buffer.trim()) {\n const event = parseStreamChunk(buffer, context)\n if (event) yield event\n }\n\n function* drainStreamBuffer(flush: boolean): Iterable<RuntimeStreamEvent> {\n for (;;) {\n const sseBoundary = buffer.indexOf('\\n\\n')\n if (sseBoundary >= 0) {\n const chunk = buffer.slice(0, sseBoundary)\n buffer = buffer.slice(sseBoundary + 2)\n const event = parseStreamChunk(chunk, context)\n if (event) yield event\n continue\n }\n\n const newline = buffer.indexOf('\\n')\n if (newline >= 0 && !buffer.slice(0, newline).startsWith('data:')) {\n const line = buffer.slice(0, newline)\n buffer = buffer.slice(newline + 1)\n const event = parseStreamChunk(line, context)\n if (event) yield event\n continue\n }\n\n if (flush && buffer.trim() && !buffer.trimStart().startsWith('data:')) {\n const line = buffer\n buffer = ''\n const event = parseStreamChunk(line, context)\n if (event) yield event\n continue\n }\n\n break\n }\n }\n}\n\nfunction parseStreamChunk(chunk: string, context: AgentBackendContext): RuntimeStreamEvent | undefined {\n const lines = chunk.split(/\\r?\\n/)\n const dataLines = lines.filter((line) => line.startsWith('data:'))\n const data = dataLines.length > 0\n ? dataLines.map((line) => line.slice(5).trimStart()).join('\\n')\n : chunk.trim()\n if (!data || data === '[DONE]') return undefined\n try {\n const parsed = JSON.parse(data) as Record<string, unknown>\n const choice = Array.isArray(parsed.choices) ? parsed.choices[0] as Record<string, unknown> | undefined : undefined\n const delta = choice?.delta as Record<string, unknown> | undefined\n const message = choice?.message as Record<string, unknown> | undefined\n const text = stringValue(delta?.content) ?? stringValue(message?.content) ?? stringValue(parsed.text)\n if (text) return { type: 'text_delta', task: context.task, session: context.session, text, timestamp: timestamp() }\n return mapCommonBackendEvent(parsed, context)\n } catch {\n return { type: 'text_delta', task: context.task, session: context.session, text: data, timestamp: timestamp() }\n }\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\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(control: ControlRunResult<unknown, unknown, unknown, ControlEvalResult>): 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: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>,\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\nexport type {\n ControlBudget,\n ControlDecision,\n ControlEvalResult,\n ControlRunResult,\n ControlStep,\n DataAcquisitionPlan,\n KnowledgeReadinessReport,\n KnowledgeRequirement,\n RunRecord,\n UserQuestion,\n} from '@tangle-network/agent-eval'\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n acquisitionPlansForKnowledgeGaps,\n blockingKnowledgeEval,\n runAgentControlLoop,\n scoreKnowledgeReadiness,\n userQuestionsForKnowledgeGaps,\n type ControlBudget,\n type ControlContext,\n type ControlDecision,\n type ControlEvalResult,\n type ControlRunResult,\n type ControlStep,\n type DataAcquisitionPlan,\n type KnowledgeReadinessReport,\n type KnowledgeRequirement,\n type RunRecord,\n type TraceStore,\n type UserQuestion,\n} from '@tangle-network/agent-eval'\n\nexport interface AgentTaskSpec {\n id: string\n intent: string\n /** Domain is metadata, not an architectural boundary: tax, legal, gtm, creative, blueprint, redteam, etc. */\n domain?: string\n inputs?: Record<string, unknown>\n requiredKnowledge?: KnowledgeRequirement[]\n budget?: Partial<ControlBudget>\n metadata?: Record<string, unknown>\n}\n\nexport interface AgentKnowledgeProvider {\n buildReadiness?(task: AgentTaskSpec): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport\n answerQuestions?(questions: UserQuestion[], task: AgentTaskSpec): Promise<Record<string, string>> | Record<string, string>\n executeAcquisitionPlans?(plans: DataAcquisitionPlan[], task: AgentTaskSpec): Promise<string[]> | string[]\n refreshReadiness?(input: {\n task: AgentTaskSpec\n previous: KnowledgeReadinessReport\n userAnswers: Record<string, string>\n acquiredEvidenceIds: string[]\n }): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport\n}\n\nexport interface AgentTaskContext<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n budget: ControlBudget\n stepIndex: number\n wallMs: number\n spentCostUsd: number\n remainingCostUsd?: number\n abortSignal: AbortSignal\n}\n\nexport interface AgentAdapter<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n observe(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }): Promise<TState> | TState\n\n validate(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n state: TState\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }): Promise<TEval[]> | TEval[]\n\n decide(ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<ControlDecision<TAction>> | ControlDecision<TAction>\n\n act(action: TAction, ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<TActionResult> | TActionResult\n\n shouldStop?(ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<{\n stop: boolean\n pass: boolean\n reason: string\n score?: number\n }> | {\n stop: boolean\n pass: boolean\n reason: string\n score?: number\n }\n\n onKnowledgeBlocked?(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n }): Promise<ControlDecision<TAction>> | ControlDecision<TAction>\n\n getActionCostUsd?(ctx: {\n action: TAction\n result: TActionResult\n task: AgentTaskSpec\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n }): number | undefined\n\n projectRunRecords?(result: ControlRunResult<TState, TAction, TActionResult, TEval>, task: AgentTaskSpec): RunRecord[]\n}\n\nexport type AgentTaskStatus =\n | 'completed'\n | 'blocked'\n | 'failed'\n | 'aborted'\n\nexport type AgentRuntimeEvent<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> =\n | { type: 'task_start'; task: AgentTaskSpec }\n | { type: 'readiness_start'; task: AgentTaskSpec }\n | { type: 'readiness_end'; task: AgentTaskSpec; knowledge: KnowledgeReadinessReport }\n | { type: 'questions_start'; task: AgentTaskSpec; questions: UserQuestion[] }\n | { type: 'questions_end'; task: AgentTaskSpec; questions: UserQuestion[]; userAnswers: Record<string, string> }\n | { type: 'acquisition_start'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[] }\n | { type: 'acquisition_end'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[]; acquiredEvidenceIds: string[] }\n | { type: 'control_start'; task: AgentTaskSpec; knowledge: KnowledgeReadinessReport }\n | { type: 'control_step'; task: AgentTaskSpec; step: ControlStep<TState, TAction, TActionResult, TEval> }\n | { type: 'control_end'; task: AgentTaskSpec; control: ControlRunResult<TState, TAction, TActionResult, TEval> }\n | { type: 'task_end'; task: AgentTaskSpec; status: AgentTaskStatus; reason: string }\n\nexport type AgentRuntimeEventSink<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> = (\n event: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>,\n) => Promise<void> | void\n\nexport type RuntimeStreamEvent =\n | { type: 'task_start'; task: AgentTaskSpec; timestamp: string }\n | { type: 'readiness_start'; task: AgentTaskSpec; timestamp: string }\n | { type: 'readiness_end'; task: AgentTaskSpec; knowledge: KnowledgeReadinessReport; decision: KnowledgeReadinessDecision; timestamp: string }\n | { type: 'questions_start'; task: AgentTaskSpec; questions: UserQuestion[]; timestamp: string }\n | { type: 'questions_end'; task: AgentTaskSpec; questions: UserQuestion[]; userAnswers: Record<string, string>; timestamp: string }\n | { type: 'acquisition_start'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[]; timestamp: string }\n | { type: 'acquisition_end'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[]; acquiredEvidenceIds: string[]; timestamp: string }\n | { type: 'session_created'; task: AgentTaskSpec; session: RuntimeSession; timestamp: string }\n | { type: 'session_resumed'; task: AgentTaskSpec; session: RuntimeSession; timestamp: string }\n | { type: 'backend_start'; task: AgentTaskSpec; session: RuntimeSession; backend: string; timestamp: string }\n | { type: 'text_delta'; task?: AgentTaskSpec; session?: RuntimeSession; text: string; timestamp?: string }\n | { type: 'reasoning_delta'; task?: AgentTaskSpec; session?: RuntimeSession; text: string; timestamp?: string }\n | { type: 'tool_call'; task?: AgentTaskSpec; session?: RuntimeSession; toolName: string; toolCallId?: string; args?: unknown; timestamp?: string }\n | { type: 'tool_result'; task?: AgentTaskSpec; session?: RuntimeSession; toolName: string; toolCallId?: string; result?: unknown; timestamp?: string }\n | { type: 'artifact'; task?: AgentTaskSpec; session?: RuntimeSession; artifactId: string; name?: string; mimeType?: string; uri?: string; metadata?: Record<string, unknown>; timestamp?: string }\n | { type: 'backend_error'; task: AgentTaskSpec; session?: RuntimeSession; backend: string; message: string; recoverable: boolean; timestamp: string }\n | { type: 'backend_end'; task: AgentTaskSpec; session: RuntimeSession; backend: string; timestamp: string }\n | { type: 'task_end'; task: AgentTaskSpec; status: AgentTaskStatus; reason: string; timestamp: string }\n | { type: 'final'; task: AgentTaskSpec; session?: RuntimeSession; status: AgentTaskStatus; reason: string; text?: string; metadata?: Record<string, unknown>; timestamp: string }\n\nexport interface RuntimeSession {\n id: string\n backend: string\n status: 'active' | 'completed' | 'failed' | 'aborted'\n resumeToken?: string\n createdAt: string\n updatedAt: string\n metadata?: Record<string, unknown>\n}\n\nexport interface RuntimeSessionStore {\n get(sessionId: string): Promise<RuntimeSession | undefined> | RuntimeSession | undefined\n put(session: RuntimeSession): Promise<void> | void\n appendEvent?(sessionId: string, event: RuntimeStreamEvent): Promise<void> | void\n listEvents?(sessionId: string): Promise<RuntimeStreamEvent[]> | RuntimeStreamEvent[]\n}\n\nexport interface AgentBackendInput {\n task: AgentTaskSpec\n message?: string\n messages?: Array<{ role: string; content: string }>\n inputs?: Record<string, unknown>\n}\n\nexport interface AgentBackendContext {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n session: RuntimeSession\n signal?: AbortSignal\n}\n\nexport interface AgentExecutionBackend<TInput extends AgentBackendInput = AgentBackendInput> {\n kind: string\n start?(input: TInput, context: Omit<AgentBackendContext, 'session'> & { requestedSessionId?: string }): Promise<RuntimeSession> | RuntimeSession\n resume?(session: RuntimeSession, input: TInput, context: Omit<AgentBackendContext, 'session'>): Promise<RuntimeSession> | RuntimeSession\n stream(input: TInput, context: AgentBackendContext): AsyncIterable<RuntimeStreamEvent>\n stop?(session: RuntimeSession, reason: string): Promise<void> | void\n}\n\nexport interface RunAgentTaskStreamOptions<TInput extends AgentBackendInput = AgentBackendInput> {\n task: AgentTaskSpec\n backend: AgentExecutionBackend<TInput>\n input?: Omit<TInput, 'task'>\n knowledge?: AgentKnowledgeProvider\n sessionStore?: RuntimeSessionStore\n sessionId?: string\n resume?: boolean\n signal?: AbortSignal\n minimumReadinessScore?: number\n}\n\nexport interface RunAgentTaskOptions<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n adapter: AgentAdapter<TState, TAction, TActionResult, TEval>\n knowledge?: AgentKnowledgeProvider\n onEvent?: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>\n store?: TraceStore\n signal?: AbortSignal\n scenarioId?: string\n projectId?: string\n variantId?: string\n minimumReadinessScore?: number\n}\n\nexport interface AgentTaskRunResult<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n status: AgentTaskStatus\n knowledge: KnowledgeReadinessReport\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n userAnswers: Record<string, string>\n acquiredEvidenceIds: string[]\n control: ControlRunResult<TState, TAction, TActionResult, TEval>\n runRecords: RunRecord[]\n}\n\nexport interface RuntimeTelemetryOptions {\n /**\n * Include raw task inputs. Off by default because task inputs often\n * contain customer facts, credentials, source text, or internal IDs.\n */\n includeInputs?: boolean\n /** Include requirement descriptions. Secret requirements are always redacted. */\n includeRequirementDescriptions?: boolean\n /** Include evidence IDs. Off by default; counts are safer for shared reports. */\n includeEvidenceIds?: boolean\n /** Include user answers from question preflight. Off by default. */\n includeUserAnswers?: boolean\n /** Include action payloads and action results for control steps. Off by default. */\n includeControlPayloads?: boolean\n /** Include task metadata. Off by default because metadata may carry IDs or policy internals. */\n includeMetadata?: boolean\n /** Include eval detail/evidence strings. Off by default because validators may echo private input. */\n includeEvalDetails?: boolean\n}\n\nexport interface SanitizedKnowledgeRequirement {\n id: string\n description?: string\n requiredFor: string[]\n category: KnowledgeRequirement['category']\n acquisitionMode: KnowledgeRequirement['acquisitionMode']\n importance: KnowledgeRequirement['importance']\n freshness: KnowledgeRequirement['freshness']\n sensitivity: KnowledgeRequirement['sensitivity']\n confidenceNeeded: number\n currentConfidence: number\n evidenceCount: number\n evidenceIds?: string[]\n fallbackPolicy: KnowledgeRequirement['fallbackPolicy']\n}\n\nexport interface SanitizedKnowledgeReadinessReport {\n taskId: string\n readinessScore: number\n recommendedAction: KnowledgeReadinessReport['recommendedAction']\n severity: KnowledgeReadinessReport['severity']\n reason: string\n blockingMissingRequirements: SanitizedKnowledgeRequirement[]\n nonBlockingGaps: SanitizedKnowledgeRequirement[]\n evidenceCount: number\n evidenceIds?: string[]\n missingRequirementIds: string[]\n}\n\nexport interface AgentTaskRunSummary {\n taskId: string\n domain?: string\n status: AgentTaskStatus\n reason: string\n readinessStatus: KnowledgeReadinessDecision['status']\n readinessScore: number\n recommendedAction: KnowledgeReadinessReport['recommendedAction']\n blockingGapIds: string[]\n nonBlockingGapIds: string[]\n questionCount: number\n acquisitionPlanCount: number\n acquiredEvidenceCount: number\n controlStepCount: number\n pass: boolean\n failureClass?: string\n wallMs: number\n costUsd: number\n}\n\nexport interface KnowledgeReadinessDecision {\n passed: boolean\n status: 'ready' | 'blocked' | 'caveat'\n reason: string\n readinessScore: number\n recommendedAction: KnowledgeReadinessReport['recommendedAction']\n severity: KnowledgeReadinessReport['severity']\n blockingGapIds: string[]\n nonBlockingGapIds: string[]\n}\n\nexport interface RuntimeEventCollector<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> {\n onEvent: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>\n events: Array<Record<string, unknown>>\n}\n\nexport interface ServerSentEventOptions {\n event?: string\n id?: string\n retry?: number\n}\n\nexport class InMemoryRuntimeSessionStore implements RuntimeSessionStore {\n private readonly sessions = new Map<string, RuntimeSession>()\n private readonly events = new Map<string, RuntimeStreamEvent[]>()\n\n get(sessionId: string): RuntimeSession | undefined {\n return this.sessions.get(sessionId)\n }\n\n put(session: RuntimeSession): void {\n this.sessions.set(session.id, session)\n }\n\n appendEvent(sessionId: string, event: RuntimeStreamEvent): void {\n const existing = this.events.get(sessionId) ?? []\n existing.push(event)\n this.events.set(sessionId, existing)\n }\n\n listEvents(sessionId: string): RuntimeStreamEvent[] {\n return [...(this.events.get(sessionId) ?? [])]\n }\n}\n\nexport async function runAgentTask<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult>(\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(task, questions, acquisitionPlans, options.knowledge, options.onEvent)\n if (options.knowledge?.refreshReadiness && (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)) {\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 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: options.scenarioId ?? task.id,\n projectId: options.projectId,\n variantId: options.variantId,\n observe: ({ history, abortSignal }) => options.adapter.observe({ task, knowledge, history, abortSignal }),\n validate: async ({ state, history, abortSignal }) => {\n const readinessEval = blockingKnowledgeEval(knowledge, { minimumScore: options.minimumReadinessScore })\n const evals = await options.adapter.validate({ task, knowledge, state, history, abortSignal })\n return [readinessEval as TEval, ...evals]\n },\n decide: (ctx) => {\n if (isKnowledgeBlocked(ctx.evals)) {\n return options.adapter.onKnowledgeBlocked?.({ task, knowledge, questions, acquisitionPlans }) ?? {\n type: 'stop',\n pass: false,\n score: knowledge.readinessScore,\n reason: `knowledge readiness blocked: ${knowledge.reason}`,\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 }) => 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: options.adapter.projectRunRecords?.(control, task) ?? [],\n }\n}\n\nexport function summarizeAgentTaskRun<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n result: AgentTaskRunResult<TState, TAction, TActionResult, TEval>,\n): AgentTaskRunSummary {\n return {\n taskId: result.task.id,\n domain: result.task.domain,\n status: result.status,\n reason: result.control.reason,\n readinessStatus: decideKnowledgeReadiness(result.knowledge).status,\n readinessScore: result.knowledge.readinessScore,\n recommendedAction: result.knowledge.recommendedAction,\n blockingGapIds: result.knowledge.blockingMissingRequirements.map((requirement) => requirement.id),\n nonBlockingGapIds: result.knowledge.nonBlockingGaps.map((requirement) => requirement.id),\n questionCount: result.questions.length,\n acquisitionPlanCount: result.acquisitionPlans.length,\n acquiredEvidenceCount: result.acquiredEvidenceIds.length,\n controlStepCount: result.control.steps.length,\n pass: result.control.pass,\n failureClass: result.control.failureClass,\n wallMs: result.control.wallMs,\n costUsd: result.control.spentCostUsd,\n }\n}\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 const started = streamEvent({ type: 'task_start', task })\n yield started\n\n const readinessStart = streamEvent({ type: 'readiness_start', task })\n yield readinessStart\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(task, questions, acquisitionPlans, options.knowledge)\n for (const event of preflight.events) yield event\n if (options.knowledge?.refreshReadiness && (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)) {\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, { minimumScore: options.minimumReadinessScore })\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 existing = options.sessionId ? await store?.get(options.sessionId) : undefined\n const shouldResume = Boolean(options.resume && existing)\n let session = shouldResume && existing\n ? await resumeBackendSession(options.backend, existing, input, { task, knowledge, signal: options.signal })\n : await startBackendSession(options.backend, input, { task, knowledge, signal: options.signal }, options.sessionId)\n await store?.put(session)\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({ type: 'backend_start', task, session, backend: options.backend.kind })\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(input, { task, knowledge, session, signal: options.signal })) {\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({ type: 'backend_end', task, session, backend: options.backend.kind })\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({ type: 'final', task, session, status: completedStatus, reason, text: finalText || undefined })\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 backendError = streamEvent({\n type: 'backend_error',\n task,\n session,\n backend: options.backend.kind,\n message: stopErrorMessage ? `${message}; backend stop failed: ${stopErrorMessage}` : message,\n recoverable: !options.signal?.aborted,\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({ type: 'final', task, session, status, reason: message, text: finalText || undefined })\n await store?.appendEvent?.(session.id, final)\n yield final\n }\n}\n\nexport function decideKnowledgeReadiness(\n report: KnowledgeReadinessReport,\n options: { minimumScore?: number } = {},\n): KnowledgeReadinessDecision {\n const minimumScore = options.minimumScore ?? 0.7\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\nexport function sanitizeKnowledgeReadinessReport(\n report: KnowledgeReadinessReport,\n options: RuntimeTelemetryOptions = {},\n): SanitizedKnowledgeReadinessReport {\n return {\n taskId: report.taskId,\n readinessScore: report.readinessScore,\n recommendedAction: report.recommendedAction,\n severity: report.severity,\n reason: report.reason,\n blockingMissingRequirements: report.blockingMissingRequirements.map((requirement) =>\n sanitizeKnowledgeRequirement(requirement, options),\n ),\n nonBlockingGaps: report.nonBlockingGaps.map((requirement) =>\n sanitizeKnowledgeRequirement(requirement, options),\n ),\n evidenceCount: report.bundle.evidenceIds.length,\n evidenceIds: options.includeEvidenceIds ? report.bundle.evidenceIds : undefined,\n missingRequirementIds: report.bundle.missing.map((requirement) => requirement.id),\n }\n}\n\nexport function sanitizeAgentRuntimeEvent<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n event: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>,\n options: RuntimeTelemetryOptions = {},\n): Record<string, unknown> {\n const base = { type: event.type, task: sanitizeTask(event.task, options) }\n if (event.type === 'readiness_start' || event.type === 'task_start' || event.type === 'control_start') {\n return event.type === 'control_start'\n ? { ...base, knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options) }\n : base\n }\n if (event.type === 'readiness_end') {\n return { ...base, knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options) }\n }\n if (event.type === 'questions_start') {\n return { ...base, questions: event.questions.map((question) => sanitizeQuestion(question, options)) }\n }\n if (event.type === 'questions_end') {\n return {\n ...base,\n questions: event.questions.map((question) => sanitizeQuestion(question, options)),\n userAnswers: options.includeUserAnswers ? event.userAnswers : redactRecord(event.userAnswers),\n }\n }\n if (event.type === 'acquisition_start') {\n return { ...base, acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan) }\n }\n if (event.type === 'acquisition_end') {\n return {\n ...base,\n acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan),\n acquiredEvidenceCount: event.acquiredEvidenceIds.length,\n acquiredEvidenceIds: options.includeEvidenceIds ? event.acquiredEvidenceIds : undefined,\n }\n }\n if (event.type === 'control_step') {\n return { ...base, step: sanitizeControlStep(event.step, options) }\n }\n if (event.type === 'control_end') {\n return { ...base, control: sanitizeControlRun(event.control, options) }\n }\n return { ...base, status: event.status, reason: event.reason }\n}\n\nexport function sanitizeRuntimeStreamEvent(\n event: RuntimeStreamEvent,\n options: RuntimeTelemetryOptions = {},\n): Record<string, unknown> {\n const withTask = 'task' in event && event.task\n ? { task: sanitizeTask(event.task, options) }\n : {}\n const withSession = 'session' in event && event.session\n ? { session: sanitizeRuntimeSession(event.session, options) }\n : {}\n\n if (event.type === 'readiness_end') {\n return {\n type: event.type,\n ...withTask,\n timestamp: event.timestamp,\n decision: event.decision,\n knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options),\n }\n }\n if (event.type === 'questions_start') {\n return { type: event.type, ...withTask, timestamp: event.timestamp, questions: event.questions.map((question) => sanitizeQuestion(question, options)) }\n }\n if (event.type === 'questions_end') {\n return {\n type: event.type,\n ...withTask,\n timestamp: event.timestamp,\n questions: event.questions.map((question) => sanitizeQuestion(question, options)),\n userAnswers: options.includeUserAnswers ? event.userAnswers : redactRecord(event.userAnswers),\n }\n }\n if (event.type === 'acquisition_start') {\n return { type: event.type, ...withTask, timestamp: event.timestamp, acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan) }\n }\n if (event.type === 'acquisition_end') {\n return {\n type: event.type,\n ...withTask,\n timestamp: event.timestamp,\n acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan),\n acquiredEvidenceCount: event.acquiredEvidenceIds.length,\n acquiredEvidenceIds: options.includeEvidenceIds ? event.acquiredEvidenceIds : undefined,\n }\n }\n if (event.type === 'tool_call') {\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: event.timestamp,\n toolName: event.toolName,\n toolCallId: event.toolCallId,\n args: options.includeControlPayloads ? event.args : undefined,\n }\n }\n if (event.type === 'tool_result') {\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: event.timestamp,\n toolName: event.toolName,\n toolCallId: event.toolCallId,\n result: options.includeControlPayloads ? event.result : undefined,\n }\n }\n if (event.type === 'artifact') {\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: event.timestamp,\n artifactId: event.artifactId,\n name: event.name,\n mimeType: event.mimeType,\n uri: options.includeEvidenceIds ? event.uri : undefined,\n metadata: options.includeMetadata ? event.metadata : undefined,\n }\n }\n if (event.type === 'final') {\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: event.timestamp,\n status: event.status,\n reason: event.reason,\n text: options.includeControlPayloads ? event.text : undefined,\n metadata: options.includeMetadata ? event.metadata : undefined,\n }\n }\n return {\n type: event.type,\n ...withTask,\n ...withSession,\n timestamp: 'timestamp' in event ? event.timestamp : undefined,\n ...pickPublicStreamFields(event),\n }\n}\n\nexport function createRuntimeEventCollector<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult>(\n options: RuntimeTelemetryOptions = {},\n): RuntimeEventCollector<TState, TAction, TActionResult, TEval> {\n const events: Array<Record<string, unknown>> = []\n return {\n events,\n onEvent: (event) => {\n events.push(sanitizeAgentRuntimeEvent(event, options))\n },\n }\n}\n\nexport function encodeServerSentEvent(\n data: unknown,\n options: ServerSentEventOptions = {},\n): 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\nexport function readinessServerSentEvent(\n report: KnowledgeReadinessReport,\n options: RuntimeTelemetryOptions & ServerSentEventOptions = {},\n): string {\n const { event, id, retry, ...telemetryOptions } = options\n return encodeServerSentEvent({\n type: 'readiness',\n readiness: sanitizeKnowledgeReadinessReport(report, telemetryOptions),\n }, { event, id, retry })\n}\n\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), { event: sseEvent, id, retry })\n}\n\nexport function createIterableBackend<TInput extends AgentBackendInput>(\n options: {\n kind: string\n start?: AgentExecutionBackend<TInput>['start']\n resume?: AgentExecutionBackend<TInput>['resume']\n stream: AgentExecutionBackend<TInput>['stream']\n stop?: AgentExecutionBackend<TInput>['stop']\n },\n): AgentExecutionBackend<TInput> {\n return options\n}\n\nexport function createSandboxPromptBackend<TBox, TInput extends AgentBackendInput = AgentBackendInput>(\n options: {\n kind?: string\n getBox(input: TInput, context: Omit<AgentBackendContext, 'session'>): Promise<TBox> | TBox\n streamPrompt(box: TBox, message: string, context: AgentBackendContext): AsyncIterable<unknown>\n mapEvent?: (event: unknown, context: AgentBackendContext) => RuntimeStreamEvent | undefined\n getSessionId?: (box: TBox, input: TInput) => string | undefined\n },\n): AgentExecutionBackend<TInput> {\n return {\n kind: options.kind ?? 'sandbox',\n async start(input, context) {\n const box = await options.getBox(input, context)\n return newRuntimeSession(options.kind ?? 'sandbox', options.getSessionId?.(box, input) ?? context.requestedSessionId, {\n resumable: true,\n })\n },\n resume(session) {\n return touchSession({ ...session, status: 'active' })\n },\n async *stream(input, context) {\n const box = await options.getBox(input, context)\n const message = input.message ?? input.messages?.at(-1)?.content ?? context.task.intent\n for await (const event of options.streamPrompt(box, message, context)) {\n const mapped = options.mapEvent?.(event, context) ?? mapCommonBackendEvent(event, context)\n if (mapped) yield mapped\n }\n },\n }\n}\n\nexport function createCliBridgeBackend<TInput extends AgentBackendInput = AgentBackendInput>(\n options: {\n url: string\n bearer?: string\n kind?: string\n fetchImpl?: typeof fetch\n },\n): AgentExecutionBackend<TInput> {\n const fetcher = options.fetchImpl ?? fetch\n return {\n kind: options.kind ?? 'cli-bridge',\n start(_input, context) {\n return newRuntimeSession(options.kind ?? 'cli-bridge', context.requestedSessionId, { resumable: true })\n },\n resume(session) {\n return touchSession({ ...session, status: 'active' })\n },\n async *stream(input, context) {\n const response = await fetcher(options.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(options.bearer ? { Authorization: `Bearer ${options.bearer}` } : {}),\n },\n body: JSON.stringify({\n sessionId: context.session.id,\n resumeToken: context.session.resumeToken,\n task: input.task,\n message: input.message,\n messages: input.messages,\n inputs: input.inputs,\n }),\n signal: context.signal,\n })\n if (!response.ok) throw new Error(`cli bridge returned ${response.status}`)\n yield* streamResponseEvents(response, context)\n },\n }\n}\n\nexport function createOpenAICompatibleBackend<TInput extends AgentBackendInput = AgentBackendInput>(\n options: {\n apiKey: string\n baseUrl: string\n model: string\n kind?: string\n fetchImpl?: typeof fetch\n },\n): AgentExecutionBackend<TInput> {\n const fetcher = options.fetchImpl ?? fetch\n return {\n kind: options.kind ?? 'tcloud',\n start(_input, context) {\n return newRuntimeSession(options.kind ?? 'tcloud', context.requestedSessionId)\n },\n async *stream(input, context) {\n const response = await fetcher(`${options.baseUrl.replace(/\\/$/, '')}/chat/completions`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: options.model,\n stream: true,\n messages: input.messages ?? [{ role: 'user', content: input.message ?? context.task.intent }],\n }),\n signal: context.signal,\n })\n if (!response.ok) throw new Error(`chat backend returned ${response.status}`)\n yield* streamResponseEvents(response, context)\n },\n }\n}\n\nasync function runKnowledgePreflight<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\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, { type: 'acquisition_end', task, acquisitionPlans, acquiredEvidenceIds })\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(streamEvent({ type: 'acquisition_end', task, acquisitionPlans, acquiredEvidenceIds }))\n }\n return { userAnswers, acquiredEvidenceIds, events }\n}\n\nfunction sanitizeTask(task: AgentTaskSpec, options: RuntimeTelemetryOptions): Record<string, unknown> {\n return {\n id: task.id,\n intent: task.intent,\n domain: task.domain,\n inputs: options.includeInputs ? task.inputs : task.inputs ? '[redacted]' : undefined,\n requiredKnowledge: task.requiredKnowledge?.map((requirement) =>\n sanitizeKnowledgeRequirement(requirement, options),\n ),\n metadata: options.includeMetadata ? task.metadata : task.metadata ? '[redacted]' : undefined,\n }\n}\n\nfunction sanitizeRuntimeSession(session: RuntimeSession, options: RuntimeTelemetryOptions): Record<string, unknown> {\n return {\n id: session.id,\n backend: session.backend,\n status: session.status,\n hasResumeToken: Boolean(session.resumeToken),\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n metadata: options.includeMetadata ? session.metadata : session.metadata ? '[redacted]' : undefined,\n }\n}\n\nfunction sanitizeKnowledgeRequirement(\n requirement: KnowledgeRequirement,\n options: RuntimeTelemetryOptions,\n): SanitizedKnowledgeRequirement {\n const includeDescription = options.includeRequirementDescriptions && requirement.sensitivity !== 'secret'\n return {\n id: requirement.id,\n description: includeDescription ? requirement.description : undefined,\n requiredFor: requirement.requiredFor,\n category: requirement.category,\n acquisitionMode: requirement.acquisitionMode,\n importance: requirement.importance,\n freshness: requirement.freshness,\n sensitivity: requirement.sensitivity,\n confidenceNeeded: requirement.confidenceNeeded,\n currentConfidence: requirement.currentConfidence,\n evidenceCount: requirement.evidenceIds.length,\n evidenceIds: options.includeEvidenceIds ? requirement.evidenceIds : undefined,\n fallbackPolicy: requirement.fallbackPolicy,\n }\n}\n\nfunction sanitizeQuestion(question: UserQuestion, options: RuntimeTelemetryOptions): Record<string, unknown> {\n return {\n id: question.id,\n question: options.includeRequirementDescriptions && question.answerType !== 'credential'\n ? question.question\n : undefined,\n reason: options.includeRequirementDescriptions ? question.reason : undefined,\n requirementId: question.requirementId,\n importance: question.importance,\n answerType: question.answerType,\n impactIfUnknown: options.includeRequirementDescriptions ? question.impactIfUnknown : undefined,\n optionCount: question.options?.length ?? 0,\n }\n}\n\nfunction sanitizeAcquisitionPlan(plan: DataAcquisitionPlan): Record<string, unknown> {\n return {\n id: plan.id,\n requirementIds: plan.requirementIds,\n mode: plan.mode,\n priority: plan.priority,\n expectedEvidenceCount: plan.expectedEvidenceIds?.length ?? 0,\n questionCount: plan.questions?.length ?? 0,\n }\n}\n\nfunction sanitizeControlStep<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n step: ControlStep<TState, TAction, TActionResult, TEval>,\n options: RuntimeTelemetryOptions,\n): Record<string, unknown> {\n const actionOutcome = step.actionOutcome\n return {\n index: step.index,\n decisionType: step.decision.type,\n reason: step.decision.reason,\n action: options.includeControlPayloads && step.decision.type === 'continue' ? step.decision.action : undefined,\n result: options.includeControlPayloads && actionOutcome?.ok ? actionOutcome.result : undefined,\n actionOk: actionOutcome?.ok,\n actionError: actionOutcome?.ok === false ? actionOutcome.error : undefined,\n durationMs: actionOutcome?.durationMs,\n evalsBefore: summarizeEvals(step.evalsBefore, options),\n evalsAfter: summarizeEvals(step.evalsAfter, options),\n startedAt: step.startedAt,\n endedAt: step.endedAt,\n }\n}\n\nfunction sanitizeControlRun<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n control: ControlRunResult<TState, TAction, TActionResult, TEval>,\n options: RuntimeTelemetryOptions,\n): Record<string, unknown> {\n return {\n pass: control.pass,\n completed: control.completed,\n reason: control.reason,\n score: control.score,\n stepCount: control.steps.length,\n wallMs: control.wallMs,\n spentCostUsd: control.spentCostUsd,\n failureClass: control.failureClass,\n stoppedBy: control.stoppedBy,\n runId: control.runId,\n runtimeErrorCount: control.runtimeErrors.length,\n finalEvals: summarizeEvals(control.finalEvals, options),\n }\n}\n\nfunction summarizeEvals(evals: ControlEvalResult[], options: RuntimeTelemetryOptions): Array<Record<string, unknown>> {\n return evals.map((evalResult) => ({\n id: evalResult.id,\n passed: evalResult.passed,\n score: evalResult.score,\n severity: evalResult.severity,\n objective: evalResult.objective,\n detail: options.includeEvalDetails ? evalResult.detail : undefined,\n evidence: options.includeEvalDetails ? evalResult.evidence : undefined,\n }))\n}\n\nfunction redactRecord(record: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.keys(record).map((key) => [key, '[redacted]']))\n}\n\nfunction stripNewlines(value: string): string {\n return value.replace(/[\\r\\n]/g, ' ')\n}\n\nfunction timestamp(): string {\n return new Date().toISOString()\n}\n\nfunction streamEvent<T extends Omit<RuntimeStreamEvent, 'timestamp'>>(event: T): T & { timestamp: string } {\n return { ...event, timestamp: timestamp() }\n}\n\nfunction newRuntimeSession(backend: string, requestedId?: string, metadata?: Record<string, unknown>): RuntimeSession {\n const now = timestamp()\n return {\n id: requestedId || crypto.randomUUID(),\n backend,\n status: 'active',\n createdAt: now,\n updatedAt: now,\n metadata,\n }\n}\n\nfunction touchSession(session: RuntimeSession): RuntimeSession {\n return { ...session, updatedAt: timestamp() }\n}\n\nasync function startBackendSession<TInput extends AgentBackendInput>(\n backend: AgentExecutionBackend<TInput>,\n input: TInput,\n context: Omit<AgentBackendContext, 'session'>,\n requestedSessionId?: string,\n): Promise<RuntimeSession> {\n if (backend.start) return backend.start(input, { ...context, requestedSessionId })\n return newRuntimeSession(backend.kind, requestedSessionId)\n}\n\nasync function resumeBackendSession<TInput extends AgentBackendInput>(\n backend: AgentExecutionBackend<TInput>,\n session: RuntimeSession,\n input: TInput,\n context: Omit<AgentBackendContext, 'session'>,\n): Promise<RuntimeSession> {\n if (session.backend !== backend.kind) {\n throw new Error(`Cannot resume ${session.backend} session with ${backend.kind} backend`)\n }\n if (backend.resume) return backend.resume(session, input, context)\n return touchSession({ ...session, status: 'active' })\n}\n\nfunction normalizeBackendStreamEvent(event: RuntimeStreamEvent, task: AgentTaskSpec, session: RuntimeSession): RuntimeStreamEvent {\n if ('task' in event && event.task && 'session' in event && event.session && 'timestamp' in event && event.timestamp) return event\n return {\n ...event,\n task: 'task' in event && event.task ? event.task : task,\n session: 'session' in event && event.session ? event.session : session,\n timestamp: 'timestamp' in event && event.timestamp ? event.timestamp : timestamp(),\n } as RuntimeStreamEvent\n}\n\nfunction pickPublicStreamFields(event: RuntimeStreamEvent): Record<string, unknown> {\n if (event.type === 'session_created' || event.type === 'session_resumed') return {}\n if (event.type === 'backend_start' || event.type === 'backend_end') return { backend: event.backend }\n if (event.type === 'backend_error') return { backend: event.backend, message: event.message, recoverable: event.recoverable }\n if (event.type === 'task_end') return { status: event.status, reason: event.reason }\n if (event.type === 'text_delta' || event.type === 'reasoning_delta') return { text: event.text }\n return {}\n}\n\nfunction mapCommonBackendEvent(event: unknown, context: AgentBackendContext): RuntimeStreamEvent | undefined {\n if (!event || typeof event !== 'object') return undefined\n const record = event as Record<string, unknown>\n const type = String(record.type ?? '')\n const data = record.data && typeof record.data === 'object' ? record.data as Record<string, unknown> : record\n if (type === 'message.part.updated' || type === 'text_delta' || type === 'delta') {\n const text = stringValue(data.text) ?? stringValue(data.delta) ?? stringValue(record.text)\n return text ? { type: 'text_delta', task: context.task, session: context.session, text, timestamp: timestamp() } : undefined\n }\n if (type === 'reasoning_delta') {\n const text = stringValue(data.text) ?? stringValue(record.text)\n return text ? { type: 'reasoning_delta', task: context.task, session: context.session, text, timestamp: timestamp() } : undefined\n }\n if (type === 'tool_call') {\n return {\n type: 'tool_call',\n task: context.task,\n session: context.session,\n toolName: stringValue(data.name) ?? stringValue(record.toolName) ?? 'tool',\n toolCallId: stringValue(data.id) ?? stringValue(record.toolCallId),\n args: data.args ?? data.input ?? record.args,\n timestamp: timestamp(),\n }\n }\n if (type === 'tool_result') {\n return {\n type: 'tool_result',\n task: context.task,\n session: context.session,\n toolName: stringValue(data.name) ?? stringValue(record.toolName) ?? 'tool',\n toolCallId: stringValue(data.id) ?? stringValue(record.toolCallId),\n result: data.result ?? data.output ?? record.result,\n timestamp: timestamp(),\n }\n }\n if (type === 'result' || type === 'final') {\n const text = stringValue(data.finalText) ?? stringValue(data.text) ?? stringValue(record.text)\n return text ? { type: 'text_delta', task: context.task, session: context.session, text, timestamp: timestamp() } : undefined\n }\n return undefined\n}\n\nasync function* streamResponseEvents(response: Response, context: AgentBackendContext): AsyncIterable<RuntimeStreamEvent> {\n const body = response.body\n if (!body) return\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, '\\n')\n for (const event of drainStreamBuffer(false)) yield event\n }\n buffer += decoder.decode().replace(/\\r\\n/g, '\\n')\n for (const event of drainStreamBuffer(true)) yield event\n if (buffer.trim()) {\n const event = parseStreamChunk(buffer, context)\n if (event) yield event\n }\n\n function* drainStreamBuffer(flush: boolean): Iterable<RuntimeStreamEvent> {\n for (;;) {\n const sseBoundary = buffer.indexOf('\\n\\n')\n if (sseBoundary >= 0) {\n const chunk = buffer.slice(0, sseBoundary)\n buffer = buffer.slice(sseBoundary + 2)\n const event = parseStreamChunk(chunk, context)\n if (event) yield event\n continue\n }\n\n const newline = buffer.indexOf('\\n')\n if (newline >= 0 && !buffer.slice(0, newline).startsWith('data:')) {\n const line = buffer.slice(0, newline)\n buffer = buffer.slice(newline + 1)\n const event = parseStreamChunk(line, context)\n if (event) yield event\n continue\n }\n\n if (flush && buffer.trim() && !buffer.trimStart().startsWith('data:')) {\n const line = buffer\n buffer = ''\n const event = parseStreamChunk(line, context)\n if (event) yield event\n continue\n }\n\n break\n }\n }\n}\n\nfunction parseStreamChunk(chunk: string, context: AgentBackendContext): RuntimeStreamEvent | undefined {\n const lines = chunk.split(/\\r?\\n/)\n const dataLines = lines.filter((line) => line.startsWith('data:'))\n const data = dataLines.length > 0\n ? dataLines.map((line) => line.slice(5).trimStart()).join('\\n')\n : chunk.trim()\n if (!data || data === '[DONE]') return undefined\n try {\n const parsed = JSON.parse(data) as Record<string, unknown>\n const choice = Array.isArray(parsed.choices) ? parsed.choices[0] as Record<string, unknown> | undefined : undefined\n const delta = choice?.delta as Record<string, unknown> | undefined\n const message = choice?.message as Record<string, unknown> | undefined\n const text = stringValue(delta?.content) ?? stringValue(message?.content) ?? stringValue(parsed.text)\n if (text) return { type: 'text_delta', task: context.task, session: context.session, text, timestamp: timestamp() }\n return mapCommonBackendEvent(parsed, context)\n } catch {\n return { type: 'text_delta', task: context.task, session: context.session, text: data, timestamp: timestamp() }\n }\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\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(control: ControlRunResult<unknown, unknown, unknown, ControlEvalResult>): 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: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>,\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\nexport type {\n ControlBudget,\n ControlDecision,\n ControlEvalResult,\n ControlRunResult,\n ControlStep,\n DataAcquisitionPlan,\n KnowledgeReadinessReport,\n KnowledgeRequirement,\n RunRecord,\n UserQuestion,\n} from '@tangle-network/agent-eval'\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAaK;AA6SA,IAAM,8BAAN,MAAiE;AAAA,EACrD,WAAW,oBAAI,IAA4B;AAAA,EAC3C,SAAS,oBAAI,IAAkC;AAAA,EAEhE,IAAI,WAA+C;AACjD,WAAO,KAAK,SAAS,IAAI,SAAS;AAAA,EACpC;AAAA,EAEA,IAAI,SAA+B;AACjC,SAAK,SAAS,IAAI,QAAQ,IAAI,OAAO;AAAA,EACvC;AAAA,EAEA,YAAY,WAAmB,OAAiC;AAC9D,UAAM,WAAW,KAAK,OAAO,IAAI,SAAS,KAAK,CAAC;AAChD,aAAS,KAAK,KAAK;AACnB,SAAK,OAAO,IAAI,WAAW,QAAQ;AAAA,EACrC;AAAA,EAEA,WAAW,WAAyC;AAClD,WAAO,CAAC,GAAI,KAAK,OAAO,IAAI,SAAS,KAAK,CAAC,CAAE;AAAA,EAC/C;AACF;AAEA,eAAsB,aACpB,SACoE;AACpE,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,QAAQ,SAAS,EAAE,MAAM,cAAc,KAAK,CAAC;AACxD,QAAM,KAAK,QAAQ,SAAS,EAAE,MAAM,mBAAmB,KAAK,CAAC;AAC7D,MAAI,YAAY,MAAM,eAAe,MAAM,QAAQ,SAAS;AAC5D,QAAM,KAAK,QAAQ,SAAS,EAAE,MAAM,iBAAiB,MAAM,UAAU,CAAC;AACtE,QAAM,YAAY,8BAA8B,UAAU,2BAA2B;AACrF,QAAM,mBAAmB,iCAAiC;AAAA,IACxD,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,EACf,CAAC;AACD,QAAM,YAAY,MAAM,sBAAsB,MAAM,WAAW,kBAAkB,QAAQ,WAAW,QAAQ,OAAO;AACnH,MAAI,QAAQ,WAAW,qBAAqB,OAAO,KAAK,UAAU,WAAW,EAAE,SAAS,KAAK,UAAU,oBAAoB,SAAS,IAAI;AACtI,UAAM,KAAK,QAAQ,SAAS,EAAE,MAAM,mBAAmB,KAAK,CAAC;AAC7D,gBAAY,MAAM,QAAQ,UAAU,iBAAiB;AAAA,MACnD;AAAA,MACA,UAAU;AAAA,MACV,aAAa,UAAU;AAAA,MACvB,qBAAqB,UAAU;AAAA,IACjC,CAAC;AACD,UAAM,KAAK,QAAQ,SAAS,EAAE,MAAM,iBAAiB,MAAM,UAAU,CAAC;AAAA,EACxE;AAEA,QAAM,KAAK,QAAQ,SAAS,EAAE,MAAM,iBAAiB,MAAM,UAAU,CAAC;AACtE,QAAM,UAAU,MAAM,oBAA2D;AAAA,IAC/E,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ,cAAc,KAAK;AAAA,IACvC,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,SAAS,CAAC,EAAE,SAAS,YAAY,MAAM,QAAQ,QAAQ,QAAQ,EAAE,MAAM,WAAW,SAAS,YAAY,CAAC;AAAA,IACxG,UAAU,OAAO,EAAE,OAAO,SAAS,YAAY,MAAM;AACnD,YAAM,gBAAgB,sBAAsB,WAAW,EAAE,cAAc,QAAQ,sBAAsB,CAAC;AACtG,YAAM,QAAQ,MAAM,QAAQ,QAAQ,SAAS,EAAE,MAAM,WAAW,OAAO,SAAS,YAAY,CAAC;AAC7F,aAAO,CAAC,eAAwB,GAAG,KAAK;AAAA,IAC1C;AAAA,IACA,QAAQ,CAAC,QAAQ;AACf,UAAI,mBAAmB,IAAI,KAAK,GAAG;AACjC,eAAO,QAAQ,QAAQ,qBAAqB,EAAE,MAAM,WAAW,WAAW,iBAAiB,CAAC,KAAK;AAAA,UAC/F,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO,UAAU;AAAA,UACjB,QAAQ,gCAAgC,UAAU,MAAM;AAAA,QAC1D;AAAA,MACF;AACA,aAAO,QAAQ,QAAQ,OAAO,eAAe,MAAM,WAAW,GAAG,CAAC;AAAA,IACpE;AAAA,IACA,KAAK,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,eAAe,MAAM,WAAW,GAAG,CAAC;AAAA,IACtF,YAAY,QAAQ,QAAQ,aACxB,CAAC,QAAQ,QAAQ,QAAQ,WAAY,eAAe,MAAM,WAAW,GAAG,CAAC,IACzE;AAAA,IACJ,kBAAkB,QAAQ,QAAQ,mBAC9B,CAAC,EAAE,QAAQ,QAAQ,OAAO,OAAO,QAAQ,MAAM,QAAQ,QAAQ,iBAAkB,EAAE,QAAQ,QAAQ,MAAM,OAAO,OAAO,QAAQ,CAAC,IAChI;AAAA,IACJ,QAAQ,CAAC,SAAS,KAAK,QAAQ,SAAS,EAAE,MAAM,gBAAgB,MAAM,KAAK,CAAC;AAAA,EAC9E,CAAC;AACD,QAAM,KAAK,QAAQ,SAAS,EAAE,MAAM,eAAe,MAAM,QAAQ,CAAC;AAClE,QAAM,SAAS,kBAAkB,OAAO;AACxC,QAAM,KAAK,QAAQ,SAAS,EAAE,MAAM,YAAY,MAAM,QAAQ,QAAQ,QAAQ,OAAO,CAAC;AAEtF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,UAAU;AAAA,IACvB,qBAAqB,UAAU;AAAA,IAC/B;AAAA,IACA,YAAY,QAAQ,QAAQ,oBAAoB,SAAS,IAAI,KAAK,CAAC;AAAA,EACrE;AACF;AAEO,SAAS,sBACd,QACqB;AACrB,SAAO;AAAA,IACL,QAAQ,OAAO,KAAK;AAAA,IACpB,QAAQ,OAAO,KAAK;AAAA,IACpB,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO,QAAQ;AAAA,IACvB,iBAAiB,yBAAyB,OAAO,SAAS,EAAE;AAAA,IAC5D,gBAAgB,OAAO,UAAU;AAAA,IACjC,mBAAmB,OAAO,UAAU;AAAA,IACpC,gBAAgB,OAAO,UAAU,4BAA4B,IAAI,CAAC,gBAAgB,YAAY,EAAE;AAAA,IAChG,mBAAmB,OAAO,UAAU,gBAAgB,IAAI,CAAC,gBAAgB,YAAY,EAAE;AAAA,IACvF,eAAe,OAAO,UAAU;AAAA,IAChC,sBAAsB,OAAO,iBAAiB;AAAA,IAC9C,uBAAuB,OAAO,oBAAoB;AAAA,IAClD,kBAAkB,OAAO,QAAQ,MAAM;AAAA,IACvC,MAAM,OAAO,QAAQ;AAAA,IACrB,cAAc,OAAO,QAAQ;AAAA,IAC7B,QAAQ,OAAO,QAAQ;AAAA,IACvB,SAAS,OAAO,QAAQ;AAAA,EAC1B;AACF;AAEA,gBAAuB,mBACrB,SACmC;AACnC,QAAM,OAAO,QAAQ;AACrB,QAAM,QAAQ,EAAE,MAAM,GAAI,QAAQ,SAAS,CAAC,EAAG;AAC/C,QAAM,UAAU,YAAY,EAAE,MAAM,cAAc,KAAK,CAAC;AACxD,QAAM;AAEN,QAAM,iBAAiB,YAAY,EAAE,MAAM,mBAAmB,KAAK,CAAC;AACpE,QAAM;AACN,MAAI,YAAY,MAAM,eAAe,MAAM,QAAQ,SAAS;AAC5D,QAAM,YAAY,8BAA8B,UAAU,2BAA2B;AACrF,QAAM,mBAAmB,iCAAiC;AAAA,IACxD,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,EACf,CAAC;AACD,QAAM,YAAY,MAAM,4BAA4B,MAAM,WAAW,kBAAkB,QAAQ,SAAS;AACxG,aAAW,SAAS,UAAU,OAAQ,OAAM;AAC5C,MAAI,QAAQ,WAAW,qBAAqB,OAAO,KAAK,UAAU,WAAW,EAAE,SAAS,KAAK,UAAU,oBAAoB,SAAS,IAAI;AACtI,UAAM,YAAY,EAAE,MAAM,mBAAmB,KAAK,CAAC;AACnD,gBAAY,MAAM,QAAQ,UAAU,iBAAiB;AAAA,MACnD;AAAA,MACA,UAAU;AAAA,MACV,aAAa,UAAU;AAAA,MACvB,qBAAqB,UAAU;AAAA,IACjC,CAAC;AAAA,EACH;AACA,QAAM,WAAW,yBAAyB,WAAW,EAAE,cAAc,QAAQ,sBAAsB,CAAC;AACpG,QAAM,YAAY,EAAE,MAAM,iBAAiB,MAAM,WAAW,SAAS,CAAC;AACtE,MAAI,CAAC,SAAS,UAAU,SAAS,WAAW,WAAW;AACrD,UAAM,SAAS,gCAAgC,SAAS,MAAM;AAC9D,UAAM,YAAY,EAAE,MAAM,YAAY,MAAM,QAAQ,WAAW,OAAO,CAAC;AACvE,UAAM,YAAY,EAAE,MAAM,SAAS,MAAM,QAAQ,WAAW,OAAO,CAAC;AACpE;AAAA,EACF;AAEA,QAAM,QAAQ,QAAQ;AACtB,QAAM,WAAW,QAAQ,YAAY,MAAM,OAAO,IAAI,QAAQ,SAAS,IAAI;AAC3E,QAAM,eAAe,QAAQ,QAAQ,UAAU,QAAQ;AACvD,MAAI,UAAU,gBAAgB,WAC1B,MAAM,qBAAqB,QAAQ,SAAS,UAAU,OAAO,EAAE,MAAM,WAAW,QAAQ,QAAQ,OAAO,CAAC,IACxG,MAAM,oBAAoB,QAAQ,SAAS,OAAO,EAAE,MAAM,WAAW,QAAQ,QAAQ,OAAO,GAAG,QAAQ,SAAS;AACpH,QAAM,OAAO,IAAI,OAAO;AACxB,QAAM,eAAe,YAAY;AAAA,IAC/B,MAAM,eAAe,oBAAoB;AAAA,IACzC;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,OAAO,cAAc,QAAQ,IAAI,YAAY;AACnD,QAAM;AAEN,QAAM,eAAe,YAAY,EAAE,MAAM,iBAAiB,MAAM,SAAS,SAAS,QAAQ,QAAQ,KAAK,CAAC;AACxG,QAAM,OAAO,cAAc,QAAQ,IAAI,YAAY;AACnD,QAAM;AAEN,MAAI,YAAY;AAChB,MAAI;AACF,qBAAiB,YAAY,QAAQ,QAAQ,OAAO,OAAO,EAAE,MAAM,WAAW,SAAS,QAAQ,QAAQ,OAAO,CAAC,GAAG;AAChH,YAAM,QAAQ,4BAA4B,UAAU,MAAM,OAAO;AACjE,UAAI,MAAM,SAAS,aAAc,cAAa,MAAM;AACpD,YAAM,OAAO,cAAc,QAAQ,IAAI,KAAK;AAC5C,YAAM;AAAA,IACR;AACA,UAAM,kBAAmC;AACzC,cAAU,aAAa,EAAE,GAAG,SAAS,QAAQ,gBAAgB,CAAC;AAC9D,UAAM,OAAO,IAAI,OAAO;AACxB,UAAM,aAAa,YAAY,EAAE,MAAM,eAAe,MAAM,SAAS,SAAS,QAAQ,QAAQ,KAAK,CAAC;AACpG,UAAM,OAAO,cAAc,QAAQ,IAAI,UAAU;AACjD,UAAM;AACN,UAAM,SAAS;AACf,UAAM,UAAU,YAAY,EAAE,MAAM,YAAY,MAAM,QAAQ,iBAAiB,OAAO,CAAC;AACvF,UAAM,OAAO,cAAc,QAAQ,IAAI,OAAO;AAC9C,UAAM;AACN,UAAM,QAAQ,YAAY,EAAE,MAAM,SAAS,MAAM,SAAS,QAAQ,iBAAiB,QAAQ,MAAM,aAAa,OAAU,CAAC;AACzH,UAAM,OAAO,cAAc,QAAQ,IAAI,KAAK;AAC5C,UAAM;AAAA,EACR,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,cAAU,aAAa,EAAE,GAAG,SAAS,QAAQ,QAAQ,QAAQ,UAAU,YAAY,SAAS,CAAC;AAC7F,UAAM,OAAO,IAAI,OAAO;AACxB,QAAI;AACJ,QAAI;AACF,YAAM,QAAQ,QAAQ,OAAO,SAAS,OAAO;AAAA,IAC/C,SAAS,SAAS;AAChB,yBAAmB,mBAAmB,QAAQ,QAAQ,UAAU,OAAO,OAAO;AAAA,IAChF;AACA,UAAM,eAAe,YAAY;AAAA,MAC/B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,QAAQ;AAAA,MACzB,SAAS,mBAAmB,GAAG,OAAO,0BAA0B,gBAAgB,KAAK;AAAA,MACrF,aAAa,CAAC,QAAQ,QAAQ;AAAA,IAChC,CAAC;AACD,UAAM,OAAO,cAAc,QAAQ,IAAI,YAAY;AACnD,UAAM;AACN,UAAM,SAA0B,QAAQ,QAAQ,UAAU,YAAY;AACtE,UAAM,UAAU,YAAY,EAAE,MAAM,YAAY,MAAM,QAAQ,QAAQ,QAAQ,CAAC;AAC/E,UAAM,OAAO,cAAc,QAAQ,IAAI,OAAO;AAC9C,UAAM;AACN,UAAM,QAAQ,YAAY,EAAE,MAAM,SAAS,MAAM,SAAS,QAAQ,QAAQ,SAAS,MAAM,aAAa,OAAU,CAAC;AACjH,UAAM,OAAO,cAAc,QAAQ,IAAI,KAAK;AAC5C,UAAM;AAAA,EACR;AACF;AAEO,SAAS,yBACd,QACA,UAAqC,CAAC,GACV;AAC5B,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,iBAAiB,OAAO,4BAA4B,IAAI,CAAC,gBAAgB,YAAY,EAAE;AAC7F,QAAM,oBAAoB,OAAO,gBAAgB,IAAI,CAAC,gBAAgB,YAAY,EAAE;AACpF,MAAI,eAAe,SAAS,GAAG;AAC7B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ,OAAO;AAAA,MACf,gBAAgB,OAAO;AAAA,MACvB,mBAAmB,OAAO;AAAA,MAC1B,UAAU,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,iBAAiB,cAAc;AACxC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ,6BAA6B,OAAO,eAAe,QAAQ,CAAC,CAAC,qBAAqB,aAAa,QAAQ,CAAC,CAAC;AAAA,MACjH,gBAAgB,OAAO;AAAA,MACvB,mBAAmB,OAAO;AAAA,MAC1B,UAAU,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,OAAO;AAAA,IACf,gBAAgB,OAAO;AAAA,IACvB,mBAAmB,OAAO;AAAA,IAC1B,UAAU,OAAO;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iCACd,QACA,UAAmC,CAAC,GACD;AACnC,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,gBAAgB,OAAO;AAAA,IACvB,mBAAmB,OAAO;AAAA,IAC1B,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,6BAA6B,OAAO,4BAA4B;AAAA,MAAI,CAAC,gBACnE,6BAA6B,aAAa,OAAO;AAAA,IACnD;AAAA,IACA,iBAAiB,OAAO,gBAAgB;AAAA,MAAI,CAAC,gBAC3C,6BAA6B,aAAa,OAAO;AAAA,IACnD;AAAA,IACA,eAAe,OAAO,OAAO,YAAY;AAAA,IACzC,aAAa,QAAQ,qBAAqB,OAAO,OAAO,cAAc;AAAA,IACtE,uBAAuB,OAAO,OAAO,QAAQ,IAAI,CAAC,gBAAgB,YAAY,EAAE;AAAA,EAClF;AACF;AAEO,SAAS,0BACd,OACA,UAAmC,CAAC,GACX;AACzB,QAAM,OAAO,EAAE,MAAM,MAAM,MAAM,MAAM,aAAa,MAAM,MAAM,OAAO,EAAE;AACzE,MAAI,MAAM,SAAS,qBAAqB,MAAM,SAAS,gBAAgB,MAAM,SAAS,iBAAiB;AACrG,WAAO,MAAM,SAAS,kBAClB,EAAE,GAAG,MAAM,WAAW,iCAAiC,MAAM,WAAW,OAAO,EAAE,IACjF;AAAA,EACN;AACA,MAAI,MAAM,SAAS,iBAAiB;AAClC,WAAO,EAAE,GAAG,MAAM,WAAW,iCAAiC,MAAM,WAAW,OAAO,EAAE;AAAA,EAC1F;AACA,MAAI,MAAM,SAAS,mBAAmB;AACpC,WAAO,EAAE,GAAG,MAAM,WAAW,MAAM,UAAU,IAAI,CAAC,aAAa,iBAAiB,UAAU,OAAO,CAAC,EAAE;AAAA,EACtG;AACA,MAAI,MAAM,SAAS,iBAAiB;AAClC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,WAAW,MAAM,UAAU,IAAI,CAAC,aAAa,iBAAiB,UAAU,OAAO,CAAC;AAAA,MAChF,aAAa,QAAQ,qBAAqB,MAAM,cAAc,aAAa,MAAM,WAAW;AAAA,IAC9F;AAAA,EACF;AACA,MAAI,MAAM,SAAS,qBAAqB;AACtC,WAAO,EAAE,GAAG,MAAM,kBAAkB,MAAM,iBAAiB,IAAI,uBAAuB,EAAE;AAAA,EAC1F;AACA,MAAI,MAAM,SAAS,mBAAmB;AACpC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,kBAAkB,MAAM,iBAAiB,IAAI,uBAAuB;AAAA,MACpE,uBAAuB,MAAM,oBAAoB;AAAA,MACjD,qBAAqB,QAAQ,qBAAqB,MAAM,sBAAsB;AAAA,IAChF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,gBAAgB;AACjC,WAAO,EAAE,GAAG,MAAM,MAAM,oBAAoB,MAAM,MAAM,OAAO,EAAE;AAAA,EACnE;AACA,MAAI,MAAM,SAAS,eAAe;AAChC,WAAO,EAAE,GAAG,MAAM,SAAS,mBAAmB,MAAM,SAAS,OAAO,EAAE;AAAA,EACxE;AACA,SAAO,EAAE,GAAG,MAAM,QAAQ,MAAM,QAAQ,QAAQ,MAAM,OAAO;AAC/D;AAEO,SAAS,2BACd,OACA,UAAmC,CAAC,GACX;AACzB,QAAM,WAAW,UAAU,SAAS,MAAM,OACtC,EAAE,MAAM,aAAa,MAAM,MAAM,OAAO,EAAE,IAC1C,CAAC;AACL,QAAM,cAAc,aAAa,SAAS,MAAM,UAC5C,EAAE,SAAS,uBAAuB,MAAM,SAAS,OAAO,EAAE,IAC1D,CAAC;AAEL,MAAI,MAAM,SAAS,iBAAiB;AAClC,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,GAAG;AAAA,MACH,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,WAAW,iCAAiC,MAAM,WAAW,OAAO;AAAA,IACtE;AAAA,EACF;AACA,MAAI,MAAM,SAAS,mBAAmB;AACpC,WAAO,EAAE,MAAM,MAAM,MAAM,GAAG,UAAU,WAAW,MAAM,WAAW,WAAW,MAAM,UAAU,IAAI,CAAC,aAAa,iBAAiB,UAAU,OAAO,CAAC,EAAE;AAAA,EACxJ;AACA,MAAI,MAAM,SAAS,iBAAiB;AAClC,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,GAAG;AAAA,MACH,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM,UAAU,IAAI,CAAC,aAAa,iBAAiB,UAAU,OAAO,CAAC;AAAA,MAChF,aAAa,QAAQ,qBAAqB,MAAM,cAAc,aAAa,MAAM,WAAW;AAAA,IAC9F;AAAA,EACF;AACA,MAAI,MAAM,SAAS,qBAAqB;AACtC,WAAO,EAAE,MAAM,MAAM,MAAM,GAAG,UAAU,WAAW,MAAM,WAAW,kBAAkB,MAAM,iBAAiB,IAAI,uBAAuB,EAAE;AAAA,EAC5I;AACA,MAAI,MAAM,SAAS,mBAAmB;AACpC,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,GAAG;AAAA,MACH,WAAW,MAAM;AAAA,MACjB,kBAAkB,MAAM,iBAAiB,IAAI,uBAAuB;AAAA,MACpE,uBAAuB,MAAM,oBAAoB;AAAA,MACjD,qBAAqB,QAAQ,qBAAqB,MAAM,sBAAsB;AAAA,IAChF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,aAAa;AAC9B,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,GAAG;AAAA,MACH,GAAG;AAAA,MACH,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,MAAM,QAAQ,yBAAyB,MAAM,OAAO;AAAA,IACtD;AAAA,EACF;AACA,MAAI,MAAM,SAAS,eAAe;AAChC,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,GAAG;AAAA,MACH,GAAG;AAAA,MACH,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,QAAQ,QAAQ,yBAAyB,MAAM,SAAS;AAAA,IAC1D;AAAA,EACF;AACA,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,GAAG;AAAA,MACH,GAAG;AAAA,MACH,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,MAClB,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,KAAK,QAAQ,qBAAqB,MAAM,MAAM;AAAA,MAC9C,UAAU,QAAQ,kBAAkB,MAAM,WAAW;AAAA,IACvD;AAAA,EACF;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,GAAG;AAAA,MACH,GAAG;AAAA,MACH,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM;AAAA,MACd,MAAM,QAAQ,yBAAyB,MAAM,OAAO;AAAA,MACpD,UAAU,QAAQ,kBAAkB,MAAM,WAAW;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,WAAW,eAAe,QAAQ,MAAM,YAAY;AAAA,IACpD,GAAG,uBAAuB,KAAK;AAAA,EACjC;AACF;AAEO,SAAS,4BACd,UAAmC,CAAC,GAC0B;AAC9D,QAAM,SAAyC,CAAC;AAChD,SAAO;AAAA,IACL;AAAA,IACA,SAAS,CAAC,UAAU;AAClB,aAAO,KAAK,0BAA0B,OAAO,OAAO,CAAC;AAAA,IACvD;AAAA,EACF;AACF;AAEO,SAAS,sBACd,MACA,UAAkC,CAAC,GAC3B;AACR,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,GAAI,OAAM,KAAK,OAAO,cAAc,QAAQ,EAAE,CAAC,EAAE;AAC7D,MAAI,QAAQ,MAAO,OAAM,KAAK,UAAU,cAAc,QAAQ,KAAK,CAAC,EAAE;AACtE,MAAI,OAAO,QAAQ,UAAU,YAAY,OAAO,SAAS,QAAQ,KAAK,KAAK,QAAQ,SAAS,GAAG;AAC7F,UAAM,KAAK,UAAU,KAAK,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,EAClD;AAEA,QAAM,UAAU,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,IAAI;AACrE,aAAW,QAAQ,QAAQ,MAAM,OAAO,GAAG;AACzC,UAAM,KAAK,SAAS,IAAI,EAAE;AAAA,EAC5B;AACA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA;AAC5B;AAEO,SAAS,yBACd,QACA,UAA4D,CAAC,GACrD;AACR,QAAM,EAAE,OAAO,IAAI,OAAO,GAAG,iBAAiB,IAAI;AAClD,SAAO,sBAAsB;AAAA,IAC3B,MAAM;AAAA,IACN,WAAW,iCAAiC,QAAQ,gBAAgB;AAAA,EACtE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC;AACzB;AAEO,SAAS,6BACd,OACA,UAA4D,CAAC,GACrD;AACR,QAAM,EAAE,OAAO,UAAU,IAAI,OAAO,GAAG,iBAAiB,IAAI;AAC5D,SAAO,sBAAsB,2BAA2B,OAAO,gBAAgB,GAAG,EAAE,OAAO,UAAU,IAAI,MAAM,CAAC;AAClH;AAEO,SAAS,sBACd,SAO+B;AAC/B,SAAO;AACT;AAEO,SAAS,2BACd,SAO+B;AAC/B,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,SAAS;AAC1B,YAAM,MAAM,MAAM,QAAQ,OAAO,OAAO,OAAO;AAC/C,aAAO,kBAAkB,QAAQ,QAAQ,WAAW,QAAQ,eAAe,KAAK,KAAK,KAAK,QAAQ,oBAAoB;AAAA,QACpH,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,aAAO,aAAa,EAAE,GAAG,SAAS,QAAQ,SAAS,CAAC;AAAA,IACtD;AAAA,IACA,OAAO,OAAO,OAAO,SAAS;AAC5B,YAAM,MAAM,MAAM,QAAQ,OAAO,OAAO,OAAO;AAC/C,YAAM,UAAU,MAAM,WAAW,MAAM,UAAU,GAAG,EAAE,GAAG,WAAW,QAAQ,KAAK;AACjF,uBAAiB,SAAS,QAAQ,aAAa,KAAK,SAAS,OAAO,GAAG;AACrE,cAAM,SAAS,QAAQ,WAAW,OAAO,OAAO,KAAK,sBAAsB,OAAO,OAAO;AACzF,YAAI,OAAQ,OAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,uBACd,SAM+B;AAC/B,QAAM,UAAU,QAAQ,aAAa;AACrC,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,QAAQ,SAAS;AACrB,aAAO,kBAAkB,QAAQ,QAAQ,cAAc,QAAQ,oBAAoB,EAAE,WAAW,KAAK,CAAC;AAAA,IACxG;AAAA,IACA,OAAO,SAAS;AACd,aAAO,aAAa,EAAE,GAAG,SAAS,QAAQ,SAAS,CAAC;AAAA,IACtD;AAAA,IACA,OAAO,OAAO,OAAO,SAAS;AAC5B,YAAM,WAAW,MAAM,QAAQ,QAAQ,KAAK;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,GAAI,QAAQ,SAAS,EAAE,eAAe,UAAU,QAAQ,MAAM,GAAG,IAAI,CAAC;AAAA,QACxE;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,WAAW,QAAQ,QAAQ;AAAA,UAC3B,aAAa,QAAQ,QAAQ;AAAA,UAC7B,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,UACf,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,QACD,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD,UAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAC1E,aAAO,qBAAqB,UAAU,OAAO;AAAA,IAC/C;AAAA,EACF;AACF;AAEO,SAAS,8BACd,SAO+B;AAC/B,QAAM,UAAU,QAAQ,aAAa;AACrC,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,QAAQ,SAAS;AACrB,aAAO,kBAAkB,QAAQ,QAAQ,UAAU,QAAQ,kBAAkB;AAAA,IAC/E;AAAA,IACA,OAAO,OAAO,OAAO,SAAS;AAC5B,YAAM,WAAW,MAAM,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,OAAO,EAAE,CAAC,qBAAqB;AAAA,QACvF,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,QAAQ,MAAM;AAAA,UACvC,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO,QAAQ;AAAA,UACf,QAAQ;AAAA,UACR,UAAU,MAAM,YAAY,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,WAAW,QAAQ,KAAK,OAAO,CAAC;AAAA,QAC9F,CAAC;AAAA,QACD,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD,UAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,EAAE;AAC5E,aAAO,qBAAqB,UAAU,OAAO;AAAA,IAC/C;AAAA,EACF;AACF;AAEA,eAAe,sBACb,MACA,WACA,kBACA,UACA,SACiF;AACjF,MAAI,cAAsC,CAAC;AAC3C,MAAI,sBAAgC,CAAC;AACrC,MAAI,UAAU,SAAS,KAAK,UAAU,iBAAiB;AACrD,UAAM,KAAK,SAAS,EAAE,MAAM,mBAAmB,MAAM,UAAU,CAAC;AAChE,kBAAc,MAAM,SAAS,gBAAgB,WAAW,IAAI;AAC5D,UAAM,KAAK,SAAS,EAAE,MAAM,iBAAiB,MAAM,WAAW,YAAY,CAAC;AAAA,EAC7E;AACA,MAAI,iBAAiB,SAAS,KAAK,UAAU,yBAAyB;AACpE,UAAM,KAAK,SAAS,EAAE,MAAM,qBAAqB,MAAM,iBAAiB,CAAC;AACzE,0BAAsB,MAAM,SAAS,wBAAwB,kBAAkB,IAAI;AACnF,UAAM,KAAK,SAAS,EAAE,MAAM,mBAAmB,MAAM,kBAAkB,oBAAoB,CAAC;AAAA,EAC9F;AACA,SAAO,EAAE,aAAa,oBAAoB;AAC5C;AAEA,eAAe,4BACb,MACA,WACA,kBACA,UAKC;AACD,QAAM,SAA+B,CAAC;AACtC,MAAI,cAAsC,CAAC;AAC3C,MAAI,sBAAgC,CAAC;AACrC,MAAI,UAAU,SAAS,KAAK,UAAU,iBAAiB;AACrD,WAAO,KAAK,YAAY,EAAE,MAAM,mBAAmB,MAAM,UAAU,CAAC,CAAC;AACrE,kBAAc,MAAM,SAAS,gBAAgB,WAAW,IAAI;AAC5D,WAAO,KAAK,YAAY,EAAE,MAAM,iBAAiB,MAAM,WAAW,YAAY,CAAC,CAAC;AAAA,EAClF;AACA,MAAI,iBAAiB,SAAS,KAAK,UAAU,yBAAyB;AACpE,WAAO,KAAK,YAAY,EAAE,MAAM,qBAAqB,MAAM,iBAAiB,CAAC,CAAC;AAC9E,0BAAsB,MAAM,SAAS,wBAAwB,kBAAkB,IAAI;AACnF,WAAO,KAAK,YAAY,EAAE,MAAM,mBAAmB,MAAM,kBAAkB,oBAAoB,CAAC,CAAC;AAAA,EACnG;AACA,SAAO,EAAE,aAAa,qBAAqB,OAAO;AACpD;AAEA,SAAS,aAAa,MAAqB,SAA2D;AACpG,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,QAAQ,QAAQ,gBAAgB,KAAK,SAAS,KAAK,SAAS,eAAe;AAAA,IAC3E,mBAAmB,KAAK,mBAAmB;AAAA,MAAI,CAAC,gBAC9C,6BAA6B,aAAa,OAAO;AAAA,IACnD;AAAA,IACA,UAAU,QAAQ,kBAAkB,KAAK,WAAW,KAAK,WAAW,eAAe;AAAA,EACrF;AACF;AAEA,SAAS,uBAAuB,SAAyB,SAA2D;AAClH,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,gBAAgB,QAAQ,QAAQ,WAAW;AAAA,IAC3C,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ,kBAAkB,QAAQ,WAAW,QAAQ,WAAW,eAAe;AAAA,EAC3F;AACF;AAEA,SAAS,6BACP,aACA,SAC+B;AAC/B,QAAM,qBAAqB,QAAQ,kCAAkC,YAAY,gBAAgB;AACjG,SAAO;AAAA,IACL,IAAI,YAAY;AAAA,IAChB,aAAa,qBAAqB,YAAY,cAAc;AAAA,IAC5D,aAAa,YAAY;AAAA,IACzB,UAAU,YAAY;AAAA,IACtB,iBAAiB,YAAY;AAAA,IAC7B,YAAY,YAAY;AAAA,IACxB,WAAW,YAAY;AAAA,IACvB,aAAa,YAAY;AAAA,IACzB,kBAAkB,YAAY;AAAA,IAC9B,mBAAmB,YAAY;AAAA,IAC/B,eAAe,YAAY,YAAY;AAAA,IACvC,aAAa,QAAQ,qBAAqB,YAAY,cAAc;AAAA,IACpE,gBAAgB,YAAY;AAAA,EAC9B;AACF;AAEA,SAAS,iBAAiB,UAAwB,SAA2D;AAC3G,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,UAAU,QAAQ,kCAAkC,SAAS,eAAe,eACxE,SAAS,WACT;AAAA,IACJ,QAAQ,QAAQ,iCAAiC,SAAS,SAAS;AAAA,IACnE,eAAe,SAAS;AAAA,IACxB,YAAY,SAAS;AAAA,IACrB,YAAY,SAAS;AAAA,IACrB,iBAAiB,QAAQ,iCAAiC,SAAS,kBAAkB;AAAA,IACrF,aAAa,SAAS,SAAS,UAAU;AAAA,EAC3C;AACF;AAEA,SAAS,wBAAwB,MAAoD;AACnF,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,gBAAgB,KAAK;AAAA,IACrB,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,IACf,uBAAuB,KAAK,qBAAqB,UAAU;AAAA,IAC3D,eAAe,KAAK,WAAW,UAAU;AAAA,EAC3C;AACF;AAEA,SAAS,oBACP,MACA,SACyB;AACzB,QAAM,gBAAgB,KAAK;AAC3B,SAAO;AAAA,IACL,OAAO,KAAK;AAAA,IACZ,cAAc,KAAK,SAAS;AAAA,IAC5B,QAAQ,KAAK,SAAS;AAAA,IACtB,QAAQ,QAAQ,0BAA0B,KAAK,SAAS,SAAS,aAAa,KAAK,SAAS,SAAS;AAAA,IACrG,QAAQ,QAAQ,0BAA0B,eAAe,KAAK,cAAc,SAAS;AAAA,IACrF,UAAU,eAAe;AAAA,IACzB,aAAa,eAAe,OAAO,QAAQ,cAAc,QAAQ;AAAA,IACjE,YAAY,eAAe;AAAA,IAC3B,aAAa,eAAe,KAAK,aAAa,OAAO;AAAA,IACrD,YAAY,eAAe,KAAK,YAAY,OAAO;AAAA,IACnD,WAAW,KAAK;AAAA,IAChB,SAAS,KAAK;AAAA,EAChB;AACF;AAEA,SAAS,mBACP,SACA,SACyB;AACzB,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,WAAW,QAAQ;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,WAAW,QAAQ,MAAM;AAAA,IACzB,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,cAAc,QAAQ;AAAA,IACtB,WAAW,QAAQ;AAAA,IACnB,OAAO,QAAQ;AAAA,IACf,mBAAmB,QAAQ,cAAc;AAAA,IACzC,YAAY,eAAe,QAAQ,YAAY,OAAO;AAAA,EACxD;AACF;AAEA,SAAS,eAAe,OAA4B,SAAkE;AACpH,SAAO,MAAM,IAAI,CAAC,gBAAgB;AAAA,IAChC,IAAI,WAAW;AAAA,IACf,QAAQ,WAAW;AAAA,IACnB,OAAO,WAAW;AAAA,IAClB,UAAU,WAAW;AAAA,IACrB,WAAW,WAAW;AAAA,IACtB,QAAQ,QAAQ,qBAAqB,WAAW,SAAS;AAAA,IACzD,UAAU,QAAQ,qBAAqB,WAAW,WAAW;AAAA,EAC/D,EAAE;AACJ;AAEA,SAAS,aAAa,QAAwD;AAC5E,SAAO,OAAO,YAAY,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,YAAY,CAAC,CAAC;AACjF;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MAAM,QAAQ,WAAW,GAAG;AACrC;AAEA,SAAS,YAAoB;AAC3B,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAEA,SAAS,YAA6D,OAAqC;AACzG,SAAO,EAAE,GAAG,OAAO,WAAW,UAAU,EAAE;AAC5C;AAEA,SAAS,kBAAkB,SAAiB,aAAsB,UAAoD;AACpH,QAAM,MAAM,UAAU;AACtB,SAAO;AAAA,IACL,IAAI,eAAe,OAAO,WAAW;AAAA,IACrC;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,aAAa,SAAyC;AAC7D,SAAO,EAAE,GAAG,SAAS,WAAW,UAAU,EAAE;AAC9C;AAEA,eAAe,oBACb,SACA,OACA,SACA,oBACyB;AACzB,MAAI,QAAQ,MAAO,QAAO,QAAQ,MAAM,OAAO,EAAE,GAAG,SAAS,mBAAmB,CAAC;AACjF,SAAO,kBAAkB,QAAQ,MAAM,kBAAkB;AAC3D;AAEA,eAAe,qBACb,SACA,SACA,OACA,SACyB;AACzB,MAAI,QAAQ,YAAY,QAAQ,MAAM;AACpC,UAAM,IAAI,MAAM,iBAAiB,QAAQ,OAAO,iBAAiB,QAAQ,IAAI,UAAU;AAAA,EACzF;AACA,MAAI,QAAQ,OAAQ,QAAO,QAAQ,OAAO,SAAS,OAAO,OAAO;AACjE,SAAO,aAAa,EAAE,GAAG,SAAS,QAAQ,SAAS,CAAC;AACtD;AAEA,SAAS,4BAA4B,OAA2B,MAAqB,SAA6C;AAChI,MAAI,UAAU,SAAS,MAAM,QAAQ,aAAa,SAAS,MAAM,WAAW,eAAe,SAAS,MAAM,UAAW,QAAO;AAC5H,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,UAAU,SAAS,MAAM,OAAO,MAAM,OAAO;AAAA,IACnD,SAAS,aAAa,SAAS,MAAM,UAAU,MAAM,UAAU;AAAA,IAC/D,WAAW,eAAe,SAAS,MAAM,YAAY,MAAM,YAAY,UAAU;AAAA,EACnF;AACF;AAEA,SAAS,uBAAuB,OAAoD;AAClF,MAAI,MAAM,SAAS,qBAAqB,MAAM,SAAS,kBAAmB,QAAO,CAAC;AAClF,MAAI,MAAM,SAAS,mBAAmB,MAAM,SAAS,cAAe,QAAO,EAAE,SAAS,MAAM,QAAQ;AACpG,MAAI,MAAM,SAAS,gBAAiB,QAAO,EAAE,SAAS,MAAM,SAAS,SAAS,MAAM,SAAS,aAAa,MAAM,YAAY;AAC5H,MAAI,MAAM,SAAS,WAAY,QAAO,EAAE,QAAQ,MAAM,QAAQ,QAAQ,MAAM,OAAO;AACnF,MAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,kBAAmB,QAAO,EAAE,MAAM,MAAM,KAAK;AAC/F,SAAO,CAAC;AACV;AAEA,SAAS,sBAAsB,OAAgB,SAA8D;AAC3G,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,SAAS;AACf,QAAM,OAAO,OAAO,OAAO,QAAQ,EAAE;AACrC,QAAM,OAAO,OAAO,QAAQ,OAAO,OAAO,SAAS,WAAW,OAAO,OAAkC;AACvG,MAAI,SAAS,0BAA0B,SAAS,gBAAgB,SAAS,SAAS;AAChF,UAAM,OAAO,YAAY,KAAK,IAAI,KAAK,YAAY,KAAK,KAAK,KAAK,YAAY,OAAO,IAAI;AACzF,WAAO,OAAO,EAAE,MAAM,cAAc,MAAM,QAAQ,MAAM,SAAS,QAAQ,SAAS,MAAM,WAAW,UAAU,EAAE,IAAI;AAAA,EACrH;AACA,MAAI,SAAS,mBAAmB;AAC9B,UAAM,OAAO,YAAY,KAAK,IAAI,KAAK,YAAY,OAAO,IAAI;AAC9D,WAAO,OAAO,EAAE,MAAM,mBAAmB,MAAM,QAAQ,MAAM,SAAS,QAAQ,SAAS,MAAM,WAAW,UAAU,EAAE,IAAI;AAAA,EAC1H;AACA,MAAI,SAAS,aAAa;AACxB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB,UAAU,YAAY,KAAK,IAAI,KAAK,YAAY,OAAO,QAAQ,KAAK;AAAA,MACpE,YAAY,YAAY,KAAK,EAAE,KAAK,YAAY,OAAO,UAAU;AAAA,MACjE,MAAM,KAAK,QAAQ,KAAK,SAAS,OAAO;AAAA,MACxC,WAAW,UAAU;AAAA,IACvB;AAAA,EACF;AACA,MAAI,SAAS,eAAe;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB,UAAU,YAAY,KAAK,IAAI,KAAK,YAAY,OAAO,QAAQ,KAAK;AAAA,MACpE,YAAY,YAAY,KAAK,EAAE,KAAK,YAAY,OAAO,UAAU;AAAA,MACjE,QAAQ,KAAK,UAAU,KAAK,UAAU,OAAO;AAAA,MAC7C,WAAW,UAAU;AAAA,IACvB;AAAA,EACF;AACA,MAAI,SAAS,YAAY,SAAS,SAAS;AACzC,UAAM,OAAO,YAAY,KAAK,SAAS,KAAK,YAAY,KAAK,IAAI,KAAK,YAAY,OAAO,IAAI;AAC7F,WAAO,OAAO,EAAE,MAAM,cAAc,MAAM,QAAQ,MAAM,SAAS,QAAQ,SAAS,MAAM,WAAW,UAAU,EAAE,IAAI;AAAA,EACrH;AACA,SAAO;AACT;AAEA,gBAAgB,qBAAqB,UAAoB,SAAiE;AACxH,QAAM,OAAO,SAAS;AACtB,MAAI,CAAC,KAAM;AACX,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AACb,aAAS;AACP,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AACV,cAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,EAAE,QAAQ,SAAS,IAAI;AACvE,eAAW,SAAS,kBAAkB,KAAK,EAAG,OAAM;AAAA,EACtD;AACA,YAAU,QAAQ,OAAO,EAAE,QAAQ,SAAS,IAAI;AAChD,aAAW,SAAS,kBAAkB,IAAI,EAAG,OAAM;AACnD,MAAI,OAAO,KAAK,GAAG;AACjB,UAAM,QAAQ,iBAAiB,QAAQ,OAAO;AAC9C,QAAI,MAAO,OAAM;AAAA,EACnB;AAEA,YAAU,kBAAkB,OAA8C;AACxE,eAAS;AACP,YAAM,cAAc,OAAO,QAAQ,MAAM;AACzC,UAAI,eAAe,GAAG;AACpB,cAAM,QAAQ,OAAO,MAAM,GAAG,WAAW;AACzC,iBAAS,OAAO,MAAM,cAAc,CAAC;AACrC,cAAM,QAAQ,iBAAiB,OAAO,OAAO;AAC7C,YAAI,MAAO,OAAM;AACjB;AAAA,MACF;AAEA,YAAM,UAAU,OAAO,QAAQ,IAAI;AACnC,UAAI,WAAW,KAAK,CAAC,OAAO,MAAM,GAAG,OAAO,EAAE,WAAW,OAAO,GAAG;AACjE,cAAM,OAAO,OAAO,MAAM,GAAG,OAAO;AACpC,iBAAS,OAAO,MAAM,UAAU,CAAC;AACjC,cAAM,QAAQ,iBAAiB,MAAM,OAAO;AAC5C,YAAI,MAAO,OAAM;AACjB;AAAA,MACF;AAEA,UAAI,SAAS,OAAO,KAAK,KAAK,CAAC,OAAO,UAAU,EAAE,WAAW,OAAO,GAAG;AACrE,cAAM,OAAO;AACb,iBAAS;AACT,cAAM,QAAQ,iBAAiB,MAAM,OAAO;AAC5C,YAAI,MAAO,OAAM;AACjB;AAAA,MACF;AAEA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAe,SAA8D;AACrG,QAAM,QAAQ,MAAM,MAAM,OAAO;AACjC,QAAM,YAAY,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,OAAO,CAAC;AACjE,QAAM,OAAO,UAAU,SAAS,IAC5B,UAAU,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,IAC5D,MAAM,KAAK;AACf,MAAI,CAAC,QAAQ,SAAS,SAAU,QAAO;AACvC,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,UAAM,SAAS,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,QAAQ,CAAC,IAA2C;AAC1G,UAAM,QAAQ,QAAQ;AACtB,UAAM,UAAU,QAAQ;AACxB,UAAM,OAAO,YAAY,OAAO,OAAO,KAAK,YAAY,SAAS,OAAO,KAAK,YAAY,OAAO,IAAI;AACpG,QAAI,KAAM,QAAO,EAAE,MAAM,cAAc,MAAM,QAAQ,MAAM,SAAS,QAAQ,SAAS,MAAM,WAAW,UAAU,EAAE;AAClH,WAAO,sBAAsB,QAAQ,OAAO;AAAA,EAC9C,QAAQ;AACN,WAAO,EAAE,MAAM,cAAc,MAAM,QAAQ,MAAM,SAAS,QAAQ,SAAS,MAAM,MAAM,WAAW,UAAU,EAAE;AAAA,EAChH;AACF;AAEA,SAAS,YAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,eACP,MACA,UAC8D;AAC9D,MAAI,UAAU,eAAgB,QAAO,SAAS,eAAe,IAAI;AACjE,SAAO,wBAAwB;AAAA,IAC7B,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK,qBAAqB,CAAC;AAAA,IACzC,UAAU,EAAE,QAAQ,KAAK,QAAQ,GAAG,KAAK,SAAS;AAAA,EACpD,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAqC;AAC/D,SAAO,MAAM,KAAK,CAAC,eAAe,WAAW,OAAO,qBAAqB,CAAC,WAAW,MAAM;AAC7F;AAEA,SAAS,kBAAkB,SAA0F;AACnH,MAAI,QAAQ,cAAc,QAAS,QAAO;AAC1C,MAAI,QAAQ,OAAO,SAAS,6BAA6B,EAAG,QAAO;AACnE,MAAI,QAAQ,KAAM,QAAO;AACzB,SAAO;AACT;AAEA,eAAe,KACb,MACA,OACe;AACf,QAAM,OAAO,KAAK;AACpB;AAEA,SAAS,eACP,MACA,WACA,KACyD;AACzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI;AAAA,IACf,QAAQ,IAAI;AAAA,IACZ,cAAc,IAAI;AAAA,IAClB,kBAAkB,IAAI;AAAA,IACtB,aAAa,IAAI;AAAA,EACnB;AACF;","names":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Product Runtime Kernel
|
|
2
2
|
|
|
3
|
-
Status:
|
|
4
|
-
documented, and hardened
|
|
3
|
+
Status: complete. Implemented in `@tangle-network/agent-runtime@0.5.0`;
|
|
4
|
+
validated, documented, and hardened through `0.5.2`.
|
|
5
5
|
|
|
6
|
-
This document
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
This document is the completion record for the production runtime kernel: what
|
|
7
|
+
it is for, what is done, how it was validated, what is intentionally outside the
|
|
8
|
+
public package, and how product repos should adopt it.
|
|
9
9
|
|
|
10
10
|
## Purpose
|
|
11
11
|
|
|
@@ -55,6 +55,8 @@ The kernel is complete when these are true:
|
|
|
55
55
|
All kernel-side criteria are satisfied in `0.5.2`. Durable storage and UI
|
|
56
56
|
rollout are product adoption tasks, not core package blockers.
|
|
57
57
|
|
|
58
|
+
Completion verdict: passed. There are no open kernel blockers in this document.
|
|
59
|
+
|
|
58
60
|
## Completed API Surface
|
|
59
61
|
|
|
60
62
|
### Execution
|
|
@@ -193,6 +195,35 @@ Release verification:
|
|
|
193
195
|
| Durable persistence | Contract complete, product-owned | `RuntimeSessionStore` interface exists; product repos must provide D1/Postgres/Redis implementations. |
|
|
194
196
|
| UI rollout | Product-owned | Runtime emits stable events; product UIs decide rendering. |
|
|
195
197
|
|
|
198
|
+
## Completion Boundaries
|
|
199
|
+
|
|
200
|
+
The package is done when the reusable contract is complete. The package is not
|
|
201
|
+
responsible for product-specific state, credentials, databases, or UX. Those are
|
|
202
|
+
adoption responsibilities.
|
|
203
|
+
|
|
204
|
+
### Complete in `agent-runtime`
|
|
205
|
+
|
|
206
|
+
- Public task and stream contracts.
|
|
207
|
+
- Readiness-gated streamed execution.
|
|
208
|
+
- Session create/resume contract.
|
|
209
|
+
- Backend abstraction and adapter factories.
|
|
210
|
+
- Safe stream sanitization.
|
|
211
|
+
- SSE encoding.
|
|
212
|
+
- Failure normalization and backend stop hook.
|
|
213
|
+
- Unit tests for the contract and shipped adapters.
|
|
214
|
+
- NPM package publication.
|
|
215
|
+
|
|
216
|
+
### Not Part of the Public Kernel
|
|
217
|
+
|
|
218
|
+
- Product database migrations.
|
|
219
|
+
- Product-specific session persistence.
|
|
220
|
+
- Product-specific auth, secrets, billing, and rate limits.
|
|
221
|
+
- UI components for resume/readiness.
|
|
222
|
+
- Domain-specific knowledge requirements and tool policies.
|
|
223
|
+
- Concrete private SDK client construction.
|
|
224
|
+
|
|
225
|
+
These are not deferred kernel tasks. They are downstream integration tasks.
|
|
226
|
+
|
|
196
227
|
## Critique
|
|
197
228
|
|
|
198
229
|
The runtime kernel is now materially useful, but it is not magic. The most
|
|
@@ -275,18 +306,19 @@ Validation found and fixed two issues before marking this complete:
|
|
|
275
306
|
|
|
276
307
|
The doc now matches shipped behavior.
|
|
277
308
|
|
|
278
|
-
##
|
|
309
|
+
## Downstream Rollout Plan
|
|
279
310
|
|
|
280
|
-
This is downstream work, not missing kernel work:
|
|
311
|
+
This is downstream adoption work, not missing kernel work:
|
|
281
312
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
313
|
+
1. Add durable `RuntimeSessionStore` implementations in product repos.
|
|
314
|
+
2. Convert CLI bridge routes/harnesses to `createCliBridgeBackend`.
|
|
315
|
+
3. Convert simple TCloud chat routes to `createOpenAICompatibleBackend` where
|
|
316
|
+
useful.
|
|
317
|
+
4. Store runtime stream events in product trace/run-record tables.
|
|
318
|
+
5. Add UI affordances for session resume/continuation and readiness blockers.
|
|
319
|
+
6. Extend failure classifiers to consume `RuntimeStreamEvent` evidence directly.
|
|
289
320
|
|
|
290
|
-
The kernel is complete
|
|
291
|
-
removing bespoke product stream loops and using the same runtime contract
|
|
292
|
-
|
|
321
|
+
The kernel is complete and ready for broad adoption. The next value comes from
|
|
322
|
+
removing bespoke product stream loops and using the same runtime contract across
|
|
323
|
+
product routes, coding harnesses, CLI bridge runs, evals, and optimization
|
|
324
|
+
reports.
|
package/package.json
CHANGED