@nagi-js/core 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal.ts","../src/builder.ts","../src/memory.ts","../src/idempotency.ts","../src/scheduler.ts","../src/dispatch.ts","../src/worker.ts","../src/runtime.ts"],"names":["arms","def","finalizedDef","flow","last","fact"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n Json,\n Millis,\n NeedsMap,\n RetryPolicy,\n RunState,\n StandardSchemaV1,\n Step,\n StepCtx,\n StepMap,\n} from \"./types\";\n\n/**\n * A nested step's annotation — set on any step that lives inside a match arm.\n * The scheduler uses this to gate the step:\n * - blocked until the parent match selects an arm\n * - skipped when the parent's selected arm differs from this step's arm\n * - eligible when the parent's selected arm matches\n */\nexport interface ParentMatchRef {\n readonly matchId: string;\n readonly armId: string;\n}\n\nexport interface TaskDef {\n readonly kind: \"task\";\n readonly needs: NeedsMap;\n readonly retry?: RetryPolicy;\n readonly timeout?: Millis;\n readonly when?: (args: {\n input: unknown;\n needs: Record<string, unknown>;\n }) => boolean;\n readonly run: (args: {\n input: unknown;\n needs: Record<string, unknown>;\n ctx: StepCtx<unknown>;\n }) => Promise<Json>;\n readonly parentMatch?: ParentMatchRef;\n}\n\nexport interface SignalDef {\n readonly kind: \"signal\";\n readonly needs: NeedsMap;\n readonly schema: StandardSchemaV1;\n readonly timeout?: Millis;\n readonly when?: (args: {\n input: unknown;\n needs: Record<string, unknown>;\n }) => boolean;\n readonly parentMatch?: ParentMatchRef;\n}\n\n/**\n * One arm of a match. For discriminator matches `id` is the case key\n * (e.g. \"hot\"); for guard matches it's `arm0` / `arm1` / ... / `otherwise`.\n *\n * `stepIds` is populated by `flow()` once nested steps have been assigned\n * namespaced IDs (`<matchKey>.<armId>.<stepKey>`). During builder execution\n * `stepIds` is empty and the unflattened map lives on `_nested`, which\n * `flow()` consumes and discards.\n */\nexport interface MatchArmDef {\n readonly id: string;\n readonly when?: (args: {\n input: unknown;\n needs: Record<string, unknown>;\n }) => boolean;\n readonly otherwise?: true;\n readonly stepIds: readonly string[];\n /** @internal Transient. Populated by builder, consumed by flow(). */\n readonly _nested?: StepMap;\n}\n\ninterface MatchDefBase {\n readonly kind: \"match\";\n readonly needs: NeedsMap;\n readonly parentMatch?: ParentMatchRef;\n}\n\nexport interface DiscriminatorMatchDef extends MatchDefBase {\n readonly mode: \"discriminator\";\n readonly on: (args: {\n input: unknown;\n needs: Record<string, unknown>;\n }) => string;\n readonly arms: Readonly<Record<string, MatchArmDef>>;\n}\n\nexport interface GuardMatchDef extends MatchDefBase {\n readonly mode: \"guard\";\n readonly arms: readonly MatchArmDef[];\n}\n\nexport type MatchDef = DiscriminatorMatchDef | GuardMatchDef;\n\nexport type StepDef = TaskDef | SignalDef | MatchDef;\n\nconst DEF = \"__def\" as const;\n\nexport type StepWithDef<Output = unknown> = Step<Output> & {\n readonly [DEF]: StepDef;\n};\n\nexport function attachDef<Output>(\n meta: { readonly kind: StepDef[\"kind\"]; readonly id: string },\n def: StepDef,\n): StepWithDef<Output> {\n return { kind: meta.kind, id: meta.id, [DEF]: def };\n}\n\nexport function getDef(step: Step<unknown>): StepDef {\n const def = (step as Partial<StepWithDef>)[DEF];\n if (def === undefined) {\n throw new Error(\n `Step \"${step.id}\" has no internal definition. Construct steps via the builder.`,\n );\n }\n return def;\n}\n\n/** A step is \"complete-blocking\" if downstream can't run until it finishes. */\nexport function isStepKind(def: StepDef, kind: StepDef[\"kind\"]): boolean {\n return def.kind === kind;\n}\n\n/** Names of the upstream steps this step depends on. */\nexport function needsKeys(def: StepDef): readonly string[] {\n return Object.keys(def.needs);\n}\n\n/** Extract the upstream step IDs (after `flow()` has assigned ids from keys). */\nexport function needsStepIds(def: StepDef): readonly string[] {\n const out: string[] = [];\n for (const upstream of Object.values(def.needs)) {\n if (\n upstream &&\n typeof upstream === \"object\" &&\n \"id\" in upstream &&\n typeof upstream.id === \"string\"\n ) {\n out.push(upstream.id);\n }\n }\n return out;\n}\n\n/** Build the `needs` record passed to a handler — `{ localKey: upstreamOutput }`. */\nexport function resolveNeeds(\n def: StepDef,\n loadOutput: (stepId: string) => Json | null,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [localKey, upstream] of Object.entries(def.needs)) {\n if (\n upstream &&\n typeof upstream === \"object\" &&\n \"id\" in upstream &&\n typeof upstream.id === \"string\"\n ) {\n result[localKey] = loadOutput(upstream.id);\n }\n }\n return result;\n}\n\nexport type StepMapWithDefs = Readonly<Record<string, StepWithDef<unknown>>>;\n\n/** Cast a public StepMap to the internal one. Builder produces StepWithDef instances. */\nexport function asStepMapWithDefs(steps: StepMap): StepMapWithDefs {\n return steps as StepMapWithDefs;\n}\n\n/** All arms of a match, regardless of mode, as an ordered list. */\nexport function matchArms(def: MatchDef): readonly MatchArmDef[] {\n return def.mode === \"discriminator\" ? Object.values(def.arms) : def.arms;\n}\n\n/** Look up an arm by id. Returns undefined if no arm has that id. */\nexport function findArm(def: MatchDef, armId: string): MatchArmDef | undefined {\n if (def.mode === \"discriminator\") return def.arms[armId];\n return def.arms.find((a) => a.id === armId);\n}\n\n/**\n * Read the chosen arm of a match from the fact log. Returns `null` if the\n * match has not yet selected an arm in this run (i.e. no `match.arm-selected`\n * fact for `matchId`).\n *\n * The fact log is the source of truth for the selection — it survives crash\n * and replay, and the match's own `running` state in the steps projection\n * doesn't carry the chosen-arm bit.\n */\nexport function readSelectedArm(\n matchId: string,\n runState: RunState,\n): string | null {\n for (const fact of runState.facts) {\n if (fact.kind === \"match.arm-selected\" && fact.stepId === matchId) {\n return fact.arm;\n }\n }\n return null;\n}\n\n/**\n * Pick the arm to run for a given match invocation.\n *\n * Discriminator: invoke `on(args)`, look up the case key in `def.arms`. Throw\n * if the returned key has no arm — the type system guards exhaustiveness,\n * but the discriminant might be a runtime-narrowed string that escapes the\n * declared union.\n *\n * Guard: walk `def.arms` top-to-bottom. The first arm whose `when()` returns\n * true wins; an arm with `otherwise: true` matches unconditionally. Throw\n * if no arm matches and no `otherwise` is present (per the v0 fallthrough\n * policy: unreachable fallthrough is a programmer error → match fails\n * terminally).\n *\n * The thrown Error's message becomes the `step.failed.error.message` for the\n * match, so phrase it for an operator reading a fact log.\n */\nexport function selectArm(\n def: MatchDef,\n args: { readonly input: unknown; readonly needs: Record<string, unknown> },\n): string {\n if (def.mode === \"discriminator\") {\n const key = def.on(args);\n if (def.arms[key] === undefined) {\n const available = Object.keys(def.arms).join(\", \");\n throw new Error(\n `match: discriminator returned \"${key}\" which has no arm (available: ${available || \"<none>\"})`,\n );\n }\n return key;\n }\n\n for (const arm of def.arms) {\n if (arm.otherwise) return arm.id;\n if (arm.when?.(args)) return arm.id;\n }\n throw new Error(\n `match: no guard arm matched and no { otherwise: true } fallback was provided`,\n );\n}\n","import {\n attachDef,\n type DiscriminatorMatchDef,\n type GuardMatchDef,\n type MatchArmDef,\n type MatchDef,\n type ParentMatchRef,\n type SignalDef,\n type StepDef,\n type TaskDef,\n} from \"./internal\";\nimport type {\n Builder,\n Flow,\n FlowConfig,\n InferSchemaOutput,\n MatchArm,\n MatchDiscriminatorConfig,\n MatchGuardConfig,\n NeedsMap,\n SignalConfig,\n StandardSchemaV1,\n Step,\n StepMap,\n TaskConfig,\n} from \"./types\";\n\nfunction isDiscriminator(\n config: object,\n): config is MatchDiscriminatorConfig<\n unknown,\n NeedsMap,\n string,\n Record<string, StepMap>\n> {\n return \"cases\" in config && \"on\" in config;\n}\n\nfunction makeBuilder<Input>(): Builder<Input> {\n function task<N extends NeedsMap, O>(\n config: TaskConfig<Input, N, O>,\n ): Step<O> {\n const def: TaskDef = {\n kind: \"task\",\n needs: (config.needs ?? {}) as NeedsMap,\n ...(config.retry !== undefined ? { retry: config.retry } : {}),\n ...(config.timeout !== undefined ? { timeout: config.timeout } : {}),\n ...(config.when !== undefined\n ? {\n when: config.when as (args: {\n input: unknown;\n needs: Record<string, unknown>;\n }) => boolean,\n }\n : {}),\n run: config.run as TaskDef[\"run\"],\n };\n return attachDef<O>({ kind: \"task\", id: \"\" }, def);\n }\n\n function signal<N extends NeedsMap, S extends StandardSchemaV1>(\n config: SignalConfig<Input, N, S>,\n ): Step<InferSchemaOutput<S>> {\n const def: SignalDef = {\n kind: \"signal\",\n needs: (config.needs ?? {}) as NeedsMap,\n schema: config.schema,\n ...(config.timeout !== undefined ? { timeout: config.timeout } : {}),\n ...(config.when !== undefined\n ? {\n when: config.when as (args: {\n input: unknown;\n needs: Record<string, unknown>;\n }) => boolean,\n }\n : {}),\n };\n return attachDef<InferSchemaOutput<S>>({ kind: \"signal\", id: \"\" }, def);\n }\n\n function match(config: object): Step<unknown> {\n const needs =\n \"needs\" in config && config.needs\n ? (config.needs as NeedsMap)\n : ({} as NeedsMap);\n\n if (isDiscriminator(config)) {\n const arms: Record<string, MatchArmDef> = {};\n for (const [caseKey, build] of Object.entries(config.cases)) {\n const nested = (build as (b: Builder<Input>) => StepMap)(\n makeBuilder<Input>(),\n );\n arms[caseKey] = { id: caseKey, stepIds: [], _nested: nested };\n }\n const def: DiscriminatorMatchDef = {\n kind: \"match\",\n mode: \"discriminator\",\n needs,\n on: config.on as DiscriminatorMatchDef[\"on\"],\n arms,\n };\n return attachDef<unknown>({ kind: \"match\", id: \"\" }, def);\n }\n\n const guardConfig = config as MatchGuardConfig<Input, NeedsMap, StepMap>;\n const arms: MatchArmDef[] = [];\n for (let i = 0; i < guardConfig.arms.length; i++) {\n const arm = guardConfig.arms[i] as MatchArm<Input, NeedsMap, StepMap>;\n const nested = arm.build(makeBuilder<Input>());\n const armId = arm.otherwise ? \"otherwise\" : `arm${i}`;\n arms.push({\n id: armId,\n ...(arm.when !== undefined\n ? {\n when: arm.when as (args: {\n input: unknown;\n needs: Record<string, unknown>;\n }) => boolean,\n }\n : {}),\n ...(arm.otherwise ? { otherwise: true as const } : {}),\n stepIds: [],\n _nested: nested,\n });\n }\n const def: GuardMatchDef = {\n kind: \"match\",\n mode: \"guard\",\n needs,\n arms,\n };\n return attachDef<unknown>({ kind: \"match\", id: \"\" }, def);\n }\n\n return { task, signal, match: match as Builder<Input>[\"match\"] };\n}\n\n/**\n * Construct a flow.\n *\n * 1. Run `build(b)` to collect the user's StepMap. Each call to `b.task` /\n * `b.signal` / `b.match` produced a Step with `id: \"\"` and a captured def\n * (which may reference upstream Step values from earlier in the closure).\n * Match defs additionally hold their arms' nested StepMaps on `_nested`.\n * 2. Walk the returned map *recursively*, descending into match arms. Each\n * step gets an id derived from its position: top-level keys verbatim,\n * nested arm steps namespaced as `<matchKey>.<armId>.<stepKey>`.\n * 3. Rewrite every def's `needs` so each upstream Step value carries its\n * assigned id. Nested-arm step defs additionally get a `parentMatch`\n * annotation so the scheduler can gate them on arm selection.\n * 4. Promote `MatchArmDef._nested` → `MatchArmDef.stepIds` (the namespaced\n * IDs of the arm's nested steps), then drop `_nested`.\n */\nexport function flow<\n const Id extends string,\n InputSchema extends StandardSchemaV1,\n M extends StepMap,\n Output = unknown,\n>(\n config: FlowConfig<Id, InputSchema, M, Output>,\n): Flow<Id, InputSchema, M, Output> {\n const builder = makeBuilder<InferSchemaOutput<InputSchema>>();\n const built = config.build(builder);\n\n const idByIdentity = new Map<Step<unknown>, string>();\n collectIds(built, \"\", idByIdentity);\n\n const finalSteps: Record<string, Step<unknown>> = {};\n walkAndRewrite({\n flowId: config.id,\n map: built,\n prefix: \"\",\n parentMatch: undefined,\n idByIdentity,\n out: finalSteps,\n });\n\n return {\n id: config.id,\n input: config.input,\n steps: finalSteps as M,\n ...(config.output !== undefined ? { output: config.output } : {}),\n };\n}\n\n/** Recursively assign namespaced IDs and record them by Step identity. */\nfunction collectIds(\n map: StepMap,\n prefix: string,\n idByIdentity: Map<Step<unknown>, string>,\n): void {\n for (const [key, step] of Object.entries(map)) {\n const id = prefix ? `${prefix}.${key}` : key;\n idByIdentity.set(step, id);\n const def = (step as { __def?: StepDef }).__def;\n if (def?.kind === \"match\") {\n const arms: readonly MatchArmDef[] =\n def.mode === \"discriminator\" ? Object.values(def.arms) : def.arms;\n for (const arm of arms) {\n if (arm._nested)\n collectIds(arm._nested, `${id}.${arm.id}`, idByIdentity);\n }\n }\n }\n}\n\ninterface WalkArgs {\n readonly flowId: string;\n readonly map: StepMap;\n readonly prefix: string;\n readonly parentMatch: ParentMatchRef | undefined;\n readonly idByIdentity: Map<Step<unknown>, string>;\n readonly out: Record<string, Step<unknown>>;\n}\n\n/**\n * Recursively rewrite defs and emit them into `out` under their assigned\n * namespaced IDs. For matches, each arm's nested steps are emitted into the\n * same flat `out` map (so the scheduler sees the full graph), then the arm\n * is finalized with the namespaced ID list.\n */\nfunction walkAndRewrite(args: WalkArgs): void {\n const { flowId, map, prefix, parentMatch, idByIdentity, out } = args;\n\n for (const [key, step] of Object.entries(map)) {\n const id = prefix ? `${prefix}.${key}` : key;\n const def = (step as { __def?: StepDef }).__def;\n if (def === undefined) {\n throw new Error(\n `Flow \"${flowId}\": step \"${id}\" has no internal def. ` +\n `Did you return a value not produced by the builder?`,\n );\n }\n // Steps fresh from `b.task` / `b.signal` / `b.match` carry id \"\". A\n // non-empty id means this step was already processed by a different\n // `flow()` call — sharing a step across flows is unsupported.\n if (step.id !== \"\") {\n throw new Error(\n `Flow \"${flowId}\": step \"${id}\" was produced by a different flow() ` +\n `call (its id is already \"${step.id}\"). Each flow's build must use ` +\n `only the builder passed to it; steps cannot be shared between flows.`,\n );\n }\n\n const rewrittenNeeds: Record<string, Step<unknown>> = {};\n for (const [localKey, upstream] of Object.entries(def.needs)) {\n const upstreamId = idByIdentity.get(upstream);\n if (upstreamId === undefined) {\n const fromOtherFlow = upstream.id !== \"\";\n throw new Error(\n fromOtherFlow\n ? `Flow \"${flowId}\": step \"${id}\" needs an upstream step from a ` +\n `different flow() call (upstream id \"${upstream.id}\"). Steps ` +\n `cannot be shared between flows.`\n : `Flow \"${flowId}\": step \"${id}\" references an upstream step ` +\n `that was not returned from build(). Add it to the returned object.`,\n );\n }\n rewrittenNeeds[localKey] = { ...upstream, id: upstreamId };\n }\n\n if (def.kind === \"match\") {\n const armList: readonly MatchArmDef[] =\n def.mode === \"discriminator\" ? Object.values(def.arms) : def.arms;\n const finalizedArms: MatchArmDef[] = [];\n\n for (const arm of armList) {\n const armPrefix = `${id}.${arm.id}`;\n const nestedStepIds: string[] = [];\n if (arm._nested) {\n for (const nestedKey of Object.keys(arm._nested)) {\n nestedStepIds.push(`${armPrefix}.${nestedKey}`);\n }\n walkAndRewrite({\n flowId,\n map: arm._nested,\n prefix: armPrefix,\n parentMatch: { matchId: id, armId: arm.id },\n idByIdentity,\n out,\n });\n }\n finalizedArms.push({\n id: arm.id,\n ...(arm.when !== undefined ? { when: arm.when } : {}),\n ...(arm.otherwise ? { otherwise: true as const } : {}),\n stepIds: nestedStepIds,\n });\n }\n\n const finalizedDef: MatchDef =\n def.mode === \"discriminator\"\n ? {\n kind: \"match\",\n mode: \"discriminator\",\n needs: rewrittenNeeds,\n on: def.on,\n arms: Object.fromEntries(finalizedArms.map((a) => [a.id, a])),\n ...(parentMatch ? { parentMatch } : {}),\n }\n : {\n kind: \"match\",\n mode: \"guard\",\n needs: rewrittenNeeds,\n arms: finalizedArms,\n ...(parentMatch ? { parentMatch } : {}),\n };\n\n out[id] = attachDef({ kind: \"match\", id }, finalizedDef);\n continue;\n }\n\n const baseRewritten = { ...def, needs: rewrittenNeeds } as StepDef;\n const finalizedDef = parentMatch\n ? ({ ...baseRewritten, parentMatch } as StepDef)\n : baseRewritten;\n out[id] = attachDef({ kind: finalizedDef.kind, id }, finalizedDef);\n }\n}\n","import type {\n AttemptNumber,\n ClaimToken,\n Clock,\n Fact,\n FlowStartedFact,\n Json,\n Millis,\n Queue,\n QueueDequeueOpts,\n QueueEnqueueOpts,\n QueueMessage,\n RunId,\n RunState,\n RunStatus,\n SerializedError,\n StepCompletedFact,\n StepFailedFact,\n StepId,\n StepState,\n Store,\n Trigger,\n Tx,\n} from \"./types\";\n\ninterface MemoryLease {\n readonly token: ClaimToken;\n readonly expiresAt: number;\n}\n\nexport interface InMemoryStoreOpts {\n readonly leaseMs?: Millis;\n}\n\nconst DEFAULT_STORE_LEASE_MS: Millis = 60_000;\n\nexport class InMemoryStore implements Store {\n private readonly facts = new Map<string, Fact[]>();\n private readonly outputs = new Map<string, Json>();\n private readonly onces = new Map<string, Json>();\n private readonly leases = new Map<string, MemoryLease>();\n private readonly leaseMs: Millis;\n\n constructor(opts: InMemoryStoreOpts = {}) {\n this.leaseMs = opts.leaseMs ?? DEFAULT_STORE_LEASE_MS;\n }\n\n async appendFact(runId: RunId, fact: Fact): Promise<void> {\n const list = this.facts.get(runId) ?? [];\n list.push(fact);\n this.facts.set(runId, list);\n }\n\n async tryStartRun(\n runId: RunId,\n fact: FlowStartedFact,\n ): Promise<{ readonly started: boolean }> {\n // Single-process JS is cooperatively single-threaded between awaits, so\n // this `has` + `set` pair is atomic with respect to any other call into\n // this Store. No locking primitive needed; the Postgres adapter is where\n // real cross-process race safety lives.\n if (this.facts.has(runId)) {\n return { started: false };\n }\n this.facts.set(runId, [fact]);\n return { started: true };\n }\n\n async loadRunState(runId: RunId): Promise<RunState> {\n return projectRunState(runId, this.facts.get(runId) ?? []);\n }\n\n async claimStep(\n runId: RunId,\n stepId: StepId,\n attempt: AttemptNumber,\n ): Promise<ClaimToken | null> {\n const key = `${runId}::${stepId}::${attempt}`;\n const now = Date.now();\n const existing = this.leases.get(key);\n if (existing && existing.expiresAt > now) {\n return null;\n }\n const token = `lease-${crypto.randomUUID()}` as ClaimToken;\n this.leases.set(key, { token, expiresAt: now + this.leaseMs });\n return token;\n }\n\n async completeStep(\n runId: RunId,\n stepId: StepId,\n output: Json,\n fact: Fact,\n ): Promise<void> {\n this.outputs.set(`${runId}::${stepId}`, output);\n await this.appendFact(runId, fact);\n }\n\n async failStep(\n runId: RunId,\n _stepId: StepId,\n _error: SerializedError,\n fact: Fact,\n ): Promise<void> {\n await this.appendFact(runId, fact);\n }\n\n async getStepOutput(runId: RunId, stepId: StepId): Promise<Json | null> {\n return this.outputs.get(`${runId}::${stepId}`) ?? null;\n }\n\n async recordOnce(\n runId: RunId,\n stepId: StepId,\n scope: string,\n value: Json,\n ): Promise<void> {\n this.onces.set(`${runId}::${stepId}::${scope}`, value);\n }\n\n async getOnce(\n runId: RunId,\n stepId: StepId,\n scope: string,\n ): Promise<Json | null> {\n return this.onces.get(`${runId}::${stepId}::${scope}`) ?? null;\n }\n\n async runStep<T extends Json>(\n runId: RunId,\n stepId: StepId,\n _attempt: AttemptNumber,\n body: (tx: Tx) => Promise<{\n readonly output: T;\n readonly fact: StepCompletedFact | StepFailedFact;\n }>,\n ): Promise<T> {\n const result = await body(undefined as unknown as Tx);\n if (result.fact.kind === \"step.completed\") {\n await this.completeStep(runId, stepId, result.output, result.fact);\n } else {\n await this.failStep(runId, stepId, result.fact.error, result.fact);\n }\n return result.output;\n }\n}\n\n/**\n * Project an append-only fact stream into a `RunState`. Public so adapters\n * (e.g. `@nagi-js/postgres`) can re-use the same projection rules — keeping\n * one canonical definition of \"what does the fact log mean\".\n */\nexport function projectRunState(\n runId: RunId,\n facts: readonly Fact[],\n): RunState {\n let flowId = \"\";\n let status: RunStatus = \"pending\";\n const steps: Record<string, StepState> = {};\n\n for (const fact of facts) {\n switch (fact.kind) {\n case \"flow.started\":\n flowId = fact.flowId;\n status = \"running\";\n break;\n case \"flow.completed\":\n status = \"completed\";\n break;\n case \"flow.failed\":\n status = \"failed\";\n break;\n case \"step.started\":\n steps[fact.stepId] = {\n stepId: fact.stepId,\n status: \"running\",\n attempts: fact.attempt,\n };\n break;\n case \"step.completed\":\n steps[fact.stepId] = {\n stepId: fact.stepId,\n status: \"completed\",\n attempts: fact.attempt,\n output: fact.output,\n };\n break;\n case \"step.failed\":\n steps[fact.stepId] = {\n stepId: fact.stepId,\n status: \"failed\",\n attempts: fact.attempt,\n error: fact.error,\n };\n break;\n case \"step.skipped\":\n steps[fact.stepId] = {\n stepId: fact.stepId,\n status: \"skipped\",\n attempts: 0,\n };\n break;\n case \"step.retried\":\n case \"signal.sent\":\n case \"signal.received\":\n case \"once.recorded\":\n case \"match.arm-selected\":\n // Don't affect the step-state projection directly; live in the fact log only.\n break;\n }\n }\n\n return { runId, flowId, status, steps, facts };\n}\n\ninterface QueuedItem extends QueueMessage {\n readonly enqueuedAt: number;\n readonly visibleAt: number;\n}\n\nexport interface InMemoryQueueOpts {\n readonly leaseMs?: Millis;\n}\n\nconst DEFAULT_QUEUE_LEASE_MS: Millis = 60_000;\n\nexport class InMemoryQueue implements Queue {\n private readonly pending: QueuedItem[] = [];\n private readonly leased = new Map<string, QueuedItem>();\n private readonly leaseMs: Millis;\n\n constructor(opts: InMemoryQueueOpts = {}) {\n this.leaseMs = opts.leaseMs ?? DEFAULT_QUEUE_LEASE_MS;\n }\n\n async enqueue(\n runId: RunId,\n stepId: StepId,\n opts?: QueueEnqueueOpts,\n ): Promise<void> {\n const now = Date.now();\n const item: QueuedItem = {\n receipt: crypto.randomUUID(),\n runId,\n stepId,\n payload: opts?.payload ?? null,\n attempt: opts?.attempt ?? 1,\n enqueuedAt: now,\n visibleAt: now + (opts?.delayMs ?? 0),\n };\n this.pending.push(item);\n }\n\n async dequeue(opts: QueueDequeueOpts): Promise<readonly QueueMessage[]> {\n const now = Date.now();\n const claimed: QueueMessage[] = [];\n for (\n let i = 0;\n i < this.pending.length && claimed.length < opts.count;\n i++\n ) {\n const item = this.pending[i];\n if (item === undefined) continue;\n if (item.visibleAt > now) continue;\n const next: QueuedItem = { ...item, visibleAt: now + this.leaseMs };\n this.pending.splice(i, 1);\n i--;\n this.leased.set(item.receipt, next);\n claimed.push(item);\n }\n return claimed;\n }\n\n async ack(receipt: string): Promise<void> {\n this.leased.delete(receipt);\n }\n\n async nack(receipt: string, opts?: { delayMs?: Millis }): Promise<void> {\n const item = this.leased.get(receipt);\n if (!item) return;\n this.leased.delete(receipt);\n // attempt is owned by the dispatcher (store-side tracking) — nack does not\n // increment. The same message returns to the queue on lease expiry / nack.\n const requeued: QueuedItem = {\n ...item,\n visibleAt: Date.now() + (opts?.delayMs ?? 0),\n };\n this.pending.push(requeued);\n }\n\n async extend(receipt: string, leaseMs: Millis): Promise<void> {\n const item = this.leased.get(receipt);\n if (!item) return;\n this.leased.set(receipt, { ...item, visibleAt: Date.now() + leaseMs });\n }\n}\n\nexport interface InMemoryClockOpts {\n /**\n * Wires `schedule()` wake-ups to a trigger. When the persistent timer fires,\n * the clock calls `trigger.fire(runId)` so scheduler subscribers can resume\n * the run. Without this, `schedule()` is a no-op on the worker loop and any\n * step that depends on it (time-based gates, long-delayed retries) will\n * stall in tests.\n */\n readonly trigger?: InMemoryTrigger;\n}\n\nexport class InMemoryClock implements Clock {\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly trigger: InMemoryTrigger | undefined;\n\n constructor(opts: InMemoryClockOpts = {}) {\n this.trigger = opts.trigger;\n }\n\n now(): Date {\n return new Date();\n }\n\n async sleep(ms: Millis, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n throw signal.reason ?? new Error(\"aborted\");\n }\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal?.reason ?? new Error(\"aborted\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n async schedule(at: Date, runId: RunId, stepId: StepId): Promise<void> {\n const key = `${runId}::${stepId}`;\n const existing = this.timers.get(key);\n if (existing !== undefined) clearTimeout(existing);\n\n const delay = Math.max(0, at.getTime() - Date.now());\n const handle = setTimeout(() => {\n this.timers.delete(key);\n this.trigger?.fire(runId);\n }, delay);\n this.timers.set(key, handle);\n }\n\n /** Clear any pending scheduled timers. Call from test teardown. */\n dispose(): void {\n for (const t of this.timers.values()) clearTimeout(t);\n this.timers.clear();\n }\n}\n\nexport class InMemoryTrigger implements Trigger {\n private handlers: Array<(runId: RunId) => void> = [];\n\n subscribe(handler: (runId: RunId) => void): () => void {\n this.handlers.push(handler);\n return () => {\n this.handlers = this.handlers.filter((h) => h !== handler);\n };\n }\n\n /**\n * Test-only: synchronously dispatch a wake-up to all subscribers.\n * Real triggers fire from a Store change (NOTIFY/LISTEN, polling, etc.).\n */\n fire(runId: RunId): void {\n for (const h of this.handlers) h(runId);\n }\n}\n","import type { Json, RunId, StepId, Store } from \"./types\";\n\n/**\n * Stable key generator for external APIs (Stripe, Mux, etc.).\n *\n * Per the boundary contract: `hash(runId + stepId + scope)`. Identical across\n * retries of the same step, different across runs.\n *\n * v0 uses concat (`nagi:<runId>:<stepId>:<scope>`) — sync, debuggable,\n * Stripe-friendly (under the 255 char limit). Switch to `crypto.subtle`\n * SHA-256 if compactness ever matters.\n */\nexport function makeIdempotencyKey(\n runId: RunId,\n stepId: StepId,\n): (scope: string) => string {\n return (scope) => `nagi:${runId}:${stepId}:${scope}`;\n}\n\n/**\n * Durable per-effect memoization. The first successful call for\n * `(runId, stepId, scope)` persists its return value; subsequent calls\n * (including post-crash retries) return the cached value without invoking `fn`.\n */\nexport function makeOnce(args: {\n readonly runId: RunId;\n readonly stepId: StepId;\n readonly store: Store;\n}): <T extends Json>(scope: string, fn: () => Promise<T>) => Promise<T> {\n const { runId, stepId, store } = args;\n return async function once<T extends Json>(\n scope: string,\n fn: () => Promise<T>,\n ): Promise<T> {\n const cached = await store.getOnce(runId, stepId, scope);\n if (cached !== null) return cached as T;\n\n const value = await fn();\n await store.recordOnce(runId, stepId, scope, value);\n return value;\n };\n}\n","import {\n getDef,\n readSelectedArm,\n resolveNeeds,\n type StepDef,\n} from \"./internal\";\nimport type { Flow, Json, RunState, StepState } from \"./types\";\n\nexport type SkipReason = \"when-false\" | \"transitive\";\n\nexport interface ScheduleDecision {\n readonly runnable: readonly string[];\n readonly skip: ReadonlyArray<{\n readonly stepId: string;\n readonly reason: SkipReason;\n }>;\n}\n\nexport interface ScheduleArgs {\n readonly flow: Flow;\n readonly runState: RunState;\n readonly input: unknown;\n}\n\n/**\n * Compute the next set of runnable / skip decisions from current state.\n * Pure function; the caller persists the resulting facts and enqueues messages.\n */\nexport function nextRunnable(args: ScheduleArgs): ScheduleDecision {\n const { flow, runState, input } = args;\n const runnable: string[] = [];\n const skip: { stepId: string; reason: SkipReason }[] = [];\n\n for (const [stepId, step] of Object.entries(flow.steps)) {\n const state = runState.steps[stepId];\n if (state !== undefined && state.status !== \"pending\") continue;\n\n const def = getDef(step);\n\n // Gate nested arm steps on parent match arm selection.\n const parentGate = checkParentMatch(def, runState);\n if (parentGate === \"blocked\") continue;\n if (parentGate === \"transitive-skip\") {\n skip.push({ stepId, reason: \"transitive\" });\n continue;\n }\n\n const upstreamCheck = checkUpstream(def, runState);\n if (upstreamCheck === \"blocked\") continue;\n if (upstreamCheck === \"transitive-skip\") {\n skip.push({ stepId, reason: \"transitive\" });\n continue;\n }\n\n const when = def.kind === \"match\" ? undefined : def.when;\n if (when) {\n const needs = resolveNeeds(\n def,\n (id) => runState.steps[id]?.output ?? null,\n );\n const shouldRun = when({ input, needs });\n if (!shouldRun) {\n skip.push({ stepId, reason: \"when-false\" });\n continue;\n }\n }\n\n runnable.push(stepId);\n }\n\n return { runnable, skip };\n}\n\ntype UpstreamStatus = \"ready\" | \"blocked\" | \"transitive-skip\";\n\nfunction checkUpstream(def: StepDef, runState: RunState): UpstreamStatus {\n for (const upstream of Object.values(def.needs)) {\n if (\n !upstream ||\n typeof upstream !== \"object\" ||\n !(\"id\" in upstream) ||\n typeof upstream.id !== \"string\"\n ) {\n continue;\n }\n const upstreamState = runState.steps[upstream.id];\n if (upstreamState === undefined) return \"blocked\";\n if (upstreamState.status === \"completed\") continue;\n if (\n upstreamState.status === \"skipped\" ||\n upstreamState.status === \"failed\"\n ) {\n return \"transitive-skip\";\n }\n return \"blocked\";\n }\n return \"ready\";\n}\n\n/**\n * Gate for nested arm steps. A step with `parentMatch` runs only after its\n * parent match has selected an arm AND that arm matches.\n *\n * parent missing arm-selected fact → blocked (parent hasn't routed yet)\n * parent selected a different arm → transitive-skip\n * parent failed/skipped before selecting → transitive-skip\n * parent selected this arm → ready\n */\nfunction checkParentMatch(def: StepDef, runState: RunState): UpstreamStatus {\n if (!def.parentMatch) return \"ready\";\n const { matchId, armId } = def.parentMatch;\n\n const parentState = runState.steps[matchId];\n if (parentState?.status === \"failed\" || parentState?.status === \"skipped\") {\n return \"transitive-skip\";\n }\n\n const selected = readSelectedArm(matchId, runState);\n if (selected === null) return \"blocked\";\n return selected === armId ? \"ready\" : \"transitive-skip\";\n}\n\nexport type MatchAggregation =\n | { readonly kind: \"pending\" }\n | {\n readonly kind: \"complete\";\n readonly output: Readonly<Record<string, Json>>;\n }\n | { readonly kind: \"fail-fast\"; readonly failedStepId: string };\n\n/**\n * Inspect the chosen arm of a `running` match and report whether it can be\n * promoted to a terminal state.\n *\n * pending — selected arm has steps still running/pending; do nothing\n * fail-fast — at least one chosen-arm step is `failed`; match should fail\n * complete — every chosen-arm step is terminal (completed/skipped) and\n * none failed; match should be completed with assembled output\n *\n * Output is keyed by the *local* step key (the original key from the arm's\n * StepMap), not the namespaced runtime id — that's what the user sees in\n * `needs.matchStep.<key>`. Skipped steps land as `null`, consistent with the\n * \"skip is transitive\" lock.\n */\nexport function aggregateMatch(\n matchId: string,\n flow: Flow,\n runState: RunState,\n): MatchAggregation {\n const step = flow.steps[matchId];\n if (!step) return { kind: \"pending\" };\n const def = getDef(step);\n if (def.kind !== \"match\") return { kind: \"pending\" };\n\n const selected = readSelectedArm(matchId, runState);\n if (selected === null) return { kind: \"pending\" };\n\n const arm =\n def.mode === \"discriminator\"\n ? def.arms[selected]\n : def.arms.find((a) => a.id === selected);\n if (!arm) return { kind: \"pending\" };\n\n const output: Record<string, Json> = {};\n let allTerminal = true;\n const stripPrefix = `${matchId}.${arm.id}.`;\n\n for (const stepId of arm.stepIds) {\n const state: StepState | undefined = runState.steps[stepId];\n if (\n state === undefined ||\n state.status === \"pending\" ||\n state.status === \"running\"\n ) {\n allTerminal = false;\n continue;\n }\n if (state.status === \"failed\") {\n return { kind: \"fail-fast\", failedStepId: stepId };\n }\n const localKey = stepId.startsWith(stripPrefix)\n ? stepId.slice(stripPrefix.length)\n : stepId;\n output[localKey] =\n state.status === \"completed\" ? (state.output ?? null) : null;\n }\n\n if (!allTerminal) return { kind: \"pending\" };\n return { kind: \"complete\", output };\n}\n\nexport interface FlowTermination {\n readonly done: boolean;\n readonly failed: boolean;\n}\n\n/**\n * `done` ⇔ every step is terminal (completed / failed / skipped).\n * `failed` ⇔ at least one step failed terminally.\n * The runtime appends `flow.completed` (or `flow.failed`) once `done`.\n */\nexport function flowTermination(\n flow: Flow,\n runState: RunState,\n): FlowTermination {\n let done = true;\n let failed = false;\n for (const stepId of Object.keys(flow.steps)) {\n const state: StepState | undefined = runState.steps[stepId];\n if (\n state === undefined ||\n state.status === \"pending\" ||\n state.status === \"running\"\n ) {\n done = false;\n break;\n }\n if (state.status === \"failed\") failed = true;\n }\n return { done, failed };\n}\n\n/**\n * The flow input is persisted in the `flow.started` fact. Extracted on every\n * dispatch so handler `ctx.input` is consistent with what the run was started with.\n */\nexport function extractInput(runState: RunState): Json {\n for (const fact of runState.facts) {\n if (fact.kind === \"flow.started\") return fact.input;\n }\n throw new Error(\n \"No flow.started fact in run — was the run initialized via wf.start?\",\n );\n}\n","import { makeIdempotencyKey, makeOnce } from \"./idempotency\";\nimport {\n getDef,\n type MatchDef,\n resolveNeeds,\n type StepDef,\n selectArm,\n} from \"./internal\";\nimport {\n aggregateMatch,\n extractInput,\n flowTermination,\n nextRunnable,\n} from \"./scheduler\";\nimport type {\n Clock,\n Fact,\n Flow,\n FlowHooks,\n Json,\n Logger,\n Millis,\n Queue,\n QueueMessage,\n RetryPolicy,\n RunId,\n RunState,\n SerializedError,\n StepCtx,\n Store,\n Tx,\n} from \"./types\";\n\nexport interface DispatchDeps {\n /**\n * Resolves the flow for a given run. The runtime supplies a closure over its\n * flow registry; adapters may override to load flows lazily. Called once at\n * the top of `dispatchMessage` and `advance` — per-step lookups reuse the\n * resolved value.\n */\n readonly flowFor: (runId: RunId) => Promise<Flow>;\n readonly store: Store;\n readonly queue: Queue;\n readonly clock: Clock;\n readonly hooks?: FlowHooks;\n readonly logger?: Logger;\n readonly defaultRetry?: RetryPolicy;\n}\n\nconst DEFAULT_RETRY: RetryPolicy = {\n maxAttempts: 3,\n backoff: \"exponential\",\n initialDelayMs: 1_000,\n maxDelayMs: 60_000,\n};\n\nexport async function dispatchMessage(\n deps: DispatchDeps,\n message: QueueMessage,\n): Promise<void> {\n const { store, queue, clock } = deps;\n const { runId, stepId, attempt } = message;\n const flow = await deps.flowFor(runId);\n\n const step = flow.steps[stepId];\n if (!step) {\n deps.logger?.warn(\n `dispatch: step \"${stepId}\" not in flow \"${flow.id}\"; ack and skip`,\n );\n await queue.ack(message.receipt);\n return;\n }\n const def = getDef(step);\n\n const preState = await store.loadRunState(runId);\n const preStep = preState.steps[stepId];\n if (\n preStep &&\n (preStep.status === \"completed\" ||\n preStep.status === \"failed\" ||\n preStep.status === \"skipped\")\n ) {\n await queue.ack(message.receipt);\n return;\n }\n\n const claim = await store.claimStep(runId, stepId, attempt);\n if (claim === null) {\n await queue.ack(message.receipt);\n return;\n }\n\n await store.appendFact(runId, {\n kind: \"step.started\",\n runId,\n stepId,\n attempt,\n at: clock.now(),\n });\n // Resolve the hook's `input` field by step kind:\n // - task: the same value passed to `run({ input, ... })` (flow input).\n // - signal: `null` — no pre-execution input.\n // - match: `null` — the discriminator value is computed inside the\n // match handler; the start event fires before that resolves.\n const startEventInput: Json =\n def.kind === \"task\" ? extractInput(await store.loadRunState(runId)) : null;\n await deps.hooks?.onStepStart?.({\n runId,\n flowId: flow.id,\n stepId,\n attempt,\n kind: def.kind,\n input: startEventInput,\n at: clock.now(),\n });\n\n const startedAt = Date.now();\n\n try {\n if (def.kind === \"task\") {\n const output = await executeTask({\n deps,\n message,\n def,\n runId,\n stepId,\n attempt,\n });\n await deps.hooks?.onStepComplete?.({\n runId,\n flowId: flow.id,\n stepId,\n attempt,\n kind: \"task\",\n output,\n durationMs: Date.now() - startedAt,\n at: clock.now(),\n });\n await advance(deps, runId);\n } else if (def.kind === \"signal\") {\n // Signals don't run; they wait. Mark `started` (already done above) and ack.\n // Completion arrives via `wf.signal()`.\n await queue.ack(message.receipt);\n return;\n } else if (def.kind === \"match\") {\n await executeMatch({ deps, message, def, runId, stepId, attempt });\n await advance(deps, runId);\n }\n } catch (err) {\n await handleStepError({\n deps,\n flow,\n message,\n def,\n runId,\n stepId,\n attempt,\n err,\n });\n }\n}\n\nasync function executeTask(args: {\n deps: DispatchDeps;\n message: QueueMessage;\n def: StepDef;\n runId: RunId;\n stepId: string;\n attempt: number;\n}): Promise<Json> {\n const { deps, message, def, runId, stepId, attempt } = args;\n if (def.kind !== \"task\") {\n throw new Error(`executeTask called with non-task def (kind: ${def.kind})`);\n }\n\n const { store, queue, clock } = deps;\n const runState = await store.loadRunState(runId);\n const input = extractInput(runState);\n const needs = resolveNeeds(def, (id) => runState.steps[id]?.output ?? null);\n\n // `runStep` owns the atomic scope: adapter-managed tx, then atomic write of\n // step output + `step.completed` fact + lease release. The handler's\n // `ctx.tx` is the same tx so domain writes commit together with the step.\n const output = await store.runStep<Json>(\n runId,\n stepId,\n attempt,\n async (tx) => {\n const ctx = makeStepCtx({\n runId,\n stepId,\n attempt,\n input,\n store,\n clock,\n tx,\n ...(deps.logger !== undefined ? { logger: deps.logger } : {}),\n });\n const out = (await def.run({ input, needs, ctx })) as Json;\n const fact: Fact = {\n kind: \"step.completed\",\n runId,\n stepId,\n attempt,\n output: out,\n at: clock.now(),\n };\n return { output: out, fact };\n },\n );\n await queue.ack(message.receipt);\n return output;\n}\n\n/**\n * Match dispatch: select an arm, persist the `match.arm-selected` fact, ack\n * the message. The match step stays in `running` status — it transitions to\n * `completed` (or `failed`) inside `advance()` once the chosen arm's nested\n * steps are terminal. Throws if `selectArm` throws so `handleStepError`\n * applies the match's retry policy / surfaces the failure.\n */\nasync function executeMatch(args: {\n deps: DispatchDeps;\n message: QueueMessage;\n def: MatchDef;\n runId: RunId;\n stepId: string;\n attempt: number;\n}): Promise<void> {\n const { deps, message, def, runId, stepId } = args;\n const { store, queue, clock } = deps;\n\n const runState = await store.loadRunState(runId);\n const input = extractInput(runState);\n const needs = resolveNeeds(def, (id) => runState.steps[id]?.output ?? null);\n\n const armId = selectArm(def, { input, needs });\n\n await store.appendFact(runId, {\n kind: \"match.arm-selected\",\n runId,\n stepId,\n arm: armId,\n at: clock.now(),\n });\n await queue.ack(message.receipt);\n}\n\nasync function handleStepError(args: {\n deps: DispatchDeps;\n flow: Flow;\n message: QueueMessage;\n def: StepDef;\n runId: RunId;\n stepId: string;\n attempt: number;\n err: unknown;\n}): Promise<void> {\n const { deps, flow, message, def, runId, stepId, attempt, err } = args;\n const { store, queue, clock } = deps;\n const error = serializeError(err);\n\n const policy =\n def.kind === \"task\" && def.retry\n ? def.retry\n : (deps.defaultRetry ?? DEFAULT_RETRY);\n const shouldRetry = attempt < policy.maxAttempts && retryAllows(policy, err);\n\n if (shouldRetry) {\n const delayMs = computeBackoff(policy, attempt);\n await store.appendFact(runId, {\n kind: \"step.retried\",\n runId,\n stepId,\n attempt,\n nextAttemptAt: new Date(Date.now() + delayMs),\n at: clock.now(),\n });\n await deps.hooks?.onStepRetry?.({\n runId,\n flowId: flow.id,\n stepId,\n attempt,\n kind: def.kind,\n error,\n nextAttemptAt: new Date(Date.now() + delayMs),\n at: clock.now(),\n });\n await queue.enqueue(runId, stepId, { attempt: attempt + 1, delayMs });\n await queue.ack(message.receipt);\n return;\n }\n\n const fact: Fact = {\n kind: \"step.failed\",\n runId,\n stepId,\n attempt,\n error,\n at: clock.now(),\n };\n await store.failStep(runId, stepId, error, fact);\n await deps.hooks?.onStepError?.({\n runId,\n flowId: flow.id,\n stepId,\n attempt,\n kind: def.kind,\n error,\n at: clock.now(),\n });\n await queue.ack(message.receipt);\n await advance(deps, runId);\n}\n\nconst MAX_ADVANCE_ITERS = 1024;\n\nexport async function advance(deps: DispatchDeps, runId: RunId): Promise<void> {\n const { store, queue, clock } = deps;\n const flow = await deps.flowFor(runId);\n\n for (let iter = 0; iter < MAX_ADVANCE_ITERS; iter++) {\n const runState = await store.loadRunState(runId);\n\n // Promote any `running` match whose chosen arm has reached a terminal\n // state. This must precede termination + scheduling: a match that just\n // completed releases its downstream needs in the same iteration.\n const promoted = await promoteMatches({ deps, flow, runState });\n if (promoted) continue;\n\n const termination = flowTermination(flow, runState);\n\n if (termination.done) {\n const last = runState.facts[runState.facts.length - 1];\n const flowAlreadyTerminal =\n last !== undefined &&\n (last.kind === \"flow.completed\" || last.kind === \"flow.failed\");\n if (!flowAlreadyTerminal) {\n if (termination.failed) {\n const failedStep = Object.values(runState.steps).find(\n (s) => s.status === \"failed\",\n );\n await store.appendFact(runId, {\n kind: \"flow.failed\",\n runId,\n error: failedStep?.error ?? {\n name: \"Error\",\n message: \"step failed\",\n },\n at: clock.now(),\n });\n await deps.hooks?.onFlowError?.({\n runId,\n flowId: flow.id,\n error: failedStep?.error ?? {\n name: \"Error\",\n message: \"step failed\",\n },\n at: clock.now(),\n });\n } else {\n let flowOutput: Json = null;\n if (flow.output !== undefined) {\n const stepOutputs: Record<string, Json> = {};\n for (const [sid, sstate] of Object.entries(runState.steps)) {\n if (sstate.output !== undefined) stepOutputs[sid] = sstate.output;\n }\n flowOutput = flow.output(stepOutputs as never) as Json;\n }\n await store.appendFact(runId, {\n kind: \"flow.completed\",\n runId,\n output: flowOutput,\n at: clock.now(),\n });\n await deps.hooks?.onFlowComplete?.({\n runId,\n flowId: flow.id,\n output: flowOutput,\n at: clock.now(),\n });\n }\n }\n return;\n }\n\n const input = extractInput(runState);\n const decision = nextRunnable({ flow, runState, input });\n\n if (decision.skip.length === 0 && decision.runnable.length === 0) return;\n\n for (const { stepId, reason } of decision.skip) {\n await store.appendFact(runId, {\n kind: \"step.skipped\",\n runId,\n stepId,\n reason,\n at: clock.now(),\n });\n }\n\n for (const stepId of decision.runnable) {\n await queue.enqueue(runId, stepId);\n }\n\n if (decision.runnable.length > 0) {\n // Workers will pick up these messages; advance loop exits and resumes\n // when those steps complete.\n return;\n }\n // Only skips happened; loop to recompute.\n }\n\n // Cycle guard: rather than crash the worker, mark the flow as failed with a\n // structured error so callers can query the terminal state.\n const cycleError: SerializedError = {\n name: \"NagiCycleError\",\n message: `advance exceeded ${MAX_ADVANCE_ITERS} iterations — likely a cycle or infinite skip loop in flow \"${flow.id}\"`,\n };\n const last = (await store.loadRunState(runId)).facts.slice(-1)[0];\n const alreadyTerminal =\n last !== undefined &&\n (last.kind === \"flow.completed\" || last.kind === \"flow.failed\");\n if (!alreadyTerminal) {\n await store.appendFact(runId, {\n kind: \"flow.failed\",\n runId,\n error: cycleError,\n at: clock.now(),\n });\n await deps.hooks?.onFlowError?.({\n runId,\n flowId: flow.id,\n error: cycleError,\n at: clock.now(),\n });\n }\n}\n\n/**\n * Walk every match step in `running` status and promote any whose chosen arm\n * has reached a terminal state.\n *\n * fail-fast — a chosen-arm step terminally failed. Mark the match `failed`\n * with an error that points back to the failing nested step.\n * Sibling running arm steps will still complete on their workers,\n * but the match is already terminal — downstream cascades skip.\n * complete — every chosen-arm step terminated cleanly. Mark the match\n * `completed` with the assembled `{ stepKey: stepOutput }` map.\n *\n * Returns true if any match was promoted (caller should reload + re-loop).\n */\nasync function promoteMatches(args: {\n deps: DispatchDeps;\n flow: Flow;\n runState: RunState;\n}): Promise<boolean> {\n const { deps, flow, runState } = args;\n const { store, clock } = deps;\n let promoted = false;\n\n for (const [matchId, step] of Object.entries(flow.steps)) {\n const def = getDef(step);\n if (def.kind !== \"match\") continue;\n const state = runState.steps[matchId];\n if (state?.status !== \"running\") continue;\n\n const agg = aggregateMatch(matchId, flow, runState);\n if (agg.kind === \"pending\") continue;\n\n const attempt = state.attempts > 0 ? state.attempts : 1;\n\n if (agg.kind === \"fail-fast\") {\n const failedNested = runState.steps[agg.failedStepId];\n const error: SerializedError = failedNested?.error ?? {\n name: \"Error\",\n message: `match \"${matchId}\": chosen-arm step \"${agg.failedStepId}\" failed`,\n };\n const fact: Fact = {\n kind: \"step.failed\",\n runId: runState.runId,\n stepId: matchId,\n attempt,\n error,\n at: clock.now(),\n };\n await store.failStep(runState.runId, matchId, error, fact);\n await deps.hooks?.onStepError?.({\n runId: runState.runId,\n flowId: flow.id,\n stepId: matchId,\n attempt,\n kind: \"match\",\n error,\n at: clock.now(),\n });\n promoted = true;\n continue;\n }\n\n const fact: Fact = {\n kind: \"step.completed\",\n runId: runState.runId,\n stepId: matchId,\n attempt,\n output: agg.output,\n at: clock.now(),\n };\n await store.completeStep(runState.runId, matchId, agg.output, fact);\n await deps.hooks?.onStepComplete?.({\n runId: runState.runId,\n flowId: flow.id,\n stepId: matchId,\n attempt,\n kind: \"match\",\n output: agg.output,\n durationMs: 0,\n at: clock.now(),\n });\n promoted = true;\n }\n\n return promoted;\n}\n\nfunction makeStepCtx(args: {\n runId: RunId;\n stepId: string;\n attempt: number;\n input: unknown;\n store: Store;\n clock: Clock;\n tx: Tx;\n logger?: Logger;\n}): StepCtx<unknown> {\n const { runId, stepId, attempt, input, store, clock, tx } = args;\n const ac = new AbortController();\n\n return {\n input,\n runId,\n stepId,\n attempt,\n signal: ac.signal,\n now: () => clock.now(),\n // `tx` is supplied by `Store.runStep` — for adapters with no real\n // transaction (in-memory) it is `undefined as Tx`, and handlers that\n // touch `ctx.tx` will throw on the first call. Adapters that need\n // typed transactional clients (e.g. `@nagi-js/postgres`) augment\n // `Register.tx` and pass a real Kysely transaction here.\n tx,\n logger: args.logger ?? consoleLogger(),\n once: makeOnce({ runId, stepId, store }),\n idempotencyKey: makeIdempotencyKey(runId, stepId),\n };\n}\n\nfunction consoleLogger(): Logger {\n return {\n debug: (m, a) => console.debug(m, a),\n info: (m, a) => console.info(m, a),\n warn: (m, a) => console.warn(m, a),\n error: (m, a) => console.error(m, a),\n };\n}\n\nexport function computeBackoff(policy: RetryPolicy, attempt: number): Millis {\n const initial = policy.initialDelayMs ?? 1_000;\n const max = policy.maxDelayMs ?? 60_000;\n switch (policy.backoff) {\n case \"exponential\":\n return Math.min(initial * 2 ** Math.max(0, attempt - 1), max);\n case \"linear\":\n return Math.min(initial * Math.max(1, attempt), max);\n case \"fixed\":\n return Math.min(initial, max);\n }\n}\n\nfunction retryAllows(policy: RetryPolicy, err: unknown): boolean {\n if (!policy.retryOn) return true;\n return policy.retryOn(err);\n}\n\nfunction serializeError(err: unknown): SerializedError {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n ...(err.stack !== undefined ? { stack: err.stack } : {}),\n };\n }\n return { name: \"Error\", message: String(err) };\n}\n","import { type DispatchDeps, dispatchMessage } from \"./dispatch\";\nimport type {\n Clock,\n Millis,\n QueueMessage,\n Worker,\n WorkerConfig,\n WorkerRunOnceOpts,\n WorkerRunResult,\n WorkerRunUntilEmptyOpts,\n} from \"./types\";\n\nconst DEFAULT_CONCURRENCY = 4;\nconst DEFAULT_POLL_INTERVAL_MS: Millis = 1_000;\n\nexport interface WorkerDeps extends DispatchDeps {\n readonly clock: Clock;\n}\n\nexport function makeWorker(deps: WorkerDeps, config?: WorkerConfig): Worker {\n return new WorkerImpl(deps, config);\n}\n\nclass WorkerImpl implements Worker {\n private inFlight = 0;\n private readonly concurrency: number;\n private readonly pollIntervalMs: Millis;\n private readonly signal: AbortSignal | undefined;\n\n constructor(\n private readonly deps: WorkerDeps,\n config?: WorkerConfig,\n ) {\n this.concurrency = Math.max(1, config?.concurrency ?? DEFAULT_CONCURRENCY);\n this.pollIntervalMs = config?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n this.signal = config?.signal;\n }\n\n async run(): Promise<void> {\n while (!this.aborted()) {\n const slots = this.concurrency - this.inFlight;\n if (slots <= 0) {\n await this.sleep(50);\n continue;\n }\n\n const messages = await this.dequeue(slots);\n if (messages.length === 0) {\n await this.sleep(this.pollIntervalMs);\n continue;\n }\n\n for (const msg of messages) this.fire(msg);\n }\n await this.drain();\n }\n\n async runOnce(opts?: WorkerRunOnceOpts): Promise<WorkerRunResult> {\n const limit = Math.max(1, opts?.maxSteps ?? this.concurrency);\n let processed = 0;\n\n while (processed < limit && !this.aborted()) {\n const remaining = limit - processed;\n const messages = await this.dequeue(\n Math.min(remaining, this.concurrency),\n );\n if (messages.length === 0) break;\n\n await Promise.all(messages.map((m) => this.dispatchSafely(m)));\n processed += messages.length;\n }\n return { processed };\n }\n\n async runUntilEmpty(\n opts?: WorkerRunUntilEmptyOpts,\n ): Promise<WorkerRunResult> {\n const deadline = opts?.deadline;\n let processed = 0;\n\n while (!this.aborted()) {\n if (deadline !== undefined && Date.now() >= deadline) break;\n const messages = await this.dequeue(this.concurrency);\n if (messages.length === 0) break;\n\n await Promise.all(messages.map((m) => this.dispatchSafely(m)));\n processed += messages.length;\n }\n return { processed };\n }\n\n private async dequeue(count: number): Promise<readonly QueueMessage[]> {\n return this.deps.queue.dequeue({ count: Math.max(1, count) });\n }\n\n private fire(msg: QueueMessage): void {\n this.inFlight++;\n void this.dispatchSafely(msg).finally(() => {\n this.inFlight = Math.max(0, this.inFlight - 1);\n });\n }\n\n private async dispatchSafely(msg: QueueMessage): Promise<void> {\n try {\n await dispatchMessage(this.deps, msg);\n } catch (err) {\n this.deps.logger?.error(\"worker.dispatch threw uncaught\", {\n error: String(err),\n });\n // Nack so the message becomes visible again after the lease expires.\n // (dispatchMessage handles its own ack/nack on the happy path; this is the safety net.)\n try {\n await this.deps.queue.nack(msg.receipt);\n } catch {}\n }\n }\n\n private async drain(): Promise<void> {\n while (this.inFlight > 0) {\n await this.deps.clock.sleep(50);\n }\n }\n\n private aborted(): boolean {\n return this.signal?.aborted === true;\n }\n\n private async sleep(ms: Millis): Promise<void> {\n try {\n await this.deps.clock.sleep(ms, this.signal);\n } catch {\n // sleep rejects on abort; loop condition catches it next iteration.\n }\n }\n}\n","import { advance, type DispatchDeps } from \"./dispatch\";\nimport { getDef } from \"./internal\";\nimport { InMemoryClock } from \"./memory\";\nimport type {\n Clock,\n Fact,\n Flow,\n FlowHooks,\n FlowInput,\n Json,\n Logger,\n Queue,\n ReplayOpts,\n RetryPolicy,\n RunId,\n StandardSchemaV1,\n Store,\n Trigger,\n Worker,\n WorkerConfig,\n} from \"./types\";\nimport { makeWorker } from \"./worker\";\n\nexport interface NagiConfig {\n readonly flows: ReadonlyArray<Flow>;\n readonly store: Store;\n readonly queue: Queue;\n readonly clock?: Clock;\n readonly trigger?: Trigger;\n readonly hooks?: FlowHooks;\n readonly logger?: Logger;\n readonly defaultRetry?: RetryPolicy;\n}\n\nexport interface StartOpts {\n /**\n * Caller-supplied runId for idempotent kickoff. If provided and a run with\n * this ID already exists, `start()` is a no-op and returns the same ID\n * without re-appending `flow.started`, re-dispatching, or re-validating the\n * input. Two concurrent `start()` calls with the same `runId` produce\n * exactly one run (enforced at the Store layer).\n *\n * If omitted, the runtime mints a fresh ID via `crypto.randomUUID()`.\n *\n * Typical usage: a content hash of the input, so callers de-duplicate\n * kickoffs without coordinating.\n */\n readonly runId?: RunId;\n}\n\nexport interface Wf {\n /** Begin a new run. Returns the runId. */\n start<F extends Flow>(\n flow: F,\n input: FlowInput<F>,\n opts?: StartOpts,\n ): Promise<RunId>;\n\n /** Resolve a `b.signal()` step waiting on external input. */\n signal(runId: RunId, stepName: string, payload: unknown): Promise<void>;\n\n /** Construct a worker; call `run` / `runOnce` / `runUntilEmpty` on it. */\n worker(config?: WorkerConfig): Worker;\n\n /**\n * Re-dispatch from the first incomplete step. `mode: \"continue\"` runs side\n * effects (idempotency protects); `mode: \"inspect\"` is a no-op probe.\n */\n replay(runId: RunId, opts?: ReplayOpts): Promise<void>;\n}\n\nexport class NagiValidationError extends Error {\n readonly issues: ReadonlyArray<StandardSchemaV1.Issue>;\n constructor(issues: ReadonlyArray<StandardSchemaV1.Issue>) {\n super(issues.map((i) => i.message).join(\"; \"));\n this.name = \"NagiValidationError\";\n this.issues = issues;\n }\n}\n\nexport class NagiRuntimeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NagiRuntimeError\";\n }\n}\n\nexport function nagi(config: NagiConfig): Wf {\n const clock = config.clock ?? new InMemoryClock();\n const flowsById = new Map<string, Flow>();\n for (const f of config.flows) {\n if (flowsById.has(f.id)) {\n throw new NagiRuntimeError(\n `Duplicate flow id \"${f.id}\" passed to nagi()`,\n );\n }\n flowsById.set(f.id, f);\n }\n\n async function flowFor(runId: RunId): Promise<Flow> {\n const runState = await config.store.loadRunState(runId);\n const flow = flowsById.get(runState.flowId);\n if (!flow) {\n throw new NagiRuntimeError(\n `Run ${runId} references flow \"${runState.flowId}\" which is not registered with nagi().`,\n );\n }\n return flow;\n }\n\n const dispatchDeps: DispatchDeps = {\n flowFor,\n store: config.store,\n queue: config.queue,\n clock,\n ...(config.hooks !== undefined ? { hooks: config.hooks } : {}),\n ...(config.logger !== undefined ? { logger: config.logger } : {}),\n ...(config.defaultRetry !== undefined\n ? { defaultRetry: config.defaultRetry }\n : {}),\n };\n\n return {\n async start<F extends Flow>(\n flow: F,\n input: FlowInput<F>,\n opts?: StartOpts,\n ): Promise<RunId> {\n if (!flowsById.has(flow.id)) {\n throw new NagiRuntimeError(\n `Flow \"${flow.id}\" not registered with nagi(). Pass it to flows[].`,\n );\n }\n\n // Caller-supplied runId. We accept it, validate shape, and rely on the\n // Store's atomic `tryStartRun` for race safety — never check-then-insert\n // at this layer.\n let runId: RunId;\n if (opts?.runId !== undefined) {\n if (typeof opts.runId !== \"string\" || opts.runId.length === 0) {\n throw new NagiValidationError([\n {\n message: \"opts.runId must be a non-empty string\",\n path: [\"runId\"],\n },\n ]);\n }\n runId = opts.runId;\n } else {\n runId = mintRunId();\n }\n\n const validated = (await validate(flow.input, input)) as Json;\n const startedAt = clock.now();\n const fact = {\n kind: \"flow.started\" as const,\n runId,\n flowId: flow.id,\n input: validated,\n at: startedAt,\n };\n\n const { started } = await config.store.tryStartRun(runId, fact);\n if (!started) {\n // Idempotent no-op: a run with this ID already exists. Per the contract\n // we do NOT re-append the fact, do NOT re-dispatch, and do NOT\n // re-validate against the prior input (we don't have it, and even if\n // we did, callers asked for \"use this runId\" semantics — not \"verify\n // the same input\").\n return runId;\n }\n\n await config.hooks?.onFlowStart?.({\n runId,\n flowId: flow.id,\n input: validated,\n at: startedAt,\n });\n\n await advance(dispatchDeps, runId);\n return runId;\n },\n\n async signal(\n runId: RunId,\n stepName: string,\n payload: unknown,\n ): Promise<void> {\n const runState = await config.store.loadRunState(runId);\n const flow = flowsById.get(runState.flowId);\n if (!flow) {\n throw new NagiRuntimeError(\n `Run ${runId} references flow \"${runState.flowId}\" which is not registered with nagi().`,\n );\n }\n const step = flow.steps[stepName];\n if (!step) {\n throw new NagiRuntimeError(\n `Flow \"${flow.id}\" has no step named \"${stepName}\".`,\n );\n }\n const def = getDef(step);\n if (def.kind !== \"signal\") {\n throw new NagiRuntimeError(\n `Step \"${stepName}\" is a ${def.kind}, not a signal.`,\n );\n }\n const stepState = runState.steps[stepName];\n if (stepState?.status !== \"running\") {\n throw new NagiRuntimeError(\n `Step \"${stepName}\" is not waiting for signal (status: ${stepState?.status ?? \"pending\"}).`,\n );\n }\n\n const validated = (await validate(def.schema, payload)) as Json;\n const attempt = stepState.attempts > 0 ? stepState.attempts : 1;\n\n await config.store.appendFact(runId, {\n kind: \"signal.received\",\n runId,\n stepId: stepName,\n payload: validated,\n at: clock.now(),\n });\n\n const completedFact: Fact = {\n kind: \"step.completed\",\n runId,\n stepId: stepName,\n attempt,\n output: validated,\n at: clock.now(),\n };\n await config.store.completeStep(\n runId,\n stepName,\n validated,\n completedFact,\n );\n\n await config.hooks?.onSignalReceived?.({\n runId,\n flowId: flow.id,\n stepId: stepName,\n attempt,\n kind: \"signal\",\n payload: validated,\n at: clock.now(),\n });\n\n await advance(dispatchDeps, runId);\n },\n\n worker(workerConfig?: WorkerConfig): Worker {\n if (config.flows.length === 0) {\n throw new NagiRuntimeError(\n \"nagi(): no flows registered — cannot create a worker.\",\n );\n }\n return makeWorker({ ...dispatchDeps, clock }, workerConfig);\n },\n\n async replay(\n runId: RunId,\n opts: ReplayOpts = { mode: \"continue\" },\n ): Promise<void> {\n const runState = await config.store.loadRunState(runId);\n const flow = flowsById.get(runState.flowId);\n if (!flow) {\n throw new NagiRuntimeError(\n `Run ${runId} references flow \"${runState.flowId}\" which is not registered with nagi().`,\n );\n }\n if (opts.mode === \"inspect\") return;\n await advance(dispatchDeps, runId);\n },\n };\n}\n\nfunction mintRunId(): RunId {\n return `run-${crypto.randomUUID()}` as RunId;\n}\n\nasync function validate<S extends StandardSchemaV1>(\n schema: S,\n value: unknown,\n): Promise<unknown> {\n const result = await schema[\"~standard\"].validate(value);\n if (\"issues\" in result && result.issues !== undefined) {\n throw new NagiValidationError(result.issues);\n }\n return (result as { value: unknown }).value;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@nagi-js/core",
3
+ "version": "0.1.0",
4
+ "description": "Type-safe declarative workflow engine. Edge-compliant. Zero runtime deps.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "keywords": [
9
+ "workflow",
10
+ "durable",
11
+ "llm",
12
+ "typescript",
13
+ "type-safe",
14
+ "declarative",
15
+ "step-functions",
16
+ "orchestration"
17
+ ],
18
+ "engines": {
19
+ "node": ">=22"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public",
23
+ "registry": "https://registry.npmjs.org/",
24
+ "provenance": false
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js",
30
+ "default": "./dist/index.js"
31
+ }
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "README.md",
36
+ "LICENSE"
37
+ ],
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/lymo-inc/nagi.git",
41
+ "directory": "packages/core"
42
+ },
43
+ "homepage": "https://github.com/lymo-inc/nagi#readme",
44
+ "bugs": {
45
+ "url": "https://github.com/lymo-inc/nagi/issues"
46
+ },
47
+ "scripts": {
48
+ "build": "tsup",
49
+ "dev": "tsup --watch",
50
+ "test": "vitest run",
51
+ "test:watch": "vitest",
52
+ "test:types": "vitest run --typecheck",
53
+ "typecheck": "tsc --noEmit"
54
+ }
55
+ }