@agentproto/workflow-runtime 0.7.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -93,6 +93,12 @@ final message against it, **re-prompting on mismatch** up to `maxRetries`
93
93
  (default 2). The step's bound output is `{ sessionId, output }` where `output`
94
94
  is the parsed, schema-valid value.
95
95
 
96
+ Without `outputSchema`, an agent step whose host implements `readFinalMessage`
97
+ binds `{ sessionId, text }`, where `text` is the session's final assistant
98
+ message. The runtime uses that `text` to thread prior agent-step output into
99
+ later agent prompts automatically, so multi-step workflows can share context
100
+ without manual selector plumbing.
101
+
96
102
  ```ts
97
103
  const Verdict = z.object({
98
104
  verdict: z.enum(["real", "false-positive"]),
@@ -218,6 +224,21 @@ await runWorkflow({ workflow: wf, cache, cacheKey: "nightly-review" }) // run 2:
218
224
  Both `cache` and `cacheKey` must be set for any caching to happen. Supply your
219
225
  own `StepCache` (`{ get, set }`) for an in-memory or custom-backed journal.
220
226
 
227
+ ### Step lifecycle callbacks
228
+
229
+ Pass `onStepStart` and `onStepComplete` to `runWorkflow` to observe progress in
230
+ real time. The callbacks fire for every step kind; for `agent` steps, start fires
231
+ before spawn and complete fires after the turn (and any output-schema retry loop)
232
+ finishes.
233
+
234
+ ```ts
235
+ await runWorkflow({
236
+ workflow: wf,
237
+ onStepStart: (stepId) => console.log("starting", stepId),
238
+ onStepComplete: (stepId, output) => console.log("done", stepId, output),
239
+ })
240
+ ```
241
+
221
242
  ## AgentSessionHost — the host seam
222
243
 
223
244
  The runtime has **no** knowledge of concrete session registries or event buses.
@@ -225,11 +246,22 @@ The runtime has **no** knowledge of concrete session registries or event buses.
225
246
 
226
247
  ```ts
227
248
  interface AgentSessionHost {
228
- spawn(adapter: string, opts: { cwd?; workspaceSlug?; stepId? }): Promise<string>
249
+ spawn(
250
+ adapter: string,
251
+ opts: {
252
+ cwd?
253
+ workspaceSlug?
254
+ stepId?
255
+ /** AIP-36 sandbox ref (provider slug or inline spec). */
256
+ sandbox?
257
+ /** Adapter option id → value, e.g. for an app-scoped agent resolution. */
258
+ options?: Record<string, boolean | number | string>
259
+ },
260
+ ): Promise<string>
229
261
  sendPromptAndWait(sessionId: string, prompt: string): Promise<void>
230
262
  resolveByLabel(stepId: string): string | undefined // for sessionRef reuse
231
263
  onAwaitingInput?(sessionId, policy): Promise<void>
232
- readFinalMessage?(sessionId): Promise<string> // required for outputSchema
264
+ readFinalMessage?(sessionId): Promise<string> // required for outputSchema; also supplies `text` output
233
265
  readCostUsd?(sessionId): Promise<number> // required for maxTotalCostUsd
234
266
  }
235
267
  ```
package/dist/index.mjs CHANGED
@@ -536,12 +536,14 @@ function compileStep(step, opts) {
536
536
  case "map": {
537
537
  const over = f(step, "over");
538
538
  const inner = compileStepList(f(step, "steps"), `${id}__body`, opts);
539
+ const onError = f(step, "onError");
539
540
  return {
540
541
  kind: "map",
541
542
  id,
542
543
  parallelism: f(step, "parallelism"),
543
544
  over: (b) => resolveRef(over, b),
544
- body: () => inner
545
+ body: () => inner,
546
+ ...onError !== void 0 ? { onError } : {}
545
547
  };
546
548
  }
547
549
  case "loop": {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/run-workflow.ts","../src/build-agent-step.ts","../src/compile-workflow.ts","../src/load-workflow.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * The step-walker. Executes a {@link RuntimeWorkflow} top-to-bottom, threading\n * each step's output into a run-scoped binding bag, and dispatching `tool`\n * steps through `@agentproto/driver` `runTool` (resolve DRIVER → validate input\n * + context → execute body → validate output). Composite steps (`map` /\n * `branch` / `loop` / `parallel` / `approval` / `subworkflow`) recurse over the\n * same bindings; `suspend` defers to the host's resume hook.\n */\n\nimport { runTool } from \"@agentproto/driver\"\nimport { createHash } from \"node:crypto\"\nimport type { ZodError } from \"zod\"\nimport type {\n AgentStep,\n Bindings,\n FanOutOutcome,\n RunStep,\n RunWorkflowArgs,\n RuntimeWorkflow,\n TolerantFanOutResult,\n WorkflowRunResult,\n} from \"./types.js\"\n\n/** Thrown by a `suspend` step when no host `resume` hook is provided. */\nexport class WorkflowSuspendedError extends Error {\n constructor(\n readonly stepId: string,\n readonly on: readonly string[],\n ) {\n super(\n `workflow suspended at step '${stepId}' awaiting [${on.join(\", \")}] — ` +\n `no resume hook supplied`,\n )\n this.name = \"WorkflowSuspendedError\"\n }\n}\n\ninterface RunState {\n readonly input: unknown\n readonly steps: Record<string, unknown>\n readonly maxTotalCostUsd?: number\n /** Last-known cost per session id; summed to get the run's total spend.\n * A Map (not a running delta) so a session reused across steps via\n * sessionRef is counted once, not double-counted. */\n readonly costBySession: Map<string, number>\n}\n\ninterface RunCtx {\n readonly state: RunState\n readonly approve?: RunWorkflowArgs[\"approve\"]\n readonly resume?: RunWorkflowArgs[\"resume\"]\n readonly signal?: AbortSignal\n readonly agents?: RunWorkflowArgs[\"agents\"]\n readonly cwd?: string\n readonly workspaceSlug?: string\n readonly cache?: RunWorkflowArgs[\"cache\"]\n readonly cacheKey?: RunWorkflowArgs[\"cacheKey\"]\n readonly onStepStart?: RunWorkflowArgs[\"onStepStart\"]\n readonly onStepComplete?: RunWorkflowArgs[\"onStepComplete\"]\n}\n\nfunction view(state: RunState, item?: unknown, index?: number): Bindings {\n return { input: state.input, steps: state.steps, item, index }\n}\n\n/** Resolve a value that is either a static string or a binding selector. */\nfunction resolveSel(sel: string | ((bindings: Bindings) => string), b: Bindings): string {\n return typeof sel === \"function\" ? sel(b) : sel\n}\n\n/** Extract a JSON candidate from raw assistant text:\n * 1. last ```json fenced block if present, else\n * 2. last generic ``` fenced block if present, else\n * 3. the whole trimmed string. */\nfunction extractJsonCandidate(raw: string): string {\n const jsonFence = /```json\\s*([\\s\\S]*?)```/g\n const lastJson = lastMatch(jsonFence, raw)\n if (lastJson !== undefined) return lastJson\n\n const anyFence = /```\\s*([\\s\\S]*?)```/g\n const lastAny = lastMatch(anyFence, raw)\n if (lastAny !== undefined) return lastAny\n\n return raw.trim()\n}\n\nfunction lastMatch(re: RegExp, s: string): string | undefined {\n let m: RegExpExecArray | null\n let last: RegExpExecArray | null = null\n while ((m = re.exec(s)) !== null) last = m\n return last ? last[1]?.trim() : undefined\n}\n\nfunction spentUsd(state: RunState): number {\n let total = 0\n for (const c of state.costBySession.values()) total += c\n return total\n}\n\n/** Deterministic content hash of a step's resolved inputs. */\nfunction hashResolvedInputs(kind: string, resolved: unknown): string {\n return createHash(\"sha256\")\n .update(`${kind}\\u0000${JSON.stringify(resolved) ?? \"undefined\"}`)\n .digest(\"hex\")\n}\n\n/** Namespaced journal key for a step under a run's cacheKey. */\nfunction stepJournalKey(cacheKey: string, step: RunStep): string {\n return `${cacheKey}\\u0000${step.id}\\u0000${step.kind}`\n}\n\n/** True when this step should consult/populate the journal. */\nfunction isCacheEnabled(ctx: RunCtx, step: { cacheable?: boolean }): boolean {\n return step.cacheable === true && ctx.cache !== undefined && ctx.cacheKey !== undefined\n}\n\n/** Read the journal; on a hit return the output, else the key+hash to write on miss. */\nasync function readStepCache(\n ctx: RunCtx,\n step: RunStep,\n resolvedInputs: unknown,\n): Promise<{ hit: true; output: unknown } | { hit: false; key: string; hash: string }> {\n const key = stepJournalKey(ctx.cacheKey!, step)\n const hash = hashResolvedInputs(step.kind, resolvedInputs)\n const entry = await ctx.cache!.get(key)\n if (entry !== undefined && entry.resolvedInputHash === hash) {\n return { hit: true, output: entry.output }\n }\n return { hit: false, key, hash }\n}\n\n/** `err.message` if `err` is an `Error`, else its string coercion. */\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction formatZodError(err: ZodError): string {\n return err.issues\n .map((i) => `${i.path.length > 0 ? i.path.join(\".\") + \": \" : \"\"}${i.message}`)\n .join(\", \")\n}\n\n/** Run an ordered list of steps, binding each output under its id; return last. */\nasync function runSequence(\n steps: readonly RunStep[],\n ctx: RunCtx,\n item: unknown,\n index: number | undefined,\n): Promise<unknown> {\n let last: unknown\n for (const s of steps) {\n const out = await execStep(s, ctx, item, index)\n ctx.state.steps[s.id] = out\n ctx.onStepComplete?.(s.id, out)\n last = out\n }\n return last\n}\n\n/** Execute the full AgentStep body — spawn, prompt, policy, budget, outputSchema retry loop. */\nasync function execAgentStep(step: AgentStep, ctx: RunCtx, b: Bindings): Promise<unknown> {\n // Notify step start before any execution\n ctx.onStepStart?.(step.id)\n\n if (\n step.adapter &&\n ctx.state.maxTotalCostUsd !== undefined &&\n spentUsd(ctx.state) >= ctx.state.maxTotalCostUsd\n ) {\n throw new Error(\n `step '${step.id}': budget_exceeded — run spend $${spentUsd(ctx.state).toFixed(4)} >= cap $${ctx.state.maxTotalCostUsd}`,\n )\n }\n const cwd = step.cwd ? resolveSel(step.cwd, b) : ctx.cwd\n // Sandbox ref: a selector resolves per-run (undefined ⇒ host spawn); a\n // literal (slug string or inline spec object) passes through as-is.\n const sandbox =\n typeof step.sandbox === \"function\" ? step.sandbox(b) : step.sandbox\n const sessionId = step.adapter\n ? await ctx.agents!.spawn(resolveSel(step.adapter, b), {\n cwd,\n workspaceSlug: ctx.workspaceSlug,\n stepId: step.id,\n ...(sandbox !== undefined ? { sandbox } : {}),\n ...(step.options !== undefined ? { options: step.options } : {}),\n })\n : ctx.agents!.resolveByLabel(step.sessionRef!)\n if (!sessionId) throw new Error(`step '${step.id}': no session (adapter and sessionRef both unresolved)`)\n await ctx.agents!.sendPromptAndWait(sessionId, step.prompt(b))\n if (step.policy && ctx.agents!.onAwaitingInput) {\n await ctx.agents!.onAwaitingInput(sessionId, step.policy)\n }\n\n if (ctx.agents!.readCostUsd) {\n ctx.state.costBySession.set(sessionId, await ctx.agents!.readCostUsd(sessionId))\n }\n\n if (!step.outputSchema) {\n let text: string | undefined\n if (ctx.agents!.readFinalMessage) {\n try {\n text = await ctx.agents!.readFinalMessage(sessionId)\n } catch {\n // ignore\n }\n }\n return { sessionId, ...(text !== undefined ? { text } : {}) }\n }\n\n // Validate-and-retry loop\n if (!ctx.agents!.readFinalMessage) {\n throw new Error(`step '${step.id}': outputSchema requires a host with readFinalMessage`)\n }\n const maxRetries = step.maxRetries ?? 2\n let lastErr = \"\"\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const raw = await ctx.agents!.readFinalMessage(sessionId)\n const candidate = extractJsonCandidate(raw)\n let value: unknown\n try {\n value = JSON.parse(candidate)\n } catch {\n lastErr = \"not valid JSON\"\n if (attempt < maxRetries) {\n await ctx.agents!.sendPromptAndWait(\n sessionId,\n `Your previous reply did not match the required schema: ${lastErr}. ` +\n `Reply again with ONLY a JSON object that matches. No prose, no code fence needed.`,\n )\n }\n continue\n }\n const res = step.outputSchema.safeParse(value)\n if (res.success) return { sessionId, output: res.data }\n lastErr = formatZodError(res.error)\n if (attempt < maxRetries) {\n await ctx.agents!.sendPromptAndWait(\n sessionId,\n `Your previous reply did not match the required schema: ${lastErr}. ` +\n `Reply again with ONLY a JSON object that matches. No prose, no code fence needed.`,\n )\n }\n }\n throw new Error(`step '${step.id}': output_invalid — final message never matched outputSchema (${lastErr})`)\n}\n\nasync function execStep(\n step: RunStep,\n ctx: RunCtx,\n item: unknown,\n index: number | undefined,\n): Promise<unknown> {\n const { state, signal } = ctx\n const b = view(state, item, index)\n\n // Notify step start for non-agent steps (agent steps notify in execAgentStep)\n if (step.kind !== \"agent\") {\n ctx.onStepStart?.(step.id)\n }\n\n switch (step.kind) {\n case \"tool\": {\n const input = step.input(b)\n const runIt = (): Promise<unknown> =>\n runTool({\n tool: step.tool,\n candidates: step.candidates,\n input,\n context: step.context ? step.context(b) : undefined,\n resolverContext: step.resolverContext,\n secrets: step.secrets,\n signal,\n })\n if (!isCacheEnabled(ctx, step)) return runIt()\n const c = await readStepCache(ctx, step, input)\n if (c.hit) return c.output\n const out = await runIt()\n await ctx.cache!.set(c.key, { output: out, resolvedInputHash: c.hash })\n return out\n }\n\n case \"transform\":\n return step.compute(b)\n\n case \"map\": {\n const arr = [...step.over(b)]\n const parallelism = Math.max(1, step.parallelism ?? 1)\n const tolerant = step.onError === \"collect\"\n const results: unknown[] = new Array(arr.length)\n for (let i = 0; i < arr.length; i += parallelism) {\n const chunk = arr.slice(i, i + parallelism)\n if (!tolerant) {\n const outs = await Promise.all(\n chunk.map((el, j) => {\n const idx = i + j\n const inner = step.body(el, idx, view(state, el, idx))\n return execStep(inner, ctx, el, idx)\n }),\n )\n for (let j = 0; j < outs.length; j++) results[i + j] = outs[j]\n continue\n }\n const settled = await Promise.allSettled(\n chunk.map((el, j) => {\n const idx = i + j\n const inner = step.body(el, idx, view(state, el, idx))\n return execStep(inner, ctx, el, idx)\n }),\n )\n settled.forEach((s, j) => {\n const idx = i + j\n results[idx] =\n s.status === \"fulfilled\"\n ? { status: \"fulfilled\", index: idx, value: s.value }\n : { status: \"rejected\", index: idx, item: chunk[j], error: errorMessage(s.reason) }\n })\n }\n if (!tolerant) return results\n const outcomes = results as FanOutOutcome[]\n return {\n results: outcomes,\n succeeded: outcomes.filter((r) => r.status === \"fulfilled\").length,\n failed: outcomes.filter((r) => r.status === \"rejected\").length,\n } satisfies TolerantFanOutResult\n }\n\n case \"pipeline\": {\n const items = [...step.over(b)]\n const tolerant = step.onError === \"collect\"\n if (items.length === 0) return tolerant ? { results: [], succeeded: 0, failed: 0 } : []\n const cap = Math.max(1, step.concurrency ?? items.length)\n const results: unknown[] = new Array(items.length)\n let next = 0\n const runItem = async (idx: number): Promise<void> => {\n let prev: unknown = undefined\n try {\n for (const stage of step.stages) {\n prev = await execStep(stage(items[idx], idx, prev, view(state, items[idx], idx)), ctx, items[idx], idx)\n }\n results[idx] = tolerant ? { status: \"fulfilled\", index: idx, value: prev } : prev\n } catch (err) {\n if (!tolerant) throw err\n results[idx] = { status: \"rejected\", index: idx, item: items[idx], error: errorMessage(err) }\n }\n }\n const worker = async (): Promise<void> => {\n while (next < items.length) {\n const idx = next++\n await runItem(idx)\n }\n }\n await Promise.all(Array.from({ length: Math.min(cap, items.length) }, () => worker()))\n if (!tolerant) return results\n const outcomes = results as FanOutOutcome[]\n return {\n results: outcomes,\n succeeded: outcomes.filter((r) => r.status === \"fulfilled\").length,\n failed: outcomes.filter((r) => r.status === \"rejected\").length,\n } satisfies TolerantFanOutResult\n }\n\n case \"branch\": {\n const chosen = step.cond(b) ? step.then : (step.otherwise ?? [])\n return runSequence(chosen, ctx, item, index)\n }\n\n case \"loop\": {\n let iterations = 0\n let last: unknown\n while (\n iterations < step.maxIterations &&\n step.while(view(state, item, index))\n ) {\n last = await runSequence(step.body, ctx, item, index)\n iterations++\n }\n return last\n }\n\n case \"parallel\": {\n const outs = await Promise.all(\n step.branches.map((br) =>\n runSequence(br.steps, ctx, item, index).then((last) => ({\n id: br.id,\n last,\n })),\n ),\n )\n const record: Record<string, unknown> = {}\n for (const { id, last } of outs) record[id] = last\n return record\n }\n\n case \"approval\": {\n const prompt = step.prompt(b)\n const approvers = step.approvers ?? []\n const approved = ctx.approve\n ? await ctx.approve({ stepId: step.id, prompt, approvers })\n : true\n const followups = approved\n ? (step.onApprove ?? [])\n : (step.onReject ?? [])\n await runSequence(followups, ctx, item, index)\n return { approved }\n }\n\n case \"suspend\": {\n if (!ctx.resume) throw new WorkflowSuspendedError(step.id, step.on)\n return ctx.resume({ stepId: step.id, on: step.on })\n }\n\n case \"group\":\n return runSequence(step.steps, ctx, item, index)\n\n case \"subworkflow\": {\n const childInput = step.input ? step.input(b) : state.input\n const child = await runWorkflowInner(step.workflow, childInput, {\n approve: ctx.approve,\n resume: ctx.resume,\n signal,\n agents: ctx.agents,\n cwd: ctx.cwd,\n workspaceSlug: ctx.workspaceSlug,\n cache: ctx.cache,\n cacheKey: ctx.cacheKey,\n })\n return child.output\n }\n\n case \"agent\": {\n if (!ctx.agents) throw new Error(`step '${step.id}': AgentStep requires a host agents implementation`)\n if (!isCacheEnabled(ctx, step)) return execAgentStep(step, ctx, b)\n const resolved = {\n prompt: step.prompt(b),\n adapter: step.adapter ? resolveSel(step.adapter, b) : undefined,\n sessionRef: step.sessionRef,\n }\n const c = await readStepCache(ctx, step, resolved)\n if (c.hit) return c.output // cache hit ⇒ NO spawn, NO budget spend\n const out = await execAgentStep(step, ctx, b)\n await ctx.cache!.set(c.key, { output: out, resolvedInputHash: c.hash })\n return out\n }\n }\n}\n\nasync function runWorkflowInner(\n workflow: RuntimeWorkflow,\n input: unknown,\n hooks: Pick<RunCtx, \"approve\" | \"resume\" | \"signal\" | \"agents\" | \"cwd\" | \"workspaceSlug\" | \"cache\" | \"cacheKey\" | \"onStepStart\" | \"onStepComplete\">,\n maxTotalCostUsd?: number,\n): Promise<WorkflowRunResult> {\n const state: RunState = { input, steps: {}, costBySession: new Map(), maxTotalCostUsd }\n const ctx: RunCtx = { state, ...hooks }\n let lastId: string | undefined\n for (const step of workflow.steps) {\n const out = await execStep(step, ctx, undefined, undefined)\n state.steps[step.id] = out\n ctx.onStepComplete?.(step.id, out)\n lastId = step.id\n }\n const bindings = view(state)\n const output = workflow.output\n ? workflow.output(bindings)\n : lastId !== undefined\n ? state.steps[lastId]\n : undefined\n return { output, bindings }\n}\n\nexport async function runWorkflow(\n args: RunWorkflowArgs,\n): Promise<WorkflowRunResult> {\n return runWorkflowInner(args.workflow, args.input, {\n approve: args.approve,\n resume: args.resume,\n signal: args.signal,\n agents: args.agents,\n cwd: args.cwd,\n workspaceSlug: args.workspaceSlug,\n cache: args.cache,\n cacheKey: args.cacheKey,\n onStepStart: args.onStepStart,\n onStepComplete: args.onStepComplete,\n }, args.maxTotalCostUsd)\n}\n","/**\n * Shared `AgentStep` construction — the one place that applies AgentStep's\n * defaults (`policy` → `{ awaiting: \"fail\" }`, a literal `prompt` wrapped as\n * a `Selector`). Used by both `compileWorkflow`'s declarative `kind:\"agent\"`\n * step and `@agentproto/runtime`'s `translateStages` (the `workflow_start` /\n * `WorkflowRunner` path), so the two authoring surfaces stay byte-identical\n * instead of drifting apart.\n */\n\nimport type { AgentSandboxRef, AgentStep, Bindings, Selector } from \"./types.js\"\n\nexport interface AgentStepFields {\n /** A literal prompt string, or a per-run selector (declarative manifest\n * steps resolve `$steps.*` refs into one before calling this). */\n prompt: string | Selector<string>\n adapter?: string\n sessionRef?: string\n sandbox?: AgentSandboxRef\n cacheable?: boolean\n policy?: AgentStep[\"policy\"]\n outputSchema?: AgentStep[\"outputSchema\"]\n maxRetries?: number\n options?: Record<string, boolean | number | string>\n}\n\n/** Build a runtime {@link AgentStep} from field values, applying the same\n * defaults everywhere: `policy` defaults to `{ awaiting: \"fail\" }`. */\nexport function buildAgentStep(id: string, fields: AgentStepFields): AgentStep {\n const prompt = fields.prompt\n return {\n kind: \"agent\",\n id,\n ...(fields.adapter !== undefined ? { adapter: fields.adapter } : {}),\n ...(fields.sessionRef !== undefined ? { sessionRef: fields.sessionRef } : {}),\n ...(fields.sandbox !== undefined ? { sandbox: fields.sandbox } : {}),\n ...(fields.cacheable ? { cacheable: true } : {}),\n ...(fields.options !== undefined ? { options: fields.options } : {}),\n prompt: typeof prompt === \"function\" ? prompt : ((_b: Bindings) => prompt),\n policy: fields.policy ?? { awaiting: \"fail\" as const },\n ...(fields.outputSchema !== undefined ? { outputSchema: fields.outputSchema } : {}),\n ...(fields.maxRetries !== undefined ? { maxRetries: fields.maxRetries } : {}),\n }\n}\n","/**\n * Compile a declarative AIP-15 `WorkflowHandle` into a runnable\n * {@link RuntimeWorkflow} for {@link runWorkflow}. This is the bridge that makes\n * an authored WORKFLOW.md actually execute.\n *\n * AIP-15 leaves the IO seam (`step.inputs`, `map.over`, `loop.while`) to a\n * meta-validator. This compiler pins a concrete, minimal **reference grammar**\n * for it — the convention a manifest author writes:\n *\n * - data refs: `$input` · `$input.a.b` · `$steps.<id>` · `$steps.<id>.a`\n * · `$item` · `$item.a` · `$index` (`$$` escapes a literal `$`)\n * - `step.inputs`: a JSON object whose leaf strings may be refs (resolved\n * recursively); non-`$` strings are literals\n * - `map.over`: a ref to an array\n * - `loop.while` / approval prompt: `<ref> <op> <literal>` (`== != < <= > >=`)\n * or a bare ref (truthiness)\n *\n * Scope: the **linear / structured subset** of AIP-15 — steps run in document\n * order; `map`/`loop`/`parallel` nest their child step lists. Non-linear `next`\n * gotos and goto-style `branch` routing are rejected with a clear diagnostic\n * (hand-author a structured `BranchStep`, or nest). Compiling the full goto\n * graph is a separable follow-up.\n */\n\nimport type { WorkflowHandle } from \"@agentproto/workflow\"\nimport type { DriverHandle } from \"@agentproto/driver\"\nimport type { ToolHandle } from \"@agentproto/tool\"\nimport type { AgentRefResolution, AgentStep, Bindings, RunStep, RuntimeWorkflow } from \"./types.js\"\nimport { buildAgentStep } from \"./build-agent-step.js\"\n\nexport interface CompileWorkflowOptions {\n /** TOOL contracts by id — each `tool` step resolves its handle here. */\n tools: ReadonlyMap<string, ToolHandle> | Record<string, ToolHandle>\n /** DRIVER candidates the resolver dispatches over for every tool step. */\n candidates: readonly DriverHandle[]\n /** Resolve a tool step's injected context (live capabilities) from bindings. */\n contextFor?: (toolId: string, bindings: Bindings) => unknown\n /** Sub-workflows by id, for `subworkflow` steps. */\n workflows?:\n | ReadonlyMap<string, WorkflowHandle>\n | Record<string, WorkflowHandle>\n /** App-scoped agent ids for a declarative `kind:\"agent\"` step's\n * `agent.ref` — e.g. `{ \"@app/reviewer\": { adapter: \"mastra-agent\",\n * options: { agent: \"<dir>/.agentproto/agents/reviewer/AGENT.md\" } } }`.\n * Built by the host from its own app-install state (see\n * `@agentproto/runtime`'s `resolveAgentRefsForWorkflow`). A step using\n * `agent.ref` with this unset, or naming a ref this map doesn't have,\n * fails compilation — never the runtime. */\n agentRefs?: ReadonlyMap<string, AgentRefResolution> | Record<string, AgentRefResolution>\n}\n\nexport class WorkflowCompileError extends Error {\n constructor(message: string) {\n super(`compileWorkflow: ${message}`)\n this.name = \"WorkflowCompileError\"\n }\n}\n\n// ── reference + predicate resolution (the AIP-16 IO seam) ────────────\n\nconst get = <T>(\n m: ReadonlyMap<string, T> | Record<string, T>,\n key: string,\n): T | undefined =>\n m instanceof Map ? m.get(key) : (m as Record<string, T>)[key]\n\nfunction dig(value: unknown, path: readonly string[]): unknown {\n let v = value\n for (const seg of path) {\n if (v == null) return undefined\n v = (v as Record<string, unknown>)[seg]\n }\n return v\n}\n\n/** Resolve a single `$…` reference string against the run bindings. */\nexport function resolveRef(ref: string, b: Bindings): unknown {\n if (ref === \"$index\") return b.index\n const m = ref.match(/^\\$(input|item|steps)((?:\\.[^.]+)*)$/)\n if (!m) throw new WorkflowCompileError(`bad reference '${ref}'`)\n const segs = m[2] ? m[2].slice(1).split(\".\") : []\n switch (m[1]) {\n case \"input\":\n return dig(b.input, segs)\n case \"item\":\n return dig(b.item, segs)\n case \"steps\": {\n const [stepId, ...rest] = segs\n if (!stepId) throw new WorkflowCompileError(`'$steps' needs a step id`)\n return dig(b.steps[stepId], rest)\n }\n }\n}\n\n/** Recursively resolve a value node: refs in strings, into arrays/objects. */\nexport function resolveValue(node: unknown, b: Bindings): unknown {\n if (typeof node === \"string\") {\n if (node.startsWith(\"$$\")) return node.slice(1) // $$ → literal $\n if (node.startsWith(\"$\")) return resolveRef(node, b)\n return node\n }\n if (Array.isArray(node)) return node.map((n) => resolveValue(n, b))\n if (node && typeof node === \"object\") {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(node as Record<string, unknown>))\n out[k] = resolveValue(v, b)\n return out\n }\n return node\n}\n\nconst COMPARATORS: Record<string, (a: number, b: number) => boolean> = {\n \"<\": (a, c) => a < c,\n \"<=\": (a, c) => a <= c,\n \">\": (a, c) => a > c,\n \">=\": (a, c) => a >= c,\n}\n\nfunction literal(token: string, b: Bindings): unknown {\n if (token.startsWith(\"$\")) return resolveRef(token, b)\n if (token === \"true\") return true\n if (token === \"false\") return false\n if (token === \"null\") return null\n if (/^-?\\d+(\\.\\d+)?$/.test(token)) return Number(token)\n return token.replace(/^['\"]|['\"]$/g, \"\")\n}\n\n/** Evaluate a `while`/`when` predicate string against the bindings. */\nexport function evalPredicate(expr: string, b: Bindings): boolean {\n const m = expr.match(/^(.+?)\\s*(==|!=|<=|>=|<|>)\\s*(.+)$/)\n if (!m) return Boolean(literal(expr.trim(), b)) // bare ref → truthiness\n const left = literal(m[1]!.trim(), b)\n const right = literal(m[3]!.trim(), b)\n switch (m[2]) {\n case \"==\":\n return left === right\n case \"!=\":\n return left !== right\n default: {\n const cmp = COMPARATORS[m[2]!]!\n return cmp(Number(left), Number(right))\n }\n }\n}\n\n// ── step compilation ─────────────────────────────────────────────────\n\n/** AIP step ids may be paths/refs; the runtime key is the last segment. */\nfunction normalizeToolId(ref: string): string {\n let s = ref.trim()\n if (s.endsWith(\"/TOOL.md\")) s = s.slice(0, -\"/TOOL.md\".length)\n const slash = s.lastIndexOf(\"/\")\n return slash === -1 ? s : s.slice(slash + 1)\n}\n\n// AIP step frontmatter leaves IO fields as opaque `{}`; read them dynamically.\nconst f = <T>(step: object, key: string): T =>\n (step as Record<string, unknown>)[key] as T\n\nfunction assertLinear(steps: readonly { id: string; kind: string; next?: string }[]): void {\n steps.forEach((s, i) => {\n const next = (s as { next?: string }).next\n const followingId = steps[i + 1]?.id\n if (next && next !== followingId) {\n throw new WorkflowCompileError(\n `step '${s.id}' has a non-linear next='${next}' — the structured-subset ` +\n `compiler only runs steps in document order. Hand-author a BranchStep ` +\n `or nest structurally.`,\n )\n }\n })\n}\n\nexport function compileWorkflow(\n handle: WorkflowHandle,\n opts: CompileWorkflowOptions,\n): RuntimeWorkflow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const steps = handle.steps as unknown as any[]\n if (handle.start && handle.start !== steps[0]?.id) {\n throw new WorkflowCompileError(\n `start='${handle.start}' is not the first step — structured-subset runs in order`,\n )\n }\n assertLinear(steps)\n // `result` is the optional output value-expression (AIP-15): map it through\n // the same ref grammar as a step's inputs. Absent ⇒ no output selector, so\n // runWorkflow falls back to the final step's result.\n const result = (handle as { result?: unknown }).result\n const output =\n result !== undefined ? (b: Bindings) => resolveValue(result, b) : undefined\n return {\n id: handle.id,\n description: handle.description,\n steps: steps.map((s) => compileStep(s, opts)),\n ...(output ? { output } : {}),\n }\n}\n\nfunction compileStepList(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n steps: any[],\n id: string,\n opts: CompileWorkflowOptions,\n): RunStep {\n assertLinear(steps)\n if (steps.length === 1) return compileStep(steps[0], opts)\n return { kind: \"group\", id, steps: steps.map((s) => compileStep(s, opts)) }\n}\n\n/**\n * Compile a declarative `kind:\"agent\"` manifest step — `{ agent: { ref },\n * prompt, adapter?, sessionRef?, sandbox?, cacheable?, policy?, outputSchema?,\n * maxRetries? }` — into a real {@link AgentStep}. `prompt` runs through the\n * same `$input`/`$steps.<id>` ref grammar as a `tool` step's `inputs`.\n * `agent.ref` resolves via `opts.agentRefs` — unresolvable (no map, or an id\n * the map doesn't have) fails HERE, at compile time, never at the runtime\n * spawn.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction compileAgentStep(step: any, id: string, opts: CompileWorkflowOptions): AgentStep {\n const prompt = f<string>(step, \"prompt\")\n if (typeof prompt !== \"string\" || prompt.length === 0) {\n throw new WorkflowCompileError(`agent step '${id}' needs a non-empty 'prompt'`)\n }\n\n let adapter: string | undefined = typeof step.adapter === \"string\" ? step.adapter : undefined\n let options: Record<string, boolean | number | string> | undefined =\n step.options !== undefined ? step.options : undefined\n\n const agentRef: unknown = step.agent?.ref\n if (agentRef !== undefined) {\n if (typeof agentRef !== \"string\" || agentRef.trim().length === 0) {\n throw new WorkflowCompileError(`agent step '${id}' has an empty 'agent.ref'`)\n }\n const resolved = opts.agentRefs ? get(opts.agentRefs, agentRef) : undefined\n if (!resolved) {\n const available = opts.agentRefs\n ? opts.agentRefs instanceof Map\n ? [...opts.agentRefs.keys()]\n : Object.keys(opts.agentRefs)\n : []\n throw new WorkflowCompileError(\n `agent step '${id}' references unknown agent ref '${agentRef}'` +\n (available.length > 0\n ? ` — available refs: ${available.join(\", \")}`\n : \" — no agent refs are configured for this compile (not running in an app context?)\"),\n )\n }\n adapter = resolved.adapter\n options = resolved.options\n }\n\n return buildAgentStep(id, {\n prompt: (b: Bindings) => String(resolveValue(prompt, b)),\n ...(adapter !== undefined ? { adapter } : {}),\n ...(step.sessionRef !== undefined ? { sessionRef: step.sessionRef } : {}),\n ...(step.sandbox !== undefined ? { sandbox: step.sandbox } : {}),\n ...(step.cacheable ? { cacheable: true } : {}),\n ...(options !== undefined ? { options } : {}),\n policy: step.policy,\n ...(step.outputSchema !== undefined ? { outputSchema: step.outputSchema } : {}),\n ...(step.maxRetries !== undefined ? { maxRetries: step.maxRetries } : {}),\n })\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction compileStep(step: any, opts: CompileWorkflowOptions): RunStep {\n const id: string = step.id\n switch (step.kind) {\n case \"tool\": {\n const ref = typeof step.tool === \"string\" ? step.tool : step.tool.entry\n const toolId = normalizeToolId(ref)\n const tool = get(opts.tools, toolId)\n if (!tool)\n throw new WorkflowCompileError(`no tool registered for '${toolId}'`)\n const inputs = f<unknown>(step, \"inputs\") ?? {}\n return {\n kind: \"tool\",\n id,\n tool,\n candidates: opts.candidates,\n input: (b) => resolveValue(inputs, b),\n context: opts.contextFor\n ? (b) => opts.contextFor!(toolId, b)\n : undefined,\n }\n }\n\n case \"map\": {\n const over = f<string>(step, \"over\")\n const inner = compileStepList(f(step, \"steps\"), `${id}__body`, opts)\n return {\n kind: \"map\",\n id,\n parallelism: f<number | undefined>(step, \"parallelism\"),\n over: (b) => resolveRef(over, b) as readonly unknown[],\n body: () => inner,\n }\n }\n\n case \"loop\": {\n const whileExpr = f<string>(step, \"while\")\n return {\n kind: \"loop\",\n id,\n maxIterations: f<number>(step, \"max_iterations\"),\n while: (b) => evalPredicate(whileExpr, b),\n body: [compileStepList(f(step, \"steps\"), `${id}__body`, opts)],\n }\n }\n\n case \"parallel\": {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const branches = f<any[]>(step, \"branches\")\n return {\n kind: \"parallel\",\n id,\n branches: branches.map((br) => ({\n id: br.id,\n steps: [compileStepList(br.steps, `${id}__${br.id}`, opts)],\n })),\n }\n }\n\n case \"approval\": {\n const prompt = f<string>(step, \"prompt\")\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const approvers = (f<any[]>(step, \"approvers\") ?? []).map(\n (a) => a.role ?? a.userId ?? String(a),\n )\n return {\n kind: \"approval\",\n id,\n approvers,\n prompt: (b) => String(resolveValue(prompt, b)),\n }\n }\n\n case \"suspend\": {\n const resume = f<{ on: string[]; timeout_ms?: number }>(step, \"resume\")\n return { kind: \"suspend\", id, on: resume.on, timeoutMs: resume.timeout_ms }\n }\n\n case \"subworkflow\": {\n const wfId = f<string>(step, \"workflow\")\n const child = opts.workflows ? get(opts.workflows, wfId) : undefined\n if (!child)\n throw new WorkflowCompileError(\n `subworkflow '${wfId}' not found — pass it in opts.workflows`,\n )\n const compiledChild = compileWorkflow(child, opts)\n return { kind: \"subworkflow\", id, workflow: compiledChild }\n }\n\n case \"agent\": {\n // Two shapes reach here under the same `kind:\"agent\"`: an ENTRY-based\n // handle's already-built runtime AgentStep (function-valued `prompt`\n // selector — nothing declarative left to resolve, pass through\n // unchanged), or a purely-declarative manifest step (`prompt` is a\n // plain string) that this compiler must turn into a real AgentStep,\n // the same way `translateStages` does for `workflow_start`.\n if (typeof step.prompt === \"function\") {\n const passthrough: RunStep = step\n return passthrough\n }\n return compileAgentStep(step, id, opts)\n }\n\n case \"transform\": {\n // Not a declarative manifest kind — no string expression language for\n // `compute` — so it only reaches the compiler from an ENTRY-based\n // handle, already built as a runtime TransformStep (function-valued\n // `compute`). Passes through unchanged: this is what lets an entry.mjs\n // step shape/serialize an earlier tool step's output (e.g.\n // `JSON.stringify` a prior `$steps.<id>` value) for a later tool step\n // to consume as a plain string input, something the `$steps.*` ref\n // grammar alone can't do. `step` is `any`, so no cast is needed.\n const passthrough: RunStep = step\n return passthrough\n }\n\n case \"branch\":\n throw new WorkflowCompileError(\n `goto-style 'branch' (step '${id}') is unsupported in the structured ` +\n `subset — hand-author a structured BranchStep, or nest.`,\n )\n\n default:\n throw new WorkflowCompileError(\n `unsupported step kind '${step.kind}' (step '${id}')`,\n )\n }\n}\n","/**\n * compileWorkflowManifest — the connective step between an authored\n * `WORKFLOW.md` and a runnable workflow.\n *\n * AIP-15 ships every piece needed to run a declarative manifest except the\n * seam that joins them: `parseWorkflowManifest` (md + frontmatter → manifest)\n * and `workflowFromManifest` (manifest → `WorkflowHandle`) live in\n * `@agentproto/workflow`; `compileWorkflow` (handle → `RuntimeWorkflow`) lives\n * here. Without this chain an authored `WORKFLOW.md` parses and validates but\n * never reaches the executor. This joins the three so a manifest source string\n * compiles straight to a runnable workflow — no hand-built handle.\n *\n * Framework-pure: the caller owns reading the file off disk (this package does\n * no I/O), and passes the source string in. The tool registry + driver\n * candidates are injected via {@link CompileWorkflowOptions}, same as the\n * hand-built path.\n */\n\nimport {\n parseWorkflowManifest,\n workflowFromManifest,\n} from \"@agentproto/workflow/manifest\"\n\nimport { compileWorkflow } from \"./compile-workflow.js\"\nimport type { CompileWorkflowOptions } from \"./compile-workflow.js\"\nimport type { RuntimeWorkflow } from \"./types.js\"\n\n/**\n * Compile a `WORKFLOW.md` source string into a {@link RuntimeWorkflow} ready\n * for `runWorkflow`. Parses + validates the frontmatter against the AIP-15\n * schema, lifts it to a `WorkflowHandle`, then compiles its step graph against\n * the injected tool registry. Throws on invalid frontmatter (the parser's\n * diagnostic) or an unresolved tool / non-linear step (the compiler's).\n */\nexport function compileWorkflowManifest(\n source: string,\n opts: CompileWorkflowOptions,\n): RuntimeWorkflow {\n const manifest = parseWorkflowManifest(source)\n const handle = workflowFromManifest(manifest)\n return compileWorkflow(handle, opts)\n}\n"]}
1
+ {"version":3,"sources":["../src/run-workflow.ts","../src/build-agent-step.ts","../src/compile-workflow.ts","../src/load-workflow.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * The step-walker. Executes a {@link RuntimeWorkflow} top-to-bottom, threading\n * each step's output into a run-scoped binding bag, and dispatching `tool`\n * steps through `@agentproto/driver` `runTool` (resolve DRIVER → validate input\n * + context → execute body → validate output). Composite steps (`map` /\n * `branch` / `loop` / `parallel` / `approval` / `subworkflow`) recurse over the\n * same bindings; `suspend` defers to the host's resume hook.\n */\n\nimport { runTool } from \"@agentproto/driver\"\nimport { createHash } from \"node:crypto\"\nimport type { ZodError } from \"zod\"\nimport type {\n AgentStep,\n Bindings,\n FanOutOutcome,\n RunStep,\n RunWorkflowArgs,\n RuntimeWorkflow,\n TolerantFanOutResult,\n WorkflowRunResult,\n} from \"./types.js\"\n\n/** Thrown by a `suspend` step when no host `resume` hook is provided. */\nexport class WorkflowSuspendedError extends Error {\n constructor(\n readonly stepId: string,\n readonly on: readonly string[],\n ) {\n super(\n `workflow suspended at step '${stepId}' awaiting [${on.join(\", \")}] — ` +\n `no resume hook supplied`,\n )\n this.name = \"WorkflowSuspendedError\"\n }\n}\n\ninterface RunState {\n readonly input: unknown\n readonly steps: Record<string, unknown>\n readonly maxTotalCostUsd?: number\n /** Last-known cost per session id; summed to get the run's total spend.\n * A Map (not a running delta) so a session reused across steps via\n * sessionRef is counted once, not double-counted. */\n readonly costBySession: Map<string, number>\n}\n\ninterface RunCtx {\n readonly state: RunState\n readonly approve?: RunWorkflowArgs[\"approve\"]\n readonly resume?: RunWorkflowArgs[\"resume\"]\n readonly signal?: AbortSignal\n readonly agents?: RunWorkflowArgs[\"agents\"]\n readonly cwd?: string\n readonly workspaceSlug?: string\n readonly cache?: RunWorkflowArgs[\"cache\"]\n readonly cacheKey?: RunWorkflowArgs[\"cacheKey\"]\n readonly onStepStart?: RunWorkflowArgs[\"onStepStart\"]\n readonly onStepComplete?: RunWorkflowArgs[\"onStepComplete\"]\n}\n\nfunction view(state: RunState, item?: unknown, index?: number): Bindings {\n return { input: state.input, steps: state.steps, item, index }\n}\n\n/** Resolve a value that is either a static string or a binding selector. */\nfunction resolveSel(sel: string | ((bindings: Bindings) => string), b: Bindings): string {\n return typeof sel === \"function\" ? sel(b) : sel\n}\n\n/** Extract a JSON candidate from raw assistant text:\n * 1. last ```json fenced block if present, else\n * 2. last generic ``` fenced block if present, else\n * 3. the whole trimmed string. */\nfunction extractJsonCandidate(raw: string): string {\n const jsonFence = /```json\\s*([\\s\\S]*?)```/g\n const lastJson = lastMatch(jsonFence, raw)\n if (lastJson !== undefined) return lastJson\n\n const anyFence = /```\\s*([\\s\\S]*?)```/g\n const lastAny = lastMatch(anyFence, raw)\n if (lastAny !== undefined) return lastAny\n\n return raw.trim()\n}\n\nfunction lastMatch(re: RegExp, s: string): string | undefined {\n let m: RegExpExecArray | null\n let last: RegExpExecArray | null = null\n while ((m = re.exec(s)) !== null) last = m\n return last ? last[1]?.trim() : undefined\n}\n\nfunction spentUsd(state: RunState): number {\n let total = 0\n for (const c of state.costBySession.values()) total += c\n return total\n}\n\n/** Deterministic content hash of a step's resolved inputs. */\nfunction hashResolvedInputs(kind: string, resolved: unknown): string {\n return createHash(\"sha256\")\n .update(`${kind}\\u0000${JSON.stringify(resolved) ?? \"undefined\"}`)\n .digest(\"hex\")\n}\n\n/** Namespaced journal key for a step under a run's cacheKey. */\nfunction stepJournalKey(cacheKey: string, step: RunStep): string {\n return `${cacheKey}\\u0000${step.id}\\u0000${step.kind}`\n}\n\n/** True when this step should consult/populate the journal. */\nfunction isCacheEnabled(ctx: RunCtx, step: { cacheable?: boolean }): boolean {\n return step.cacheable === true && ctx.cache !== undefined && ctx.cacheKey !== undefined\n}\n\n/** Read the journal; on a hit return the output, else the key+hash to write on miss. */\nasync function readStepCache(\n ctx: RunCtx,\n step: RunStep,\n resolvedInputs: unknown,\n): Promise<{ hit: true; output: unknown } | { hit: false; key: string; hash: string }> {\n const key = stepJournalKey(ctx.cacheKey!, step)\n const hash = hashResolvedInputs(step.kind, resolvedInputs)\n const entry = await ctx.cache!.get(key)\n if (entry !== undefined && entry.resolvedInputHash === hash) {\n return { hit: true, output: entry.output }\n }\n return { hit: false, key, hash }\n}\n\n/** `err.message` if `err` is an `Error`, else its string coercion. */\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction formatZodError(err: ZodError): string {\n return err.issues\n .map((i) => `${i.path.length > 0 ? i.path.join(\".\") + \": \" : \"\"}${i.message}`)\n .join(\", \")\n}\n\n/** Run an ordered list of steps, binding each output under its id; return last. */\nasync function runSequence(\n steps: readonly RunStep[],\n ctx: RunCtx,\n item: unknown,\n index: number | undefined,\n): Promise<unknown> {\n let last: unknown\n for (const s of steps) {\n const out = await execStep(s, ctx, item, index)\n ctx.state.steps[s.id] = out\n ctx.onStepComplete?.(s.id, out)\n last = out\n }\n return last\n}\n\n/** Execute the full AgentStep body — spawn, prompt, policy, budget, outputSchema retry loop. */\nasync function execAgentStep(step: AgentStep, ctx: RunCtx, b: Bindings): Promise<unknown> {\n // Notify step start before any execution\n ctx.onStepStart?.(step.id)\n\n if (\n step.adapter &&\n ctx.state.maxTotalCostUsd !== undefined &&\n spentUsd(ctx.state) >= ctx.state.maxTotalCostUsd\n ) {\n throw new Error(\n `step '${step.id}': budget_exceeded — run spend $${spentUsd(ctx.state).toFixed(4)} >= cap $${ctx.state.maxTotalCostUsd}`,\n )\n }\n const cwd = step.cwd ? resolveSel(step.cwd, b) : ctx.cwd\n // Sandbox ref: a selector resolves per-run (undefined ⇒ host spawn); a\n // literal (slug string or inline spec object) passes through as-is.\n const sandbox =\n typeof step.sandbox === \"function\" ? step.sandbox(b) : step.sandbox\n const sessionId = step.adapter\n ? await ctx.agents!.spawn(resolveSel(step.adapter, b), {\n cwd,\n workspaceSlug: ctx.workspaceSlug,\n stepId: step.id,\n ...(sandbox !== undefined ? { sandbox } : {}),\n ...(step.options !== undefined ? { options: step.options } : {}),\n })\n : ctx.agents!.resolveByLabel(step.sessionRef!)\n if (!sessionId) throw new Error(`step '${step.id}': no session (adapter and sessionRef both unresolved)`)\n await ctx.agents!.sendPromptAndWait(sessionId, step.prompt(b))\n if (step.policy && ctx.agents!.onAwaitingInput) {\n await ctx.agents!.onAwaitingInput(sessionId, step.policy)\n }\n\n if (ctx.agents!.readCostUsd) {\n ctx.state.costBySession.set(sessionId, await ctx.agents!.readCostUsd(sessionId))\n }\n\n if (!step.outputSchema) {\n let text: string | undefined\n if (ctx.agents!.readFinalMessage) {\n try {\n text = await ctx.agents!.readFinalMessage(sessionId)\n } catch {\n // ignore\n }\n }\n return { sessionId, ...(text !== undefined ? { text } : {}) }\n }\n\n // Validate-and-retry loop\n if (!ctx.agents!.readFinalMessage) {\n throw new Error(`step '${step.id}': outputSchema requires a host with readFinalMessage`)\n }\n const maxRetries = step.maxRetries ?? 2\n let lastErr = \"\"\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const raw = await ctx.agents!.readFinalMessage(sessionId)\n const candidate = extractJsonCandidate(raw)\n let value: unknown\n try {\n value = JSON.parse(candidate)\n } catch {\n lastErr = \"not valid JSON\"\n if (attempt < maxRetries) {\n await ctx.agents!.sendPromptAndWait(\n sessionId,\n `Your previous reply did not match the required schema: ${lastErr}. ` +\n `Reply again with ONLY a JSON object that matches. No prose, no code fence needed.`,\n )\n }\n continue\n }\n const res = step.outputSchema.safeParse(value)\n if (res.success) return { sessionId, output: res.data }\n lastErr = formatZodError(res.error)\n if (attempt < maxRetries) {\n await ctx.agents!.sendPromptAndWait(\n sessionId,\n `Your previous reply did not match the required schema: ${lastErr}. ` +\n `Reply again with ONLY a JSON object that matches. No prose, no code fence needed.`,\n )\n }\n }\n throw new Error(`step '${step.id}': output_invalid — final message never matched outputSchema (${lastErr})`)\n}\n\nasync function execStep(\n step: RunStep,\n ctx: RunCtx,\n item: unknown,\n index: number | undefined,\n): Promise<unknown> {\n const { state, signal } = ctx\n const b = view(state, item, index)\n\n // Notify step start for non-agent steps (agent steps notify in execAgentStep)\n if (step.kind !== \"agent\") {\n ctx.onStepStart?.(step.id)\n }\n\n switch (step.kind) {\n case \"tool\": {\n const input = step.input(b)\n const runIt = (): Promise<unknown> =>\n runTool({\n tool: step.tool,\n candidates: step.candidates,\n input,\n context: step.context ? step.context(b) : undefined,\n resolverContext: step.resolverContext,\n secrets: step.secrets,\n signal,\n })\n if (!isCacheEnabled(ctx, step)) return runIt()\n const c = await readStepCache(ctx, step, input)\n if (c.hit) return c.output\n const out = await runIt()\n await ctx.cache!.set(c.key, { output: out, resolvedInputHash: c.hash })\n return out\n }\n\n case \"transform\":\n return step.compute(b)\n\n case \"map\": {\n const arr = [...step.over(b)]\n const parallelism = Math.max(1, step.parallelism ?? 1)\n const tolerant = step.onError === \"collect\"\n const results: unknown[] = new Array(arr.length)\n for (let i = 0; i < arr.length; i += parallelism) {\n const chunk = arr.slice(i, i + parallelism)\n if (!tolerant) {\n const outs = await Promise.all(\n chunk.map((el, j) => {\n const idx = i + j\n const inner = step.body(el, idx, view(state, el, idx))\n return execStep(inner, ctx, el, idx)\n }),\n )\n for (let j = 0; j < outs.length; j++) results[i + j] = outs[j]\n continue\n }\n const settled = await Promise.allSettled(\n chunk.map((el, j) => {\n const idx = i + j\n const inner = step.body(el, idx, view(state, el, idx))\n return execStep(inner, ctx, el, idx)\n }),\n )\n settled.forEach((s, j) => {\n const idx = i + j\n results[idx] =\n s.status === \"fulfilled\"\n ? { status: \"fulfilled\", index: idx, value: s.value }\n : { status: \"rejected\", index: idx, item: chunk[j], error: errorMessage(s.reason) }\n })\n }\n if (!tolerant) return results\n const outcomes = results as FanOutOutcome[]\n return {\n results: outcomes,\n succeeded: outcomes.filter((r) => r.status === \"fulfilled\").length,\n failed: outcomes.filter((r) => r.status === \"rejected\").length,\n } satisfies TolerantFanOutResult\n }\n\n case \"pipeline\": {\n const items = [...step.over(b)]\n const tolerant = step.onError === \"collect\"\n if (items.length === 0) return tolerant ? { results: [], succeeded: 0, failed: 0 } : []\n const cap = Math.max(1, step.concurrency ?? items.length)\n const results: unknown[] = new Array(items.length)\n let next = 0\n const runItem = async (idx: number): Promise<void> => {\n let prev: unknown = undefined\n try {\n for (const stage of step.stages) {\n prev = await execStep(stage(items[idx], idx, prev, view(state, items[idx], idx)), ctx, items[idx], idx)\n }\n results[idx] = tolerant ? { status: \"fulfilled\", index: idx, value: prev } : prev\n } catch (err) {\n if (!tolerant) throw err\n results[idx] = { status: \"rejected\", index: idx, item: items[idx], error: errorMessage(err) }\n }\n }\n const worker = async (): Promise<void> => {\n while (next < items.length) {\n const idx = next++\n await runItem(idx)\n }\n }\n await Promise.all(Array.from({ length: Math.min(cap, items.length) }, () => worker()))\n if (!tolerant) return results\n const outcomes = results as FanOutOutcome[]\n return {\n results: outcomes,\n succeeded: outcomes.filter((r) => r.status === \"fulfilled\").length,\n failed: outcomes.filter((r) => r.status === \"rejected\").length,\n } satisfies TolerantFanOutResult\n }\n\n case \"branch\": {\n const chosen = step.cond(b) ? step.then : (step.otherwise ?? [])\n return runSequence(chosen, ctx, item, index)\n }\n\n case \"loop\": {\n let iterations = 0\n let last: unknown\n while (\n iterations < step.maxIterations &&\n step.while(view(state, item, index))\n ) {\n last = await runSequence(step.body, ctx, item, index)\n iterations++\n }\n return last\n }\n\n case \"parallel\": {\n const outs = await Promise.all(\n step.branches.map((br) =>\n runSequence(br.steps, ctx, item, index).then((last) => ({\n id: br.id,\n last,\n })),\n ),\n )\n const record: Record<string, unknown> = {}\n for (const { id, last } of outs) record[id] = last\n return record\n }\n\n case \"approval\": {\n const prompt = step.prompt(b)\n const approvers = step.approvers ?? []\n const approved = ctx.approve\n ? await ctx.approve({ stepId: step.id, prompt, approvers })\n : true\n const followups = approved\n ? (step.onApprove ?? [])\n : (step.onReject ?? [])\n await runSequence(followups, ctx, item, index)\n return { approved }\n }\n\n case \"suspend\": {\n if (!ctx.resume) throw new WorkflowSuspendedError(step.id, step.on)\n return ctx.resume({ stepId: step.id, on: step.on })\n }\n\n case \"group\":\n return runSequence(step.steps, ctx, item, index)\n\n case \"subworkflow\": {\n const childInput = step.input ? step.input(b) : state.input\n const child = await runWorkflowInner(step.workflow, childInput, {\n approve: ctx.approve,\n resume: ctx.resume,\n signal,\n agents: ctx.agents,\n cwd: ctx.cwd,\n workspaceSlug: ctx.workspaceSlug,\n cache: ctx.cache,\n cacheKey: ctx.cacheKey,\n })\n return child.output\n }\n\n case \"agent\": {\n if (!ctx.agents) throw new Error(`step '${step.id}': AgentStep requires a host agents implementation`)\n if (!isCacheEnabled(ctx, step)) return execAgentStep(step, ctx, b)\n const resolved = {\n prompt: step.prompt(b),\n adapter: step.adapter ? resolveSel(step.adapter, b) : undefined,\n sessionRef: step.sessionRef,\n }\n const c = await readStepCache(ctx, step, resolved)\n if (c.hit) return c.output // cache hit ⇒ NO spawn, NO budget spend\n const out = await execAgentStep(step, ctx, b)\n await ctx.cache!.set(c.key, { output: out, resolvedInputHash: c.hash })\n return out\n }\n }\n}\n\nasync function runWorkflowInner(\n workflow: RuntimeWorkflow,\n input: unknown,\n hooks: Pick<RunCtx, \"approve\" | \"resume\" | \"signal\" | \"agents\" | \"cwd\" | \"workspaceSlug\" | \"cache\" | \"cacheKey\" | \"onStepStart\" | \"onStepComplete\">,\n maxTotalCostUsd?: number,\n): Promise<WorkflowRunResult> {\n const state: RunState = { input, steps: {}, costBySession: new Map(), maxTotalCostUsd }\n const ctx: RunCtx = { state, ...hooks }\n let lastId: string | undefined\n for (const step of workflow.steps) {\n const out = await execStep(step, ctx, undefined, undefined)\n state.steps[step.id] = out\n ctx.onStepComplete?.(step.id, out)\n lastId = step.id\n }\n const bindings = view(state)\n const output = workflow.output\n ? workflow.output(bindings)\n : lastId !== undefined\n ? state.steps[lastId]\n : undefined\n return { output, bindings }\n}\n\nexport async function runWorkflow(\n args: RunWorkflowArgs,\n): Promise<WorkflowRunResult> {\n return runWorkflowInner(args.workflow, args.input, {\n approve: args.approve,\n resume: args.resume,\n signal: args.signal,\n agents: args.agents,\n cwd: args.cwd,\n workspaceSlug: args.workspaceSlug,\n cache: args.cache,\n cacheKey: args.cacheKey,\n onStepStart: args.onStepStart,\n onStepComplete: args.onStepComplete,\n }, args.maxTotalCostUsd)\n}\n","/**\n * Shared `AgentStep` construction — the one place that applies AgentStep's\n * defaults (`policy` → `{ awaiting: \"fail\" }`, a literal `prompt` wrapped as\n * a `Selector`). Used by both `compileWorkflow`'s declarative `kind:\"agent\"`\n * step and `@agentproto/runtime`'s `translateStages` (the `workflow_start` /\n * `WorkflowRunner` path), so the two authoring surfaces stay byte-identical\n * instead of drifting apart.\n */\n\nimport type { AgentSandboxRef, AgentStep, Bindings, Selector } from \"./types.js\"\n\nexport interface AgentStepFields {\n /** A literal prompt string, or a per-run selector (declarative manifest\n * steps resolve `$steps.*` refs into one before calling this). */\n prompt: string | Selector<string>\n adapter?: string\n sessionRef?: string\n sandbox?: AgentSandboxRef\n cacheable?: boolean\n policy?: AgentStep[\"policy\"]\n outputSchema?: AgentStep[\"outputSchema\"]\n maxRetries?: number\n options?: Record<string, boolean | number | string>\n}\n\n/** Build a runtime {@link AgentStep} from field values, applying the same\n * defaults everywhere: `policy` defaults to `{ awaiting: \"fail\" }`. */\nexport function buildAgentStep(id: string, fields: AgentStepFields): AgentStep {\n const prompt = fields.prompt\n return {\n kind: \"agent\",\n id,\n ...(fields.adapter !== undefined ? { adapter: fields.adapter } : {}),\n ...(fields.sessionRef !== undefined ? { sessionRef: fields.sessionRef } : {}),\n ...(fields.sandbox !== undefined ? { sandbox: fields.sandbox } : {}),\n ...(fields.cacheable ? { cacheable: true } : {}),\n ...(fields.options !== undefined ? { options: fields.options } : {}),\n prompt: typeof prompt === \"function\" ? prompt : ((_b: Bindings) => prompt),\n policy: fields.policy ?? { awaiting: \"fail\" as const },\n ...(fields.outputSchema !== undefined ? { outputSchema: fields.outputSchema } : {}),\n ...(fields.maxRetries !== undefined ? { maxRetries: fields.maxRetries } : {}),\n }\n}\n","/**\n * Compile a declarative AIP-15 `WorkflowHandle` into a runnable\n * {@link RuntimeWorkflow} for {@link runWorkflow}. This is the bridge that makes\n * an authored WORKFLOW.md actually execute.\n *\n * AIP-15 leaves the IO seam (`step.inputs`, `map.over`, `loop.while`) to a\n * meta-validator. This compiler pins a concrete, minimal **reference grammar**\n * for it — the convention a manifest author writes:\n *\n * - data refs: `$input` · `$input.a.b` · `$steps.<id>` · `$steps.<id>.a`\n * · `$item` · `$item.a` · `$index` (`$$` escapes a literal `$`)\n * - `step.inputs`: a JSON object whose leaf strings may be refs (resolved\n * recursively); non-`$` strings are literals\n * - `map.over`: a ref to an array\n * - `loop.while` / approval prompt: `<ref> <op> <literal>` (`== != < <= > >=`)\n * or a bare ref (truthiness)\n *\n * Scope: the **linear / structured subset** of AIP-15 — steps run in document\n * order; `map`/`loop`/`parallel` nest their child step lists. Non-linear `next`\n * gotos and goto-style `branch` routing are rejected with a clear diagnostic\n * (hand-author a structured `BranchStep`, or nest). Compiling the full goto\n * graph is a separable follow-up.\n */\n\nimport type { WorkflowHandle } from \"@agentproto/workflow\"\nimport type { DriverHandle } from \"@agentproto/driver\"\nimport type { ToolHandle } from \"@agentproto/tool\"\nimport type { AgentRefResolution, AgentStep, Bindings, RunStep, RuntimeWorkflow } from \"./types.js\"\nimport { buildAgentStep } from \"./build-agent-step.js\"\n\nexport interface CompileWorkflowOptions {\n /** TOOL contracts by id — each `tool` step resolves its handle here. */\n tools: ReadonlyMap<string, ToolHandle> | Record<string, ToolHandle>\n /** DRIVER candidates the resolver dispatches over for every tool step. */\n candidates: readonly DriverHandle[]\n /** Resolve a tool step's injected context (live capabilities) from bindings. */\n contextFor?: (toolId: string, bindings: Bindings) => unknown\n /** Sub-workflows by id, for `subworkflow` steps. */\n workflows?:\n | ReadonlyMap<string, WorkflowHandle>\n | Record<string, WorkflowHandle>\n /** App-scoped agent ids for a declarative `kind:\"agent\"` step's\n * `agent.ref` — e.g. `{ \"@app/reviewer\": { adapter: \"mastra-agent\",\n * options: { agent: \"<dir>/.agentproto/agents/reviewer/AGENT.md\" } } }`.\n * Built by the host from its own app-install state (see\n * `@agentproto/runtime`'s `resolveAgentRefsForWorkflow`). A step using\n * `agent.ref` with this unset, or naming a ref this map doesn't have,\n * fails compilation — never the runtime. */\n agentRefs?: ReadonlyMap<string, AgentRefResolution> | Record<string, AgentRefResolution>\n}\n\nexport class WorkflowCompileError extends Error {\n constructor(message: string) {\n super(`compileWorkflow: ${message}`)\n this.name = \"WorkflowCompileError\"\n }\n}\n\n// ── reference + predicate resolution (the AIP-16 IO seam) ────────────\n\nconst get = <T>(\n m: ReadonlyMap<string, T> | Record<string, T>,\n key: string,\n): T | undefined =>\n m instanceof Map ? m.get(key) : (m as Record<string, T>)[key]\n\nfunction dig(value: unknown, path: readonly string[]): unknown {\n let v = value\n for (const seg of path) {\n if (v == null) return undefined\n v = (v as Record<string, unknown>)[seg]\n }\n return v\n}\n\n/** Resolve a single `$…` reference string against the run bindings. */\nexport function resolveRef(ref: string, b: Bindings): unknown {\n if (ref === \"$index\") return b.index\n const m = ref.match(/^\\$(input|item|steps)((?:\\.[^.]+)*)$/)\n if (!m) throw new WorkflowCompileError(`bad reference '${ref}'`)\n const segs = m[2] ? m[2].slice(1).split(\".\") : []\n switch (m[1]) {\n case \"input\":\n return dig(b.input, segs)\n case \"item\":\n return dig(b.item, segs)\n case \"steps\": {\n const [stepId, ...rest] = segs\n if (!stepId) throw new WorkflowCompileError(`'$steps' needs a step id`)\n return dig(b.steps[stepId], rest)\n }\n }\n}\n\n/** Recursively resolve a value node: refs in strings, into arrays/objects. */\nexport function resolveValue(node: unknown, b: Bindings): unknown {\n if (typeof node === \"string\") {\n if (node.startsWith(\"$$\")) return node.slice(1) // $$ → literal $\n if (node.startsWith(\"$\")) return resolveRef(node, b)\n return node\n }\n if (Array.isArray(node)) return node.map((n) => resolveValue(n, b))\n if (node && typeof node === \"object\") {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(node as Record<string, unknown>))\n out[k] = resolveValue(v, b)\n return out\n }\n return node\n}\n\nconst COMPARATORS: Record<string, (a: number, b: number) => boolean> = {\n \"<\": (a, c) => a < c,\n \"<=\": (a, c) => a <= c,\n \">\": (a, c) => a > c,\n \">=\": (a, c) => a >= c,\n}\n\nfunction literal(token: string, b: Bindings): unknown {\n if (token.startsWith(\"$\")) return resolveRef(token, b)\n if (token === \"true\") return true\n if (token === \"false\") return false\n if (token === \"null\") return null\n if (/^-?\\d+(\\.\\d+)?$/.test(token)) return Number(token)\n return token.replace(/^['\"]|['\"]$/g, \"\")\n}\n\n/** Evaluate a `while`/`when` predicate string against the bindings. */\nexport function evalPredicate(expr: string, b: Bindings): boolean {\n const m = expr.match(/^(.+?)\\s*(==|!=|<=|>=|<|>)\\s*(.+)$/)\n if (!m) return Boolean(literal(expr.trim(), b)) // bare ref → truthiness\n const left = literal(m[1]!.trim(), b)\n const right = literal(m[3]!.trim(), b)\n switch (m[2]) {\n case \"==\":\n return left === right\n case \"!=\":\n return left !== right\n default: {\n const cmp = COMPARATORS[m[2]!]!\n return cmp(Number(left), Number(right))\n }\n }\n}\n\n// ── step compilation ─────────────────────────────────────────────────\n\n/** AIP step ids may be paths/refs; the runtime key is the last segment. */\nfunction normalizeToolId(ref: string): string {\n let s = ref.trim()\n if (s.endsWith(\"/TOOL.md\")) s = s.slice(0, -\"/TOOL.md\".length)\n const slash = s.lastIndexOf(\"/\")\n return slash === -1 ? s : s.slice(slash + 1)\n}\n\n// AIP step frontmatter leaves IO fields as opaque `{}`; read them dynamically.\nconst f = <T>(step: object, key: string): T =>\n (step as Record<string, unknown>)[key] as T\n\nfunction assertLinear(steps: readonly { id: string; kind: string; next?: string }[]): void {\n steps.forEach((s, i) => {\n const next = (s as { next?: string }).next\n const followingId = steps[i + 1]?.id\n if (next && next !== followingId) {\n throw new WorkflowCompileError(\n `step '${s.id}' has a non-linear next='${next}' — the structured-subset ` +\n `compiler only runs steps in document order. Hand-author a BranchStep ` +\n `or nest structurally.`,\n )\n }\n })\n}\n\nexport function compileWorkflow(\n handle: WorkflowHandle,\n opts: CompileWorkflowOptions,\n): RuntimeWorkflow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const steps = handle.steps as unknown as any[]\n if (handle.start && handle.start !== steps[0]?.id) {\n throw new WorkflowCompileError(\n `start='${handle.start}' is not the first step — structured-subset runs in order`,\n )\n }\n assertLinear(steps)\n // `result` is the optional output value-expression (AIP-15): map it through\n // the same ref grammar as a step's inputs. Absent ⇒ no output selector, so\n // runWorkflow falls back to the final step's result.\n const result = (handle as { result?: unknown }).result\n const output =\n result !== undefined ? (b: Bindings) => resolveValue(result, b) : undefined\n return {\n id: handle.id,\n description: handle.description,\n steps: steps.map((s) => compileStep(s, opts)),\n ...(output ? { output } : {}),\n }\n}\n\nfunction compileStepList(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n steps: any[],\n id: string,\n opts: CompileWorkflowOptions,\n): RunStep {\n assertLinear(steps)\n if (steps.length === 1) return compileStep(steps[0], opts)\n return { kind: \"group\", id, steps: steps.map((s) => compileStep(s, opts)) }\n}\n\n/**\n * Compile a declarative `kind:\"agent\"` manifest step — `{ agent: { ref },\n * prompt, adapter?, sessionRef?, sandbox?, cacheable?, policy?, outputSchema?,\n * maxRetries? }` — into a real {@link AgentStep}. `prompt` runs through the\n * same `$input`/`$steps.<id>` ref grammar as a `tool` step's `inputs`.\n * `agent.ref` resolves via `opts.agentRefs` — unresolvable (no map, or an id\n * the map doesn't have) fails HERE, at compile time, never at the runtime\n * spawn.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction compileAgentStep(step: any, id: string, opts: CompileWorkflowOptions): AgentStep {\n const prompt = f<string>(step, \"prompt\")\n if (typeof prompt !== \"string\" || prompt.length === 0) {\n throw new WorkflowCompileError(`agent step '${id}' needs a non-empty 'prompt'`)\n }\n\n let adapter: string | undefined = typeof step.adapter === \"string\" ? step.adapter : undefined\n let options: Record<string, boolean | number | string> | undefined =\n step.options !== undefined ? step.options : undefined\n\n const agentRef: unknown = step.agent?.ref\n if (agentRef !== undefined) {\n if (typeof agentRef !== \"string\" || agentRef.trim().length === 0) {\n throw new WorkflowCompileError(`agent step '${id}' has an empty 'agent.ref'`)\n }\n const resolved = opts.agentRefs ? get(opts.agentRefs, agentRef) : undefined\n if (!resolved) {\n const available = opts.agentRefs\n ? opts.agentRefs instanceof Map\n ? [...opts.agentRefs.keys()]\n : Object.keys(opts.agentRefs)\n : []\n throw new WorkflowCompileError(\n `agent step '${id}' references unknown agent ref '${agentRef}'` +\n (available.length > 0\n ? ` — available refs: ${available.join(\", \")}`\n : \" — no agent refs are configured for this compile (not running in an app context?)\"),\n )\n }\n adapter = resolved.adapter\n options = resolved.options\n }\n\n return buildAgentStep(id, {\n prompt: (b: Bindings) => String(resolveValue(prompt, b)),\n ...(adapter !== undefined ? { adapter } : {}),\n ...(step.sessionRef !== undefined ? { sessionRef: step.sessionRef } : {}),\n ...(step.sandbox !== undefined ? { sandbox: step.sandbox } : {}),\n ...(step.cacheable ? { cacheable: true } : {}),\n ...(options !== undefined ? { options } : {}),\n policy: step.policy,\n ...(step.outputSchema !== undefined ? { outputSchema: step.outputSchema } : {}),\n ...(step.maxRetries !== undefined ? { maxRetries: step.maxRetries } : {}),\n })\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction compileStep(step: any, opts: CompileWorkflowOptions): RunStep {\n const id: string = step.id\n switch (step.kind) {\n case \"tool\": {\n const ref = typeof step.tool === \"string\" ? step.tool : step.tool.entry\n const toolId = normalizeToolId(ref)\n const tool = get(opts.tools, toolId)\n if (!tool)\n throw new WorkflowCompileError(`no tool registered for '${toolId}'`)\n const inputs = f<unknown>(step, \"inputs\") ?? {}\n return {\n kind: \"tool\",\n id,\n tool,\n candidates: opts.candidates,\n input: (b) => resolveValue(inputs, b),\n context: opts.contextFor\n ? (b) => opts.contextFor!(toolId, b)\n : undefined,\n }\n }\n\n case \"map\": {\n const over = f<string>(step, \"over\")\n const inner = compileStepList(f(step, \"steps\"), `${id}__body`, opts)\n const onError = f<\"throw\" | \"collect\" | undefined>(step, \"onError\")\n return {\n kind: \"map\",\n id,\n parallelism: f<number | undefined>(step, \"parallelism\"),\n over: (b) => resolveRef(over, b) as readonly unknown[],\n body: () => inner,\n ...(onError !== undefined ? { onError } : {}),\n }\n }\n\n case \"loop\": {\n const whileExpr = f<string>(step, \"while\")\n return {\n kind: \"loop\",\n id,\n maxIterations: f<number>(step, \"max_iterations\"),\n while: (b) => evalPredicate(whileExpr, b),\n body: [compileStepList(f(step, \"steps\"), `${id}__body`, opts)],\n }\n }\n\n case \"parallel\": {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const branches = f<any[]>(step, \"branches\")\n return {\n kind: \"parallel\",\n id,\n branches: branches.map((br) => ({\n id: br.id,\n steps: [compileStepList(br.steps, `${id}__${br.id}`, opts)],\n })),\n }\n }\n\n case \"approval\": {\n const prompt = f<string>(step, \"prompt\")\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const approvers = (f<any[]>(step, \"approvers\") ?? []).map(\n (a) => a.role ?? a.userId ?? String(a),\n )\n return {\n kind: \"approval\",\n id,\n approvers,\n prompt: (b) => String(resolveValue(prompt, b)),\n }\n }\n\n case \"suspend\": {\n const resume = f<{ on: string[]; timeout_ms?: number }>(step, \"resume\")\n return { kind: \"suspend\", id, on: resume.on, timeoutMs: resume.timeout_ms }\n }\n\n case \"subworkflow\": {\n const wfId = f<string>(step, \"workflow\")\n const child = opts.workflows ? get(opts.workflows, wfId) : undefined\n if (!child)\n throw new WorkflowCompileError(\n `subworkflow '${wfId}' not found — pass it in opts.workflows`,\n )\n const compiledChild = compileWorkflow(child, opts)\n return { kind: \"subworkflow\", id, workflow: compiledChild }\n }\n\n case \"agent\": {\n // Two shapes reach here under the same `kind:\"agent\"`: an ENTRY-based\n // handle's already-built runtime AgentStep (function-valued `prompt`\n // selector — nothing declarative left to resolve, pass through\n // unchanged), or a purely-declarative manifest step (`prompt` is a\n // plain string) that this compiler must turn into a real AgentStep,\n // the same way `translateStages` does for `workflow_start`.\n if (typeof step.prompt === \"function\") {\n const passthrough: RunStep = step\n return passthrough\n }\n return compileAgentStep(step, id, opts)\n }\n\n case \"transform\": {\n // Not a declarative manifest kind — no string expression language for\n // `compute` — so it only reaches the compiler from an ENTRY-based\n // handle, already built as a runtime TransformStep (function-valued\n // `compute`). Passes through unchanged: this is what lets an entry.mjs\n // step shape/serialize an earlier tool step's output (e.g.\n // `JSON.stringify` a prior `$steps.<id>` value) for a later tool step\n // to consume as a plain string input, something the `$steps.*` ref\n // grammar alone can't do. `step` is `any`, so no cast is needed.\n const passthrough: RunStep = step\n return passthrough\n }\n\n case \"branch\":\n throw new WorkflowCompileError(\n `goto-style 'branch' (step '${id}') is unsupported in the structured ` +\n `subset — hand-author a structured BranchStep, or nest.`,\n )\n\n default:\n throw new WorkflowCompileError(\n `unsupported step kind '${step.kind}' (step '${id}')`,\n )\n }\n}\n","/**\n * compileWorkflowManifest — the connective step between an authored\n * `WORKFLOW.md` and a runnable workflow.\n *\n * AIP-15 ships every piece needed to run a declarative manifest except the\n * seam that joins them: `parseWorkflowManifest` (md + frontmatter → manifest)\n * and `workflowFromManifest` (manifest → `WorkflowHandle`) live in\n * `@agentproto/workflow`; `compileWorkflow` (handle → `RuntimeWorkflow`) lives\n * here. Without this chain an authored `WORKFLOW.md` parses and validates but\n * never reaches the executor. This joins the three so a manifest source string\n * compiles straight to a runnable workflow — no hand-built handle.\n *\n * Framework-pure: the caller owns reading the file off disk (this package does\n * no I/O), and passes the source string in. The tool registry + driver\n * candidates are injected via {@link CompileWorkflowOptions}, same as the\n * hand-built path.\n */\n\nimport {\n parseWorkflowManifest,\n workflowFromManifest,\n} from \"@agentproto/workflow/manifest\"\n\nimport { compileWorkflow } from \"./compile-workflow.js\"\nimport type { CompileWorkflowOptions } from \"./compile-workflow.js\"\nimport type { RuntimeWorkflow } from \"./types.js\"\n\n/**\n * Compile a `WORKFLOW.md` source string into a {@link RuntimeWorkflow} ready\n * for `runWorkflow`. Parses + validates the frontmatter against the AIP-15\n * schema, lifts it to a `WorkflowHandle`, then compiles its step graph against\n * the injected tool registry. Throws on invalid frontmatter (the parser's\n * diagnostic) or an unresolved tool / non-linear step (the compiler's).\n */\nexport function compileWorkflowManifest(\n source: string,\n opts: CompileWorkflowOptions,\n): RuntimeWorkflow {\n const manifest = parseWorkflowManifest(source)\n const handle = workflowFromManifest(manifest)\n return compileWorkflow(handle, opts)\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentproto/workflow-runtime",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "Reference step-walker for AIP-15 WORKFLOW composition: executes a typed step graph (tool / map / branch / loop / transform) over @agentproto/driver runTool, threading each step's output into a run-scoped binding bag (the AIP-16 IO seam, expressed as typed selectors). The missing executor that makes 'composition = config' runnable.",
5
5
  "keywords": [
6
6
  "agentproto",
@@ -39,16 +39,16 @@
39
39
  "access": "public"
40
40
  },
41
41
  "dependencies": {
42
- "@agentproto/driver": "0.2.0",
43
- "@agentproto/tool": "0.2.1",
44
- "@agentproto/workflow": "0.2.0"
42
+ "@agentproto/driver": "0.2.1",
43
+ "@agentproto/tool": "0.2.2",
44
+ "@agentproto/workflow": "0.3.1"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/node": "^25.6.2",
48
48
  "tsup": "^8.5.1",
49
49
  "typescript": "^5.9.3",
50
50
  "vitest": "^3.2.4",
51
- "zod": "^4.4.3",
51
+ "zod": "^4.5.4",
52
52
  "@agentproto/tooling": "0.1.0-alpha.0"
53
53
  },
54
54
  "scripts": {