@tangle-network/agent-runtime 0.43.0 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +1 -1
- package/dist/{chunk-C5HMTTNY.js → chunk-GFKVVRQ7.js} +8 -8
- package/dist/{chunk-MNCB4SJ5.js → chunk-KDMRUD2P.js} +2 -2
- package/dist/{chunk-EKBSQYZE.js → chunk-S7JXV32P.js} +159 -25
- package/dist/chunk-S7JXV32P.js.map +1 -0
- package/dist/{chunk-MJDGCRAT.js → chunk-SKUZZCHE.js} +2 -2
- package/dist/{dynamic-B_7GgCwu.d.ts → dynamic-wUgp6UKs.d.ts} +1 -1
- package/dist/improvement.js +3 -3
- package/dist/index.d.ts +6 -6
- package/dist/index.js +15 -15
- package/dist/{kb-gate-DTBum3vH.d.ts → kb-gate-D0ZIhFOU.d.ts} +1 -1
- package/dist/{loop-runner-bin-CVoCBmYk.d.ts → loop-runner-bin-BLMa8He3.d.ts} +3 -3
- package/dist/loop-runner-bin.d.ts +4 -4
- package/dist/loop-runner-bin.js +4 -4
- package/dist/loops.d.ts +101 -79
- package/dist/loops.js +9 -1
- package/dist/mcp/bin.js +3 -3
- package/dist/mcp/index.d.ts +5 -5
- package/dist/mcp/index.js +3 -3
- package/dist/{otel-export-BzvF1Ela.d.ts → otel-export-wFDmmurL.d.ts} +1 -1
- package/dist/profiles.d.ts +1 -1
- package/dist/run-loop-C4L1Sted.d.ts +89 -0
- package/dist/{types-Bcp071Jg.d.ts → types-DbJzz2uf.d.ts} +1 -1
- package/dist/workflow.d.ts +550 -0
- package/dist/workflow.js +1779 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +29 -12
- package/dist/chunk-EKBSQYZE.js.map +0 -1
- /package/dist/{chunk-C5HMTTNY.js.map → chunk-GFKVVRQ7.js.map} +0 -0
- /package/dist/{chunk-MNCB4SJ5.js.map → chunk-KDMRUD2P.js.map} +0 -0
- /package/dist/{chunk-MJDGCRAT.js.map → chunk-SKUZZCHE.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/workflow/agent-delegate.ts","../src/workflow/budget.ts","../src/workflow/loop-delegate.ts","../src/workflow/runtime.ts","../src/workflow/schema.ts","../src/workflow/options.ts","../src/workflow/realm.ts","../src/workflow/runtime-support.ts","../src/workflow/validate.ts","../src/workflow/nested-workflow-delegate.ts"],"sourcesContent":["import type {\n AgentProfile,\n CreateSandboxOptions,\n PromptOptions,\n SandboxEvent,\n TaskOptions,\n} from '@tangle-network/sandbox'\nimport { ValidationError } from '../errors'\nimport {\n extractLlmCallEvent,\n type LoopSandboxClient,\n type LoopSandboxPlacement,\n type OutputAdapter,\n} from '../loops'\nimport { createSandboxForSpec, describeSandboxPlacement } from '../loops/run-loop'\nimport type {\n WorkflowAgentDelegate,\n WorkflowAgentOptions,\n WorkflowDelegateContext,\n WorkflowDelegateResult,\n WorkflowTokenUsage,\n} from './types'\n\nexport type WorkflowSandboxAgentStream = 'prompt' | 'task'\n\nexport type WorkflowSandboxAgentProfileResolver =\n | AgentProfile\n | ((prompt: string, options: WorkflowAgentOptions, ctx: WorkflowDelegateContext) => AgentProfile)\n\nexport type WorkflowSandboxPromptOptionsResolver<TOptions extends PromptOptions> =\n | TOptions\n | ((prompt: string, options: WorkflowAgentOptions, ctx: WorkflowDelegateContext) => TOptions)\n\nexport interface WorkflowSandboxAgentTrace<TOutput = unknown> {\n prompt: string\n options: WorkflowAgentOptions\n ctx: WorkflowDelegateContext\n profile: AgentProfile\n output: TOutput\n events: SandboxEvent[]\n stream: WorkflowSandboxAgentStream\n placement: LoopSandboxPlacement\n costUsd: number\n tokenUsage: WorkflowTokenUsage\n}\n\nexport interface CreateSandboxWorkflowAgentDelegateOptions<TOutput = unknown> {\n client: LoopSandboxClient\n profile: WorkflowSandboxAgentProfileResolver\n output?: OutputAdapter<TOutput>\n stream?: WorkflowSandboxAgentStream\n sandboxOverrides?: Partial<Omit<CreateSandboxOptions, 'backend'>> & {\n backend?: Omit<NonNullable<CreateSandboxOptions['backend']>, 'profile'>\n }\n promptOptions?: WorkflowSandboxPromptOptionsResolver<PromptOptions>\n taskOptions?: WorkflowSandboxPromptOptionsResolver<TaskOptions>\n deleteAfter?: boolean\n includeEventsInTrace?: boolean\n toTrace?: (trace: WorkflowSandboxAgentTrace<TOutput>) => unknown\n}\n\nexport interface WorkflowSandboxAgentDefaultTrace {\n stream: WorkflowSandboxAgentStream\n placement: LoopSandboxPlacement['kind']\n sandboxId?: string\n fleetId?: string\n machineId?: string\n profileName?: string\n eventCount: number\n eventTypes: string[]\n events?: SandboxEvent[]\n}\n\nexport function createSandboxWorkflowAgentDelegate<TOutput = unknown>(\n options: CreateSandboxWorkflowAgentDelegateOptions<TOutput>,\n): WorkflowAgentDelegate {\n return async (prompt, agentOptions, ctx): Promise<WorkflowDelegateResult> => {\n if (!options.client || typeof options.client.create !== 'function') {\n throw new ValidationError('workflow sandbox agent: client.create is required')\n }\n const profile = resolveProfile(options.profile, prompt, agentOptions, ctx)\n const agentRunName = agentOptions.label ?? profile.name ?? 'workflow-agent'\n const box = await createSandboxForSpec(\n options.client,\n {\n profile,\n name: agentRunName,\n taskToPrompt: (value: string) => value,\n sandboxOverrides: options.sandboxOverrides,\n },\n ctx.signal,\n )\n const placement = describeSandboxPlacement(options.client, box)\n const stream = options.stream ?? 'prompt'\n const events: SandboxEvent[] = []\n const tokenUsage: WorkflowTokenUsage = { input: 0, output: 0 }\n let costUsd = 0\n\n try {\n const source =\n stream === 'task'\n ? box.streamTask(prompt, {\n ...resolveStreamOptions(options.taskOptions, prompt, agentOptions, ctx),\n signal: ctx.signal,\n })\n : box.streamPrompt(prompt, {\n ...resolveStreamOptions(options.promptOptions, prompt, agentOptions, ctx),\n signal: ctx.signal,\n })\n\n for await (const event of source) {\n events.push(event)\n const llmCall = extractLlmCallEvent(event, agentRunName)\n if (!llmCall) continue\n costUsd += llmCall.costUsd ?? 0\n tokenUsage.input += llmCall.tokensIn ?? 0\n tokenUsage.output += llmCall.tokensOut ?? 0\n }\n\n const output = options.output\n ? options.output.parse(events)\n : (parseSandboxAgentDefaultOutput(events) as TOutput)\n const trace = {\n prompt,\n options: agentOptions,\n ctx,\n profile,\n output,\n events,\n stream,\n placement,\n costUsd,\n tokenUsage,\n } satisfies WorkflowSandboxAgentTrace<TOutput>\n return {\n output,\n costUsd,\n tokenUsage,\n trace: options.toTrace ? options.toTrace(trace) : defaultTrace(trace, options),\n }\n } finally {\n if (options.deleteAfter) await box.delete()\n }\n }\n}\n\nexport function parseSandboxAgentDefaultOutput(events: SandboxEvent[]): unknown {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i]\n const data = asRecord(event?.data)\n const text = firstString(data, ['finalText', 'response', 'text', 'output', 'content'])\n if (text !== undefined) return text\n if ('result' in data) return data.result\n }\n throw new ValidationError(\n 'workflow sandbox agent emitted no parseable terminal output; pass an output adapter',\n )\n}\n\nfunction resolveProfile(\n resolver: WorkflowSandboxAgentProfileResolver,\n prompt: string,\n options: WorkflowAgentOptions,\n ctx: WorkflowDelegateContext,\n): AgentProfile {\n return typeof resolver === 'function' ? resolver(prompt, options, ctx) : resolver\n}\n\nfunction resolveStreamOptions<TOptions extends PromptOptions>(\n resolver: WorkflowSandboxPromptOptionsResolver<TOptions> | undefined,\n prompt: string,\n options: WorkflowAgentOptions,\n ctx: WorkflowDelegateContext,\n): TOptions | undefined {\n return typeof resolver === 'function' ? resolver(prompt, options, ctx) : resolver\n}\n\nfunction defaultTrace<TOutput>(\n trace: WorkflowSandboxAgentTrace<TOutput>,\n options: CreateSandboxWorkflowAgentDelegateOptions<TOutput>,\n): WorkflowSandboxAgentDefaultTrace {\n return {\n stream: trace.stream,\n placement: trace.placement.kind,\n sandboxId: trace.placement.sandboxId,\n fleetId: trace.placement.fleetId,\n machineId: trace.placement.machineId,\n profileName: trace.profile.name,\n eventCount: trace.events.length,\n eventTypes: trace.events.map((event) => String(event.type ?? '')),\n ...(options.includeEventsInTrace ? { events: trace.events } : {}),\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : {}\n}\n\nfunction firstString(data: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = data[key]\n if (typeof value === 'string') return value\n }\n return undefined\n}\n","import { ValidationError } from '../errors'\nimport type {\n WorkflowBudgetCaps,\n WorkflowBudgetRemaining,\n WorkflowBudgetSnapshot,\n WorkflowBudgetView,\n WorkflowDelegateResult,\n WorkflowTokenUsage,\n} from './types'\n\nexport class WorkflowBudget implements WorkflowBudgetView {\n readonly total: WorkflowBudgetCaps\n private readonly startedAt: number\n private readonly now: () => number\n private costUsd = 0\n private tokens: WorkflowTokenUsage = { input: 0, output: 0 }\n private agentCallCount = 0\n private loopCallCount = 0\n\n constructor(total: WorkflowBudgetCaps, now: () => number) {\n this.total = total\n this.now = now\n this.startedAt = now()\n }\n\n spent(): WorkflowBudgetSnapshot {\n return {\n costUsd: this.costUsd,\n tokens: { ...this.tokens },\n agentCalls: this.agentCallCount,\n loopCalls: this.loopCallCount,\n elapsedMs: this.elapsedMs(),\n }\n }\n\n remaining(): WorkflowBudgetRemaining {\n const out: WorkflowBudgetRemaining = {}\n if (this.total.maxCostUsd !== undefined) out.costUsd = this.total.maxCostUsd - this.costUsd\n if (this.total.maxTokens !== undefined) {\n out.tokens = this.total.maxTokens - this.tokens.input - this.tokens.output\n }\n if (this.total.maxAgentCalls !== undefined) {\n out.agentCalls = this.total.maxAgentCalls - this.agentCallCount\n }\n if (this.total.maxLoopCalls !== undefined) {\n out.loopCalls = this.total.maxLoopCalls - this.loopCallCount\n }\n if (this.total.maxWallMs !== undefined) out.wallMs = this.total.maxWallMs - this.elapsedMs()\n return out\n }\n\n nextAgentIndex(): number {\n this.assertWall()\n if (this.total.maxAgentCalls !== undefined && this.agentCallCount >= this.total.maxAgentCalls) {\n throw new ValidationError(\n `workflow budget exhausted: maxAgentCalls=${this.total.maxAgentCalls}`,\n )\n }\n const index = this.agentCallCount\n this.agentCallCount += 1\n return index\n }\n\n nextLoopIndex(): number {\n this.assertWall()\n if (this.total.maxLoopCalls !== undefined && this.loopCallCount >= this.total.maxLoopCalls) {\n throw new ValidationError(\n `workflow budget exhausted: maxLoopCalls=${this.total.maxLoopCalls}`,\n )\n }\n const index = this.loopCallCount\n this.loopCallCount += 1\n return index\n }\n\n assertFanout(count: number): void {\n if (!Number.isInteger(count) || count < 0) {\n throw new ValidationError(\n `workflow fanout count must be a non-negative integer, got ${count}`,\n )\n }\n if (this.total.maxFanout !== undefined && count > this.total.maxFanout) {\n throw new ValidationError(\n `workflow fanout ${count} exceeds maxFanout=${this.total.maxFanout}`,\n )\n }\n }\n\n observe(result: WorkflowDelegateResult): { costUsd: number; tokenUsage: WorkflowTokenUsage } {\n const costUsd = finiteNonNegative(result.costUsd ?? 0, 'costUsd')\n const tokenUsage = {\n input: finiteNonNegative(result.tokenUsage?.input ?? 0, 'tokenUsage.input'),\n output: finiteNonNegative(result.tokenUsage?.output ?? 0, 'tokenUsage.output'),\n }\n const agentCalls = finiteNonNegativeInteger(result.agentCalls ?? 0, 'agentCalls')\n const loopCalls = finiteNonNegativeInteger(result.loopCalls ?? 0, 'loopCalls')\n this.costUsd += costUsd\n this.tokens.input += tokenUsage.input\n this.tokens.output += tokenUsage.output\n this.agentCallCount += agentCalls\n this.loopCallCount += loopCalls\n this.assertSpend()\n return { costUsd, tokenUsage }\n }\n\n assertWall(): void {\n if (this.total.maxWallMs !== undefined && this.elapsedMs() > this.total.maxWallMs) {\n throw new ValidationError(`workflow budget exhausted: maxWallMs=${this.total.maxWallMs}`)\n }\n }\n\n remainingWallMs(): number | undefined {\n if (this.total.maxWallMs === undefined) return undefined\n return Math.max(0, this.total.maxWallMs - this.elapsedMs())\n }\n\n private elapsedMs(): number {\n return Math.max(0, this.now() - this.startedAt)\n }\n\n private assertSpend(): void {\n if (this.total.maxCostUsd !== undefined && this.costUsd > this.total.maxCostUsd) {\n throw new ValidationError(`workflow budget exhausted: maxCostUsd=${this.total.maxCostUsd}`)\n }\n if (\n this.total.maxTokens !== undefined &&\n this.tokens.input + this.tokens.output > this.total.maxTokens\n ) {\n throw new ValidationError(`workflow budget exhausted: maxTokens=${this.total.maxTokens}`)\n }\n }\n}\n\nfunction finiteNonNegative(value: number, field: string): number {\n if (!Number.isFinite(value) || value < 0) {\n throw new ValidationError(`workflow delegate returned invalid ${field}: ${value}`)\n }\n return value\n}\n\nfunction finiteNonNegativeInteger(value: number, field: string): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new ValidationError(`workflow delegate returned invalid ${field}: ${value}`)\n }\n return value\n}\n","import { type LoopResult, type RunLoopOptions, runLoop } from '../loops'\nimport type {\n WorkflowDelegateContext,\n WorkflowDelegateResult,\n WorkflowLoopDelegate,\n WorkflowLoopOptions,\n} from './types'\n\nexport interface CreateRunLoopWorkflowDelegateOptions<Input, Task, Output, Decision> {\n toRunLoopOptions(\n input: Input,\n options: WorkflowLoopOptions,\n ctx: WorkflowDelegateContext,\n ): RunLoopOptions<Task, Output, Decision>\n toOutput?: (result: LoopResult<Task, Output, Decision>) => unknown\n toTrace?: (result: LoopResult<Task, Output, Decision>) => unknown\n}\n\nexport function createRunLoopWorkflowDelegate<Input, Task, Output, Decision>(\n options: CreateRunLoopWorkflowDelegateOptions<Input, Task, Output, Decision>,\n): WorkflowLoopDelegate {\n return async (input, loopOptions, ctx): Promise<WorkflowDelegateResult> => {\n const result = await runLoop(options.toRunLoopOptions(input as Input, loopOptions, ctx))\n return {\n output: options.toOutput ? options.toOutput(result) : defaultOutput(result),\n costUsd: result.costUsd,\n tokenUsage: result.tokenUsage,\n trace: options.toTrace ? options.toTrace(result) : defaultTrace(result),\n }\n }\n}\n\nfunction defaultOutput<Task, Output, Decision>(\n result: LoopResult<Task, Output, Decision>,\n): unknown {\n return (\n result.winner?.output ?? {\n decision: result.decision,\n iterations: result.iterations.length,\n }\n )\n}\n\nfunction defaultTrace<Task, Output, Decision>(result: LoopResult<Task, Output, Decision>): unknown {\n return {\n decision: result.decision,\n iterations: result.iterations.length,\n winnerIterationIndex: result.winner?.iterationIndex,\n costUsd: result.costUsd,\n tokenUsage: result.tokenUsage,\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { ValidationError } from '../errors'\nimport { WorkflowBudget } from './budget'\nimport {\n normalizeWorkflowAgentOptions,\n normalizeWorkflowCheckpointOptions,\n normalizeWorkflowLoopOptions,\n} from './options'\nimport { normalizeRuntimeError, type WorkflowRuntimeGlobals } from './realm'\nimport {\n assertWorkflowString,\n checkpointEndedKind,\n checkpointFailedKind,\n checkpointStartedKind,\n createWorkflowSignal,\n decodeWorkflowDelegateResult,\n fulfilledValues,\n isRejected,\n normalizeWorkflowCaps,\n runWorkflowBody,\n type WorkflowCheckpointRuntimeKind,\n waitForWorkflowBudget,\n} from './runtime-support'\nimport type {\n WorkflowAnalystDelegate,\n WorkflowCheckpointOptions,\n WorkflowDelegateContext,\n WorkflowResult,\n WorkflowReviewerDelegate,\n WorkflowRuntimeOptions,\n WorkflowTraceEvent,\n WorkflowVerifierDelegate,\n} from './types'\nimport { parseWorkflowScript } from './validate'\n\nexport async function runWorkflow<TOutput = unknown>(\n options: WorkflowRuntimeOptions,\n): Promise<WorkflowResult<TOutput>> {\n const parsed = parseWorkflowScript(options.source)\n const runId = options.runId ?? `workflow-${randomUUID()}`\n const depth = options.depth ?? 0\n const caps = normalizeWorkflowCaps(options.caps)\n if (depth > caps.maxDepth) {\n throw new ValidationError(`workflow depth ${depth} exceeds maxDepth=${caps.maxDepth}`)\n }\n\n const now = options.now ?? Date.now\n const budget = new WorkflowBudget(caps, now)\n const workflowSignal = createWorkflowSignal(options.signal)\n const events: WorkflowTraceEvent[] = []\n const startedAt = now()\n let currentPhase: string | undefined\n const checkpointCounts: Record<WorkflowCheckpointRuntimeKind, number> = {\n verifier: 0,\n analyst: 0,\n reviewer: 0,\n }\n\n const emit = async (event: WorkflowTraceEvent): Promise<void> => {\n events.push(event)\n await options.traceEmitter?.emit(event)\n }\n\n const delegateCtx = (): WorkflowDelegateContext => ({\n workflowRunId: runId,\n depth,\n phase: currentPhase,\n signal: workflowSignal.signal,\n caps,\n budget,\n metadata: options.metadata,\n })\n\n const emitNow = (event: Omit<WorkflowTraceEvent, 'runId' | 'timestamp'>): WorkflowTraceEvent =>\n ({\n ...event,\n runId,\n timestamp: now(),\n }) as WorkflowTraceEvent\n\n const emitDelegateFailure = async (\n kind:\n | 'workflow.agent.failed'\n | 'workflow.loop.failed'\n | 'workflow.verifier.failed'\n | 'workflow.analyst.failed'\n | 'workflow.reviewer.failed',\n args: {\n err: unknown\n index: number\n label?: string\n startedAt: number\n },\n ): Promise<never> => {\n const normalized = normalizeRuntimeError(args.err)\n await emit(\n emitNow({\n kind,\n payload: {\n index: args.index,\n label: args.label,\n durationMs: now() - args.startedAt,\n message: normalized.message,\n code: normalized.name,\n phase: currentPhase,\n },\n }),\n )\n throw normalized\n }\n\n const globals: WorkflowRuntimeGlobals = {\n budget,\n phase(title) {\n assertWorkflowString(title, 'phase title')\n currentPhase = title\n void emit(emitNow({ kind: 'workflow.phase', payload: { title } }))\n },\n log(message) {\n assertWorkflowString(message, 'log message')\n void emit(emitNow({ kind: 'workflow.log', payload: { message, phase: currentPhase } }))\n },\n async parallel(thunks) {\n if (!Array.isArray(thunks)) throw new ValidationError('parallel() expects an array')\n budget.assertFanout(thunks.length)\n thunks.forEach((thunk, index) => {\n if (typeof thunk !== 'function') {\n throw new ValidationError(`parallel() branch ${index} is not a function`)\n }\n })\n const opStarted = now()\n const operationPhase = currentPhase\n await emit(\n emitNow({\n kind: 'workflow.parallel.started',\n payload: { branchCount: thunks.length, phase: operationPhase },\n }),\n )\n let firstFailure: Error | undefined\n const settled = await Promise.allSettled(\n thunks.map(async (thunk, index) => {\n const branchStarted = now()\n await emit(\n emitNow({\n kind: 'workflow.branch.started',\n payload: { operation: 'parallel', branchIndex: index, phase: operationPhase },\n }),\n )\n try {\n const value = await thunk()\n await emit(\n emitNow({\n kind: 'workflow.branch.ended',\n payload: {\n operation: 'parallel',\n branchIndex: index,\n durationMs: now() - branchStarted,\n phase: operationPhase,\n },\n }),\n )\n return value\n } catch (err) {\n const normalized = normalizeRuntimeError(err)\n firstFailure ??= normalized\n workflowSignal.abort()\n await emit(\n emitNow({\n kind: 'workflow.branch.failed',\n payload: {\n operation: 'parallel',\n branchIndex: index,\n durationMs: now() - branchStarted,\n message: normalized.message,\n code: normalized.name,\n phase: operationPhase,\n },\n }),\n )\n throw normalized\n }\n }),\n )\n const rejected = settled.find(isRejected)\n if (rejected) throw firstFailure ?? normalizeRuntimeError(rejected.reason)\n await emit(\n emitNow({\n kind: 'workflow.parallel.ended',\n payload: {\n branchCount: thunks.length,\n durationMs: now() - opStarted,\n phase: currentPhase,\n },\n }),\n )\n return fulfilledValues(settled)\n },\n async pipeline(items, ...stages) {\n if (!Array.isArray(items)) throw new ValidationError('pipeline() expects an item array')\n budget.assertFanout(items.length)\n if (stages.length === 0) throw new ValidationError('pipeline() expects at least one stage')\n stages.forEach((stage, index) => {\n if (typeof stage !== 'function') {\n throw new ValidationError(`pipeline() stage ${index} is not a function`)\n }\n })\n const opStarted = now()\n const operationPhase = currentPhase\n await emit(\n emitNow({\n kind: 'workflow.pipeline.started',\n payload: { itemCount: items.length, stageCount: stages.length, phase: operationPhase },\n }),\n )\n let firstFailure: Error | undefined\n const settled = await Promise.allSettled(\n items.map(async (item, index) => {\n const branchStarted = now()\n await emit(\n emitNow({\n kind: 'workflow.branch.started',\n payload: {\n operation: 'pipeline',\n branchIndex: index,\n stageCount: stages.length,\n phase: operationPhase,\n },\n }),\n )\n let stageIndex = -1\n try {\n let value: unknown = item\n for (const stage of stages) {\n stageIndex += 1\n value = await stage(value, item, index)\n }\n await emit(\n emitNow({\n kind: 'workflow.branch.ended',\n payload: {\n operation: 'pipeline',\n branchIndex: index,\n durationMs: now() - branchStarted,\n stageCount: stages.length,\n phase: operationPhase,\n },\n }),\n )\n return value as never\n } catch (err) {\n const normalized = normalizeRuntimeError(err)\n firstFailure ??= normalized\n workflowSignal.abort()\n await emit(\n emitNow({\n kind: 'workflow.branch.failed',\n payload: {\n operation: 'pipeline',\n branchIndex: index,\n durationMs: now() - branchStarted,\n message: normalized.message,\n code: normalized.name,\n phase: operationPhase,\n ...(stageIndex >= 0 ? { stageIndex } : {}),\n },\n }),\n )\n throw normalized\n }\n }),\n )\n const rejected = settled.find(isRejected)\n if (rejected) throw firstFailure ?? normalizeRuntimeError(rejected.reason)\n await emit(\n emitNow({\n kind: 'workflow.pipeline.ended',\n payload: {\n itemCount: items.length,\n stageCount: stages.length,\n durationMs: now() - opStarted,\n phase: currentPhase,\n },\n }),\n )\n return fulfilledValues(settled) as never[]\n },\n async agent(prompt, rawAgentOptions) {\n assertWorkflowString(prompt, 'agent prompt')\n const agentOptions = normalizeWorkflowAgentOptions(rawAgentOptions)\n const index = budget.nextAgentIndex()\n const label = agentOptions.label\n const opStarted = now()\n await emit(\n emitNow({\n kind: 'workflow.agent.started',\n payload: {\n index,\n label,\n promptChars: prompt.length,\n phase: currentPhase,\n metadata: agentOptions.metadata,\n },\n }),\n )\n try {\n const result = await waitForWorkflowBudget(\n () => options.agent(prompt, agentOptions, delegateCtx()),\n budget,\n workflowSignal.signal,\n workflowSignal.abort,\n )\n const output = decodeWorkflowDelegateResult(result, agentOptions)\n const usage = budget.observe(result)\n await emit(\n emitNow({\n kind: 'workflow.agent.ended',\n payload: {\n index,\n label,\n durationMs: now() - opStarted,\n costUsd: usage.costUsd,\n tokenUsage: usage.tokenUsage,\n phase: currentPhase,\n trace: result.trace,\n },\n }),\n )\n return output\n } catch (err) {\n return emitDelegateFailure('workflow.agent.failed', {\n err,\n index,\n label,\n startedAt: opStarted,\n })\n }\n },\n async loop(input, rawLoopOptions) {\n if (!options.loop) throw new ValidationError('workflow loop() delegate is not configured')\n const loopOptions = normalizeWorkflowLoopOptions(rawLoopOptions)\n const index = budget.nextLoopIndex()\n const label = loopOptions.label\n const opStarted = now()\n await emit(\n emitNow({\n kind: 'workflow.loop.started',\n payload: {\n index,\n label,\n phase: currentPhase,\n metadata: loopOptions.metadata,\n },\n }),\n )\n try {\n const result = await waitForWorkflowBudget(\n () => options.loop!(input, loopOptions, delegateCtx()),\n budget,\n workflowSignal.signal,\n workflowSignal.abort,\n )\n const output = decodeWorkflowDelegateResult(result, loopOptions)\n const usage = budget.observe(result)\n await emit(\n emitNow({\n kind: 'workflow.loop.ended',\n payload: {\n index,\n label,\n durationMs: now() - opStarted,\n costUsd: usage.costUsd,\n tokenUsage: usage.tokenUsage,\n phase: currentPhase,\n trace: result.trace,\n },\n }),\n )\n return output\n } catch (err) {\n return emitDelegateFailure('workflow.loop.failed', {\n err,\n index,\n label,\n startedAt: opStarted,\n })\n }\n },\n verify(input, rawVerifierOptions) {\n if (!options.verifier) {\n throw new ValidationError('workflow verify() delegate is not configured')\n }\n const verifierOptions = normalizeWorkflowCheckpointOptions(rawVerifierOptions, 'verify')\n return runCheckpoint({\n kind: 'verifier',\n input,\n checkpointOptions: verifierOptions,\n delegate: options.verifier,\n })\n },\n analyzeTrace(input, rawAnalystOptions) {\n if (!options.analyst) {\n throw new ValidationError('workflow analyzeTrace() delegate is not configured')\n }\n const analystOptions = normalizeWorkflowCheckpointOptions(rawAnalystOptions, 'analyzeTrace')\n return runCheckpoint({\n kind: 'analyst',\n input,\n checkpointOptions: analystOptions,\n delegate: options.analyst,\n })\n },\n review(input, rawReviewerOptions) {\n if (!options.reviewer) {\n throw new ValidationError('workflow review() delegate is not configured')\n }\n const reviewerOptions = normalizeWorkflowCheckpointOptions(rawReviewerOptions, 'review')\n return runCheckpoint({\n kind: 'reviewer',\n input,\n checkpointOptions: reviewerOptions,\n delegate: options.reviewer,\n })\n },\n }\n\n async function runCheckpoint(args: {\n kind: WorkflowCheckpointRuntimeKind\n input: unknown\n checkpointOptions: WorkflowCheckpointOptions\n delegate: WorkflowVerifierDelegate | WorkflowAnalystDelegate | WorkflowReviewerDelegate\n }): Promise<unknown> {\n const index = checkpointCounts[args.kind]\n checkpointCounts[args.kind] += 1\n const label = args.checkpointOptions.label\n const opStarted = now()\n await emit(\n emitNow({\n kind: checkpointStartedKind(args.kind),\n payload: {\n index,\n label,\n phase: currentPhase,\n metadata: args.checkpointOptions.metadata,\n },\n }),\n )\n try {\n const result = await waitForWorkflowBudget(\n () => args.delegate(args.input, args.checkpointOptions, delegateCtx()),\n budget,\n workflowSignal.signal,\n workflowSignal.abort,\n )\n const output = decodeWorkflowDelegateResult(result, args.checkpointOptions)\n const usage = budget.observe(result)\n await emit(\n emitNow({\n kind: checkpointEndedKind(args.kind),\n payload: {\n index,\n label,\n durationMs: now() - opStarted,\n costUsd: usage.costUsd,\n tokenUsage: usage.tokenUsage,\n phase: currentPhase,\n trace: result.trace,\n },\n }),\n )\n return output\n } catch (err) {\n return emitDelegateFailure(checkpointFailedKind(args.kind), {\n err,\n index,\n label,\n startedAt: opStarted,\n })\n }\n }\n\n await emit(emitNow({ kind: 'workflow.started', payload: { meta: parsed.meta, depth, caps } }))\n try {\n const output = (await waitForWorkflowBudget(\n () => runWorkflowBody(parsed.body, parsed.meta.name, globals, options.syncTimeoutMs),\n budget,\n options.signal,\n workflowSignal.abort,\n 'body',\n )) as TOutput\n const spent = budget.spent()\n const result: WorkflowResult<TOutput> = {\n runId,\n meta: parsed.meta,\n output,\n events,\n durationMs: now() - startedAt,\n costUsd: spent.costUsd,\n tokenUsage: spent.tokens,\n agentCalls: spent.agentCalls,\n loopCalls: spent.loopCalls,\n }\n await emit(\n emitNow({\n kind: 'workflow.ended',\n payload: {\n durationMs: result.durationMs,\n costUsd: result.costUsd,\n tokenUsage: result.tokenUsage,\n agentCalls: result.agentCalls,\n loopCalls: result.loopCalls,\n },\n }),\n )\n return { ...result, events }\n } catch (err) {\n const normalized = normalizeRuntimeError(err)\n workflowSignal.abort()\n await emit(\n emitNow({\n kind: 'workflow.failed',\n payload: {\n message: normalized.message,\n code: normalized.name,\n phase: currentPhase,\n },\n }),\n )\n throw normalized\n } finally {\n workflowSignal.cleanup()\n }\n}\n","import { ValidationError } from '../errors'\nimport type { JsonSchema } from './types'\n\nexport function validateJsonSchemaDefinition(\n schema: unknown,\n path = '$',\n): asserts schema is JsonSchema {\n const record = assertSchemaRecord(schema, path)\n const type = record.type\n switch (type) {\n case 'string':\n requireAllowedKeys(record, path, ['type', 'minLength', 'maxLength', 'enum'])\n optionalNonNegativeNumber(record.minLength, `${path}.minLength`, { integer: true })\n optionalNonNegativeNumber(record.maxLength, `${path}.maxLength`, { integer: true })\n optionalEnum(record.enum, path, 'string')\n return\n case 'number':\n case 'integer':\n requireAllowedKeys(record, path, ['type', 'minimum', 'maximum', 'enum'])\n optionalFiniteNumber(record.minimum, `${path}.minimum`)\n optionalFiniteNumber(record.maximum, `${path}.maximum`)\n optionalEnum(record.enum, path, type)\n return\n case 'boolean':\n requireAllowedKeys(record, path, ['type', 'enum'])\n optionalEnum(record.enum, path, 'boolean')\n return\n case 'null':\n requireAllowedKeys(record, path, ['type'])\n return\n case 'array':\n requireAllowedKeys(record, path, ['type', 'items', 'minItems', 'maxItems'])\n optionalNonNegativeNumber(record.minItems, `${path}.minItems`, { integer: true })\n optionalNonNegativeNumber(record.maxItems, `${path}.maxItems`, { integer: true })\n if (record.items !== undefined) validateJsonSchemaDefinition(record.items, `${path}.items`)\n return\n case 'object': {\n requireAllowedKeys(record, path, ['type', 'properties', 'required', 'additionalProperties'])\n if (record.properties !== undefined) {\n const properties = assertSchemaPlainRecord(record.properties, `${path}.properties`)\n for (const [key, child] of Object.entries(properties)) {\n validateJsonSchemaDefinition(child, `${path}.properties.${key}`)\n }\n }\n if (record.required !== undefined) {\n if (!Array.isArray(record.required)) {\n throw new ValidationError(`${path}.required: expected string array`)\n }\n for (const [index, value] of record.required.entries()) {\n if (typeof value !== 'string' || value.length === 0) {\n throw new ValidationError(`${path}.required[${index}]: expected non-empty string`)\n }\n }\n }\n if (\n record.additionalProperties !== undefined &&\n typeof record.additionalProperties !== 'boolean'\n ) {\n throw new ValidationError(`${path}.additionalProperties: expected boolean`)\n }\n return\n }\n default:\n throw new ValidationError(`${path}.type: expected supported JSON schema type`)\n }\n}\n\nexport function validateJsonSchema(value: unknown, schema: JsonSchema, path = '$'): void {\n validateJsonSchemaDefinition(schema)\n switch (schema.type) {\n case 'string':\n assertType(typeof value === 'string', path, 'string')\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n throw new ValidationError(`${path}: expected string length >= ${schema.minLength}`)\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n throw new ValidationError(`${path}: expected string length <= ${schema.maxLength}`)\n }\n assertEnum(value, schema.enum, path)\n return\n case 'number':\n assertType(typeof value === 'number' && Number.isFinite(value), path, 'number')\n assertNumberBounds(value, schema.minimum, schema.maximum, path)\n assertEnum(value, schema.enum, path)\n return\n case 'integer':\n assertType(Number.isInteger(value), path, 'integer')\n assertNumberBounds(value as number, schema.minimum, schema.maximum, path)\n assertEnum(value as number, schema.enum, path)\n return\n case 'boolean':\n assertType(typeof value === 'boolean', path, 'boolean')\n assertEnum(value, schema.enum, path)\n return\n case 'null':\n assertType(value === null, path, 'null')\n return\n case 'array':\n assertType(Array.isArray(value), path, 'array')\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n throw new ValidationError(`${path}: expected array length >= ${schema.minItems}`)\n }\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n throw new ValidationError(`${path}: expected array length <= ${schema.maxItems}`)\n }\n if (schema.items) {\n value.forEach((item, index) => {\n validateJsonSchema(item, schema.items!, `${path}[${index}]`)\n })\n }\n return\n case 'object':\n assertPlainObject(value, path)\n validateObject(value as Record<string, unknown>, schema, path)\n return\n }\n}\n\nfunction validateObject(\n value: Record<string, unknown>,\n schema: Extract<JsonSchema, { type: 'object' }>,\n path: string,\n): void {\n for (const key of schema.required ?? []) {\n if (!(key in value)) throw new ValidationError(`${path}: missing required property ${key}`)\n }\n const properties = schema.properties ?? {}\n for (const [key, propSchema] of Object.entries(properties)) {\n if (key in value) validateJsonSchema(value[key], propSchema, `${path}.${key}`)\n }\n if (schema.additionalProperties === false) {\n for (const key of Object.keys(value)) {\n if (!(key in properties)) throw new ValidationError(`${path}: unexpected property ${key}`)\n }\n }\n}\n\nfunction assertType(ok: boolean, path: string, expected: string): asserts ok {\n if (!ok) throw new ValidationError(`${path}: expected ${expected}`)\n}\n\nfunction assertPlainObject(value: unknown, path: string): void {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new ValidationError(`${path}: expected object`)\n }\n}\n\nfunction assertNumberBounds(\n value: number,\n minimum: number | undefined,\n maximum: number | undefined,\n path: string,\n): void {\n if (minimum !== undefined && value < minimum) {\n throw new ValidationError(`${path}: expected number >= ${minimum}`)\n }\n if (maximum !== undefined && value > maximum) {\n throw new ValidationError(`${path}: expected number <= ${maximum}`)\n }\n}\n\nfunction assertEnum<T>(value: T, allowed: readonly T[] | undefined, path: string): void {\n if (allowed && !allowed.includes(value)) {\n throw new ValidationError(`${path}: expected one of ${allowed.map(String).join(', ')}`)\n }\n}\n\nfunction assertSchemaRecord(value: unknown, path: string): Record<string, unknown> {\n const record = assertSchemaPlainRecord(value, path)\n if (typeof record.type !== 'string' || record.type.length === 0) {\n throw new ValidationError(`${path}.type: expected non-empty string`)\n }\n return record\n}\n\nfunction assertSchemaPlainRecord(value: unknown, path: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new ValidationError(`${path}: expected object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction requireAllowedKeys(\n record: Record<string, unknown>,\n path: string,\n allowedKeys: readonly string[],\n): void {\n const allowed = new Set(allowedKeys)\n for (const key of Object.keys(record)) {\n if (!allowed.has(key)) throw new ValidationError(`${path}.${key}: unsupported schema keyword`)\n }\n}\n\nfunction optionalFiniteNumber(value: unknown, path: string): void {\n if (value === undefined) return\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new ValidationError(`${path}: expected finite number`)\n }\n}\n\nfunction optionalNonNegativeNumber(\n value: unknown,\n path: string,\n options: { integer?: boolean } = {},\n): void {\n optionalFiniteNumber(value, path)\n if (value === undefined) return\n if ((value as number) < 0) throw new ValidationError(`${path}: expected non-negative number`)\n if (options.integer && !Number.isInteger(value)) {\n throw new ValidationError(`${path}: expected integer`)\n }\n}\n\nfunction optionalEnum(\n value: unknown,\n path: string,\n expected: 'string' | 'number' | 'integer' | 'boolean',\n): void {\n if (value === undefined) return\n if (!Array.isArray(value)) throw new ValidationError(`${path}.enum: expected array`)\n for (const [index, item] of value.entries()) {\n const itemPath = `${path}.enum[${index}]`\n if (expected === 'integer') {\n if (!Number.isInteger(item)) throw new ValidationError(`${itemPath}: expected integer`)\n } else if (expected === 'number') {\n if (typeof item !== 'number' || !Number.isFinite(item)) {\n throw new ValidationError(`${itemPath}: expected finite number`)\n }\n } else if (typeof item !== expected) {\n throw new ValidationError(`${itemPath}: expected ${expected}`)\n }\n }\n}\n","import { ValidationError } from '../errors'\nimport { validateJsonSchemaDefinition } from './schema'\nimport type {\n JsonSchema,\n WorkflowAgentOptions,\n WorkflowCheckpointOptions,\n WorkflowLoopOptions,\n} from './types'\n\nexport function normalizeWorkflowAgentOptions(input: unknown): WorkflowAgentOptions {\n const record = normalizeOptionsRecord(input, 'agent')\n rejectUnknownOptionKeys(record, 'agent', ['label', 'metadata', 'schema', 'allowWorkflow'])\n const out: WorkflowAgentOptions = {}\n const label = optionalStringOption(record.label, 'agent.label')\n if (label !== undefined) out.label = label\n const metadata = optionalJsonRecordOption(record.metadata, 'agent.metadata')\n if (metadata !== undefined) out.metadata = metadata\n const schema = optionalJsonSchemaOption(record.schema, 'agent.schema')\n if (schema !== undefined) out.schema = schema\n if (record.allowWorkflow !== undefined) {\n if (typeof record.allowWorkflow !== 'boolean') {\n throw new ValidationError('agent.allowWorkflow: expected boolean')\n }\n out.allowWorkflow = record.allowWorkflow\n }\n return out\n}\n\nexport function normalizeWorkflowLoopOptions(input: unknown): WorkflowLoopOptions {\n const record = normalizeOptionsRecord(input, 'loop')\n rejectUnknownOptionKeys(record, 'loop', ['label', 'metadata', 'schema'])\n return normalizeCheckpointLikeOptions(record, 'loop')\n}\n\nexport function normalizeWorkflowCheckpointOptions(\n input: unknown,\n kind: 'verify' | 'analyzeTrace' | 'review',\n): WorkflowCheckpointOptions {\n const record = normalizeOptionsRecord(input, kind)\n rejectUnknownOptionKeys(record, kind, ['label', 'metadata', 'schema'])\n return normalizeCheckpointLikeOptions(record, kind)\n}\n\nfunction normalizeCheckpointLikeOptions(\n record: Record<string, unknown>,\n kind: string,\n): WorkflowCheckpointOptions {\n const out: WorkflowCheckpointOptions = {}\n const label = optionalStringOption(record.label, `${kind}.label`)\n if (label !== undefined) out.label = label\n const metadata = optionalJsonRecordOption(record.metadata, `${kind}.metadata`)\n if (metadata !== undefined) out.metadata = metadata\n const schema = optionalJsonSchemaOption(record.schema, `${kind}.schema`)\n if (schema !== undefined) out.schema = schema\n return out\n}\n\nfunction cloneJsonRecord(value: object, path: string): Record<string, unknown> {\n const out = cloneJsonValue(value, path)\n if (!out || typeof out !== 'object' || Array.isArray(out)) {\n throw new ValidationError(`${path}: expected object`)\n }\n return out as Record<string, unknown>\n}\n\nfunction cloneJsonValue(value: unknown, path: string, seen = new Set<object>()): unknown {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) throw new ValidationError(`${path}: expected finite JSON number`)\n return value\n }\n if (value === undefined) {\n throw new ValidationError(`${path}: expected JSON value, got undefined`)\n }\n if (typeof value !== 'object') {\n throw new ValidationError(`${path}: expected JSON value, got ${typeof value}`)\n }\n if (seen.has(value)) throw new ValidationError(`${path}: JSON value cannot contain cycles`)\n seen.add(value)\n try {\n if (Array.isArray(value)) return cloneJsonArray(value, path, seen)\n return clonePlainJsonObject(value, path, seen)\n } finally {\n seen.delete(value)\n }\n}\n\nfunction cloneJsonArray(value: unknown[], path: string, seen: Set<object>): unknown[] {\n if (Object.getOwnPropertySymbols(value).length > 0) {\n throw new ValidationError(`${path}: symbol properties are not JSON`)\n }\n const descriptors = Object.getOwnPropertyDescriptors(value)\n const out: unknown[] = []\n for (let index = 0; index < value.length; index += 1) {\n const descriptor = descriptors[index]\n if (!descriptor) throw new ValidationError(`${path}[${index}]: sparse arrays are not JSON`)\n if (!('value' in descriptor)) {\n throw new ValidationError(`${path}[${index}]: accessor properties are not allowed`)\n }\n out.push(cloneJsonValue(descriptor.value, `${path}[${index}]`, seen))\n }\n for (const key of Object.keys(descriptors)) {\n if (!/^\\d+$/.test(key) && key !== 'length') {\n throw new ValidationError(`${path}.${key}: array properties are not JSON`)\n }\n }\n return out\n}\n\nfunction clonePlainJsonObject(\n value: object,\n path: string,\n seen: Set<object>,\n): Record<string, unknown> {\n if (Object.prototype.toString.call(value) !== '[object Object]') {\n throw new ValidationError(`${path}: expected plain JSON object`)\n }\n if (Object.getOwnPropertySymbols(value).length > 0) {\n throw new ValidationError(`${path}: symbol properties are not JSON`)\n }\n const out: Record<string, unknown> = {}\n const descriptors = Object.getOwnPropertyDescriptors(value)\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (key === '__proto__' || key === 'prototype' || key === 'constructor') {\n throw new ValidationError(`${path}.${key}: unsafe object key`)\n }\n if (!('value' in descriptor)) {\n throw new ValidationError(`${path}.${key}: accessor properties are not allowed`)\n }\n out[key] = cloneJsonValue(descriptor.value, `${path}.${key}`, seen)\n }\n return out\n}\n\nfunction normalizeOptionsRecord(input: unknown, kind: string): Record<string, unknown> {\n if (input === undefined) return {}\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n throw new ValidationError(`${kind} options must be an object`)\n }\n return cloneJsonRecord(input, `${kind} options`)\n}\n\nfunction rejectUnknownOptionKeys(\n record: Record<string, unknown>,\n kind: string,\n allowedKeys: readonly string[],\n): void {\n const allowed = new Set(allowedKeys)\n for (const key of Object.keys(record)) {\n if (!allowed.has(key)) throw new ValidationError(`${kind}.${key}: unsupported workflow option`)\n }\n}\n\nfunction optionalStringOption(value: unknown, path: string): string | undefined {\n if (value === undefined) return undefined\n if (typeof value !== 'string' || value.length === 0) {\n throw new ValidationError(`${path}: expected non-empty string`)\n }\n return value\n}\n\nfunction optionalJsonRecordOption(\n value: unknown,\n path: string,\n): Record<string, unknown> | undefined {\n if (value === undefined) return undefined\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new ValidationError(`${path}: expected object`)\n }\n return cloneJsonRecord(value, path)\n}\n\nfunction optionalJsonSchemaOption(value: unknown, path: string): JsonSchema | undefined {\n if (value === undefined) return undefined\n const schema = cloneJsonValue(value, path)\n validateJsonSchemaDefinition(schema, path)\n return schema\n}\n","import vm from 'node:vm'\nimport { ValidationError } from '../errors'\nimport type {\n WorkflowAgentOptions,\n WorkflowBudgetCaps,\n WorkflowBudgetView,\n WorkflowCheckpointOptions,\n WorkflowLoopOptions,\n} from './types'\n\nexport interface WorkflowRuntimeGlobals {\n agent(prompt: string, options?: WorkflowAgentOptions): Promise<unknown>\n loop(input: unknown, options?: WorkflowLoopOptions): Promise<unknown>\n verify(input: unknown, options?: WorkflowCheckpointOptions): Promise<unknown>\n analyzeTrace(input: unknown, options?: WorkflowCheckpointOptions): Promise<unknown>\n review(input: unknown, options?: WorkflowCheckpointOptions): Promise<unknown>\n parallel<T>(thunks: Array<() => Promise<T> | T>): Promise<T[]>\n pipeline<T, R>(\n items: T[],\n ...stages: Array<(value: unknown, original: T, index: number) => R>\n ): Promise<R[]>\n phase(title: string): void\n log(message: string): void\n budget: WorkflowBudgetView\n}\n\nexport function installWorkflowGlobals(context: vm.Context, globals: WorkflowRuntimeGlobals): void {\n const wrapAsync = async (run: () => Promise<unknown>) => {\n try {\n return encodeBridgeSuccess(await run())\n } catch (err) {\n return encodeBridgeError(err)\n }\n }\n const wrapSync = (run: () => unknown) => {\n try {\n return encodeBridgeSuccess(run())\n } catch (err) {\n return encodeBridgeError(err)\n }\n }\n const install = vm.compileFunction(\n `\nconst __unwrap = (payload) => {\n const envelope = JSON.parse(payload)\n if (envelope.ok) return envelope.value\n const error = new Error(envelope.error.message)\n error.name = envelope.error.name || 'Error'\n throw error\n}\n\nconst __safeMath = Object.freeze({\n abs: Math.abs,\n ceil: Math.ceil,\n floor: Math.floor,\n max: Math.max,\n min: Math.min,\n pow: Math.pow,\n round: Math.round,\n sign: Math.sign,\n sqrt: Math.sqrt,\n trunc: Math.trunc,\n})\n\nObject.defineProperties(globalThis, {\n agent: { value: async (...args) => __unwrap(await __agent(...args)), enumerable: true },\n loop: { value: async (...args) => __unwrap(await __loop(...args)), enumerable: true },\n verify: { value: async (...args) => __unwrap(await __verify(...args)), enumerable: true },\n analyzeTrace: { value: async (...args) => __unwrap(await __analyzeTrace(...args)), enumerable: true },\n review: { value: async (...args) => __unwrap(await __review(...args)), enumerable: true },\n parallel: { value: async (...args) => __unwrap(await __parallel(...args)), enumerable: true },\n pipeline: { value: async (...args) => __unwrap(await __pipeline(...args)), enumerable: true },\n phase: { value: (...args) => __unwrap(__phase(...args)), enumerable: true },\n log: { value: (...args) => __unwrap(__log(...args)), enumerable: true },\n budget: {\n value: Object.freeze({\n get total() {\n return __unwrap(__budgetTotal())\n },\n spent() {\n return __unwrap(__budgetSpent())\n },\n remaining() {\n return __unwrap(__budgetRemaining())\n },\n }),\n enumerable: true,\n },\n Math: { value: __safeMath },\n Date: { value: undefined },\n Function: { value: undefined },\n eval: { value: undefined },\n fetch: { value: undefined },\n XMLHttpRequest: { value: undefined },\n WebSocket: { value: undefined },\n WebAssembly: { value: undefined },\n setTimeout: { value: undefined },\n setInterval: { value: undefined },\n setImmediate: { value: undefined },\n queueMicrotask: { value: undefined },\n process: { value: undefined },\n require: { value: undefined },\n module: { value: undefined },\n exports: { value: undefined },\n globalThis: { value: undefined },\n window: { value: undefined },\n document: { value: undefined },\n self: { value: undefined },\n})\n`,\n [\n '__agent',\n '__loop',\n '__verify',\n '__analyzeTrace',\n '__review',\n '__parallel',\n '__pipeline',\n '__phase',\n '__log',\n '__budgetTotal',\n '__budgetSpent',\n '__budgetRemaining',\n ],\n { parsingContext: context },\n )\n install(\n (prompt: string, options?: WorkflowAgentOptions) =>\n wrapAsync(() => globals.agent(prompt, options)),\n (input: unknown, options?: WorkflowLoopOptions) =>\n wrapAsync(() => globals.loop(input, options)),\n (input: unknown, options?: WorkflowCheckpointOptions) =>\n wrapAsync(() => globals.verify(input, options)),\n (input: unknown, options?: WorkflowCheckpointOptions) =>\n wrapAsync(() => globals.analyzeTrace(input, options)),\n (input: unknown, options?: WorkflowCheckpointOptions) =>\n wrapAsync(() => globals.review(input, options)),\n (thunks: Array<() => Promise<unknown> | unknown>) => wrapAsync(() => globals.parallel(thunks)),\n (\n items: unknown[],\n ...stages: Array<(value: unknown, original: unknown, index: number) => unknown>\n ) => wrapAsync(() => globals.pipeline(items, ...stages)),\n (title: string) => wrapSync(() => globals.phase(title)),\n (message: string) => wrapSync(() => globals.log(message)),\n () => wrapSync(() => finiteCaps(globals.budget.total)),\n () => wrapSync(() => globals.budget.spent()),\n () => wrapSync(() => finiteRemaining(globals.budget.remaining())),\n )\n}\n\nexport function normalizeRuntimeError(err: unknown): Error {\n if (err instanceof Error) return err\n const message = errorMessage(err)\n const name = errorName(err)\n if (name === 'ValidationError') return new ValidationError(message, { cause: err })\n const out = new Error(message, { cause: err })\n if (name) out.name = name\n return out\n}\n\nfunction encodeBridgeSuccess(value: unknown): string {\n return JSON.stringify({ ok: true, value: toBridgeValue(value) })\n}\n\nfunction encodeBridgeError(err: unknown): string {\n return JSON.stringify({\n ok: false,\n error: {\n name: errorName(err),\n message: errorMessage(err),\n },\n })\n}\n\nfunction toBridgeValue(value: unknown, path = '$', seen = new Set<object>()): unknown {\n if (value === undefined) return undefined\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new ValidationError(`workflow bridge cannot return non-finite number at ${path}`)\n }\n return value\n }\n if (Array.isArray(value)) {\n if (seen.has(value)) throw new ValidationError(`workflow bridge cannot return cycle at ${path}`)\n seen.add(value)\n const out = value.map((item, index) => toBridgeValue(item, `${path}[${index}]`, seen))\n seen.delete(value)\n return out\n }\n if (typeof value === 'object') {\n if (Object.prototype.toString.call(value) !== '[object Object]') {\n throw new ValidationError(`workflow bridge cannot return non-plain object at ${path}`)\n }\n if (seen.has(value)) throw new ValidationError(`workflow bridge cannot return cycle at ${path}`)\n seen.add(value)\n const out: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value)) {\n if (child === undefined) continue\n out[key] = toBridgeValue(child, `${path}.${key}`, seen)\n }\n seen.delete(value)\n return out\n }\n throw new ValidationError(`workflow bridge cannot return ${typeof value} at ${path}`)\n}\n\nfunction finiteCaps(caps: WorkflowBudgetCaps): WorkflowBudgetCaps {\n return finiteNumberRecord(caps) as WorkflowBudgetCaps\n}\n\nfunction finiteRemaining(remaining: ReturnType<WorkflowBudgetView['remaining']>) {\n return finiteNumberRecord(remaining)\n}\n\nfunction finiteNumberRecord(input: object): Record<string, number> {\n const out: Record<string, number> = {}\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n if (typeof value === 'number' && Number.isFinite(value)) out[key] = value\n }\n return out\n}\n\nfunction errorMessage(err: unknown): string {\n if (err && typeof err === 'object' && 'message' in err) {\n const message = (err as { message?: unknown }).message\n if (typeof message === 'string') return message\n }\n return String(err)\n}\n\nfunction errorName(err: unknown): string | undefined {\n if (err && typeof err === 'object' && 'name' in err) {\n const name = (err as { name?: unknown }).name\n if (typeof name === 'string') return name\n }\n return undefined\n}\n","import vm from 'node:vm'\nimport { ValidationError } from '../errors'\nimport type { WorkflowBudget } from './budget'\nimport { installWorkflowGlobals, type WorkflowRuntimeGlobals } from './realm'\nimport { validateJsonSchema } from './schema'\nimport type { WorkflowBudgetCaps, WorkflowDelegateResult } from './types'\n\nexport type WorkflowCheckpointRuntimeKind = 'verifier' | 'analyst' | 'reviewer'\n\nconst DEFAULT_CAPS: Required<WorkflowBudgetCaps> = {\n maxCostUsd: Number.POSITIVE_INFINITY,\n maxTokens: Number.POSITIVE_INFINITY,\n maxWallMs: 10 * 60_000,\n maxAgentCalls: 32,\n maxLoopCalls: 16,\n maxFanout: 8,\n maxDepth: 1,\n}\n\nexport async function runWorkflowBody(\n body: string,\n workflowName: string,\n globals: WorkflowRuntimeGlobals,\n syncTimeoutMs = 1000,\n): Promise<unknown> {\n const context = vm.createContext(Object.create(null), {\n name: `workflow:${workflowName}`,\n codeGeneration: { strings: false, wasm: false },\n })\n installWorkflowGlobals(context, globals)\n const script = new vm.Script(\n `\n'use strict'\nconst __workflowMain = async () => {\n${body}\n}\n__workflowMain()\n`,\n { filename: `${workflowName}.workflow.js` },\n )\n return script.runInContext(context, { timeout: syncTimeoutMs })\n}\n\nexport function decodeWorkflowDelegateResult<\n TOptions extends { schema?: unknown; decode?: (value: unknown) => unknown },\n>(result: WorkflowDelegateResult, options: TOptions): unknown {\n if (options.schema) validateJsonSchema(result.output, options.schema as never)\n return options.decode ? options.decode(result.output) : result.output\n}\n\nexport function normalizeWorkflowCaps(caps: WorkflowBudgetCaps = {}): Required<WorkflowBudgetCaps> {\n return {\n maxCostUsd: normalizeCap(caps.maxCostUsd, DEFAULT_CAPS.maxCostUsd, 'maxCostUsd'),\n maxTokens: normalizeCap(caps.maxTokens, DEFAULT_CAPS.maxTokens, 'maxTokens'),\n maxWallMs: normalizeCap(caps.maxWallMs, DEFAULT_CAPS.maxWallMs, 'maxWallMs'),\n maxAgentCalls: normalizeCap(caps.maxAgentCalls, DEFAULT_CAPS.maxAgentCalls, 'maxAgentCalls', {\n integer: true,\n }),\n maxLoopCalls: normalizeCap(caps.maxLoopCalls, DEFAULT_CAPS.maxLoopCalls, 'maxLoopCalls', {\n integer: true,\n }),\n maxFanout: normalizeCap(caps.maxFanout, DEFAULT_CAPS.maxFanout, 'maxFanout', {\n integer: true,\n }),\n maxDepth: normalizeCap(caps.maxDepth, DEFAULT_CAPS.maxDepth, 'maxDepth', { integer: true }),\n }\n}\n\nexport async function waitForWorkflowBudget<T>(\n run: () => Promise<T>,\n budget: WorkflowBudget,\n signal: AbortSignal | undefined,\n abortWorkflow?: () => void,\n scope: 'delegate' | 'body' = 'delegate',\n): Promise<T> {\n budget.assertWall()\n const wallMs = budget.remainingWallMs()\n if (signal?.aborted) throw new ValidationError(`workflow aborted before ${scope} completed`)\n if (wallMs !== undefined && wallMs <= 0) {\n throw new ValidationError('workflow budget exhausted: maxWallMs reached')\n }\n const promise = run()\n if (wallMs === undefined || !Number.isFinite(wallMs)) return promise\n let timeout: ReturnType<typeof setTimeout> | undefined\n let abort: (() => void) | undefined\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n reject(new ValidationError(`workflow ${scope} timed out`))\n abortWorkflow?.()\n }, wallMs)\n abort = () => reject(new ValidationError(`workflow aborted before ${scope} completed`))\n signal?.addEventListener('abort', abort, { once: true })\n }),\n ])\n } finally {\n if (timeout) clearTimeout(timeout)\n if (abort) signal?.removeEventListener('abort', abort)\n }\n}\n\nexport function createWorkflowSignal(external: AbortSignal | undefined): {\n signal: AbortSignal\n abort: () => void\n cleanup: () => void\n} {\n const controller = new AbortController()\n const abort = () => {\n if (!controller.signal.aborted) controller.abort()\n }\n if (external) {\n if (external.aborted) {\n abort()\n } else {\n external.addEventListener('abort', abort, { once: true })\n }\n }\n return {\n signal: controller.signal,\n abort,\n cleanup: () => external?.removeEventListener('abort', abort),\n }\n}\n\nexport function checkpointStartedKind(\n kind: WorkflowCheckpointRuntimeKind,\n): 'workflow.verifier.started' | 'workflow.analyst.started' | 'workflow.reviewer.started' {\n switch (kind) {\n case 'verifier':\n return 'workflow.verifier.started'\n case 'analyst':\n return 'workflow.analyst.started'\n case 'reviewer':\n return 'workflow.reviewer.started'\n }\n}\n\nexport function checkpointEndedKind(\n kind: WorkflowCheckpointRuntimeKind,\n): 'workflow.verifier.ended' | 'workflow.analyst.ended' | 'workflow.reviewer.ended' {\n switch (kind) {\n case 'verifier':\n return 'workflow.verifier.ended'\n case 'analyst':\n return 'workflow.analyst.ended'\n case 'reviewer':\n return 'workflow.reviewer.ended'\n }\n}\n\nexport function checkpointFailedKind(\n kind: WorkflowCheckpointRuntimeKind,\n): 'workflow.verifier.failed' | 'workflow.analyst.failed' | 'workflow.reviewer.failed' {\n switch (kind) {\n case 'verifier':\n return 'workflow.verifier.failed'\n case 'analyst':\n return 'workflow.analyst.failed'\n case 'reviewer':\n return 'workflow.reviewer.failed'\n }\n}\n\nexport function assertWorkflowString(value: unknown, name: string): asserts value is string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new ValidationError(`workflow ${name} must be a non-empty string`)\n }\n}\n\nexport function isRejected<T>(settled: PromiseSettledResult<T>): settled is PromiseRejectedResult {\n return settled.status === 'rejected'\n}\n\nexport function fulfilledValues<T>(settled: readonly PromiseSettledResult<T>[]): T[] {\n return settled.map((item) => (item as PromiseFulfilledResult<T>).value)\n}\n\nfunction normalizeCap(\n value: number | undefined,\n fallback: number,\n field: keyof WorkflowBudgetCaps,\n options: { integer?: boolean } = {},\n): number {\n const cap = value ?? fallback\n if (typeof cap !== 'number' || Number.isNaN(cap) || cap < 0) {\n throw new ValidationError(`workflow caps.${field} must be a non-negative number`)\n }\n if (options.integer && Number.isFinite(cap) && !Number.isInteger(cap)) {\n throw new ValidationError(`workflow caps.${field} must be an integer`)\n }\n return cap\n}\n","import vm from 'node:vm'\nimport { ValidationError } from '../errors'\nimport type { WorkflowMeta } from './types'\n\nexport interface ParsedWorkflowScript {\n meta: WorkflowMeta\n body: string\n}\n\nconst FORBIDDEN_BODY_PATTERNS: Array<[RegExp, string]> = [\n [/\\bimport\\b/, 'import'],\n [/\\bexport\\b/, 'export'],\n [/\\brequire\\b/, 'require'],\n [/\\bprocess\\b/, 'process'],\n [/\\bDate\\b/, 'Date'],\n [/\\bFunction\\b/, 'Function'],\n [/\\beval\\b/, 'eval'],\n [/\\bfetch\\b/, 'fetch'],\n [/\\bXMLHttpRequest\\b/, 'XMLHttpRequest'],\n [/\\bWebSocket\\b/, 'WebSocket'],\n [/\\bsetTimeout\\b/, 'setTimeout'],\n [/\\bsetInterval\\b/, 'setInterval'],\n [/\\bsetImmediate\\b/, 'setImmediate'],\n [/\\bqueueMicrotask\\b/, 'queueMicrotask'],\n [/\\bglobalThis\\b/, 'globalThis'],\n [/\\bwindow\\b/, 'window'],\n [/\\bdocument\\b/, 'document'],\n [/\\bself\\b/, 'self'],\n [/\\bconstructor\\b/, 'constructor'],\n [/\\bprototype\\b/, 'prototype'],\n [/\\b__proto__\\b/, '__proto__'],\n [/\\bmodule\\b/, 'module'],\n [/\\bexports\\b/, 'exports'],\n [/\\bwhile\\b/, 'while'],\n [/\\bdo\\b/, 'do'],\n [/\\bfor\\s*\\(/, 'for-loop'],\n [/\\bMath\\s*\\.\\s*random\\b/, 'Math.random'],\n]\n\nconst FORBIDDEN_META_PATTERNS: Array<[RegExp, string]> = [\n [/\\(/, 'call expression'],\n [/\\bfunction\\b/, 'function'],\n [/=>/, 'arrow function'],\n [/\\bnew\\b/, 'new'],\n [/\\bclass\\b/, 'class'],\n [/\\.\\.\\./, 'spread'],\n [/`/, 'template literal'],\n [/\\bconstructor\\b/, 'constructor'],\n [/\\bprototype\\b/, 'prototype'],\n [/\\b__proto__\\b/, '__proto__'],\n]\n\nexport function parseWorkflowScript(source: string): ParsedWorkflowScript {\n if (typeof source !== 'string' || source.trim().length === 0) {\n throw new ValidationError('workflow source must be a non-empty string')\n }\n const marker = /^\\s*export\\s+const\\s+meta\\s*=\\s*/.exec(source)\n if (!marker) {\n throw new ValidationError('workflow source must start with `export const meta = { ... }`')\n }\n const literalStart = marker[0].length\n const literalEnd = findObjectLiteralEnd(source, literalStart)\n const literal = source.slice(literalStart, literalEnd)\n const restStart = consumeOptionalSemicolon(source, literalEnd)\n const body = source.slice(restStart).trim()\n const meta = evaluateMetaLiteral(literal)\n validateWorkflowBody(body)\n return { meta, body }\n}\n\nexport function validateWorkflowBody(body: string): void {\n if (body.length === 0) {\n throw new ValidationError('workflow body must not be empty')\n }\n if (body.includes('`')) {\n throw new ValidationError('workflow body cannot use template literals')\n }\n const stripped = stripStringsAndComments(body)\n for (const [pattern, label] of FORBIDDEN_BODY_PATTERNS) {\n if (pattern.test(stripped)) {\n throw new ValidationError(`workflow body uses forbidden capability: ${label}`)\n }\n }\n}\n\nfunction findObjectLiteralEnd(source: string, start: number): number {\n let i = start\n while (/\\s/.test(source[i] ?? '')) i += 1\n if (source[i] !== '{') {\n throw new ValidationError('workflow meta must be an object literal')\n }\n let depth = 0\n let quote: '\"' | \"'\" | undefined\n let escaped = false\n for (; i < source.length; i += 1) {\n const ch = source[i]!\n if (quote) {\n if (escaped) {\n escaped = false\n } else if (ch === '\\\\') {\n escaped = true\n } else if (ch === quote) {\n quote = undefined\n }\n continue\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch\n continue\n }\n if (ch === '`') throw new ValidationError('workflow meta cannot use template literals')\n if (ch === '{' || ch === '[') depth += 1\n if (ch === '}' || ch === ']') {\n depth -= 1\n if (depth === 0) return i + 1\n }\n }\n throw new ValidationError('workflow meta object literal is not closed')\n}\n\nfunction consumeOptionalSemicolon(source: string, start: number): number {\n let i = start\n while (/\\s/.test(source[i] ?? '')) i += 1\n if (source[i] === ';') return i + 1\n return i\n}\n\nfunction evaluateMetaLiteral(literal: string): WorkflowMeta {\n for (const [pattern, label] of FORBIDDEN_META_PATTERNS) {\n if (pattern.test(literal)) {\n throw new ValidationError(`workflow meta uses forbidden syntax: ${label}`)\n }\n }\n let value: unknown\n try {\n value = new vm.Script(`(${literal})`).runInNewContext(Object.create(null), {\n timeout: 50,\n contextCodeGeneration: { strings: false, wasm: false },\n })\n } catch (err) {\n throw new ValidationError(\n `workflow meta is not a parseable object literal: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n )\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new ValidationError('workflow meta must evaluate to an object')\n }\n const raw = value as { name?: unknown; description?: unknown; phases?: unknown }\n if (typeof raw.name !== 'string' || raw.name.trim().length === 0) {\n throw new ValidationError('workflow meta.name must be a non-empty string')\n }\n if (typeof raw.description !== 'string' || raw.description.trim().length === 0) {\n throw new ValidationError('workflow meta.description must be a non-empty string')\n }\n const out: WorkflowMeta = {\n name: raw.name,\n description: raw.description,\n }\n if (raw.phases !== undefined) {\n if (!Array.isArray(raw.phases))\n throw new ValidationError('workflow meta.phases must be an array')\n out.phases = raw.phases.map((phase, index) => {\n if (!phase || typeof phase !== 'object' || Array.isArray(phase)) {\n throw new ValidationError(`workflow meta.phases[${index}] must be an object`)\n }\n const title = (phase as { title?: unknown }).title\n if (typeof title !== 'string' || title.trim().length === 0) {\n throw new ValidationError(`workflow meta.phases[${index}].title must be a non-empty string`)\n }\n return { title }\n })\n }\n return out\n}\n\nfunction stripStringsAndComments(source: string): string {\n let out = ''\n let quote: '\"' | \"'\" | undefined\n let escaped = false\n let lineComment = false\n let blockComment = false\n for (let i = 0; i < source.length; i += 1) {\n const ch = source[i]!\n const next = source[i + 1]\n if (lineComment) {\n if (ch === '\\n') {\n lineComment = false\n out += '\\n'\n } else {\n out += ' '\n }\n continue\n }\n if (blockComment) {\n if (ch === '*' && next === '/') {\n blockComment = false\n out += ' '\n i += 1\n } else {\n out += ch === '\\n' ? '\\n' : ' '\n }\n continue\n }\n if (quote) {\n if (escaped) {\n escaped = false\n } else if (ch === '\\\\') {\n escaped = true\n } else if (ch === quote) {\n quote = undefined\n }\n out += ch === '\\n' ? '\\n' : ' '\n continue\n }\n if (ch === '/' && next === '/') {\n lineComment = true\n out += ' '\n i += 1\n continue\n }\n if (ch === '/' && next === '*') {\n blockComment = true\n out += ' '\n i += 1\n continue\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch\n out += ' '\n continue\n }\n out += ch\n }\n return out\n}\n","import { ValidationError } from '../errors'\nimport { runWorkflow } from './runtime'\nimport type {\n WorkflowAgentDelegate,\n WorkflowAgentOptions,\n WorkflowAnalystDelegate,\n WorkflowBudgetCaps,\n WorkflowDelegateContext,\n WorkflowDelegateResult,\n WorkflowLoopDelegate,\n WorkflowResult,\n WorkflowReviewerDelegate,\n WorkflowTraceEmitter,\n WorkflowVerifierDelegate,\n} from './types'\n\nexport interface NestedWorkflowDelegateInput {\n source: string\n options: WorkflowAgentOptions\n parent: WorkflowDelegateContext\n}\n\nexport type NestedWorkflowCapsResolver =\n | WorkflowBudgetCaps\n | ((input: NestedWorkflowDelegateInput) => WorkflowBudgetCaps)\n\nexport type NestedWorkflowMetadataResolver =\n | Record<string, unknown>\n | ((input: NestedWorkflowDelegateInput) => Record<string, unknown> | undefined)\n\nexport interface NestedWorkflowTrace {\n nested: true\n runId: string\n parentRunId: string\n depth: number\n metaName: string\n eventCount: number\n eventKinds: string[]\n durationMs: number\n costUsd: number\n tokenUsage: WorkflowResult['tokenUsage']\n agentCalls: number\n loopCalls: number\n events?: WorkflowResult['events']\n}\n\nexport interface CreateNestedWorkflowAgentDelegateOptions {\n /**\n * Real worker delegate used for normal agent() calls and for child workflow\n * agent() calls that do not opt into allowWorkflow.\n */\n agent: WorkflowAgentDelegate\n caps: NestedWorkflowCapsResolver\n loop?: WorkflowLoopDelegate\n verifier?: WorkflowVerifierDelegate\n analyst?: WorkflowAnalystDelegate\n reviewer?: WorkflowReviewerDelegate\n metadata?: NestedWorkflowMetadataResolver\n traceEmitter?: WorkflowTraceEmitter\n includeEventsInTrace?: boolean\n runId?: (input: NestedWorkflowDelegateInput) => string\n toOutput?: (result: WorkflowResult, input: NestedWorkflowDelegateInput) => unknown\n toTrace?: (result: WorkflowResult, input: NestedWorkflowDelegateInput) => unknown\n}\n\nexport function createNestedWorkflowAgentDelegate(\n options: CreateNestedWorkflowAgentDelegateOptions,\n): WorkflowAgentDelegate {\n if (!options.agent) {\n throw new ValidationError('nested workflow delegate: base agent delegate is required')\n }\n\n const delegate: WorkflowAgentDelegate = async (prompt, agentOptions, ctx) => {\n if (!agentOptions.allowWorkflow) return options.agent(prompt, agentOptions, ctx)\n assertNestedDepth(ctx)\n\n const input: NestedWorkflowDelegateInput = {\n source: prompt,\n options: agentOptions,\n parent: ctx,\n }\n const caps = boundNestedCaps(resolveNestedCaps(options.caps, input), ctx)\n const metadata = resolveMetadata(options.metadata, input)\n const result = await runWorkflow({\n source: prompt,\n runId: options.runId?.(input),\n depth: ctx.depth + 1,\n caps,\n metadata: {\n parentWorkflowRunId: ctx.workflowRunId,\n parentPhase: ctx.phase,\n parentAgentLabel: agentOptions.label,\n ...(ctx.metadata ?? {}),\n ...(metadata ?? {}),\n },\n signal: ctx.signal,\n agent: delegate,\n loop: options.loop,\n verifier: options.verifier,\n analyst: options.analyst,\n reviewer: options.reviewer,\n traceEmitter: options.traceEmitter,\n })\n\n return {\n output: options.toOutput ? options.toOutput(result, input) : result.output,\n costUsd: result.costUsd,\n tokenUsage: result.tokenUsage,\n agentCalls: result.agentCalls,\n loopCalls: result.loopCalls,\n trace: options.toTrace\n ? options.toTrace(result, input)\n : defaultTrace(result, input, options),\n } satisfies WorkflowDelegateResult\n }\n\n return delegate\n}\n\nfunction resolveNestedCaps(\n resolver: NestedWorkflowCapsResolver,\n input: NestedWorkflowDelegateInput,\n): WorkflowBudgetCaps {\n const caps = typeof resolver === 'function' ? resolver(input) : resolver\n if (!caps || typeof caps !== 'object') {\n throw new ValidationError('nested workflow caps must be an object')\n }\n assertFiniteCap(caps.maxWallMs, 'maxWallMs')\n assertFiniteCap(caps.maxAgentCalls, 'maxAgentCalls')\n assertFiniteCap(caps.maxLoopCalls, 'maxLoopCalls')\n assertFiniteCap(caps.maxFanout, 'maxFanout')\n assertFiniteCap(caps.maxDepth, 'maxDepth')\n if (caps.maxCostUsd !== undefined) assertFiniteCap(caps.maxCostUsd, 'maxCostUsd')\n if (caps.maxTokens !== undefined) assertFiniteCap(caps.maxTokens, 'maxTokens')\n return caps\n}\n\nfunction boundNestedCaps(\n caps: WorkflowBudgetCaps,\n ctx: WorkflowDelegateContext,\n): WorkflowBudgetCaps {\n const remaining = ctx.budget.remaining()\n return {\n ...caps,\n maxCostUsd: minOptionalCap(caps.maxCostUsd, remaining.costUsd),\n maxTokens: minOptionalCap(caps.maxTokens, remaining.tokens),\n maxWallMs: minRequiredCap(caps.maxWallMs, remaining.wallMs, 'maxWallMs'),\n maxAgentCalls: minRequiredCap(caps.maxAgentCalls, remaining.agentCalls, 'maxAgentCalls'),\n maxLoopCalls: minRequiredCap(caps.maxLoopCalls, remaining.loopCalls, 'maxLoopCalls'),\n maxFanout: minRequiredCap(caps.maxFanout, ctx.caps.maxFanout, 'maxFanout'),\n maxDepth: minRequiredCap(caps.maxDepth, ctx.caps.maxDepth, 'maxDepth'),\n }\n}\n\nfunction assertNestedDepth(ctx: WorkflowDelegateContext): void {\n const maxDepth = ctx.caps.maxDepth\n if (typeof maxDepth !== 'number' || !Number.isFinite(maxDepth)) {\n throw new ValidationError('nested workflow parent caps.maxDepth must be finite')\n }\n const childDepth = ctx.depth + 1\n if (childDepth > maxDepth) {\n throw new ValidationError(`nested workflow depth ${childDepth} exceeds maxDepth=${maxDepth}`)\n }\n}\n\nfunction minRequiredCap(\n child: number | undefined,\n parent: number | undefined,\n field: keyof WorkflowBudgetCaps,\n): number {\n assertFiniteCap(child, field)\n if (parent === undefined || !Number.isFinite(parent)) return child\n return Math.min(child, parent)\n}\n\nfunction minOptionalCap(child: number | undefined, parent: number | undefined): number | undefined {\n if (child !== undefined && parent !== undefined && Number.isFinite(parent)) {\n return Math.min(child, parent)\n }\n if (child !== undefined) return child\n return parent !== undefined && Number.isFinite(parent) ? parent : undefined\n}\n\nfunction assertFiniteCap(\n value: number | undefined,\n field: keyof WorkflowBudgetCaps,\n): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new ValidationError(`nested workflow caps.${field} must be a finite non-negative number`)\n }\n if (\n (field === 'maxAgentCalls' ||\n field === 'maxLoopCalls' ||\n field === 'maxFanout' ||\n field === 'maxDepth') &&\n !Number.isInteger(value)\n ) {\n throw new ValidationError(`nested workflow caps.${field} must be an integer`)\n }\n}\n\nfunction resolveMetadata(\n resolver: NestedWorkflowMetadataResolver | undefined,\n input: NestedWorkflowDelegateInput,\n): Record<string, unknown> | undefined {\n return typeof resolver === 'function' ? resolver(input) : resolver\n}\n\nfunction defaultTrace(\n result: WorkflowResult,\n input: NestedWorkflowDelegateInput,\n options: CreateNestedWorkflowAgentDelegateOptions,\n): NestedWorkflowTrace {\n return {\n nested: true,\n runId: result.runId,\n parentRunId: input.parent.workflowRunId,\n depth: input.parent.depth + 1,\n metaName: result.meta.name,\n eventCount: result.events.length,\n eventKinds: result.events.map((event) => event.kind),\n durationMs: result.durationMs,\n costUsd: result.costUsd,\n tokenUsage: result.tokenUsage,\n agentCalls: result.agentCalls,\n loopCalls: result.loopCalls,\n ...(options.includeEventsInTrace ? { events: result.events } : {}),\n }\n}\n"],"mappings":"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","names":["defaultTrace","vm","vm","vm","vm","defaultTrace"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tangle-network/agent-runtime",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.44.0",
|
|
4
|
+
"description": "Runs domain agents and automates improving them from their own traces — chat turns and loop topologies, with an analyst→prompt/knowledge→eval-gated-ship self-improvement loop.",
|
|
5
5
|
"homepage": "https://github.com/tangle-network/agent-runtime#readme",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -44,6 +44,11 @@
|
|
|
44
44
|
"import": "./dist/loops.js",
|
|
45
45
|
"default": "./dist/loops.js"
|
|
46
46
|
},
|
|
47
|
+
"./workflow": {
|
|
48
|
+
"types": "./dist/workflow.d.ts",
|
|
49
|
+
"import": "./dist/workflow.js",
|
|
50
|
+
"default": "./dist/workflow.js"
|
|
51
|
+
},
|
|
47
52
|
"./profiles": {
|
|
48
53
|
"types": "./dist/profiles.d.ts",
|
|
49
54
|
"import": "./dist/profiles.js",
|
|
@@ -67,6 +72,17 @@
|
|
|
67
72
|
"publishConfig": {
|
|
68
73
|
"access": "public"
|
|
69
74
|
},
|
|
75
|
+
"scripts": {
|
|
76
|
+
"build": "tsup",
|
|
77
|
+
"dev": "tsup --watch",
|
|
78
|
+
"prepare": "tsup",
|
|
79
|
+
"test": "vitest run",
|
|
80
|
+
"test:watch": "vitest",
|
|
81
|
+
"lint": "biome check src tests examples",
|
|
82
|
+
"lint:fix": "biome check --write src tests examples",
|
|
83
|
+
"typecheck": "tsc --noEmit",
|
|
84
|
+
"verify:package": "node scripts/verify-package-exports.mjs"
|
|
85
|
+
},
|
|
70
86
|
"dependencies": {},
|
|
71
87
|
"devDependencies": {
|
|
72
88
|
"@biomejs/biome": "^2.4.0",
|
|
@@ -77,10 +93,20 @@
|
|
|
77
93
|
"typescript": "^5.7.0",
|
|
78
94
|
"vitest": "^3.0.0"
|
|
79
95
|
},
|
|
96
|
+
"pnpm": {
|
|
97
|
+
"minimumReleaseAge": 4320,
|
|
98
|
+
"minimumReleaseAgeExclude": [
|
|
99
|
+
"@tangle-network/agent-eval"
|
|
100
|
+
],
|
|
101
|
+
"onlyBuiltDependencies": [
|
|
102
|
+
"esbuild"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
80
105
|
"engines": {
|
|
81
106
|
"node": ">=20"
|
|
82
107
|
},
|
|
83
108
|
"license": "MIT",
|
|
109
|
+
"packageManager": "pnpm@10.28.0",
|
|
84
110
|
"peerDependencies": {
|
|
85
111
|
"@tangle-network/agent-eval": ">=0.61.0 <1.0.0",
|
|
86
112
|
"@tangle-network/agent-knowledge": ">=1.3.0 <2.0.0",
|
|
@@ -93,14 +119,5 @@
|
|
|
93
119
|
"@tangle-network/sandbox": {
|
|
94
120
|
"optional": true
|
|
95
121
|
}
|
|
96
|
-
},
|
|
97
|
-
"scripts": {
|
|
98
|
-
"build": "tsup",
|
|
99
|
-
"dev": "tsup --watch",
|
|
100
|
-
"test": "vitest run",
|
|
101
|
-
"test:watch": "vitest",
|
|
102
|
-
"lint": "biome check src tests examples",
|
|
103
|
-
"lint:fix": "biome check --write src tests examples",
|
|
104
|
-
"typecheck": "tsc --noEmit"
|
|
105
122
|
}
|
|
106
|
-
}
|
|
123
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loops/drivers/dynamic.ts","../src/loops/drivers/refine.ts","../src/loops/drivers/sandbox-planner.ts","../src/loops/report-usage.ts","../src/loops/sandbox-events.ts","../src/loops/run-loop.ts","../src/loops/loop-dispatch.ts"],"sourcesContent":["/**\n * @experimental\n *\n * Dynamic driver — the agent authors the loop topology at runtime.\n *\n * Where `refine` and `fanout-vote` encode a fixed shape as a pure function of\n * history, this driver delegates the per-round shape to an injected\n * `TopologyPlanner`. Each round the planner inspects the task + iteration\n * history and emits one `TopologyMove`:\n * - `refine` → one task next round (optionally rewritten from the prior attempt)\n * - `fanout` → N tasks next round (the kernel round-robins `agentRuns`, so a\n * 2-harness fanout dispatches branch 0 to harness A and branch 1 to harness B)\n * - `stop` → terminate; the kernel selects the winner across all iterations\n *\n * The planner is the brain; this driver is the structure. It maps moves onto\n * the kernel's `plan`/`decide` contract, enforces the iteration + fanout caps,\n * and fails loud on a malformed move. The planner is injected exactly like\n * `refine`'s `refineTask` and `fanout-vote`'s `selector` — so a test can drive\n * a deterministic policy through the real kernel, and production can wire it to\n * an LLM via `createSandboxPlanner`.\n *\n * Topology is orthogonal to harness: the planner never names a backend. Which\n * harness runs a branch is decided by the `AgentRunSpec` the kernel round-robins\n * to, so one dynamic driver works across claude-code, codex, opencode, pi —\n * including fanning a single round across several at once.\n */\n\nimport { PlannerError, ValidationError } from '../../errors'\nimport type { Driver, Iteration } from '../types'\n\n/** Terminal once `decide` returns `'done'` (a kernel terminal decision). */\nexport type DynamicDecision = 'continue' | 'done'\n\n/**\n * One topology decision for the next round. `fanout` carries explicit tasks\n * rather than a count so the planner can issue heterogeneous branches (a\n * different sub-task per harness); pass N copies of one task for a homogeneous\n * fanout that relies on `agentRuns` diversity instead.\n *\n * @experimental\n */\nexport type TopologyMove<Task> =\n | { kind: 'refine'; task: Task; rationale?: string; parentIndex?: number }\n | { kind: 'fanout'; tasks: Task[]; rationale?: string; parentIndex?: number }\n | { kind: 'stop'; rationale?: string }\n\n/** @experimental */\nexport interface PlannerContext<Task, Output> {\n /** The root task the loop was invoked with — stable across rounds. */\n task: Task\n /** Every iteration so far, in dispatch order, with outputs + verdicts. */\n history: ReadonlyArray<Iteration<Task, Output>>\n /** `history.length` — iterations already spent. */\n iterationsSpent: number\n /** Iterations left before the driver's `maxIterations` cap forces a stop. */\n iterationsRemaining: number\n}\n\n/**\n * Chooses the next topology move from the task + history. Sync or async; an\n * async planner is where an LLM call goes (see `createSandboxPlanner`).\n *\n * @experimental\n */\nexport type TopologyPlanner<Task, Output> = (\n ctx: PlannerContext<Task, Output>,\n) => TopologyMove<Task> | Promise<TopologyMove<Task>>\n\n/** @experimental */\nexport interface CreateDynamicDriverOptions<Task, Output> {\n /** The agent-authored topology policy. Invoked once per round in `plan`. */\n planner: TopologyPlanner<Task, Output>\n /**\n * Hard safety cap on total iterations. When reached, the driver stops before\n * consulting the planner. Default 8. Set the kernel's `runLoop`\n * `maxIterations >= ` this so the driver's cap governs and the loop closes on\n * a clean `'done'` rather than a truncated `'continue'`.\n */\n maxIterations?: number\n /** Max branches a single `fanout` move may dispatch. Default 4. */\n maxFanout?: number\n /** Stable identifier surfaced in trace events. Default `'dynamic'`. */\n name?: string\n}\n\n/** @experimental */\nexport function createDynamicDriver<Task, Output>(\n options: CreateDynamicDriverOptions<Task, Output>,\n): Driver<Task, Output, DynamicDecision> {\n if (typeof options.planner !== 'function') {\n throw new ValidationError('createDynamicDriver: planner must be a function')\n }\n const maxIterations = options.maxIterations ?? 8\n if (!Number.isFinite(maxIterations) || maxIterations <= 0) {\n throw new ValidationError('createDynamicDriver: maxIterations must be > 0')\n }\n const maxFanout = options.maxFanout ?? 4\n if (!Number.isFinite(maxFanout) || maxFanout < 1) {\n throw new ValidationError('createDynamicDriver: maxFanout must be >= 1')\n }\n\n // The kernel calls plan(), runs the batch, then calls decide() — strictly\n // sequential, one driver instance per loop. Caching the move the planner\n // chose this round lets decide() report terminality without re-invoking the\n // planner (which would double every LLM call).\n let pending: TopologyMove<Task> | undefined\n\n return {\n name: options.name ?? 'dynamic',\n async plan(task, history) {\n if (history.length >= maxIterations) {\n pending = { kind: 'stop', rationale: `maxIterations (${maxIterations}) reached` }\n return []\n }\n const move = await options.planner({\n task,\n history,\n iterationsSpent: history.length,\n iterationsRemaining: maxIterations - history.length,\n })\n pending = validateMove(move, maxFanout)\n switch (pending.kind) {\n case 'refine':\n return [pending.task]\n case 'fanout':\n return pending.tasks\n case 'stop':\n return []\n }\n },\n decide() {\n // pending is set by the plan() call that immediately precedes every\n // decide(). Only a `stop` move terminates; refine/fanout keep looping so\n // plan() — and thus the planner — runs again next round.\n return pending?.kind === 'stop' ? 'done' : 'continue'\n },\n describePlan() {\n // Surface the move the planner just chose (kind + rationale + an optional\n // DECLARED branch source) so the kernel's loop.plan trace carries the\n // agent's intent — including faithful edge lineage when the planner\n // branched off a specific (non-winner) iteration. `pending` is the move\n // set by the preceding plan().\n if (!pending) return undefined\n const out: { kind: string; rationale?: string; parentIndex?: number } = { kind: pending.kind }\n if (pending.rationale !== undefined) out.rationale = pending.rationale\n if (pending.kind !== 'stop' && pending.parentIndex !== undefined) {\n out.parentIndex = pending.parentIndex\n }\n return out\n },\n }\n}\n\nfunction validateMove<Task>(move: TopologyMove<Task>, maxFanout: number): TopologyMove<Task> {\n if (!move || typeof move !== 'object' || typeof (move as { kind?: unknown }).kind !== 'string') {\n throw new PlannerError(`dynamic planner returned a non-move value: ${describe(move)}`)\n }\n switch (move.kind) {\n case 'refine':\n return move\n case 'stop':\n return move\n case 'fanout': {\n if (!Array.isArray(move.tasks) || move.tasks.length === 0) {\n throw new PlannerError('dynamic planner fanout move must carry a non-empty tasks[]')\n }\n if (move.tasks.length <= maxFanout) return move\n // Clamp rather than reject — over-fanning is a budget concern, not a\n // structural error. The clamp is recorded in the rationale for traces.\n return {\n kind: 'fanout',\n tasks: move.tasks.slice(0, maxFanout),\n rationale: `${move.rationale ?? ''} [clamped ${move.tasks.length}→${maxFanout}]`.trim(),\n }\n }\n default:\n throw new PlannerError(\n `dynamic planner returned unknown move kind: ${describe((move as { kind: unknown }).kind)}`,\n )\n }\n}\n\nfunction describe(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value)\n } catch {\n return String(value)\n }\n}\n\n/**\n * Compact, planner-friendly view of iteration history — what an LLM planner\n * needs to choose the next move without the raw event streams. Output is\n * truncated so a long run's prompt stays bounded.\n *\n * @experimental\n */\nexport function summarizeHistory<Task, Output>(\n history: ReadonlyArray<Iteration<Task, Output>>,\n opts: { maxOutputChars?: number } = {},\n): Array<{\n index: number\n agentRunName: string\n valid?: boolean\n score?: number\n error?: string\n output?: string\n}> {\n const maxOutputChars = opts.maxOutputChars ?? 600\n return history.map((iter) => {\n const row: {\n index: number\n agentRunName: string\n valid?: boolean\n score?: number\n error?: string\n output?: string\n } = { index: iter.index, agentRunName: iter.agentRunName }\n if (iter.verdict) {\n row.valid = iter.verdict.valid\n if (typeof iter.verdict.score === 'number') row.score = iter.verdict.score\n }\n if (iter.error) row.error = iter.error.message\n if (iter.output !== undefined) {\n const serialized = describe(iter.output)\n row.output =\n serialized.length > maxOutputChars ? `${serialized.slice(0, maxOutputChars)}…` : serialized\n }\n return row\n })\n}\n","/**\n * @experimental\n *\n * Refine driver — single task per iteration, validator-gated.\n *\n * `plan` returns `[task]` (possibly transformed via `refineTask`) until the\n * prior verdict is valid OR the local cap is hit, then `[]`.\n * `decide` returns `'stop'` once the latest verdict is valid OR the cap is\n * reached. The kernel's `maxIterations` is an orthogonal safety cap;\n * whichever is lower wins.\n */\n\nimport { ValidationError } from '../../errors'\nimport type { DefaultVerdict, Driver, Iteration } from '../types'\n\nexport type RefineDecision = 'continue' | 'stop'\n\n/** @experimental */\nexport interface CreateRefineDriverOptions<Task> {\n /** Hard cap on iterations. Default 5. */\n maxIterations?: number\n /**\n * Optional task transform applied each round based on the prior verdict.\n * When omitted, the same task is replayed and the agent is expected to\n * inspect the sandbox session state for prior attempts.\n */\n refineTask?: (task: Task, prior: DefaultVerdict) => Task\n /** Stable identifier surfaced in trace events. Default `'refine'`. */\n name?: string\n}\n\n/** @experimental */\nexport function createRefineDriver<Task, Output>(\n options: CreateRefineDriverOptions<Task> = {},\n): Driver<Task, Output, RefineDecision> {\n const maxIterations = options.maxIterations ?? 5\n if (!Number.isFinite(maxIterations) || maxIterations <= 0) {\n throw new ValidationError('createRefineDriver: maxIterations must be > 0')\n }\n const refineTask = options.refineTask\n return {\n name: options.name ?? 'refine',\n async plan(task, history) {\n if (history.length >= maxIterations) return []\n if (history.length === 0) return [task]\n const prior = history.at(-1)\n if (!prior) return [task]\n if (prior.verdict?.valid === true) return []\n // Worker error: replay the same task so the agent can self-correct.\n // The driver has no signal beyond `verdict`; only the validator\n // controls \"good enough\".\n if (!refineTask || !prior.verdict) return [prior.task]\n return [refineTask(prior.task, prior.verdict)]\n },\n decide(history) {\n const last = history.at(-1)\n if (!last) return 'continue'\n if (last.verdict?.valid === true) return 'stop'\n if (history.length >= maxIterations) return 'stop'\n return 'continue'\n },\n }\n}\n\n/**\n * Test helper: select the last-valid iteration (or the last attempt if\n * none passed). Mirrors the kernel's default selector ordering for refine\n * topologies — the most recent successful attempt wins.\n *\n * @experimental\n */\nexport function refineWinnerIndex<Task, Output>(\n iterations: ReadonlyArray<Iteration<Task, Output>>,\n): number | undefined {\n for (let i = iterations.length - 1; i >= 0; i -= 1) {\n if (iterations[i]?.verdict?.valid) return i\n }\n return iterations.length > 0 ? iterations.length - 1 : undefined\n}\n","/**\n * @experimental\n *\n * `createSandboxPlanner` — wire the dynamic driver's `TopologyPlanner` to a\n * real agent. Each round it spins a sandbox on `profile`, streams a prompt that\n * carries the history summary, and decodes the agent's chosen `TopologyMove`\n * from a JSON envelope it emits. This is the \"agent authors its own loop\n * topology\" path: the planner profile can be any harness (claude-code, codex,\n * opencode, pi) — its only job is to read what happened and emit the next move.\n *\n * The planner profile is deliberately distinct from the worker `agentRuns`: a\n * cheap fast model can steer topology while expensive workers do the labor, and\n * the planner never names which harness runs a branch — the kernel's\n * `agentRuns` round-robin decides that.\n *\n * Envelope contract the agent must emit (fenced ```json or a structured\n * `result`/`final` event payload):\n * { \"kind\": \"refine\" | \"fanout\" | \"stop\",\n * \"tasks\"?: [ <task>, ... ], // decoded via `decodeTask`\n * \"n\"?: number, // fanout shorthand: N copies of the root task\n * \"rationale\"?: string }\n *\n * A missing / unparseable / unknown-kind envelope throws `PlannerError` — the\n * loop never silently runs a topology the agent did not choose.\n */\n\nimport type { AgentProfile, CreateSandboxOptions, SandboxEvent } from '@tangle-network/sandbox'\nimport { PlannerError, ValidationError } from '../../errors'\nimport type { AgentRunSpec, LoopSandboxClient } from '../types'\nimport type { PlannerContext, TopologyMove, TopologyPlanner } from './dynamic'\nimport { summarizeHistory } from './dynamic'\n\n/** Raw, pre-decode envelope an agent emits to choose the next move. */\nexport interface TopologyMoveEnvelope {\n kind: string\n tasks?: unknown[]\n n?: number\n rationale?: string\n}\n\n/** @experimental */\nexport interface CreateSandboxPlannerOptions<Task, Output> {\n /** Sandbox client — the planner calls `.create()` once per round. */\n client: LoopSandboxClient\n /** The planner agent. Steers topology; does not run the work. */\n profile: AgentProfile\n /**\n * Decode one raw task from the envelope's `tasks[]` into a domain `Task`.\n * Required because `Task` is opaque to this module — only the caller knows\n * its shape. Throw to reject a malformed task; the error surfaces as a\n * `PlannerError`.\n */\n decodeTask: (raw: unknown, ctx: PlannerContext<Task, Output>) => Task\n /** Override the default prompt (history summary + envelope contract). */\n buildPrompt?: (ctx: PlannerContext<Task, Output>) => string\n /** Override envelope extraction from the event stream. */\n parseEnvelope?: (events: SandboxEvent[]) => TopologyMoveEnvelope | undefined\n /** Sandbox overrides for the planner sandbox (timeouts, env, etc.). */\n sandboxOverrides?: AgentRunSpec<Task>['sandboxOverrides']\n /** Cancellation for the planner's own LLM call. */\n signal?: AbortSignal\n}\n\n/** @experimental */\nexport function createSandboxPlanner<Task, Output>(\n opts: CreateSandboxPlannerOptions<Task, Output>,\n): TopologyPlanner<Task, Output> {\n if (!opts.client || typeof opts.client.create !== 'function') {\n throw new ValidationError('createSandboxPlanner: client.create is required')\n }\n if (typeof opts.decodeTask !== 'function') {\n throw new ValidationError('createSandboxPlanner: decodeTask is required')\n }\n const buildPrompt = opts.buildPrompt ?? defaultBuildPrompt\n const parseEnvelope = opts.parseEnvelope ?? defaultParseEnvelope\n\n return async (ctx) => {\n const box = await opts.client.create(buildSandboxOptions(opts.profile, opts.sandboxOverrides))\n const events: SandboxEvent[] = []\n for await (const event of box.streamPrompt(buildPrompt(ctx), { signal: opts.signal })) {\n events.push(event)\n }\n const envelope = parseEnvelope(events)\n if (!envelope) {\n throw new PlannerError('sandbox planner emitted no parseable topology-move envelope')\n }\n return envelopeToMove(envelope, ctx, opts.decodeTask)\n }\n}\n\nfunction envelopeToMove<Task, Output>(\n envelope: TopologyMoveEnvelope,\n ctx: PlannerContext<Task, Output>,\n decodeTask: (raw: unknown, ctx: PlannerContext<Task, Output>) => Task,\n): TopologyMove<Task> {\n const kind = String(envelope.kind ?? '').toLowerCase()\n const rationale = typeof envelope.rationale === 'string' ? envelope.rationale : undefined\n if (kind === 'stop') {\n return { kind: 'stop', rationale }\n }\n if (kind === 'refine') {\n const raw = Array.isArray(envelope.tasks) ? envelope.tasks[0] : undefined\n // No new task → replay the root task; the worker self-corrects from its\n // own prior attempt in sandbox state, mirroring the refine driver default.\n const task = raw === undefined ? ctx.task : decodeTaskGuarded(decodeTask, raw, ctx)\n return { kind: 'refine', task, rationale }\n }\n if (kind === 'fanout') {\n const tasks = resolveFanoutTasks(envelope, ctx, decodeTask)\n return { kind: 'fanout', tasks, rationale }\n }\n throw new PlannerError(\n `sandbox planner emitted unknown move kind: ${JSON.stringify(envelope.kind)}`,\n )\n}\n\nfunction resolveFanoutTasks<Task, Output>(\n envelope: TopologyMoveEnvelope,\n ctx: PlannerContext<Task, Output>,\n decodeTask: (raw: unknown, ctx: PlannerContext<Task, Output>) => Task,\n): Task[] {\n if (Array.isArray(envelope.tasks) && envelope.tasks.length > 0) {\n return envelope.tasks.map((raw) => decodeTaskGuarded(decodeTask, raw, ctx))\n }\n // `n` shorthand: N copies of the root task, leaning on `agentRuns` diversity.\n if (typeof envelope.n === 'number' && Number.isFinite(envelope.n) && envelope.n >= 1) {\n return Array.from({ length: Math.floor(envelope.n) }, () => ctx.task)\n }\n throw new PlannerError('sandbox planner fanout envelope needs a non-empty tasks[] or n >= 1')\n}\n\nfunction decodeTaskGuarded<Task, Output>(\n decodeTask: (raw: unknown, ctx: PlannerContext<Task, Output>) => Task,\n raw: unknown,\n ctx: PlannerContext<Task, Output>,\n): Task {\n try {\n return decodeTask(raw, ctx)\n } catch (err) {\n throw new PlannerError(`sandbox planner decodeTask rejected ${JSON.stringify(raw)}`, {\n cause: err,\n })\n }\n}\n\nfunction buildSandboxOptions(\n profile: AgentProfile,\n overrides: AgentRunSpec<unknown>['sandboxOverrides'],\n): CreateSandboxOptions {\n const base = overrides ?? {}\n const overrideBackend = base.backend\n const explicitType = profile.metadata?.backendType\n type BackendType = NonNullable<CreateSandboxOptions['backend']>['type']\n return {\n ...base,\n backend: {\n type: (overrideBackend?.type ?? explicitType ?? 'opencode') as BackendType,\n profile,\n ...(overrideBackend?.model ? { model: overrideBackend.model } : {}),\n ...(overrideBackend?.server ? { server: overrideBackend.server } : {}),\n },\n }\n}\n\nfunction defaultBuildPrompt<Task, Output>(ctx: PlannerContext<Task, Output>): string {\n const summary = summarizeHistory(ctx.history)\n return [\n 'You are the loop planner. You do not do the work — you decide the topology of the next round.',\n '',\n `Root task:\\n${safeJson(ctx.task)}`,\n '',\n `Iterations spent: ${ctx.iterationsSpent}. Remaining before the hard cap: ${ctx.iterationsRemaining}.`,\n '',\n ctx.history.length === 0\n ? 'No attempts yet.'\n : `Attempts so far (index, agent, verdict, output):\\n${safeJson(summary)}`,\n '',\n 'Choose ONE move and emit it as a fenced JSON block:',\n ' - {\"kind\":\"refine\",\"tasks\":[<task>],\"rationale\":\"...\"} — one more attempt; omit tasks to replay the root task.',\n ' - {\"kind\":\"fanout\",\"tasks\":[<task>,<task>],\"rationale\":\"...\"} — N parallel branches (or \"n\": N for N copies of the root task).',\n ' - {\"kind\":\"stop\",\"rationale\":\"...\"} — a valid result exists or further attempts will not help.',\n '',\n 'Stop as soon as an attempt is valid. Prefer refine when an attempt is close; fan out when attempts disagree or the approach is uncertain.',\n 'Emit ONLY the JSON block.',\n ].join('\\n')\n}\n\nfunction defaultParseEnvelope(events: SandboxEvent[]): TopologyMoveEnvelope | undefined {\n // Structured payload on a terminal event wins — sandbox SDKs lift emitted\n // JSON onto data.result / data.output / data of a result|final event.\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i]\n if (!event) continue\n const type = String(event.type ?? '')\n const data = isRecord(event.data) ? event.data : undefined\n if (!data) continue\n if (type === 'result' || type === 'final' || type === 'planner.move') {\n const direct = coerceEnvelope(data.result ?? data.output ?? data)\n if (direct) return direct\n }\n }\n // Fall back to a fenced JSON block in the most recent text delta.\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i]\n if (!event) continue\n const data = isRecord(event.data) ? event.data : undefined\n if (!data) continue\n const text = pickString(data.text) ?? pickString(data.delta) ?? pickString(data.content)\n if (!text) continue\n const fenced = extractFencedJson(text)\n const coerced = coerceEnvelope(fenced)\n if (coerced) return coerced\n }\n return undefined\n}\n\nfunction coerceEnvelope(value: unknown): TopologyMoveEnvelope | undefined {\n if (!isRecord(value)) return undefined\n if (typeof value.kind !== 'string' || value.kind.length === 0) return undefined\n const out: TopologyMoveEnvelope = { kind: value.kind }\n if (Array.isArray(value.tasks)) out.tasks = value.tasks\n if (typeof value.n === 'number') out.n = value.n\n if (typeof value.rationale === 'string') out.rationale = value.rationale\n return out\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction pickString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction extractFencedJson(text: string): unknown | undefined {\n const match = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/i)\n const body = (match?.[1] ?? text).trim()\n if (!body) return undefined\n try {\n return JSON.parse(body)\n } catch {\n return undefined\n }\n}\n\nfunction safeJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2) ?? String(value)\n } catch {\n return String(value)\n }\n}\n","/**\n * Bridge a finished `runLoop` into an agent-eval campaign / profile-matrix\n * dispatch.\n *\n * `runProfileMatrix` (and `runCampaign`) run the backend-integrity guard over\n * the token usage a dispatch reports through `ctx.cost`. A dispatch that wraps\n * `runLoop` must forward the loop's cost AND token usage, or the guard reads\n * the run as a stub and throws. `reportLoopUsage` is that one line:\n *\n * const dispatch: ProfileDispatchFn<S, A> = async (profile, scenario, ctx) => {\n * const result = await runLoop({ ...optsFor(profile, scenario), ctx: loopCtx })\n * reportLoopUsage(ctx, result)\n * return result.winner?.output as A\n * }\n *\n * Typed structurally against the campaign `DispatchContext.cost` so this module\n * stays free of an agent-eval import — it works with any cost meter exposing\n * `observe` + `observeTokens`.\n */\n\nimport type { LoopResult } from './types'\n\n/** The slice of an agent-eval campaign `DispatchContext.cost` this needs. */\nexport interface UsageSink {\n observe(amountUsd: number, source: string): void\n observeTokens(usage: { input: number; output: number }): void\n}\n\n/**\n * Forward a `LoopResult`'s aggregated cost + token usage into a campaign cost\n * meter so the backend-integrity guard sees real LLM activity. `source`\n * defaults to `'loop'`.\n */\nexport function reportLoopUsage<Task, Output, Decision>(\n cost: UsageSink,\n result: Pick<LoopResult<Task, Output, Decision>, 'costUsd' | 'tokenUsage'>,\n source = 'loop',\n): void {\n cost.observe(result.costUsd, source)\n cost.observeTokens({ input: result.tokenUsage.input, output: result.tokenUsage.output })\n}\n","/**\n * Sandbox-event → runtime-event mapping.\n *\n * The sandbox SDK emits a polymorphic `SandboxEvent = { type, data, id? }`\n * whose `type` vocabulary is backend-determined (opencode, etc.) rather than\n * enumerated by the SDK. Two consumers project it:\n * - the loop kernel's cost ledger (`extractLlmCallEvent`) — sums usage off\n * every cost-bearing event, regardless of stream shape;\n * - the `AgentRuntime.act` streaming contract (`mapSandboxEvent`) — projects\n * incremental events to the `RuntimeStreamEvent` chat-UX vocabulary.\n *\n * Both live here so the empirically-observed `type` vocabulary has one home.\n */\n\nimport type { SandboxEvent } from '@tangle-network/sandbox'\nimport type { RuntimeStreamEvent } from '../types'\n\n/**\n * Extract a `RuntimeStreamEvent`-shaped `llm_call` from a sandbox event when\n * the event carries usage/cost data. Returns `undefined` for non-cost events\n * so the kernel can iterate the full stream without branching.\n *\n * Canonical cost-carrying types observed in the wild:\n * - `llm_call` — `data: { model, tokensIn, tokensOut, costUsd, ... }`\n * - `message.completed` / `result` — `data: { usage: { inputTokens,\n * outputTokens, totalCostUsd? } }`\n * - `cost.usage` / `usage` — same shape under a dedicated type\n *\n * Numeric coercion is strict: `Number.isFinite` gates every accumulator write\n * so a sentinel `NaN` from a misbehaving backend cannot poison the ledger.\n */\nexport function extractLlmCallEvent(\n event: SandboxEvent,\n agentRunName: string,\n): (RuntimeStreamEvent & { type: 'llm_call' }) | undefined {\n if (!event || typeof event !== 'object') return undefined\n const type = String(event.type ?? '')\n const data =\n event.data && typeof event.data === 'object'\n ? (event.data as Record<string, unknown>)\n : ({} as Record<string, unknown>)\n\n if (type === 'llm_call' || type === 'cost.usage' || type === 'usage') {\n return buildLlmCall(data, agentRunName)\n }\n if (type === 'message.completed' || type === 'result' || type === 'final') {\n const usage = data.usage as Record<string, unknown> | undefined\n if (!usage || typeof usage !== 'object') return undefined\n return buildLlmCall({ ...usage, model: data.model ?? usage.model }, agentRunName)\n }\n // sandbox 0.4.0 terminal event: `data = { tokenUsage: { inputTokens, outputTokens,\n // reasoningTokens, cacheReadInputTokens }, totalCostUsd }`. Usage lives under\n // `tokenUsage` (not `usage`) and the cost is top-level — neither matched the\n // branches above, so an in-process loopDispatch run reported {0,0} and the\n // backend-integrity guard misread a real run as a stub. Reasoning tokens are\n // billed output (reasoning models), so they fold into the output count.\n if (type === 'done') {\n const usage = data.tokenUsage as Record<string, unknown> | undefined\n if (!usage || typeof usage !== 'object') return undefined\n const out = pickFiniteNumber(usage, ['outputTokens', 'completion_tokens', 'tokensOut'])\n const reasoning = pickFiniteNumber(usage, ['reasoningTokens'])\n const mergedOut =\n out !== undefined || reasoning !== undefined ? (out ?? 0) + (reasoning ?? 0) : undefined\n return buildLlmCall(\n {\n inputTokens: usage.inputTokens,\n outputTokens: mergedOut,\n totalCostUsd: data.totalCostUsd,\n model: data.model ?? usage.model,\n },\n agentRunName,\n )\n }\n return undefined\n}\n\nfunction buildLlmCall(\n data: Record<string, unknown>,\n agentRunName: string,\n): (RuntimeStreamEvent & { type: 'llm_call' }) | undefined {\n const tokensIn = pickFiniteNumber(data, ['tokensIn', 'inputTokens', 'prompt_tokens'])\n const tokensOut = pickFiniteNumber(data, ['tokensOut', 'outputTokens', 'completion_tokens'])\n const costUsd = pickFiniteNumber(data, ['costUsd', 'totalCostUsd', 'cost_usd', 'cost'])\n if (tokensIn === undefined && tokensOut === undefined && costUsd === undefined) {\n return undefined\n }\n const model = typeof data.model === 'string' && data.model.length > 0 ? data.model : agentRunName\n const event: RuntimeStreamEvent & { type: 'llm_call' } = {\n type: 'llm_call',\n model,\n }\n if (tokensIn !== undefined) event.tokensIn = tokensIn\n if (tokensOut !== undefined) event.tokensOut = tokensOut\n if (costUsd !== undefined) event.costUsd = costUsd\n return event\n}\n\nfunction pickFiniteNumber(data: Record<string, unknown>, keys: string[]): number | undefined {\n for (const key of keys) {\n const value = data[key]\n if (typeof value === 'number' && Number.isFinite(value)) return value\n }\n return undefined\n}\n\n/**\n * Project one `SandboxEvent` onto the `RuntimeStreamEvent` chat-UX vocabulary,\n * for runtimes that bridge a sandbox `streamPrompt` into the\n * `AgentRuntime.act` streaming contract. Returns `undefined` for events that\n * have no faithful projection — the raw stream is preserved separately for the\n * `OutputAdapter`, so an unmapped event never loses data.\n *\n * Mapped (the task-optional incremental variants — no synthesized task\n * lifecycle, no guessed tool-part shapes):\n * - `message.part.updated` text part → `text_delta`\n * - `message.part.updated` reasoning/thinking part → `reasoning_delta`\n * - cost-bearing events → `llm_call` (shared with the ledger extractor)\n *\n * The opencode backend emits incremental text as\n * `{ type: 'message.part.updated', data: { part: { type, text }, delta } }`;\n * `delta` is the increment, `part.text` the running accumulation.\n */\nexport function mapSandboxEvent(\n event: SandboxEvent,\n opts: { agentRunName?: string } = {},\n): RuntimeStreamEvent | undefined {\n if (!event || typeof event !== 'object') return undefined\n const type = String(event.type ?? '')\n const data =\n event.data && typeof event.data === 'object'\n ? (event.data as Record<string, unknown>)\n : ({} as Record<string, unknown>)\n\n if (type === 'message.part.updated') {\n const part =\n data.part && typeof data.part === 'object' ? (data.part as Record<string, unknown>) : {}\n const partType = String(part.type ?? '')\n const delta = typeof data.delta === 'string' ? data.delta : undefined\n const text = delta ?? (typeof part.text === 'string' ? part.text : undefined)\n if (text === undefined) return undefined\n if (partType === 'text') return { type: 'text_delta', text }\n if (partType === 'reasoning' || partType === 'thinking')\n return { type: 'reasoning_delta', text }\n return undefined\n }\n\n return extractLlmCallEvent(event, opts.agentRunName ?? 'agent')\n}\n","/**\n * @experimental\n *\n * `runLoop` — the topology-agnostic kernel built atop the sandbox SDK.\n *\n * Each iteration:\n * 1. `driver.plan(task, history)` → N tasks (1 = refine, N = fanout, 0 = stop)\n * 2. For each task (parallel, bounded by `maxConcurrency`):\n * a. round-robin an `AgentRunSpec` from `agentRuns`\n * b. `sandboxClient.create({ backend: { profile }, ...overrides })`\n * c. emit `loop.iteration.dispatch` with the placement\n * (`{ sibling, sandboxId }` or `{ fleet, fleetId, machineId, sandboxId }`)\n * d. iterate `box.streamPrompt(taskToPrompt(task))` and collect events\n * 3. `output.parse(events)` → typed `Output`\n * 4. `validator?.validate(output)` → `DefaultVerdict`\n * 5. Append `Iteration` to history; emit `loop.iteration.ended`\n * 6. `driver.decide(history)` → if terminal, return result + winner\n *\n * The kernel owns: iteration accounting, per-iteration timing, error\n * capture, abort propagation, concurrency cap, cost aggregation, and trace\n * emission. The kernel does NOT own: what the agent runs (sandbox SDK +\n * profile), how outputs are decoded (output adapter), how outputs are\n * scored (validator), or topology (driver).\n */\n\nimport type {\n AgentProfile,\n CreateSandboxOptions,\n SandboxEvent,\n SandboxInstance,\n} from '@tangle-network/sandbox'\nimport { ValidationError } from '../errors'\nimport { extractLlmCallEvent } from './sandbox-events'\nimport type {\n AgentRunSpec,\n Driver,\n ExecCtx,\n Iteration,\n LoopResult,\n LoopSandboxClient,\n LoopSandboxPlacement,\n LoopTraceEmitter,\n LoopTraceEvent,\n LoopWinner,\n OutputAdapter,\n Validator,\n} from './types'\n\nconst DEFAULT_MAX_ITERATIONS = 10\nconst DEFAULT_MAX_CONCURRENCY = 4\n\n/** @experimental */\nexport interface RunLoopOptions<Task, Output, Decision> {\n driver: Driver<Task, Output, Decision>\n /**\n * Single agent spec — every iteration uses this profile. Mutually\n * exclusive with `agentRuns`.\n */\n agentRun?: AgentRunSpec<Task>\n /**\n * Multiple specs for heterogeneous fanout. The kernel round-robins\n * through them when the driver plans N tasks. Mutually exclusive with\n * `agentRun`.\n */\n agentRuns?: AgentRunSpec<Task>[]\n output: OutputAdapter<Output>\n validator?: Validator<Output>\n task: Task\n ctx: ExecCtx\n /** Default 10. Hard cap on total iterations across all `plan()` rounds. */\n maxIterations?: number\n /** Default 4. In-flight worker cap within a single `plan()` batch. */\n maxConcurrency?: number\n /**\n * Pre-allocated id for trace correlation. Default = `loop-${random}`.\n * Surfaces as `runId` on every emitted `LoopTraceEvent`.\n */\n runId?: string\n /**\n * Clock override; default `Date.now`. Deterministic tests pass a\n * monotonic counter to stabilize iteration timing fields.\n */\n now?: () => number\n /**\n * Override the default winner selector (highest-valid-score, ties broken\n * by earliest iteration).\n */\n selectWinner?: (iterations: Iteration<Task, Output>[]) => LoopWinner<Task, Output> | undefined\n}\n\n/** @experimental */\nexport async function runLoop<Task, Output, Decision>(\n options: RunLoopOptions<Task, Output, Decision>,\n): Promise<LoopResult<Task, Output, Decision>> {\n const specs = resolveAgentRuns(options)\n const maxIterations = options.maxIterations ?? DEFAULT_MAX_ITERATIONS\n if (!Number.isFinite(maxIterations) || maxIterations <= 0) {\n throw new ValidationError('runLoop: maxIterations must be > 0')\n }\n const maxConcurrency = options.maxConcurrency ?? DEFAULT_MAX_CONCURRENCY\n if (!Number.isFinite(maxConcurrency) || maxConcurrency <= 0) {\n throw new ValidationError('runLoop: maxConcurrency must be > 0')\n }\n if (!options.ctx?.sandboxClient || typeof options.ctx.sandboxClient.create !== 'function') {\n throw new ValidationError('runLoop: ctx.sandboxClient.create is required')\n }\n const now = options.now ?? Date.now\n const runId = options.runId ?? `loop-${randomSuffix()}`\n const loopStart = now()\n const driverName = options.driver.name ?? 'driver'\n const iterations: Iteration<Task, Output>[] = []\n let round = 0\n\n await emitTrace(options.ctx.traceEmitter, {\n kind: 'loop.started',\n runId,\n timestamp: now(),\n payload: {\n driver: driverName,\n agentRunNames: specs.map((spec) => spec.name ?? spec.profile.name ?? 'agent'),\n maxIterations,\n maxConcurrency,\n },\n })\n\n const controller = new AbortController()\n const onOuterAbort = () => controller.abort()\n if (options.ctx.signal) {\n if (options.ctx.signal.aborted) controller.abort()\n else options.ctx.signal.addEventListener('abort', onOuterAbort, { once: true })\n }\n\n try {\n while (iterations.length < maxIterations) {\n if (controller.signal.aborted) throwAbort()\n const planned = await options.driver.plan(options.task, iterations)\n const planDesc = options.driver.describePlan?.()\n const roundIndex = round\n const baseIndex = iterations.length\n const remaining = maxIterations - iterations.length\n const slice = planned.slice(0, remaining)\n // Edge lineage: a driver may DECLARE the branch source (planner-authored\n // topology); otherwise the kernel infers it — round 0 branches from root\n // (undefined), later rounds from the best-valid (else latest) iteration so\n // far. Either way it's emitted, not guessed by the viewer.\n const parentIndex =\n planDesc?.parentIndex ?? (roundIndex === 0 ? undefined : branchPoint(iterations))\n const childIndices = slice.map((_, i) => baseIndex + i)\n await emitTrace(options.ctx.traceEmitter, {\n kind: 'loop.plan',\n runId,\n timestamp: now(),\n payload: {\n roundIndex,\n plannedCount: planned.length,\n moveKind:\n planDesc?.kind ??\n (planned.length === 0 ? 'stop' : planned.length === 1 ? 'refine' : 'fanout'),\n rationale: planDesc?.rationale,\n parentIndex,\n childIndices,\n },\n })\n round += 1\n if (planned.length === 0) break\n\n // Reserve slots up front so concurrent workers may mutate by index.\n for (let i = 0; i < slice.length; i += 1) {\n const spec = specs[(baseIndex + i) % specs.length]!\n iterations.push({\n index: baseIndex + i,\n task: slice[i] as Task,\n agentRunName: spec.name ?? spec.profile.name ?? 'agent',\n events: [],\n startedAt: now(),\n endedAt: 0,\n costUsd: 0,\n tokenUsage: { input: 0, output: 0 },\n })\n }\n\n await runBatch({\n slice,\n baseIndex,\n iterations,\n specs,\n output: options.output,\n validator: options.validator,\n maxConcurrency,\n signal: controller.signal,\n ctx: options.ctx,\n runId,\n now,\n roundIndex,\n parentIndex,\n })\n\n if (controller.signal.aborted) throwAbort()\n\n const decision = await options.driver.decide(iterations)\n await emitTrace(options.ctx.traceEmitter, {\n kind: 'loop.decision',\n runId,\n timestamp: now(),\n payload: { decision: serializeDecision(decision), historyLength: iterations.length },\n })\n if (isTerminalDecision(decision)) {\n return finalize({\n options,\n decision,\n iterations,\n startMs: loopStart,\n now,\n runId,\n })\n }\n }\n\n if (iterations.length >= maxIterations) {\n // Cap reached without a terminal decision — ask the driver one more time\n // for its final state, then close out.\n const decision = await options.driver.decide(iterations)\n await emitTrace(options.ctx.traceEmitter, {\n kind: 'loop.decision',\n runId,\n timestamp: now(),\n payload: { decision: serializeDecision(decision), historyLength: iterations.length },\n })\n return finalize({ options, decision, iterations, startMs: loopStart, now, runId })\n }\n // `plan()` returned `[]` before `decide()` reached a terminal state.\n const decision = await options.driver.decide(iterations)\n await emitTrace(options.ctx.traceEmitter, {\n kind: 'loop.decision',\n runId,\n timestamp: now(),\n payload: { decision: serializeDecision(decision), historyLength: iterations.length },\n })\n return finalize({ options, decision, iterations, startMs: loopStart, now, runId })\n } finally {\n if (options.ctx.signal) options.ctx.signal.removeEventListener('abort', onOuterAbort)\n }\n}\n\ninterface RunBatchArgs<Task, Output> {\n slice: Task[]\n baseIndex: number\n iterations: Iteration<Task, Output>[]\n specs: AgentRunSpec<Task>[]\n output: OutputAdapter<Output>\n validator: Validator<Output> | undefined\n maxConcurrency: number\n signal: AbortSignal\n ctx: ExecCtx\n runId: string\n now: () => number\n /** Plan round these iterations belong to — stamped as `groupId`. */\n roundIndex: number\n /** Iteration this round branched from — stamped as `parentIndex`. */\n parentIndex?: number\n}\n\nasync function runBatch<Task, Output>(args: RunBatchArgs<Task, Output>) {\n const queue = args.slice.map((task, offset) => ({ task, index: args.baseIndex + offset }))\n const inflight = new Set<Promise<void>>()\n while (queue.length > 0 || inflight.size > 0) {\n while (inflight.size < args.maxConcurrency && queue.length > 0) {\n const item = queue.shift()!\n const p = executeIteration({ ...args, item }).finally(() => inflight.delete(p))\n inflight.add(p)\n }\n if (inflight.size === 0) break\n await Promise.race(inflight)\n }\n}\n\ninterface ExecuteIterationArgs<Task, Output> extends RunBatchArgs<Task, Output> {\n item: { task: Task; index: number }\n}\n\nasync function executeIteration<Task, Output>(args: ExecuteIterationArgs<Task, Output>) {\n const slot = args.iterations[args.item.index]\n if (!slot)\n throw new ValidationError(`runLoop: missing iteration slot at index ${args.item.index}`)\n const spec = args.specs[args.item.index % args.specs.length]\n if (!spec) throw new ValidationError('runLoop: no AgentRunSpec available for iteration')\n slot.startedAt = args.now()\n slot.agentRunName = spec.name ?? spec.profile.name ?? 'agent'\n\n await emitTrace(args.ctx.traceEmitter, {\n kind: 'loop.iteration.started',\n runId: args.runId,\n timestamp: args.now(),\n payload: {\n iterationIndex: args.item.index,\n agentRunName: slot.agentRunName,\n taskHash: hashJson(args.item.task),\n groupId: args.roundIndex,\n parentIndex: args.parentIndex,\n },\n })\n\n try {\n const box = await createSandboxForSpec(args.ctx.sandboxClient, spec, args.signal)\n const placement = describePlacementSafe(args.ctx.sandboxClient, box)\n await emitTrace(args.ctx.traceEmitter, {\n kind: 'loop.iteration.dispatch',\n runId: args.runId,\n timestamp: args.now(),\n payload: {\n iterationIndex: args.item.index,\n agentRunName: slot.agentRunName,\n placement: placement.kind,\n sandboxId: placement.sandboxId,\n fleetId: placement.fleetId,\n machineId: placement.machineId,\n groupId: args.roundIndex,\n parentIndex: args.parentIndex,\n },\n })\n const message = spec.taskToPrompt(args.item.task)\n const events: SandboxEvent[] = []\n for await (const event of box.streamPrompt(message, { signal: args.signal })) {\n events.push(event)\n const llmCall = extractLlmCallEvent(event, slot.agentRunName)\n if (llmCall) {\n slot.costUsd += llmCall.costUsd ?? 0\n slot.tokenUsage.input += llmCall.tokensIn ?? 0\n slot.tokenUsage.output += llmCall.tokensOut ?? 0\n args.ctx.runHandle?.observe(llmCall)\n }\n }\n slot.events = events\n slot.output = args.output.parse(events)\n if (args.validator) {\n slot.verdict = await args.validator.validate(slot.output, {\n iteration: args.item.index,\n signal: args.signal,\n traceEmitter: args.ctx.traceEmitter,\n })\n }\n } catch (err) {\n slot.error = err instanceof Error ? err : new Error(String(err))\n } finally {\n slot.endedAt = args.now()\n await emitTrace(args.ctx.traceEmitter, {\n kind: 'loop.iteration.ended',\n runId: args.runId,\n timestamp: args.now(),\n payload: {\n iterationIndex: args.item.index,\n agentRunName: slot.agentRunName,\n outputHash: slot.output !== undefined ? hashJson(slot.output) : undefined,\n verdict: slot.verdict,\n error: slot.error?.message,\n costUsd: slot.costUsd,\n durationMs: slot.endedAt - slot.startedAt,\n tokenUsage:\n slot.tokenUsage.input || slot.tokenUsage.output ? { ...slot.tokenUsage } : undefined,\n groupId: args.roundIndex,\n parentIndex: args.parentIndex,\n outputPreview: slot.output !== undefined ? previewOutput(slot.output) : undefined,\n },\n })\n }\n}\n\n/**\n * Branch point for a new round — the iteration a later round descends from.\n * Highest-valid-score iteration so far; ties + no-valid fall back to the latest\n * index. Inferred (not driver-declared), so refine renders as a chain and\n * fanout→refine chains off the fanout winner.\n */\nfunction branchPoint<Task, Output>(\n iterations: ReadonlyArray<Iteration<Task, Output>>,\n): number | undefined {\n if (iterations.length === 0) return undefined\n let best = iterations.length - 1\n let bestScore = -Infinity\n for (const iter of iterations) {\n if (iter.verdict?.valid !== true) continue\n const score = iter.verdict.score ?? 0\n if (score > bestScore) {\n bestScore = score\n best = iter.index\n }\n }\n return best\n}\n\n/** Bounded string preview of a parsed output for a viewer's drawer — never the\n * full payload. JSON when serializable, else `String()`, truncated to 280. */\nfunction previewOutput(output: unknown): string {\n let s: string\n try {\n s = typeof output === 'string' ? output : (JSON.stringify(output) ?? String(output))\n } catch {\n s = String(output)\n }\n return s.length > 280 ? `${s.slice(0, 280)}…` : s\n}\n\nfunction describePlacementSafe(\n client: LoopSandboxClient,\n box: SandboxInstance,\n): LoopSandboxPlacement {\n if (typeof client.describePlacement === 'function') {\n try {\n const result = client.describePlacement(box)\n if (\n result &&\n typeof result === 'object' &&\n (result.kind === 'sibling' || result.kind === 'fleet')\n ) {\n return {\n kind: result.kind,\n sandboxId: result.sandboxId ?? readSandboxId(box),\n fleetId: result.fleetId,\n machineId: result.machineId,\n }\n }\n } catch {\n // Adapter bug must not corrupt the iteration; fall through to default.\n }\n }\n return { kind: 'sibling', sandboxId: readSandboxId(box) }\n}\n\nfunction readSandboxId(box: SandboxInstance): string | undefined {\n const raw = (box as unknown as { id?: unknown }).id\n return typeof raw === 'string' && raw.length > 0 ? raw : undefined\n}\n\n/**\n * Instantiate a sandbox for an `AgentRunSpec`: sets `backend.profile` to the\n * spec's profile (inferring the backend type when the spec doesn't override\n * it) and merges `sandboxOverrides`. Shared by the loop kernel and the\n * `AgentRuntime.act` sandbox bridge so both boot the sandbox identically.\n */\nexport async function createSandboxForSpec<Task>(\n client: LoopSandboxClient,\n spec: AgentRunSpec<Task>,\n signal: AbortSignal,\n): Promise<SandboxInstance> {\n const overrides = spec.sandboxOverrides ?? {}\n const overrideBackend = overrides.backend\n const opts: CreateSandboxOptions = {\n ...overrides,\n backend: {\n type: overrideBackend?.type ?? inferBackendType(spec.profile),\n profile: spec.profile satisfies AgentProfile,\n ...(overrideBackend?.model ? { model: overrideBackend.model } : {}),\n ...(overrideBackend?.server ? { server: overrideBackend.server } : {}),\n },\n }\n // Cooperative cancellation: if the abort signal fires while .create is\n // pending, the promise itself is not abortable but the inflight prompt is.\n if (signal.aborted) throwAbort()\n return client.create(opts)\n}\n\nfunction inferBackendType(\n profile: AgentProfile,\n): CreateSandboxOptions['backend'] extends infer B\n ? B extends { type: infer T }\n ? T\n : never\n : never {\n // The sandbox SDK accepts profile-driven backend selection by name. When the\n // profile has no explicit hint we fall through to the SDK's default\n // ('opencode' on the platform side). Returning a literal here would lie\n // about provenance — let the SDK pick.\n type BackendType = NonNullable<CreateSandboxOptions['backend']>['type']\n const explicit = profile.metadata?.backendType\n if (typeof explicit === 'string') return explicit as BackendType\n return 'opencode' as BackendType\n}\n\ninterface FinalizeArgs<Task, Output, Decision> {\n options: RunLoopOptions<Task, Output, Decision>\n decision: Decision\n iterations: Iteration<Task, Output>[]\n startMs: number\n now: () => number\n runId: string\n}\n\nfunction finalize<Task, Output, Decision>(\n args: FinalizeArgs<Task, Output, Decision>,\n): LoopResult<Task, Output, Decision> {\n const winner = (args.options.selectWinner ?? defaultSelectWinner)(args.iterations)\n const costUsd = args.iterations.reduce((sum, iter) => sum + (iter.costUsd || 0), 0)\n const tokenUsage = args.iterations.reduce(\n (acc, iter) => {\n acc.input += iter.tokenUsage?.input ?? 0\n acc.output += iter.tokenUsage?.output ?? 0\n return acc\n },\n { input: 0, output: 0 },\n )\n const result: LoopResult<Task, Output, Decision> = {\n decision: args.decision,\n iterations: args.iterations,\n winner,\n durationMs: args.now() - args.startMs,\n costUsd,\n tokenUsage,\n }\n void emitTrace(args.options.ctx.traceEmitter, {\n kind: 'loop.ended',\n runId: args.runId,\n timestamp: args.now(),\n payload: {\n winnerIterationIndex: winner?.iterationIndex,\n totalCostUsd: costUsd,\n durationMs: result.durationMs,\n iterations: args.iterations.length,\n },\n })\n return result\n}\n\nfunction defaultSelectWinner<Task, Output>(\n iterations: Iteration<Task, Output>[],\n): LoopWinner<Task, Output> | undefined {\n const candidates = iterations.filter((iter) => iter.output !== undefined && !iter.error)\n if (candidates.length === 0) return undefined\n const valid = candidates.filter((iter) => iter.verdict?.valid === true)\n const pool = valid.length > 0 ? valid : candidates\n const sorted = [...pool].sort(\n (a, b) => (b.verdict?.score ?? 0) - (a.verdict?.score ?? 0) || a.index - b.index,\n )\n const top = sorted[0]\n if (!top || top.output === undefined) return undefined\n return {\n task: top.task,\n output: top.output,\n verdict: top.verdict,\n iterationIndex: top.index,\n agentRunName: top.agentRunName,\n }\n}\n\nfunction resolveAgentRuns<Task, Output, Decision>(\n options: RunLoopOptions<Task, Output, Decision>,\n): AgentRunSpec<Task>[] {\n if (options.agentRun && options.agentRuns) {\n throw new ValidationError('runLoop: pass exactly one of `agentRun` or `agentRuns`')\n }\n if (options.agentRun) return [options.agentRun]\n if (options.agentRuns && options.agentRuns.length > 0) return options.agentRuns\n throw new ValidationError('runLoop: `agentRun` or non-empty `agentRuns` is required')\n}\n\nfunction isTerminalDecision(decision: unknown): boolean {\n return (\n decision === 'stop' || decision === 'pick-winner' || decision === 'fail' || decision === 'done'\n )\n}\n\nfunction serializeDecision(decision: unknown): string {\n if (typeof decision === 'string') return decision\n if (decision === null || decision === undefined) return 'null'\n try {\n return JSON.stringify(decision)\n } catch {\n return String(decision)\n }\n}\n\nasync function emitTrace(\n emitter: LoopTraceEmitter | undefined,\n event: LoopTraceEvent,\n): Promise<void> {\n if (!emitter) return\n await emitter.emit(event)\n}\n\nfunction randomSuffix(len = 8): string {\n return Math.random()\n .toString(36)\n .slice(2, 2 + len)\n}\n\nfunction throwAbort(): never {\n const err = new Error('aborted')\n err.name = 'AbortError'\n throw err\n}\n\n/**\n * Stable hash for the trace payload. Not cryptographic — only used so\n * downstream eval pipelines can group iterations whose task / output is the\n * same. Bare structural hash; non-JSON values stringify via their `toString`.\n */\nfunction hashJson(value: unknown): string {\n let str: string\n try {\n str = JSON.stringify(value) ?? String(value)\n } catch {\n str = String(value)\n }\n // FNV-1a 32-bit — branch-free, dependency-free, good enough for grouping.\n let h = 0x811c9dc5\n for (let i = 0; i < str.length; i += 1) {\n h ^= str.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n return (h >>> 0).toString(16).padStart(8, '0')\n}\n","/**\n * `loopDispatch` — turn `runLoop` into an agent-eval campaign dispatch.\n *\n * Without this adapter a consumer wiring `runLoop` into `runProfileMatrix` /\n * `runCampaign` has to, by hand, every time: (a) build an `ExecCtx` with a\n * sandbox client, (b) adapt the campaign `DispatchContext.trace` into a\n * `LoopTraceEmitter` (or lose all loop trace correlation), and (c) remember to\n * forward the loop's cost + tokens via `ctx.cost` (forgetting it yields a\n * `{0,0}` cell the backend-integrity guard reads as a stub). Three foot-guns,\n * the third silent. The fleet's products skipped (c) and fell back to a\n * `workerRecords[]` side-channel — the exact anti-pattern the substrate exists\n * to kill.\n *\n * `loopDispatch` collapses all three into one typed call:\n *\n * const dispatch = loopDispatch({\n * sandboxClient,\n * toLoopOptions: (scenario, profile) => ({ driver, agentRun, output, validator, task }),\n * })\n * await runProfileMatrix({ profiles, scenarios, dispatch, judges, commitSha })\n *\n * Usage is reported automatically; trace events are forwarded automatically;\n * the ctx is built automatically. The seam becomes impossible to mis-wire.\n *\n * Typed structurally against the campaign `DispatchContext` (imported type-only\n * from `@tangle-network/agent-eval/campaign`) — a downward dependency, never an\n * inversion.\n */\n\n// agent-eval's AgentProfile (the eval-harness unit of variation, `model: string`)\n// — NOT sandbox's AgentProfile. ProfileDispatchFn is keyed on the former.\nimport type { AgentProfile } from '@tangle-network/agent-eval'\nimport type {\n CampaignTraceWriter,\n DispatchContext,\n DispatchFn,\n ProfileDispatchFn,\n Scenario,\n} from '@tangle-network/agent-eval/campaign'\nimport { reportLoopUsage } from './report-usage'\nimport { type RunLoopOptions, runLoop } from './run-loop'\nimport type { LoopResult, LoopSandboxClient, LoopTraceEmitter } from './types'\n\n/** runLoop options minus the `ctx` (loopDispatch builds the ctx). */\nexport type LoopOptionsForDispatch<Task, Output, Decision> = Omit<\n RunLoopOptions<Task, Output, Decision>,\n 'ctx'\n>\n\nexport interface LoopDispatchOptions<\n Task,\n Output,\n Decision,\n TScenario extends Scenario,\n TArtifact,\n> {\n /** Sandbox client used for every cell's `runLoop`. Supplied once. */\n sandboxClient: LoopSandboxClient\n /** Build the per-cell runLoop options from the scenario (+ profile, when\n * used with `runProfileMatrix`). */\n toLoopOptions: (\n scenario: TScenario,\n profile: AgentProfile,\n ) => LoopOptionsForDispatch<Task, Output, Decision>\n /** Map the finished loop to the artifact the judges score. Default:\n * `result.winner?.output`. A loop with no winner yields `undefined` (judges\n * skip the cell) — but the loop's token usage is STILL reported, so the\n * integrity guard sees real activity. */\n toArtifact?: (result: LoopResult<Task, Output, Decision>) => TArtifact\n /** Forward `loop.*` trace events into the campaign's scoped trace so loop\n * spans correlate with the cell. Default true. */\n forwardTrace?: boolean\n /** Cost-meter source label for the loop's spend. Default `'loop'`. */\n costSource?: string\n}\n\n/** Bridge a campaign `DispatchContext.trace` to a `LoopTraceEmitter` so every\n * `loop.*` event lands as a span under the cell's scoped trace. */\nfunction campaignTraceToLoopEmitter(trace: CampaignTraceWriter): LoopTraceEmitter {\n return {\n emit(event) {\n trace\n .span(event.kind, { runId: event.runId, timestamp: event.timestamp, ...event.payload })\n .end()\n },\n }\n}\n\nasync function runLoopForCell<Task, Output, Decision, TScenario extends Scenario, TArtifact>(\n opts: LoopDispatchOptions<Task, Output, Decision, TScenario, TArtifact>,\n scenario: TScenario,\n profile: AgentProfile,\n ctx: DispatchContext,\n): Promise<TArtifact> {\n const loopOptions = opts.toLoopOptions(scenario, profile)\n const result = await runLoop<Task, Output, Decision>({\n ...loopOptions,\n ctx: {\n sandboxClient: opts.sandboxClient,\n signal: ctx.signal,\n traceEmitter: opts.forwardTrace === false ? undefined : campaignTraceToLoopEmitter(ctx.trace),\n },\n })\n reportLoopUsage(ctx.cost, result, opts.costSource ?? 'loop')\n const toArtifact =\n opts.toArtifact ?? ((r: LoopResult<Task, Output, Decision>) => r.winner?.output as TArtifact)\n return toArtifact(result)\n}\n\n/**\n * Adapter for `runProfileMatrix` (profile is an axis). Returns a\n * `ProfileDispatchFn` that runs `runLoop` per (profile, scenario) cell and\n * reports usage automatically.\n */\nexport function loopDispatch<Task, Output, Decision, TScenario extends Scenario, TArtifact>(\n opts: LoopDispatchOptions<Task, Output, Decision, TScenario, TArtifact>,\n): ProfileDispatchFn<TScenario, TArtifact> {\n return (profile, scenario, ctx) => runLoopForCell(opts, scenario, profile, ctx)\n}\n\n/**\n * Adapter for `runCampaign` (no profile axis). `toLoopOptions` receives only\n * the scenario; the `profile` passed to the shared core is a stable sentinel\n * so a single `runLoop` config is reused across cells.\n */\nexport function loopCampaignDispatch<Task, Output, Decision, TScenario extends Scenario, TArtifact>(\n opts: Omit<LoopDispatchOptions<Task, Output, Decision, TScenario, TArtifact>, 'toLoopOptions'> & {\n toLoopOptions: (scenario: TScenario) => LoopOptionsForDispatch<Task, Output, Decision>\n },\n): DispatchFn<TScenario, TArtifact> {\n const profileSentinel = { id: 'loop-campaign', model: 'n/a@loop-campaign' } as AgentProfile\n const profiled: LoopDispatchOptions<Task, Output, Decision, TScenario, TArtifact> = {\n ...opts,\n toLoopOptions: (scenario) => opts.toLoopOptions(scenario),\n }\n return (scenario, ctx) => runLoopForCell(profiled, scenario, profileSentinel, ctx)\n}\n"],"mappings":";;;;;;AAsFO,SAAS,oBACd,SACuC;AACvC,MAAI,OAAO,QAAQ,YAAY,YAAY;AACzC,UAAM,IAAI,gBAAgB,iDAAiD;AAAA,EAC7E;AACA,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,MAAI,CAAC,OAAO,SAAS,aAAa,KAAK,iBAAiB,GAAG;AACzD,UAAM,IAAI,gBAAgB,gDAAgD;AAAA,EAC5E;AACA,QAAM,YAAY,QAAQ,aAAa;AACvC,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,YAAY,GAAG;AAChD,UAAM,IAAI,gBAAgB,6CAA6C;AAAA,EACzE;AAMA,MAAI;AAEJ,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,KAAK,MAAM,SAAS;AACxB,UAAI,QAAQ,UAAU,eAAe;AACnC,kBAAU,EAAE,MAAM,QAAQ,WAAW,kBAAkB,aAAa,YAAY;AAChF,eAAO,CAAC;AAAA,MACV;AACA,YAAM,OAAO,MAAM,QAAQ,QAAQ;AAAA,QACjC;AAAA,QACA;AAAA,QACA,iBAAiB,QAAQ;AAAA,QACzB,qBAAqB,gBAAgB,QAAQ;AAAA,MAC/C,CAAC;AACD,gBAAU,aAAa,MAAM,SAAS;AACtC,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AACH,iBAAO,CAAC,QAAQ,IAAI;AAAA,QACtB,KAAK;AACH,iBAAO,QAAQ;AAAA,QACjB,KAAK;AACH,iBAAO,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,IACA,SAAS;AAIP,aAAO,SAAS,SAAS,SAAS,SAAS;AAAA,IAC7C;AAAA,IACA,eAAe;AAMb,UAAI,CAAC,QAAS,QAAO;AACrB,YAAM,MAAkE,EAAE,MAAM,QAAQ,KAAK;AAC7F,UAAI,QAAQ,cAAc,OAAW,KAAI,YAAY,QAAQ;AAC7D,UAAI,QAAQ,SAAS,UAAU,QAAQ,gBAAgB,QAAW;AAChE,YAAI,cAAc,QAAQ;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,aAAmB,MAA0B,WAAuC;AAC3F,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAA4B,SAAS,UAAU;AAC9F,UAAM,IAAI,aAAa,8CAA8C,SAAS,IAAI,CAAC,EAAE;AAAA,EACvF;AACA,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK,UAAU;AACb,UAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,WAAW,GAAG;AACzD,cAAM,IAAI,aAAa,4DAA4D;AAAA,MACrF;AACA,UAAI,KAAK,MAAM,UAAU,UAAW,QAAO;AAG3C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,KAAK,MAAM,MAAM,GAAG,SAAS;AAAA,QACpC,WAAW,GAAG,KAAK,aAAa,EAAE,aAAa,KAAK,MAAM,MAAM,SAAI,SAAS,IAAI,KAAK;AAAA,MACxF;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI;AAAA,QACR,+CAA+C,SAAU,KAA2B,IAAI,CAAC;AAAA,MAC3F;AAAA,EACJ;AACF;AAEA,SAAS,SAAS,OAAwB;AACxC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAAA,EAC9C,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AASO,SAAS,iBACd,SACA,OAAoC,CAAC,GAQpC;AACD,QAAM,iBAAiB,KAAK,kBAAkB;AAC9C,SAAO,QAAQ,IAAI,CAAC,SAAS;AAC3B,UAAM,MAOF,EAAE,OAAO,KAAK,OAAO,cAAc,KAAK,aAAa;AACzD,QAAI,KAAK,SAAS;AAChB,UAAI,QAAQ,KAAK,QAAQ;AACzB,UAAI,OAAO,KAAK,QAAQ,UAAU,SAAU,KAAI,QAAQ,KAAK,QAAQ;AAAA,IACvE;AACA,QAAI,KAAK,MAAO,KAAI,QAAQ,KAAK,MAAM;AACvC,QAAI,KAAK,WAAW,QAAW;AAC7B,YAAM,aAAa,SAAS,KAAK,MAAM;AACvC,UAAI,SACF,WAAW,SAAS,iBAAiB,GAAG,WAAW,MAAM,GAAG,cAAc,CAAC,WAAM;AAAA,IACrF;AACA,WAAO;AAAA,EACT,CAAC;AACH;;;ACtMO,SAAS,mBACd,UAA2C,CAAC,GACN;AACtC,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,MAAI,CAAC,OAAO,SAAS,aAAa,KAAK,iBAAiB,GAAG;AACzD,UAAM,IAAI,gBAAgB,+CAA+C;AAAA,EAC3E;AACA,QAAM,aAAa,QAAQ;AAC3B,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,KAAK,MAAM,SAAS;AACxB,UAAI,QAAQ,UAAU,cAAe,QAAO,CAAC;AAC7C,UAAI,QAAQ,WAAW,EAAG,QAAO,CAAC,IAAI;AACtC,YAAM,QAAQ,QAAQ,GAAG,EAAE;AAC3B,UAAI,CAAC,MAAO,QAAO,CAAC,IAAI;AACxB,UAAI,MAAM,SAAS,UAAU,KAAM,QAAO,CAAC;AAI3C,UAAI,CAAC,cAAc,CAAC,MAAM,QAAS,QAAO,CAAC,MAAM,IAAI;AACrD,aAAO,CAAC,WAAW,MAAM,MAAM,MAAM,OAAO,CAAC;AAAA,IAC/C;AAAA,IACA,OAAO,SAAS;AACd,YAAM,OAAO,QAAQ,GAAG,EAAE;AAC1B,UAAI,CAAC,KAAM,QAAO;AAClB,UAAI,KAAK,SAAS,UAAU,KAAM,QAAO;AACzC,UAAI,QAAQ,UAAU,cAAe,QAAO;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AACF;AASO,SAAS,kBACd,YACoB;AACpB,WAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAClD,QAAI,WAAW,CAAC,GAAG,SAAS,MAAO,QAAO;AAAA,EAC5C;AACA,SAAO,WAAW,SAAS,IAAI,WAAW,SAAS,IAAI;AACzD;;;ACdO,SAAS,qBACd,MAC+B;AAC/B,MAAI,CAAC,KAAK,UAAU,OAAO,KAAK,OAAO,WAAW,YAAY;AAC5D,UAAM,IAAI,gBAAgB,iDAAiD;AAAA,EAC7E;AACA,MAAI,OAAO,KAAK,eAAe,YAAY;AACzC,UAAM,IAAI,gBAAgB,8CAA8C;AAAA,EAC1E;AACA,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,gBAAgB,KAAK,iBAAiB;AAE5C,SAAO,OAAO,QAAQ;AACpB,UAAM,MAAM,MAAM,KAAK,OAAO,OAAO,oBAAoB,KAAK,SAAS,KAAK,gBAAgB,CAAC;AAC7F,UAAM,SAAyB,CAAC;AAChC,qBAAiB,SAAS,IAAI,aAAa,YAAY,GAAG,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,GAAG;AACrF,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,UAAM,WAAW,cAAc,MAAM;AACrC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,aAAa,6DAA6D;AAAA,IACtF;AACA,WAAO,eAAe,UAAU,KAAK,KAAK,UAAU;AAAA,EACtD;AACF;AAEA,SAAS,eACP,UACA,KACA,YACoB;AACpB,QAAM,OAAO,OAAO,SAAS,QAAQ,EAAE,EAAE,YAAY;AACrD,QAAM,YAAY,OAAO,SAAS,cAAc,WAAW,SAAS,YAAY;AAChF,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,MAAM,QAAQ,UAAU;AAAA,EACnC;AACA,MAAI,SAAS,UAAU;AACrB,UAAM,MAAM,MAAM,QAAQ,SAAS,KAAK,IAAI,SAAS,MAAM,CAAC,IAAI;AAGhE,UAAM,OAAO,QAAQ,SAAY,IAAI,OAAO,kBAAkB,YAAY,KAAK,GAAG;AAClF,WAAO,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,EAC3C;AACA,MAAI,SAAS,UAAU;AACrB,UAAM,QAAQ,mBAAmB,UAAU,KAAK,UAAU;AAC1D,WAAO,EAAE,MAAM,UAAU,OAAO,UAAU;AAAA,EAC5C;AACA,QAAM,IAAI;AAAA,IACR,8CAA8C,KAAK,UAAU,SAAS,IAAI,CAAC;AAAA,EAC7E;AACF;AAEA,SAAS,mBACP,UACA,KACA,YACQ;AACR,MAAI,MAAM,QAAQ,SAAS,KAAK,KAAK,SAAS,MAAM,SAAS,GAAG;AAC9D,WAAO,SAAS,MAAM,IAAI,CAAC,QAAQ,kBAAkB,YAAY,KAAK,GAAG,CAAC;AAAA,EAC5E;AAEA,MAAI,OAAO,SAAS,MAAM,YAAY,OAAO,SAAS,SAAS,CAAC,KAAK,SAAS,KAAK,GAAG;AACpF,WAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,MAAM,SAAS,CAAC,EAAE,GAAG,MAAM,IAAI,IAAI;AAAA,EACtE;AACA,QAAM,IAAI,aAAa,qEAAqE;AAC9F;AAEA,SAAS,kBACP,YACA,KACA,KACM;AACN,MAAI;AACF,WAAO,WAAW,KAAK,GAAG;AAAA,EAC5B,SAAS,KAAK;AACZ,UAAM,IAAI,aAAa,uCAAuC,KAAK,UAAU,GAAG,CAAC,IAAI;AAAA,MACnF,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBACP,SACA,WACsB;AACtB,QAAM,OAAO,aAAa,CAAC;AAC3B,QAAM,kBAAkB,KAAK;AAC7B,QAAM,eAAe,QAAQ,UAAU;AAEvC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,MACP,MAAO,iBAAiB,QAAQ,gBAAgB;AAAA,MAChD;AAAA,MACA,GAAI,iBAAiB,QAAQ,EAAE,OAAO,gBAAgB,MAAM,IAAI,CAAC;AAAA,MACjE,GAAI,iBAAiB,SAAS,EAAE,QAAQ,gBAAgB,OAAO,IAAI,CAAC;AAAA,IACtE;AAAA,EACF;AACF;AAEA,SAAS,mBAAiC,KAA2C;AACnF,QAAM,UAAU,iBAAiB,IAAI,OAAO;AAC5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EAAe,SAAS,IAAI,IAAI,CAAC;AAAA,IACjC;AAAA,IACA,qBAAqB,IAAI,eAAe,oCAAoC,IAAI,mBAAmB;AAAA,IACnG;AAAA,IACA,IAAI,QAAQ,WAAW,IACnB,qBACA;AAAA,EAAqD,SAAS,OAAO,CAAC;AAAA,IAC1E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,qBAAqB,QAA0D;AAGtF,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC9C,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,CAAC,MAAO;AACZ,UAAM,OAAO,OAAO,MAAM,QAAQ,EAAE;AACpC,UAAM,OAAO,SAAS,MAAM,IAAI,IAAI,MAAM,OAAO;AACjD,QAAI,CAAC,KAAM;AACX,QAAI,SAAS,YAAY,SAAS,WAAW,SAAS,gBAAgB;AACpE,YAAM,SAAS,eAAe,KAAK,UAAU,KAAK,UAAU,IAAI;AAChE,UAAI,OAAQ,QAAO;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC9C,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,CAAC,MAAO;AACZ,UAAM,OAAO,SAAS,MAAM,IAAI,IAAI,MAAM,OAAO;AACjD,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,WAAW,KAAK,IAAI,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,KAAK,OAAO;AACvF,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,kBAAkB,IAAI;AACrC,UAAM,UAAU,eAAe,MAAM;AACrC,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAkD;AACxE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,EAAG,QAAO;AACtE,QAAM,MAA4B,EAAE,MAAM,MAAM,KAAK;AACrD,MAAI,MAAM,QAAQ,MAAM,KAAK,EAAG,KAAI,QAAQ,MAAM;AAClD,MAAI,OAAO,MAAM,MAAM,SAAU,KAAI,IAAI,MAAM;AAC/C,MAAI,OAAO,MAAM,cAAc,SAAU,KAAI,YAAY,MAAM;AAC/D,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,kBAAkB,MAAmC;AAC5D,QAAM,QAAQ,KAAK,MAAM,+BAA+B;AACxD,QAAM,QAAQ,QAAQ,CAAC,KAAK,MAAM,KAAK;AACvC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,OAAwB;AACxC,MAAI;AACF,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC,KAAK,OAAO,KAAK;AAAA,EACvD,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;;;AC1NO,SAAS,gBACd,MACA,QACA,SAAS,QACH;AACN,OAAK,QAAQ,OAAO,SAAS,MAAM;AACnC,OAAK,cAAc,EAAE,OAAO,OAAO,WAAW,OAAO,QAAQ,OAAO,WAAW,OAAO,CAAC;AACzF;;;ACTO,SAAS,oBACd,OACA,cACyD;AACzD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,OAAO,OAAO,MAAM,QAAQ,EAAE;AACpC,QAAM,OACJ,MAAM,QAAQ,OAAO,MAAM,SAAS,WAC/B,MAAM,OACN,CAAC;AAER,MAAI,SAAS,cAAc,SAAS,gBAAgB,SAAS,SAAS;AACpE,WAAO,aAAa,MAAM,YAAY;AAAA,EACxC;AACA,MAAI,SAAS,uBAAuB,SAAS,YAAY,SAAS,SAAS;AACzE,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,WAAO,aAAa,EAAE,GAAG,OAAO,OAAO,KAAK,SAAS,MAAM,MAAM,GAAG,YAAY;AAAA,EAClF;AAOA,MAAI,SAAS,QAAQ;AACnB,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,UAAM,MAAM,iBAAiB,OAAO,CAAC,gBAAgB,qBAAqB,WAAW,CAAC;AACtF,UAAM,YAAY,iBAAiB,OAAO,CAAC,iBAAiB,CAAC;AAC7D,UAAM,YACJ,QAAQ,UAAa,cAAc,UAAa,OAAO,MAAM,aAAa,KAAK;AACjF,WAAO;AAAA,MACL;AAAA,QACE,aAAa,MAAM;AAAA,QACnB,cAAc;AAAA,QACd,cAAc,KAAK;AAAA,QACnB,OAAO,KAAK,SAAS,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aACP,MACA,cACyD;AACzD,QAAM,WAAW,iBAAiB,MAAM,CAAC,YAAY,eAAe,eAAe,CAAC;AACpF,QAAM,YAAY,iBAAiB,MAAM,CAAC,aAAa,gBAAgB,mBAAmB,CAAC;AAC3F,QAAM,UAAU,iBAAiB,MAAM,CAAC,WAAW,gBAAgB,YAAY,MAAM,CAAC;AACtF,MAAI,aAAa,UAAa,cAAc,UAAa,YAAY,QAAW;AAC9E,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,SAAS,IAAI,KAAK,QAAQ;AACrF,QAAM,QAAmD;AAAA,IACvD,MAAM;AAAA,IACN;AAAA,EACF;AACA,MAAI,aAAa,OAAW,OAAM,WAAW;AAC7C,MAAI,cAAc,OAAW,OAAM,YAAY;AAC/C,MAAI,YAAY,OAAW,OAAM,UAAU;AAC3C,SAAO;AACT;AAEA,SAAS,iBAAiB,MAA+B,MAAoC;AAC3F,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO;AAAA,EAClE;AACA,SAAO;AACT;AAmBO,SAAS,gBACd,OACA,OAAkC,CAAC,GACH;AAChC,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,OAAO,OAAO,MAAM,QAAQ,EAAE;AACpC,QAAM,OACJ,MAAM,QAAQ,OAAO,MAAM,SAAS,WAC/B,MAAM,OACN,CAAC;AAER,MAAI,SAAS,wBAAwB;AACnC,UAAM,OACJ,KAAK,QAAQ,OAAO,KAAK,SAAS,WAAY,KAAK,OAAmC,CAAC;AACzF,UAAM,WAAW,OAAO,KAAK,QAAQ,EAAE;AACvC,UAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAC5D,UAAM,OAAO,UAAU,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACnE,QAAI,SAAS,OAAW,QAAO;AAC/B,QAAI,aAAa,OAAQ,QAAO,EAAE,MAAM,cAAc,KAAK;AAC3D,QAAI,aAAa,eAAe,aAAa;AAC3C,aAAO,EAAE,MAAM,mBAAmB,KAAK;AACzC,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB,OAAO,KAAK,gBAAgB,OAAO;AAChE;;;ACnGA,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AA0ChC,eAAsB,QACpB,SAC6C;AAC7C,QAAM,QAAQ,iBAAiB,OAAO;AACtC,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,MAAI,CAAC,OAAO,SAAS,aAAa,KAAK,iBAAiB,GAAG;AACzD,UAAM,IAAI,gBAAgB,oCAAoC;AAAA,EAChE;AACA,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,MAAI,CAAC,OAAO,SAAS,cAAc,KAAK,kBAAkB,GAAG;AAC3D,UAAM,IAAI,gBAAgB,qCAAqC;AAAA,EACjE;AACA,MAAI,CAAC,QAAQ,KAAK,iBAAiB,OAAO,QAAQ,IAAI,cAAc,WAAW,YAAY;AACzF,UAAM,IAAI,gBAAgB,+CAA+C;AAAA,EAC3E;AACA,QAAM,MAAM,QAAQ,OAAO,KAAK;AAChC,QAAM,QAAQ,QAAQ,SAAS,QAAQ,aAAa,CAAC;AACrD,QAAM,YAAY,IAAI;AACtB,QAAM,aAAa,QAAQ,OAAO,QAAQ;AAC1C,QAAM,aAAwC,CAAC;AAC/C,MAAI,QAAQ;AAEZ,QAAM,UAAU,QAAQ,IAAI,cAAc;AAAA,IACxC,MAAM;AAAA,IACN;AAAA,IACA,WAAW,IAAI;AAAA,IACf,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,eAAe,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,KAAK,QAAQ,QAAQ,OAAO;AAAA,MAC5E;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,eAAe,MAAM,WAAW,MAAM;AAC5C,MAAI,QAAQ,IAAI,QAAQ;AACtB,QAAI,QAAQ,IAAI,OAAO,QAAS,YAAW,MAAM;AAAA,QAC5C,SAAQ,IAAI,OAAO,iBAAiB,SAAS,cAAc,EAAE,MAAM,KAAK,CAAC;AAAA,EAChF;AAEA,MAAI;AACF,WAAO,WAAW,SAAS,eAAe;AACxC,UAAI,WAAW,OAAO,QAAS,YAAW;AAC1C,YAAM,UAAU,MAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM,UAAU;AAClE,YAAM,WAAW,QAAQ,OAAO,eAAe;AAC/C,YAAM,aAAa;AACnB,YAAM,YAAY,WAAW;AAC7B,YAAM,YAAY,gBAAgB,WAAW;AAC7C,YAAM,QAAQ,QAAQ,MAAM,GAAG,SAAS;AAKxC,YAAM,cACJ,UAAU,gBAAgB,eAAe,IAAI,SAAY,YAAY,UAAU;AACjF,YAAM,eAAe,MAAM,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC;AACtD,YAAM,UAAU,QAAQ,IAAI,cAAc;AAAA,QACxC,MAAM;AAAA,QACN;AAAA,QACA,WAAW,IAAI;AAAA,QACf,SAAS;AAAA,UACP;AAAA,UACA,cAAc,QAAQ;AAAA,UACtB,UACE,UAAU,SACT,QAAQ,WAAW,IAAI,SAAS,QAAQ,WAAW,IAAI,WAAW;AAAA,UACrE,WAAW,UAAU;AAAA,UACrB;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AACD,eAAS;AACT,UAAI,QAAQ,WAAW,EAAG;AAG1B,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,cAAM,OAAO,OAAO,YAAY,KAAK,MAAM,MAAM;AACjD,mBAAW,KAAK;AAAA,UACd,OAAO,YAAY;AAAA,UACnB,MAAM,MAAM,CAAC;AAAA,UACb,cAAc,KAAK,QAAQ,KAAK,QAAQ,QAAQ;AAAA,UAChD,QAAQ,CAAC;AAAA,UACT,WAAW,IAAI;AAAA,UACf,SAAS;AAAA,UACT,SAAS;AAAA,UACT,YAAY,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,QACpC,CAAC;AAAA,MACH;AAEA,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,QACnB;AAAA,QACA,QAAQ,WAAW;AAAA,QACnB,KAAK,QAAQ;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,WAAW,OAAO,QAAS,YAAW;AAE1C,YAAMA,YAAW,MAAM,QAAQ,OAAO,OAAO,UAAU;AACvD,YAAM,UAAU,QAAQ,IAAI,cAAc;AAAA,QACxC,MAAM;AAAA,QACN;AAAA,QACA,WAAW,IAAI;AAAA,QACf,SAAS,EAAE,UAAU,kBAAkBA,SAAQ,GAAG,eAAe,WAAW,OAAO;AAAA,MACrF,CAAC;AACD,UAAI,mBAAmBA,SAAQ,GAAG;AAChC,eAAO,SAAS;AAAA,UACd;AAAA,UACA,UAAAA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,WAAW,UAAU,eAAe;AAGtC,YAAMA,YAAW,MAAM,QAAQ,OAAO,OAAO,UAAU;AACvD,YAAM,UAAU,QAAQ,IAAI,cAAc;AAAA,QACxC,MAAM;AAAA,QACN;AAAA,QACA,WAAW,IAAI;AAAA,QACf,SAAS,EAAE,UAAU,kBAAkBA,SAAQ,GAAG,eAAe,WAAW,OAAO;AAAA,MACrF,CAAC;AACD,aAAO,SAAS,EAAE,SAAS,UAAAA,WAAU,YAAY,SAAS,WAAW,KAAK,MAAM,CAAC;AAAA,IACnF;AAEA,UAAM,WAAW,MAAM,QAAQ,OAAO,OAAO,UAAU;AACvD,UAAM,UAAU,QAAQ,IAAI,cAAc;AAAA,MACxC,MAAM;AAAA,MACN;AAAA,MACA,WAAW,IAAI;AAAA,MACf,SAAS,EAAE,UAAU,kBAAkB,QAAQ,GAAG,eAAe,WAAW,OAAO;AAAA,IACrF,CAAC;AACD,WAAO,SAAS,EAAE,SAAS,UAAU,YAAY,SAAS,WAAW,KAAK,MAAM,CAAC;AAAA,EACnF,UAAE;AACA,QAAI,QAAQ,IAAI,OAAQ,SAAQ,IAAI,OAAO,oBAAoB,SAAS,YAAY;AAAA,EACtF;AACF;AAoBA,eAAe,SAAuB,MAAkC;AACtE,QAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,MAAM,YAAY,EAAE,MAAM,OAAO,KAAK,YAAY,OAAO,EAAE;AACzF,QAAM,WAAW,oBAAI,IAAmB;AACxC,SAAO,MAAM,SAAS,KAAK,SAAS,OAAO,GAAG;AAC5C,WAAO,SAAS,OAAO,KAAK,kBAAkB,MAAM,SAAS,GAAG;AAC9D,YAAM,OAAO,MAAM,MAAM;AACzB,YAAM,IAAI,iBAAiB,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,QAAQ,MAAM,SAAS,OAAO,CAAC,CAAC;AAC9E,eAAS,IAAI,CAAC;AAAA,IAChB;AACA,QAAI,SAAS,SAAS,EAAG;AACzB,UAAM,QAAQ,KAAK,QAAQ;AAAA,EAC7B;AACF;AAMA,eAAe,iBAA+B,MAA0C;AACtF,QAAM,OAAO,KAAK,WAAW,KAAK,KAAK,KAAK;AAC5C,MAAI,CAAC;AACH,UAAM,IAAI,gBAAgB,4CAA4C,KAAK,KAAK,KAAK,EAAE;AACzF,QAAM,OAAO,KAAK,MAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,MAAM;AAC3D,MAAI,CAAC,KAAM,OAAM,IAAI,gBAAgB,kDAAkD;AACvF,OAAK,YAAY,KAAK,IAAI;AAC1B,OAAK,eAAe,KAAK,QAAQ,KAAK,QAAQ,QAAQ;AAEtD,QAAM,UAAU,KAAK,IAAI,cAAc;AAAA,IACrC,MAAM;AAAA,IACN,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,IAAI;AAAA,IACpB,SAAS;AAAA,MACP,gBAAgB,KAAK,KAAK;AAAA,MAC1B,cAAc,KAAK;AAAA,MACnB,UAAU,SAAS,KAAK,KAAK,IAAI;AAAA,MACjC,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,IACpB;AAAA,EACF,CAAC;AAED,MAAI;AACF,UAAM,MAAM,MAAM,qBAAqB,KAAK,IAAI,eAAe,MAAM,KAAK,MAAM;AAChF,UAAM,YAAY,sBAAsB,KAAK,IAAI,eAAe,GAAG;AACnE,UAAM,UAAU,KAAK,IAAI,cAAc;AAAA,MACrC,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK,IAAI;AAAA,MACpB,SAAS;AAAA,QACP,gBAAgB,KAAK,KAAK;AAAA,QAC1B,cAAc,KAAK;AAAA,QACnB,WAAW,UAAU;AAAA,QACrB,WAAW,UAAU;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB,WAAW,UAAU;AAAA,QACrB,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AACD,UAAM,UAAU,KAAK,aAAa,KAAK,KAAK,IAAI;AAChD,UAAM,SAAyB,CAAC;AAChC,qBAAiB,SAAS,IAAI,aAAa,SAAS,EAAE,QAAQ,KAAK,OAAO,CAAC,GAAG;AAC5E,aAAO,KAAK,KAAK;AACjB,YAAM,UAAU,oBAAoB,OAAO,KAAK,YAAY;AAC5D,UAAI,SAAS;AACX,aAAK,WAAW,QAAQ,WAAW;AACnC,aAAK,WAAW,SAAS,QAAQ,YAAY;AAC7C,aAAK,WAAW,UAAU,QAAQ,aAAa;AAC/C,aAAK,IAAI,WAAW,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AACA,SAAK,SAAS;AACd,SAAK,SAAS,KAAK,OAAO,MAAM,MAAM;AACtC,QAAI,KAAK,WAAW;AAClB,WAAK,UAAU,MAAM,KAAK,UAAU,SAAS,KAAK,QAAQ;AAAA,QACxD,WAAW,KAAK,KAAK;AAAA,QACrB,QAAQ,KAAK;AAAA,QACb,cAAc,KAAK,IAAI;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,SAAK,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,EACjE,UAAE;AACA,SAAK,UAAU,KAAK,IAAI;AACxB,UAAM,UAAU,KAAK,IAAI,cAAc;AAAA,MACrC,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK,IAAI;AAAA,MACpB,SAAS;AAAA,QACP,gBAAgB,KAAK,KAAK;AAAA,QAC1B,cAAc,KAAK;AAAA,QACnB,YAAY,KAAK,WAAW,SAAY,SAAS,KAAK,MAAM,IAAI;AAAA,QAChE,SAAS,KAAK;AAAA,QACd,OAAO,KAAK,OAAO;AAAA,QACnB,SAAS,KAAK;AAAA,QACd,YAAY,KAAK,UAAU,KAAK;AAAA,QAChC,YACE,KAAK,WAAW,SAAS,KAAK,WAAW,SAAS,EAAE,GAAG,KAAK,WAAW,IAAI;AAAA,QAC7E,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,eAAe,KAAK,WAAW,SAAY,cAAc,KAAK,MAAM,IAAI;AAAA,MAC1E;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAQA,SAAS,YACP,YACoB;AACpB,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,MAAI,OAAO,WAAW,SAAS;AAC/B,MAAI,YAAY;AAChB,aAAW,QAAQ,YAAY;AAC7B,QAAI,KAAK,SAAS,UAAU,KAAM;AAClC,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,QAAI,QAAQ,WAAW;AACrB,kBAAY;AACZ,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AAIA,SAAS,cAAc,QAAyB;AAC9C,MAAI;AACJ,MAAI;AACF,QAAI,OAAO,WAAW,WAAW,SAAU,KAAK,UAAU,MAAM,KAAK,OAAO,MAAM;AAAA,EACpF,QAAQ;AACN,QAAI,OAAO,MAAM;AAAA,EACnB;AACA,SAAO,EAAE,SAAS,MAAM,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,WAAM;AAClD;AAEA,SAAS,sBACP,QACA,KACsB;AACtB,MAAI,OAAO,OAAO,sBAAsB,YAAY;AAClD,QAAI;AACF,YAAM,SAAS,OAAO,kBAAkB,GAAG;AAC3C,UACE,UACA,OAAO,WAAW,aACjB,OAAO,SAAS,aAAa,OAAO,SAAS,UAC9C;AACA,eAAO;AAAA,UACL,MAAM,OAAO;AAAA,UACb,WAAW,OAAO,aAAa,cAAc,GAAG;AAAA,UAChD,SAAS,OAAO;AAAA,UAChB,WAAW,OAAO;AAAA,QACpB;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO,EAAE,MAAM,WAAW,WAAW,cAAc,GAAG,EAAE;AAC1D;AAEA,SAAS,cAAc,KAA0C;AAC/D,QAAM,MAAO,IAAoC;AACjD,SAAO,OAAO,QAAQ,YAAY,IAAI,SAAS,IAAI,MAAM;AAC3D;AAQA,eAAsB,qBACpB,QACA,MACA,QAC0B;AAC1B,QAAM,YAAY,KAAK,oBAAoB,CAAC;AAC5C,QAAM,kBAAkB,UAAU;AAClC,QAAM,OAA6B;AAAA,IACjC,GAAG;AAAA,IACH,SAAS;AAAA,MACP,MAAM,iBAAiB,QAAQ,iBAAiB,KAAK,OAAO;AAAA,MAC5D,SAAS,KAAK;AAAA,MACd,GAAI,iBAAiB,QAAQ,EAAE,OAAO,gBAAgB,MAAM,IAAI,CAAC;AAAA,MACjE,GAAI,iBAAiB,SAAS,EAAE,QAAQ,gBAAgB,OAAO,IAAI,CAAC;AAAA,IACtE;AAAA,EACF;AAGA,MAAI,OAAO,QAAS,YAAW;AAC/B,SAAO,OAAO,OAAO,IAAI;AAC3B;AAEA,SAAS,iBACP,SAKQ;AAMR,QAAM,WAAW,QAAQ,UAAU;AACnC,MAAI,OAAO,aAAa,SAAU,QAAO;AACzC,SAAO;AACT;AAWA,SAAS,SACP,MACoC;AACpC,QAAM,UAAU,KAAK,QAAQ,gBAAgB,qBAAqB,KAAK,UAAU;AACjF,QAAM,UAAU,KAAK,WAAW,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,WAAW,IAAI,CAAC;AAClF,QAAM,aAAa,KAAK,WAAW;AAAA,IACjC,CAAC,KAAK,SAAS;AACb,UAAI,SAAS,KAAK,YAAY,SAAS;AACvC,UAAI,UAAU,KAAK,YAAY,UAAU;AACzC,aAAO;AAAA,IACT;AAAA,IACA,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,EACxB;AACA,QAAM,SAA6C;AAAA,IACjD,UAAU,KAAK;AAAA,IACf,YAAY,KAAK;AAAA,IACjB;AAAA,IACA,YAAY,KAAK,IAAI,IAAI,KAAK;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACA,OAAK,UAAU,KAAK,QAAQ,IAAI,cAAc;AAAA,IAC5C,MAAM;AAAA,IACN,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,IAAI;AAAA,IACpB,SAAS;AAAA,MACP,sBAAsB,QAAQ;AAAA,MAC9B,cAAc;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,YAAY,KAAK,WAAW;AAAA,IAC9B;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,SAAS,oBACP,YACsC;AACtC,QAAM,aAAa,WAAW,OAAO,CAAC,SAAS,KAAK,WAAW,UAAa,CAAC,KAAK,KAAK;AACvF,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAM,QAAQ,WAAW,OAAO,CAAC,SAAS,KAAK,SAAS,UAAU,IAAI;AACtE,QAAM,OAAO,MAAM,SAAS,IAAI,QAAQ;AACxC,QAAM,SAAS,CAAC,GAAG,IAAI,EAAE;AAAA,IACvB,CAAC,GAAG,OAAO,EAAE,SAAS,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EAAE,QAAQ,EAAE;AAAA,EAC7E;AACA,QAAM,MAAM,OAAO,CAAC;AACpB,MAAI,CAAC,OAAO,IAAI,WAAW,OAAW,QAAO;AAC7C,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,IACb,gBAAgB,IAAI;AAAA,IACpB,cAAc,IAAI;AAAA,EACpB;AACF;AAEA,SAAS,iBACP,SACsB;AACtB,MAAI,QAAQ,YAAY,QAAQ,WAAW;AACzC,UAAM,IAAI,gBAAgB,wDAAwD;AAAA,EACpF;AACA,MAAI,QAAQ,SAAU,QAAO,CAAC,QAAQ,QAAQ;AAC9C,MAAI,QAAQ,aAAa,QAAQ,UAAU,SAAS,EAAG,QAAO,QAAQ;AACtE,QAAM,IAAI,gBAAgB,0DAA0D;AACtF;AAEA,SAAS,mBAAmB,UAA4B;AACtD,SACE,aAAa,UAAU,aAAa,iBAAiB,aAAa,UAAU,aAAa;AAE7F;AAEA,SAAS,kBAAkB,UAA2B;AACpD,MAAI,OAAO,aAAa,SAAU,QAAO;AACzC,MAAI,aAAa,QAAQ,aAAa,OAAW,QAAO;AACxD,MAAI;AACF,WAAO,KAAK,UAAU,QAAQ;AAAA,EAChC,QAAQ;AACN,WAAO,OAAO,QAAQ;AAAA,EACxB;AACF;AAEA,eAAe,UACb,SACA,OACe;AACf,MAAI,CAAC,QAAS;AACd,QAAM,QAAQ,KAAK,KAAK;AAC1B;AAEA,SAAS,aAAa,MAAM,GAAW;AACrC,SAAO,KAAK,OAAO,EAChB,SAAS,EAAE,EACX,MAAM,GAAG,IAAI,GAAG;AACrB;AAEA,SAAS,aAAoB;AAC3B,QAAM,MAAM,IAAI,MAAM,SAAS;AAC/B,MAAI,OAAO;AACX,QAAM;AACR;AAOA,SAAS,SAAS,OAAwB;AACxC,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAAA,EAC7C,QAAQ;AACN,UAAM,OAAO,KAAK;AAAA,EACpB;AAEA,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,SAAK,IAAI,WAAW,CAAC;AACrB,QAAI,KAAK,KAAK,GAAG,QAAU;AAAA,EAC7B;AACA,UAAQ,MAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC/C;;;ACnhBA,SAAS,2BAA2B,OAA8C;AAChF,SAAO;AAAA,IACL,KAAK,OAAO;AACV,YACG,KAAK,MAAM,MAAM,EAAE,OAAO,MAAM,OAAO,WAAW,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,EACrF,IAAI;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,eACb,MACA,UACA,SACA,KACoB;AACpB,QAAM,cAAc,KAAK,cAAc,UAAU,OAAO;AACxD,QAAM,SAAS,MAAM,QAAgC;AAAA,IACnD,GAAG;AAAA,IACH,KAAK;AAAA,MACH,eAAe,KAAK;AAAA,MACpB,QAAQ,IAAI;AAAA,MACZ,cAAc,KAAK,iBAAiB,QAAQ,SAAY,2BAA2B,IAAI,KAAK;AAAA,IAC9F;AAAA,EACF,CAAC;AACD,kBAAgB,IAAI,MAAM,QAAQ,KAAK,cAAc,MAAM;AAC3D,QAAM,aACJ,KAAK,eAAe,CAAC,MAA0C,EAAE,QAAQ;AAC3E,SAAO,WAAW,MAAM;AAC1B;AAOO,SAAS,aACd,MACyC;AACzC,SAAO,CAAC,SAAS,UAAU,QAAQ,eAAe,MAAM,UAAU,SAAS,GAAG;AAChF;AAOO,SAAS,qBACd,MAGkC;AAClC,QAAM,kBAAkB,EAAE,IAAI,iBAAiB,OAAO,oBAAoB;AAC1E,QAAM,WAA8E;AAAA,IAClF,GAAG;AAAA,IACH,eAAe,CAAC,aAAa,KAAK,cAAc,QAAQ;AAAA,EAC1D;AACA,SAAO,CAAC,UAAU,QAAQ,eAAe,UAAU,UAAU,iBAAiB,GAAG;AACnF;","names":["decision"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|