@tangle-network/agent-runtime 0.43.0 → 0.45.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.
Files changed (89) hide show
  1. package/README.md +96 -202
  2. package/dist/agent.d.ts +5 -4
  3. package/dist/agent.js +5 -7
  4. package/dist/agent.js.map +1 -1
  5. package/dist/analyst-loop.d.ts +65 -4
  6. package/dist/analyst-loop.js +6 -1
  7. package/dist/audit.d.ts +93 -0
  8. package/dist/audit.js +312 -0
  9. package/dist/audit.js.map +1 -0
  10. package/dist/chunk-4B6U4CVQ.js +15 -0
  11. package/dist/chunk-4B6U4CVQ.js.map +1 -0
  12. package/dist/chunk-FK53TXOP.js +603 -0
  13. package/dist/chunk-FK53TXOP.js.map +1 -0
  14. package/dist/{chunk-MJDGCRAT.js → chunk-IJ6FGOPO.js} +5 -5
  15. package/dist/chunk-IJ6FGOPO.js.map +1 -0
  16. package/dist/{chunk-HVYOHJHK.js → chunk-IJGS6J7X.js} +2 -2
  17. package/dist/chunk-IJGS6J7X.js.map +1 -0
  18. package/dist/chunk-KEWO4KI6.js +3599 -0
  19. package/dist/chunk-KEWO4KI6.js.map +1 -0
  20. package/dist/{chunk-NRZOXCJK.js → chunk-KSMX62JF.js} +2 -2
  21. package/dist/{chunk-C5HMTTNY.js → chunk-NYN5RTLP.js} +13 -12
  22. package/dist/chunk-NYN5RTLP.js.map +1 -0
  23. package/dist/chunk-PRX45WE2.js +264 -0
  24. package/dist/chunk-PRX45WE2.js.map +1 -0
  25. package/dist/{chunk-3HMHSN22.js → chunk-QR4UUC5P.js} +6 -6
  26. package/dist/chunk-QR4UUC5P.js.map +1 -0
  27. package/dist/chunk-WIR4HOOJ.js +27 -0
  28. package/dist/chunk-WIR4HOOJ.js.map +1 -0
  29. package/dist/{chunk-MNCB4SJ5.js → chunk-Z2QXVBA6.js} +296 -8
  30. package/dist/chunk-Z2QXVBA6.js.map +1 -0
  31. package/dist/coder-CczgMqFx.d.ts +114 -0
  32. package/dist/dynamic-BvllHV6M.d.ts +221 -0
  33. package/dist/{improvement-adapter-BC4HhuAR.d.ts → improvement-adapter-CWegd3vw.d.ts} +1 -1
  34. package/dist/improvement.d.ts +2 -3
  35. package/dist/improvement.js +0 -5
  36. package/dist/improvement.js.map +1 -1
  37. package/dist/index.d.ts +123 -10
  38. package/dist/index.js +407 -19
  39. package/dist/index.js.map +1 -1
  40. package/dist/{kb-gate-DTBum3vH.d.ts → kb-gate-D9GBocLN.d.ts} +82 -5
  41. package/dist/{loop-runner-bin-CVoCBmYk.d.ts → loop-runner-bin-CPrCoKqC.d.ts} +14 -10
  42. package/dist/loop-runner-bin.d.ts +9 -7
  43. package/dist/loop-runner-bin.js +6 -8
  44. package/dist/loops.d.ts +7 -371
  45. package/dist/loops.js +96 -19
  46. package/dist/mcp/bin.js +7 -7
  47. package/dist/mcp/bin.js.map +1 -1
  48. package/dist/mcp/index.d.ts +284 -11
  49. package/dist/mcp/index.js +341 -9
  50. package/dist/mcp/index.js.map +1 -1
  51. package/dist/{otel-export-BzvF1Ela.d.ts → otel-export-Dy2DyUCU.d.ts} +1 -1
  52. package/dist/profiles.d.ts +385 -86
  53. package/dist/profiles.js +549 -4
  54. package/dist/profiles.js.map +1 -1
  55. package/dist/run-loop--hSoIknW.d.ts +112 -0
  56. package/dist/runtime-hooks-C7JwKb9E.d.ts +70 -0
  57. package/dist/runtime.d.ts +1860 -0
  58. package/dist/runtime.js +114 -0
  59. package/dist/runtime.js.map +1 -0
  60. package/dist/substrate-CUgk7F7s.d.ts +77 -0
  61. package/dist/topology.d.ts +73 -0
  62. package/dist/topology.js +111 -0
  63. package/dist/topology.js.map +1 -0
  64. package/dist/types-1HbsFa7H.d.ts +438 -0
  65. package/dist/{types-p8dWBIXL.d.ts → types-BtRLF2U3.d.ts} +1 -1
  66. package/dist/{types-Bcp071Jg.d.ts → types-DdzkffAm.d.ts} +95 -1
  67. package/dist/workflow.d.ts +551 -0
  68. package/dist/workflow.js +1778 -0
  69. package/dist/workflow.js.map +1 -0
  70. package/package.json +53 -16
  71. package/skills/agent-runtime-adoption/SKILL.md +29 -26
  72. package/dist/chunk-3HMHSN22.js.map +0 -1
  73. package/dist/chunk-C5HMTTNY.js.map +0 -1
  74. package/dist/chunk-EKBSQYZE.js +0 -813
  75. package/dist/chunk-EKBSQYZE.js.map +0 -1
  76. package/dist/chunk-HVYOHJHK.js.map +0 -1
  77. package/dist/chunk-MJDGCRAT.js.map +0 -1
  78. package/dist/chunk-MNCB4SJ5.js.map +0 -1
  79. package/dist/chunk-PY6NMZYX.js +0 -52
  80. package/dist/chunk-PY6NMZYX.js.map +0 -1
  81. package/dist/chunk-SQSCRJ7U.js +0 -65
  82. package/dist/chunk-SQSCRJ7U.js.map +0 -1
  83. package/dist/chunk-VOX6Z3II.js +0 -90
  84. package/dist/chunk-VOX6Z3II.js.map +0 -1
  85. package/dist/chunk-XBUG326M.js +0 -261
  86. package/dist/chunk-XBUG326M.js.map +0 -1
  87. package/dist/dynamic-B_7GgCwu.d.ts +0 -108
  88. package/dist/optimize-prompt-D-urF2wW.d.ts +0 -129
  89. /package/dist/{chunk-NRZOXCJK.js.map → chunk-KSMX62JF.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 '../runtime'\nimport { createSandboxForSpec, describeSandboxPlacement } from '../runtime/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 '../runtime'\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.43.0",
4
- "description": "Reusable runtime lifecycle for domain-specific agents.",
3
+ "version": "0.45.0",
4
+ "description": "Shared task-lifecycle skeleton for agents: a recursive loop kernel for chat turns, one-shot tasks, and multi-attempt loops, with trace capture and eval-gated self-improvement. Domain behavior lives in adapters; scoring and ship-gates in @tangle-network/agent-eval.",
5
5
  "homepage": "https://github.com/tangle-network/agent-runtime#readme",
6
6
  "repository": {
7
7
  "type": "git",
@@ -39,16 +39,36 @@
39
39
  "import": "./dist/agent.js",
40
40
  "default": "./dist/agent.js"
41
41
  },
42
+ "./runtime": {
43
+ "types": "./dist/runtime.d.ts",
44
+ "import": "./dist/runtime.js",
45
+ "default": "./dist/runtime.js"
46
+ },
42
47
  "./loops": {
43
48
  "types": "./dist/loops.d.ts",
44
49
  "import": "./dist/loops.js",
45
50
  "default": "./dist/loops.js"
46
51
  },
52
+ "./topology": {
53
+ "types": "./dist/topology.d.ts",
54
+ "import": "./dist/topology.js",
55
+ "default": "./dist/topology.js"
56
+ },
57
+ "./workflow": {
58
+ "types": "./dist/workflow.d.ts",
59
+ "import": "./dist/workflow.js",
60
+ "default": "./dist/workflow.js"
61
+ },
47
62
  "./profiles": {
48
63
  "types": "./dist/profiles.d.ts",
49
64
  "import": "./dist/profiles.js",
50
65
  "default": "./dist/profiles.js"
51
66
  },
67
+ "./audit": {
68
+ "types": "./dist/audit.d.ts",
69
+ "import": "./dist/audit.js",
70
+ "default": "./dist/audit.js"
71
+ },
52
72
  "./mcp": {
53
73
  "types": "./dist/mcp/index.d.ts",
54
74
  "import": "./dist/mcp/index.js",
@@ -67,24 +87,47 @@
67
87
  "publishConfig": {
68
88
  "access": "public"
69
89
  },
70
- "dependencies": {},
90
+ "scripts": {
91
+ "build": "tsup",
92
+ "dev": "tsup --watch",
93
+ "prepare": "tsup",
94
+ "test": "vitest run",
95
+ "test:watch": "vitest",
96
+ "lint": "biome check src tests examples",
97
+ "lint:fix": "biome check --write src tests examples",
98
+ "typecheck": "tsc --noEmit",
99
+ "typecheck:examples": "tsc --noEmit -p tsconfig.examples.json",
100
+ "verify:package": "node scripts/verify-package-exports.mjs"
101
+ },
71
102
  "devDependencies": {
72
103
  "@biomejs/biome": "^2.4.0",
73
- "@tangle-network/agent-eval": "^0.61.0",
104
+ "@tangle-network/agent-eval": "^0.83.0",
74
105
  "@tangle-network/sandbox": "^0.4.0",
75
106
  "@types/node": "^25.6.0",
107
+ "playwright": "^1.40.0",
76
108
  "tsup": "^8.0.0",
77
109
  "typescript": "^5.7.0",
78
110
  "vitest": "^3.0.0"
79
111
  },
112
+ "pnpm": {
113
+ "minimumReleaseAge": 4320,
114
+ "minimumReleaseAgeExclude": [
115
+ "@tangle-network/agent-eval"
116
+ ],
117
+ "onlyBuiltDependencies": [
118
+ "esbuild"
119
+ ]
120
+ },
80
121
  "engines": {
81
122
  "node": ">=20"
82
123
  },
83
124
  "license": "MIT",
125
+ "packageManager": "pnpm@10.28.0",
84
126
  "peerDependencies": {
85
- "@tangle-network/agent-eval": ">=0.61.0 <1.0.0",
127
+ "@tangle-network/agent-eval": ">=0.83.0 <1.0.0",
86
128
  "@tangle-network/agent-knowledge": ">=1.3.0 <2.0.0",
87
- "@tangle-network/sandbox": ">=0.1.2 <0.5.0"
129
+ "@tangle-network/sandbox": ">=0.1.2 <0.5.0",
130
+ "playwright": "^1.40.0"
88
131
  },
89
132
  "peerDependenciesMeta": {
90
133
  "@tangle-network/agent-knowledge": {
@@ -92,15 +135,9 @@
92
135
  },
93
136
  "@tangle-network/sandbox": {
94
137
  "optional": true
138
+ },
139
+ "playwright": {
140
+ "optional": true
95
141
  }
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
142
  }
106
- }
143
+ }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: agent-runtime-adoption
3
- description: Adopt @tangle-network/agent-runtime in a product — the driven-loop kernel (runLoop), topology drivers (refine / fanout-vote / dynamic agent-authored), the loopDispatch campaign bridge, MCP delegation, and identity-gated prompt-surface optimization (optimizePrompt). Self-contained; needs only the published package + @tangle-network/agent-eval. Use when wiring runLoop, choosing a topology driver, optimizing a system/planner prompt, or exposing delegation tools.
3
+ description: Adopt @tangle-network/agent-runtime in a product — the driven-loop kernel (runLoop), topology drivers (refine / fanout-vote / dynamic agent-authored), the loopDispatch campaign bridge, MCP delegation, and the code-surface improvementDriver for agent-eval's selfImprove (the optimization entry point). Self-contained; needs only the published package + @tangle-network/agent-eval. Use when wiring runLoop, choosing a topology driver, optimizing a system/planner prompt or code surface, or exposing delegation tools.
4
4
  ---
5
5
 
6
6
  # agent-runtime adoption — driven loops, topology drivers, prompt optimization
@@ -106,30 +106,34 @@ const dispatch = loopCampaignDispatch({
106
106
 
107
107
  `loopDispatch` is the `runProfileMatrix` variant (profile is an axis).
108
108
 
109
- ## Identity-gated prompt optimization — `optimizePrompt`
109
+ ## Identity-gated optimization — agent-eval's `selfImprove`
110
110
 
111
- `@tangle-network/agent-runtime/improvement`. The text-surface entry point onto
112
- agent-eval's `runImprovementLoop` sibling to `improvementDriver` (the
113
- code/worktree path). Optimizes any prompt surface (system / planner / judge
114
- rubric) and is **identity-gated by construction**: it runs evals, proposes
115
- candidates (default driver `gepaDriver`), and the held-out gate compares
116
- candidate vs baseline. `result.prompt` is the **baseline unless the gate decided
117
- `'ship'`** so registering a prompt for optimization can never regress it; it
118
- only improves when held-out data earns it.
111
+ The optimization entry point is **`selfImprove`** (`@tangle-network/agent-eval/contract`),
112
+ NOT agent-runtimeagent-runtime contributes the code-surface `improvementDriver`
113
+ (`/improvement`, the git-worktree path) you pass to it as `driver` to optimize CODE
114
+ instead of a string. `selfImprove` optimizes any text/config surface (system /
115
+ planner / judge rubric) and is **identity-gated by construction**: it runs evals,
116
+ proposes candidates (default driver `gepaDriver`), and a held-out gate ships a winner
117
+ only if it beats the baseline. `result.winner.surface` is the **baseline unless
118
+ `result.gateDecision === 'ship'`** so registering a surface for optimization can
119
+ never regress it; it only improves when held-out data earns it.
119
120
 
120
121
  ```ts
121
- import { optimizePrompt } from '@tangle-network/agent-runtime/improvement'
122
- const { prompt, improved, decision, delta } = await optimizePrompt({
123
- baselinePrompt: CURRENT_SYSTEM_PROMPT,
124
- runWithPrompt: (prompt, scenario, ctx) => runYourThing(prompt, scenario), // sandbox / runLoop / direct call
125
- scenarios, holdoutScenarios, judges, runDir,
126
- reflection: { llm, model: REFLECTION_MODEL }, // builds the default gepaDriver
127
- // gate? defaults to heldOutGate; pass defaultProductionGate for red-team hardening
122
+ import { selfImprove } from '@tangle-network/agent-eval/contract'
123
+ const result = await selfImprove({
124
+ baselineSurface: CURRENT_SYSTEM_PROMPT,
125
+ agent: (surface, scenario, ctx) => runYourThing(surface, scenario), // sandbox / runLoop / direct call
126
+ scenarios,
127
+ judge,
128
+ budget: { holdoutScenarios, generations: 3, populationSize: 2 },
129
+ llm: { baseUrl, apiKey, model: REFLECTION_MODEL }, // drives the default gepaDriver
130
+ // driver? — pass agent-runtime's improvementDriver to optimize CODE (worktree) instead of a string
131
+ // gate? — defaults to a held-out gate; pass defaultProductionGate for red-team hardening
128
132
  })
129
- // use `prompt` unconditionally: it's the baseline until a candidate genuinely wins
133
+ // use result.winner.surface unconditionally: it's the baseline until a candidate genuinely wins
130
134
  ```
131
135
 
132
- ### optimizePrompt gotchas — read before wiring
136
+ ### selfImprove gotchas — read before wiring
133
137
 
134
138
  - **`gepaDriver` mutates TEXT only**, and its only structural guard is `##` H2
135
139
  headings (`preserveSections`) + `maxSentenceEdits`. Make load-bearing sections
@@ -137,12 +141,11 @@ const { prompt, improved, decision, delta } = await optimizePrompt({
137
141
  GEPA optimizes the prose, never the envelope/contract.
138
142
  - **Scenarios must be domain-real.** Derive them from the surface's own traces /
139
143
  ground truth, not from unrelated corpora. Cross-domain examples are noise.
140
- - **Extend, don't fork.** If the product already wires `runImprovementLoop`
141
- (e.g. for a main-agent prompt), add the new surface as another target in that
142
- harness rather than bolting on a second optimizer.
143
- - `runWithPrompt` is the only domain seam — the optimizer never assumes how a
144
- prompt runs. Report cost via `ctx.cost` inside it so the integrity guard sees
145
- real activity.
144
+ - **Extend, don't fork.** If the product already wires `selfImprove` /
145
+ `runImprovementLoop` (e.g. for a main-agent prompt), add the new surface as
146
+ another target in that harness rather than bolting on a second optimizer.
147
+ - `agent` is the only domain seam — the optimizer never assumes how a surface
148
+ runs. Report cost via `ctx.cost` inside it so the integrity guard sees real activity.
146
149
  - A live run needs a real backend (`TANGLE_API_KEY` / router, or local
147
150
  cli-bridge) and real spend; it is not free.
148
151
 
@@ -161,7 +164,7 @@ Mount it on a production `AgentProfile.mcp`; do not re-implement delegation.
161
164
  `loops/types.ts:Driver` only when none fit — never fork the kernel.
162
165
  - [ ] `runLoop` is bridged to campaigns via `loopDispatch` / `loopCampaignDispatch`
163
166
  (usage + trace auto-forwarded), not a hand-rolled ExecCtx.
164
- - [ ] Every optimizable prompt is registered through `optimizePrompt` (or the
167
+ - [ ] Every optimizable prompt is registered through `selfImprove` (or the
165
168
  product's existing `runImprovementLoop`), identity-gated on a held-out set.
166
169
  - [ ] Boundaries fail loud: no `null` sandbox client, no silent adapter return,
167
170
  no unguarded planner envelope.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/profiles/coder.ts"],"sourcesContent":["/**\n * @experimental\n *\n * `coderProfile` — opinionated preset for code-modification tasks.\n *\n * The agent is told to:\n * - work on a fresh branch inside the sandbox workspace\n * - keep the patch minimal (under `maxDiffLines`)\n * - avoid `forbiddenPaths`\n * - run `testCmd` and `typecheckCmd`\n * - emit a final JSON result the output adapter parses\n *\n * The profile is stateless and agent-agnostic — `harness` selects the\n * sandbox-SDK backend (`claude-code`, `codex`, `opencode/*`). For\n * heterogeneous fanout, use `multiHarnessCoderFanout`.\n */\n\nimport type { AgentProfile, SandboxEvent } from '@tangle-network/sandbox'\nimport { createFanoutVoteDriver } from '../loops/drivers/fanout-vote'\nimport type { AgentRunSpec, DefaultVerdict, Driver, OutputAdapter, Validator } from '../loops/types'\n\nconst DEFAULT_MAX_DIFF_LINES = 400\n\n/** @experimental */\nexport interface CoderTask {\n /** What the agent must accomplish. Free-form prose. */\n goal: string\n /** Absolute path inside the sandbox where the repo lives. */\n repoRoot: string\n /** Default `main`. The branch the agent diffs against. */\n baseBranch?: string\n /** Default `pnpm test --run`. */\n testCmd?: string\n /** Default `pnpm typecheck`. */\n typecheckCmd?: string\n /** Files the agent may inspect for context. Surfaced verbatim in the prompt. */\n contextFiles?: string[]\n /**\n * Paths the agent must not touch. Validator hard-fails on any match.\n * Use glob-free literal path prefixes for unambiguous enforcement.\n */\n forbiddenPaths?: string[]\n /** Default 400. Hard cap; validator hard-fails when exceeded. */\n maxDiffLines?: number\n}\n\n/** @experimental */\nexport interface CoderOutput {\n /** Branch the agent wrote the patch on. */\n branch: string\n /** Unified diff (`git diff <base>..HEAD`). */\n patch: string\n testResult: { passed: boolean; output: string }\n typecheckResult: { passed: boolean; output: string }\n diffStats: { filesChanged: number; insertions: number; deletions: number }\n /** Optional reviewer commentary surfaced by the agent. */\n reviewerNotes?: string\n}\n\n/** @experimental */\nexport interface CoderProfileOptions {\n /** Sandbox-SDK backend.type. Default `'claude-code'`. */\n harness?: string\n /** Default model id passed in `AgentProfile.model.default`. */\n model?: string\n /** Custom system prompt replacement. Default = built-in coder preset. */\n systemPrompt?: string\n /** Stable name for `AgentRunSpec.name`. Default = `coder-${harness}`. */\n name?: string\n}\n\n/**\n * Build a coder preset.\n *\n * `validator` enforces test + typecheck + a 400-line default diff cap. For\n * per-task `forbiddenPaths` / `maxDiffLines` enforcement, pass `task` here\n * — the returned validator closes over its constraints. Without a task\n * the validator falls back to the default cap and skips path enforcement.\n *\n * @experimental\n */\nexport function coderProfile(options: CoderProfileOptions & { task?: CoderTask } = {}): {\n profile: AgentProfile\n taskToPrompt: (task: CoderTask) => string\n output: OutputAdapter<CoderOutput>\n validator: Validator<CoderOutput>\n agentRunSpec: AgentRunSpec<CoderTask>\n} {\n const harness = options.harness ?? 'claude-code'\n const name = options.name ?? `coder-${harness}`\n const systemPrompt = options.systemPrompt ?? DEFAULT_CODER_SYSTEM_PROMPT\n const profile: AgentProfile = {\n name,\n description: 'Code-modification agent. Minimal-diff worktree-based coder.',\n prompt: { systemPrompt },\n model: options.model ? { default: options.model } : undefined,\n tools: { git: true, fs: true, shell: true, test_runner: true },\n metadata: { backendType: harness, role: 'coder' },\n }\n const output: OutputAdapter<CoderOutput> = { parse: parseCoderEvents }\n const validator: Validator<CoderOutput> = options.task\n ? createCoderValidator(options.task)\n : createCoderValidator({\n goal: '',\n repoRoot: '',\n forbiddenPaths: [],\n maxDiffLines: DEFAULT_MAX_DIFF_LINES,\n })\n const agentRunSpec: AgentRunSpec<CoderTask> = {\n name,\n profile,\n taskToPrompt: formatCoderPrompt,\n }\n return { profile, taskToPrompt: formatCoderPrompt, output, validator, agentRunSpec }\n}\n\n/** @experimental */\nexport interface MultiHarnessCoderFanoutOptions {\n /**\n * Sandbox-SDK backend.type identifiers, one per parallel agent. Default:\n * `['claude-code', 'codex', 'opencode/zai-coding-plan/glm-5.1']`.\n */\n harnesses?: string[]\n /** Optional per-harness model override. Indexed parallel to `harnesses`. */\n models?: (string | undefined)[]\n}\n\n/** @experimental */\nexport function multiHarnessCoderFanout(options: MultiHarnessCoderFanoutOptions = {}): {\n agentRuns: AgentRunSpec<CoderTask>[]\n output: OutputAdapter<CoderOutput>\n validator: Validator<CoderOutput>\n driver: Driver<CoderTask, CoderOutput, 'pick-winner' | 'fail'>\n} {\n const harnesses =\n options.harnesses && options.harnesses.length > 0\n ? options.harnesses\n : ['claude-code', 'codex', 'opencode/zai-coding-plan/glm-5.1']\n const models = options.models ?? []\n const agentRuns = harnesses.map((harness, i) => {\n const { agentRunSpec } = coderProfile({ harness, model: models[i] })\n return agentRunSpec\n })\n const { output, validator } = coderProfile()\n const driver = createFanoutVoteDriver<CoderTask, CoderOutput>({ n: harnesses.length })\n return { agentRuns, output, validator, driver }\n}\n\nconst DEFAULT_CODER_SYSTEM_PROMPT = [\n 'You are a coder agent operating inside an isolated sandbox workspace.',\n 'Your job is to deliver a minimal, correct patch for the user-supplied goal.',\n '',\n 'Hard rules:',\n ' 1. Work on a fresh branch off the supplied base. Do not mutate the base branch.',\n ' 2. Never touch a forbidden path. The user will list them explicitly.',\n ' 3. Keep the diff under the max-diff cap. Prefer the smallest change that ships.',\n ' 4. Run the supplied test and typecheck commands before declaring done.',\n ' 5. If either command fails, fix the cause — do not weaken the test or hide the error.',\n '',\n 'When you finish, emit a single final structured message of the shape:',\n ' ```json',\n ' { \"branch\": \"<branch-name>\",',\n ' \"patch\": \"<unified-diff>\",',\n ' \"testResult\": { \"passed\": <bool>, \"output\": \"<stdout/stderr>\" },',\n ' \"typecheckResult\": { \"passed\": <bool>, \"output\": \"<stdout/stderr>\" },',\n ' \"diffStats\": { \"filesChanged\": <int>, \"insertions\": <int>, \"deletions\": <int> },',\n ' \"reviewerNotes\": \"<optional commentary>\" }',\n ' ```',\n].join('\\n')\n\nfunction formatCoderPrompt(task: CoderTask): string {\n const base = task.baseBranch ?? 'main'\n const testCmd = task.testCmd ?? 'pnpm test --run'\n const typecheckCmd = task.typecheckCmd ?? 'pnpm typecheck'\n const maxDiff = task.maxDiffLines ?? DEFAULT_MAX_DIFF_LINES\n const forbidden = task.forbiddenPaths?.length ? task.forbiddenPaths.join(', ') : '(none)'\n const context = task.contextFiles?.length\n ? task.contextFiles.map((f) => ` - ${f}`).join('\\n')\n : ' (none)'\n return [\n `Goal: ${task.goal}`,\n `Repo: ${task.repoRoot}`,\n `Base branch: ${base}`,\n `Run tests with: ${testCmd}`,\n `Run typecheck with: ${typecheckCmd}`,\n `Forbidden paths: ${forbidden}`,\n `Max diff lines: ${maxDiff}`,\n 'Context files:',\n context,\n '',\n 'Produce a minimal patch on a fresh branch. Run tests and typecheck before',\n 'returning. Emit the final JSON result block exactly as instructed.',\n ].join('\\n')\n}\n\n/**\n * Walk the event stream and return the last structured `coder.result` payload.\n *\n * The agent is instructed to emit a JSON block; in practice the sandbox SDK\n * lifts the structured payload onto `data.result` of a `result` / `final`\n * event. When the event stream does not contain a structured result, the\n * adapter scans text deltas for a fenced JSON block matching the expected\n * keys. Both shapes converge on `CoderOutput`.\n */\nfunction parseCoderEvents(events: SandboxEvent[]): CoderOutput {\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 : {}\n if (type === 'result' || type === 'final' || type === 'coder.result') {\n const direct = coerceCoderOutput(data.result ?? data.output ?? data)\n if (direct) return direct\n }\n }\n // Fallback: scan text deltas in reverse for a fenced JSON block.\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 : {}\n const text = pickString(data.text) ?? pickString(data.delta)\n if (!text) continue\n const fenced = extractFencedJson(text)\n if (!fenced) continue\n const coerced = coerceCoderOutput(fenced)\n if (coerced) return coerced\n }\n return {\n branch: '',\n patch: '',\n testResult: { passed: false, output: '' },\n typecheckResult: { passed: false, output: '' },\n diffStats: { filesChanged: 0, insertions: 0, deletions: 0 },\n }\n}\n\n/**\n * Build a validator that closes over a specific `CoderTask`'s constraints.\n *\n * Checks in order:\n * 1. Forbidden-path: any `+++` / `---` header in the patch matching a\n * path prefix in `task.forbiddenPaths` fails hard.\n * 2. Diff size: line count above `task.maxDiffLines` (default 400) fails\n * hard; below cap, the score shrinks linearly.\n * 3. Tests: `output.testResult.passed` must be `true`.\n * 4. Typecheck: `output.typecheckResult.passed` must be `true`.\n *\n * Aggregate score: `0.5 * tests + 0.3 * typecheck + 0.2 * (1 - diffLines/maxDiff)`.\n * `valid` is the conjunction of all four.\n *\n * @experimental\n */\n/**\n * Default-on safety floor (folded from the ai-trading-blueprint delegation\n * MCP): a coder patch that touches a credential-shaped path is rejected\n * regardless of `forbiddenPaths` config. Catches `.env`, private keys,\n * keystores, wallets, and the common secret/credential JSON files.\n */\nconst SECRET_PATH_RE =\n /(^|\\/)(\\.env(\\.|$)|.*\\.(pem|key|p12|pfx|keystore|wallet)|id_rsa|id_ed25519|secrets?\\.json|credentials?\\.json)$/i\n\nexport function createCoderValidator(task: CoderTask): Validator<CoderOutput> {\n const maxDiff = task.maxDiffLines ?? DEFAULT_MAX_DIFF_LINES\n const forbidden = task.forbiddenPaths ?? []\n return {\n async validate(output) {\n const scores: Record<string, number> = {}\n const notes: string[] = []\n let pass = true\n\n const touched = touchedPathsFromPatch(output.patch)\n\n // No-op rejection: an empty patch can trivially \"pass\" tests/typecheck\n // (nothing changed) yet does no work — never a valid coder result.\n if (touched.length === 0 || output.patch.trim().length === 0) {\n pass = false\n scores.nonEmpty = 0\n notes.push('empty patch — no files changed')\n } else {\n scores.nonEmpty = 1\n }\n\n // Secret-path floor: always-on, independent of `forbiddenPaths`.\n const touchedSecrets = touched.filter((p) => SECRET_PATH_RE.test(p))\n if (touchedSecrets.length > 0) {\n pass = false\n scores.noSecrets = 0\n notes.push(`touched secret-shaped paths: ${touchedSecrets.join(', ')}`)\n } else {\n scores.noSecrets = 1\n }\n\n const touchedForbidden = forbidden.filter((path) => {\n const prefix = path.endsWith('/') ? path : `${path}/`\n const exact = prefix.slice(0, -1)\n return touched.some((p) => p === exact || p.startsWith(prefix))\n })\n if (touchedForbidden.length > 0) {\n pass = false\n scores.forbiddenPath = 0\n notes.push(`touched forbidden paths: ${touchedForbidden.join(', ')}`)\n } else {\n scores.forbiddenPath = 1\n }\n\n const diffLines = countDiffLines(output.patch)\n if (diffLines > maxDiff) {\n pass = false\n scores.diffSize = 0\n notes.push(`diff ${diffLines} lines exceeds cap ${maxDiff}`)\n } else {\n scores.diffSize = maxDiff === 0 ? 0 : Math.max(0, 1 - diffLines / maxDiff)\n }\n\n scores.tests = output.testResult.passed ? 1 : 0\n scores.typecheck = output.typecheckResult.passed ? 1 : 0\n if (!output.testResult.passed) {\n pass = false\n notes.push('tests failed')\n }\n if (!output.typecheckResult.passed) {\n pass = false\n notes.push('typecheck failed')\n }\n\n const score = 0.5 * scores.tests + 0.3 * scores.typecheck + 0.2 * scores.diffSize\n const verdict: DefaultVerdict = {\n valid: pass,\n score: Number.isFinite(score) ? score : 0,\n scores,\n }\n if (notes.length > 0) verdict.notes = notes.join('; ')\n return verdict\n },\n }\n}\n\nfunction touchedPathsFromPatch(patch: string): string[] {\n const out = new Set<string>()\n for (const line of patch.split(/\\r?\\n/)) {\n if (line.startsWith('+++ ') || line.startsWith('--- ')) {\n const rest = line.slice(4).trim()\n if (rest === '/dev/null') continue\n const stripped = rest.startsWith('a/') || rest.startsWith('b/') ? rest.slice(2) : rest\n out.add(stripped)\n }\n }\n return [...out]\n}\n\nfunction countDiffLines(patch: string): number {\n let count = 0\n for (const line of patch.split(/\\r?\\n/)) {\n if (\n (line.startsWith('+') || line.startsWith('-')) &&\n !line.startsWith('+++') &&\n !line.startsWith('---')\n ) {\n count += 1\n }\n }\n return count\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 if (!match) return undefined\n const body = (match[1] ?? '').trim()\n if (!body) return undefined\n try {\n return JSON.parse(body)\n } catch {\n return undefined\n }\n}\n\nfunction coerceCoderOutput(value: unknown): CoderOutput | undefined {\n if (!isRecord(value)) return undefined\n const branch = pickString(value.branch)\n const patch = pickString(value.patch) ?? ''\n if (branch === undefined) return undefined\n const testResult = coerceCmdResult(value.testResult)\n const typecheckResult = coerceCmdResult(value.typecheckResult)\n const diffStats = coerceDiffStats(value.diffStats)\n return {\n branch,\n patch,\n testResult,\n typecheckResult,\n diffStats,\n reviewerNotes: pickString(value.reviewerNotes),\n }\n}\n\nfunction coerceCmdResult(value: unknown): { passed: boolean; output: string } {\n if (!isRecord(value)) return { passed: false, output: '' }\n return {\n passed: value.passed === true,\n output: pickString(value.output) ?? '',\n }\n}\n\nfunction coerceDiffStats(value: unknown): {\n filesChanged: number\n insertions: number\n deletions: number\n} {\n if (!isRecord(value)) return { filesChanged: 0, insertions: 0, deletions: 0 }\n return {\n filesChanged: toFiniteInt(value.filesChanged),\n insertions: toFiniteInt(value.insertions),\n deletions: toFiniteInt(value.deletions),\n }\n}\n\nfunction toFiniteInt(value: unknown): number {\n if (typeof value !== 'number') return 0\n if (!Number.isFinite(value)) return 0\n return Math.max(0, Math.trunc(value))\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/loop-runner.ts","../src/loop-runner-bin.ts"],"sourcesContent":["/**\n * @experimental\n *\n * `runDelegatedLoop` — the configured delegated loop-runner.\n *\n * One typed entrypoint a worker agent (or a scheduled routine) calls to run a\n * disciplined loop in a chosen MODE, over agent-runtime's hardened engines:\n *\n * code → build-in-a-loop via the coder delegate (no-op + secret floor,\n * optional reviewer gate, winner-selection)\n * review → code mode with a REQUIRED reviewer (the gate is the point)\n * research → research-in-a-loop with valid-only KB growth (createKbGate)\n * audit → analyze trace/run data → findings (runAnalystLoop, caller-wired)\n * self-improve → identity-gated prompt optimization (optimizePrompt, caller-wired)\n * dynamic → agent-authored topology (runLoop + createDynamicDriver)\n *\n * It is intentionally a thin façade: the value is that EVERY product reuses the\n * one hardened engine instead of forking delegation logic. The dispatcher owns\n * mode routing, timing, fail-loud on an unregistered mode, and a uniform result\n * shape; each mode's engine is a pre-configured runner in the registry (build it\n * with the factories below, or inject your own / a stub).\n */\n\nimport type { Scenario } from '@tangle-network/agent-eval/campaign'\nimport { runAnalystLoop } from './analyst-loop'\nimport type { RunAnalystLoopOpts, RunAnalystLoopResult } from './analyst-loop/types'\nimport { ConfigError } from './errors'\nimport {\n type OptimizePromptOptions,\n type OptimizePromptResult,\n optimizePrompt,\n} from './improvement/optimize-prompt'\nimport {\n type AgentRunSpec,\n createDynamicDriver,\n type DynamicDecision,\n type LoopResult,\n type LoopSandboxClient,\n type OutputAdapter,\n runLoop,\n type TopologyPlanner,\n type Validator,\n} from './loops'\nimport {\n type CoderReviewer,\n type CoderWinnerSelection,\n createDefaultCoderDelegate,\n type DelegateRunCtx,\n} from './mcp/delegates'\nimport { type CreateKbGateOptions, createKbGate, type FactCandidate } from './mcp/kb-gate'\nimport type { DelegateCodeArgs } from './mcp/types'\nimport type { CoderOutput } from './profiles/coder'\n\n/** @experimental Every delegated-loop mode, for validation + CLI surfaces. */\nexport const DELEGATED_LOOP_MODES = [\n 'code',\n 'review',\n 'research',\n 'audit',\n 'self-improve',\n 'dynamic',\n] as const\n\n/** @experimental */\nexport type DelegatedLoopMode = (typeof DELEGATED_LOOP_MODES)[number]\n\n/** @experimental Type guard for an untrusted mode string (CLI / config input). */\nexport function isDelegatedLoopMode(value: unknown): value is DelegatedLoopMode {\n return typeof value === 'string' && (DELEGATED_LOOP_MODES as readonly string[]).includes(value)\n}\n\n/** @experimental A pre-configured loop for one mode. Returns the mode's raw\n * output; the dispatcher wraps it in a {@link DelegatedLoopResult}. */\nexport type DelegatedLoopRunner<T = unknown> = (signal: AbortSignal) => Promise<T>\n\n/** @experimental Mode → configured runner. Partial: only register the modes a\n * given product/routine actually uses. */\nexport type DelegatedLoopRegistry = Partial<Record<DelegatedLoopMode, DelegatedLoopRunner>>\n\n/** @experimental Uniform result — never throws from a registered runner; a\n * thrown engine becomes `{ ok: false, error }` so a routine can record + move on. */\nexport interface DelegatedLoopResult<T = unknown> {\n mode: DelegatedLoopMode\n ok: boolean\n output?: T\n error?: string\n durationMs: number\n}\n\n/** @experimental */\nexport interface RunDelegatedLoopOptions {\n signal?: AbortSignal\n /** Clock override for deterministic tests. */\n now?: () => number\n}\n\n/**\n * @experimental\n *\n * Dispatch a configured loop by mode. Fails loud (throws `ConfigError`) when no\n * runner is registered for the mode — a routine pointed at an unwired mode is a\n * config bug, not a silent no-op. A runner that throws is captured as\n * `{ ok: false }` so unattended runs record the failure rather than crash.\n */\nexport async function runDelegatedLoop<T = unknown>(\n mode: DelegatedLoopMode,\n registry: DelegatedLoopRegistry,\n options: RunDelegatedLoopOptions = {},\n): Promise<DelegatedLoopResult<T>> {\n const runner = registry[mode] as DelegatedLoopRunner<T> | undefined\n if (!runner) {\n throw new ConfigError(\n `runDelegatedLoop: no runner registered for mode '${mode}' (registered: ${\n Object.keys(registry).join(', ') || 'none'\n })`,\n )\n }\n const now = options.now ?? Date.now\n const signal = options.signal ?? new AbortController().signal\n const start = now()\n try {\n const output = await runner(signal)\n return { mode, ok: true, output, durationMs: now() - start }\n } catch (err) {\n return {\n mode,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: now() - start,\n }\n }\n}\n\n/** @experimental Options for the default `code`/`review` runner. */\nexport interface CoderLoopRunnerOptions {\n sandboxClient: LoopSandboxClient\n /** What to build — the delegate args (goal, repoRoot, variants, config, …). */\n args: DelegateCodeArgs\n /** Adversarial reviewer. REQUIRED for `review` mode (see `reviewLoopRunner`). */\n reviewer?: CoderReviewer\n /** Winner-selection strategy. Default `highest-score`. */\n winnerSelection?: CoderWinnerSelection\n /** Harnesses for `variants > 1` fanout. */\n fanoutHarnesses?: string[]\n}\n\n/** @experimental Build a `code`-mode runner over the hardened coder delegate. */\nexport function coderLoopRunner(options: CoderLoopRunnerOptions): DelegatedLoopRunner<CoderOutput> {\n const delegate = createDefaultCoderDelegate({\n sandboxClient: options.sandboxClient,\n ...(options.reviewer ? { reviewer: options.reviewer } : {}),\n ...(options.winnerSelection ? { winnerSelection: options.winnerSelection } : {}),\n ...(options.fanoutHarnesses ? { fanoutHarnesses: options.fanoutHarnesses } : {}),\n })\n return async (signal) => {\n const ctx: DelegateRunCtx = { signal, report: () => {} }\n return delegate(options.args, ctx)\n }\n}\n\n/**\n * @experimental\n *\n * `review` mode = `code` with a REQUIRED reviewer. The gate is the whole point,\n * so the type forces a reviewer (a \"review loop\" with no reviewer is a code loop).\n */\nexport function reviewLoopRunner(\n options: CoderLoopRunnerOptions & { reviewer: CoderReviewer },\n): DelegatedLoopRunner<CoderOutput> {\n return coderLoopRunner(options)\n}\n\n/** @experimental Options for the default `dynamic` runner. */\nexport interface DynamicLoopRunnerOptions<Task, Output> {\n sandboxClient: LoopSandboxClient\n /** The agent-authored topology planner (e.g. `createSandboxPlanner(...)`). */\n planner: TopologyPlanner<Task, Output>\n task: Task\n output: OutputAdapter<Output>\n validator?: Validator<Output>\n /** Exactly one of `agentRun` / `agentRuns` (runLoop validates). */\n agentRun?: AgentRunSpec<Task>\n agentRuns?: AgentRunSpec<Task>[]\n maxIterations?: number\n maxFanout?: number\n}\n\n/** @experimental `dynamic` mode — agent-authored topology over `runLoop`. */\nexport function dynamicLoopRunner<Task, Output>(\n o: DynamicLoopRunnerOptions<Task, Output>,\n): DelegatedLoopRunner<LoopResult<Task, Output, DynamicDecision>> {\n return async (signal) =>\n runLoop<Task, Output, DynamicDecision>({\n driver: createDynamicDriver<Task, Output>({\n planner: o.planner,\n ...(o.maxIterations !== undefined ? { maxIterations: o.maxIterations } : {}),\n ...(o.maxFanout !== undefined ? { maxFanout: o.maxFanout } : {}),\n }),\n ...(o.agentRun ? { agentRun: o.agentRun } : {}),\n ...(o.agentRuns ? { agentRuns: o.agentRuns } : {}),\n output: o.output,\n ...(o.validator ? { validator: o.validator } : {}),\n task: o.task,\n ctx: { sandboxClient: o.sandboxClient, signal },\n ...(o.maxIterations !== undefined ? { maxIterations: o.maxIterations } : {}),\n })\n}\n\n/** @experimental A fact rejected at the KB gate — surfaced, never dropped. */\nexport interface VetoedFact {\n candidate: FactCandidate\n vetoedBy?: string\n reason?: string\n}\n\n/** @experimental */\nexport interface ResearchLoopResult {\n /** Facts that passed the fail-closed gate — safe to write to the KB. */\n accepted: FactCandidate[]\n /** Facts the gate vetoed in the final round — escalate, do not silently drop. */\n vetoed: VetoedFact[]\n /** Research rounds actually run. */\n rounds: number\n}\n\n/** @experimental Options for the default `research` runner. */\nexport interface ResearchLoopRunnerOptions {\n /**\n * The research engine (the consumer's web/doc searcher + extractor). Called\n * each round with the prior round's vetoes so it can re-research the gaps.\n * Returns fact candidates carrying their grounding (`verbatimPassage` +\n * `sourceText`).\n */\n research: (round: number, vetoed: VetoedFact[]) => Promise<FactCandidate[]>\n /** Gate config (extra judges, self-artifact kinds, …). The floor is always on. */\n gate?: CreateKbGateOptions\n /** Max research rounds (correct-on-veto remediation). Default 1. */\n maxRounds?: number\n}\n\n/**\n * @experimental `research` mode — research-in-a-loop with valid-only KB growth.\n *\n * Each round: research → gate every candidate (fail-closed; passage MUST be in\n * the source) → accept the clean ones → re-research the vetoed ones next round,\n * up to `maxRounds`. Vetoed facts in the final round are RETURNED (escalate,\n * never silently dropped) so the caller audits vs retries.\n */\nexport function researchLoopRunner(\n o: ResearchLoopRunnerOptions,\n): DelegatedLoopRunner<ResearchLoopResult> {\n const gate = createKbGate(o.gate)\n const maxRounds = Math.max(1, Math.trunc(o.maxRounds ?? 1))\n return async (signal) => {\n const accepted: FactCandidate[] = []\n let vetoed: VetoedFact[] = []\n let rounds = 0\n for (let round = 0; round < maxRounds; round += 1) {\n if (signal.aborted) break\n rounds += 1\n const candidates = await o.research(round, vetoed)\n if (candidates.length === 0) break\n vetoed = []\n for (const c of candidates) {\n const v = await gate(c)\n if (v.accepted) accepted.push(c)\n else vetoed.push({ candidate: c, vetoedBy: v.vetoedBy, reason: v.reason })\n }\n if (vetoed.length === 0) break\n }\n return { accepted, vetoed, rounds }\n }\n}\n\n/** @experimental `self-improve` mode — identity-gated prompt optimization. */\nexport function selfImproveLoopRunner<TScenario extends Scenario, TArtifact>(\n options: OptimizePromptOptions<TScenario, TArtifact>,\n): DelegatedLoopRunner<OptimizePromptResult<TArtifact, TScenario>> {\n return async () => optimizePrompt<TScenario, TArtifact>(options)\n}\n\n/** @experimental `audit` mode — analyst loop over captured trace/run data. */\nexport function auditLoopRunner<TProposal = unknown, TEdit = unknown>(\n options: RunAnalystLoopOpts,\n): DelegatedLoopRunner<RunAnalystLoopResult<TProposal, TEdit>> {\n return async () => runAnalystLoop<TProposal, TEdit>(options)\n}\n","#!/usr/bin/env node\n/**\n * @experimental\n *\n * `agent-runtime-loop` — the schedulable entrypoint for the configured\n * delegated loop-runner. A cron job / routine / Makefile target invokes:\n *\n * agent-runtime-loop --mode research --config ./loops.config.js\n *\n * The config module wires the registry (with full access to env / creds —\n * which is why the deps live there, not in this generic bin). It must default-\n * export a `DelegatedLoopRegistry`, or a `() => DelegatedLoopRegistry | Promise<…>`.\n * The bin runs the selected mode, prints the `DelegatedLoopResult` as JSON, and\n * exits 0 on `ok`, 1 on a recorded failure, 2 on a usage/config error.\n */\n\nimport {\n DELEGATED_LOOP_MODES,\n type DelegatedLoopMode,\n type DelegatedLoopRegistry,\n type DelegatedLoopResult,\n isDelegatedLoopMode,\n runDelegatedLoop,\n} from './loop-runner'\n\n/** @experimental Parsed CLI invocation. */\nexport interface LoopRunnerCliArgs {\n mode: string\n /** Loads the registry — the bin wires this from `--config`; tests inject a stub. */\n loadRegistry: () => Promise<DelegatedLoopRegistry> | DelegatedLoopRegistry\n now?: () => number\n}\n\n/** @experimental */\nexport interface LoopRunnerCliResult {\n exitCode: number\n result?: DelegatedLoopResult\n error?: string\n}\n\n/**\n * @experimental\n *\n * Pure CLI core (no process / argv / IO) so it's unit-testable: validate the\n * mode, load the registry, dispatch, map to an exit code (0 ok / 1 failed /\n * 2 usage). Exported for embedding in custom runners + tests.\n */\nexport async function runLoopRunnerCli(args: LoopRunnerCliArgs): Promise<LoopRunnerCliResult> {\n if (!isDelegatedLoopMode(args.mode)) {\n return {\n exitCode: 2,\n error: `unknown mode '${args.mode}' (expected one of: ${DELEGATED_LOOP_MODES.join(', ')})`,\n }\n }\n let registry: DelegatedLoopRegistry\n try {\n registry = await args.loadRegistry()\n } catch (err) {\n return { exitCode: 2, error: `failed to load registry: ${errMsg(err)}` }\n }\n if (!registry[args.mode]) {\n return {\n exitCode: 2,\n error: `config registers no runner for mode '${args.mode}' (registered: ${\n Object.keys(registry).join(', ') || 'none'\n })`,\n }\n }\n // runDelegatedLoop throws only on a missing runner (guarded above); a failing\n // engine is captured as { ok: false } → exit 1, not a crash.\n const result = await runDelegatedLoop(args.mode as DelegatedLoopMode, registry, {\n ...(args.now ? { now: args.now } : {}),\n })\n return { exitCode: result.ok ? 0 : 1, result }\n}\n\n/** Parse `--mode X --config Y` from an argv tail (`process.argv.slice(2)`). */\nexport function parseLoopRunnerArgv(argv: string[]): { mode?: string; config?: string } {\n const out: { mode?: string; config?: string } = {}\n for (let i = 0; i < argv.length; i += 1) {\n const a = argv[i]\n if (a === '--mode') out.mode = argv[++i]\n else if (a === '--config') out.config = argv[++i]\n else if (a?.startsWith('--mode=')) out.mode = a.slice('--mode='.length)\n else if (a?.startsWith('--config=')) out.config = a.slice('--config='.length)\n }\n return out\n}\n\n/** Normalize a config module's default export → a registry. */\nfunction resolveRegistry(mod: unknown): DelegatedLoopRegistry {\n const def = (mod as { default?: unknown })?.default ?? mod\n const value = typeof def === 'function' ? (def as () => unknown)() : def\n return value as DelegatedLoopRegistry\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\n/** The argv → IO → exit shell. Kept thin; logic lives in `runLoopRunnerCli`. */\nasync function main(): Promise<void> {\n const { mode, config } = parseLoopRunnerArgv(process.argv.slice(2))\n if (!mode || !config) {\n process.stderr.write(\n 'usage: agent-runtime-loop --mode <mode> --config <module>\\n' +\n ` modes: ${DELEGATED_LOOP_MODES.join(' | ')}\\n` +\n ' config: a JS/TS module default-exporting a DelegatedLoopRegistry (or a factory)\\n',\n )\n process.exit(2)\n }\n const { pathToFileURL } = await import('node:url')\n const { resolve } = await import('node:path')\n const cli = await runLoopRunnerCli({\n mode,\n loadRegistry: async () => resolveRegistry(await import(pathToFileURL(resolve(config)).href)),\n })\n process.stdout.write(`${JSON.stringify(cli.result ?? { error: cli.error }, null, 2)}\\n`)\n if (cli.error) process.stderr.write(`${cli.error}\\n`)\n process.exit(cli.exitCode)\n}\n\n// Run only when executed as the bin — never when imported for the testable\n// core, and never when bundled into a runtime that has no `process.argv`\n// (e.g. Cloudflare Workers, where `process` is a shim without `argv`). Reading\n// `process.argv[1]` directly would throw at module load there; `process.argv?.`\n// keeps the guard a no-op instead of crashing the Worker on startup.\nconst invokedScript = typeof process !== 'undefined' ? process.argv?.[1] : undefined\nif (invokedScript && /loop-runner-bin\\.(js|ts|mjs)$/.test(invokedScript)) {\n void main()\n}\n"],"mappings":"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","names":[]}