{"version":3,"file":"workflow.mjs","names":["combined"],"sources":["../../../../../../../ai/src/workflow/workflow.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { WorkflowEventMap } from \"../contracts/events/event-map.type\";\nimport type { ExecutionReport } from \"../contracts/result/execution-report.type\";\nimport type { WorkflowResult } from \"../contracts/result/workflow-result.type\";\nimport type {\n  WorkflowDefinition,\n  WorkflowEventHandler,\n  WorkflowExecuteOptions,\n  WorkflowInstance,\n  WorkflowResumeOptions,\n  WorkflowRunOptions,\n} from \"../contracts/workflow/workflow.contract\";\nimport { WorkflowError } from \"../errors\";\nimport { notifyObservers } from \"../observe/resolve-observers\";\nimport type { ToolContract } from \"../tool/tool\";\nimport { asTool } from \"./as-tool\";\nimport { WorkflowEmitter } from \"./emitter\";\nimport { loadSnapshotForResume, runWorkflow } from \"./engine\";\nimport { computeSignature } from \"./signature\";\n\n/**\n * `ai.workflow(def)` — construct a `WorkflowInstance`. Validates the\n * definition, computes a stable structural signature, and wires up the\n * three-tier event subscription model.\n */\nexport function workflow<\n  TInput = unknown,\n  TOutput = unknown,\n  TState = Record<string, unknown>,\n  TContext = unknown,\n>(\n  definition: WorkflowDefinition<TInput, TOutput, TState, TContext>,\n): WorkflowInstance<TInput, TOutput, TState, TContext> {\n  validate(definition);\n  const signature = computeSignature(definition);\n  const emitter = new WorkflowEmitter(definition.on);\n\n  async function execute(\n    inputOrOptions: TInput | WorkflowExecuteOptions<TInput, TContext>,\n    maybeOptions?: WorkflowRunOptions<TContext>,\n  ): Promise<WorkflowResult<TOutput>> {\n    const { input, options } = normalizeExecuteArgs<TInput, TContext>(\n      inputOrOptions,\n      maybeOptions,\n    );\n    const runId = options?.runId ?? generateRunId();\n    const result = await runWorkflow<TOutput>({\n      definition,\n      signature,\n      emitter,\n      input,\n      context: options?.context,\n      runId,\n      signal: options?.signal,\n      executionHandlers: options?.on,\n      sessionId: options?.sessionId,\n    });\n\n    // Route the finished report to any resolved observers (F1/F3).\n    // Gated by `definition.observe` + the global observe-all flag;\n    // observer errors are swallowed inside `notifyObservers`. Bridge the\n    // pre-existing `WorkflowReport = Omit<BaseReport, \"type\">` drift (the\n    // report carries `type: \"workflow\"` at runtime — engine sets it) so\n    // this call site adds no new type error beyond the documented baseline.\n    await notifyObservers(definition.observe, result.report as unknown as ExecutionReport);\n\n    return result;\n  }\n\n  async function resume(\n    runId: string,\n    options?: WorkflowResumeOptions<TContext>,\n  ): Promise<WorkflowResult<TOutput>> {\n    const snapshot = await loadSnapshotForResume({\n      definition,\n      signature,\n      runId,\n      options,\n    });\n\n    const result = await runWorkflow<TOutput>({\n      definition,\n      signature,\n      emitter,\n      input: snapshot.input,\n      context: options?.context,\n      runId,\n      signal: options?.signal,\n      executionHandlers: options?.on,\n      sessionId: options?.sessionId,\n      resumeFrom: snapshot,\n    });\n\n    await notifyObservers(definition.observe, result.report as unknown as ExecutionReport);\n\n    return result;\n  }\n\n  const instance: WorkflowInstance<TInput, TOutput, TState, TContext> = {\n    name: definition.name,\n    description: definition.description,\n    inputSchema: definition.inputSchema,\n    signature,\n    version: definition.version,\n    execute,\n    resume,\n    on<K extends keyof WorkflowEventMap>(event: K, handler: WorkflowEventHandler<K>) {\n      return emitter.on(event, handler);\n    },\n    off<K extends keyof WorkflowEventMap>(event: K, handler: WorkflowEventHandler<K>) {\n      emitter.off(event, handler);\n    },\n    asTool<TToolInput = TInput>(options: {\n      description?: string;\n      inputSchema: StandardSchemaV1<TToolInput>;\n    }): ToolContract<TToolInput, TOutput> {\n      return asTool<TInput, TOutput, TToolInput>(instance, options);\n    },\n  };\n\n  return instance;\n}\n\n/**\n * Resolve the overloaded `execute()` call shape. If the caller passed\n * a single plain object with an `input` field, treat it as the\n * combined `WorkflowExecuteOptions`. Otherwise the first arg is the\n * raw workflow input and the second is the run options.\n *\n * Ambiguity note: if your real workflow `input` is itself an object\n * with a top-level `input` key, prefer `execute(rawInput, options)`\n * explicitly — the single-arg detection heuristic would mis-classify\n * it.\n */\nfunction normalizeExecuteArgs<TInput, TContext>(\n  inputOrOptions: TInput | WorkflowExecuteOptions<TInput, TContext>,\n  maybeOptions: WorkflowRunOptions<TContext> | undefined,\n): { input: TInput; options?: WorkflowRunOptions<TContext> } {\n  if (\n    maybeOptions === undefined &&\n    inputOrOptions !== null &&\n    typeof inputOrOptions === \"object\" &&\n    \"input\" in (inputOrOptions as object)\n  ) {\n    const combined = inputOrOptions as WorkflowExecuteOptions<TInput, TContext>;\n    const { input, ...options } = combined;\n    return { input, options };\n  }\n\n  return { input: inputOrOptions as TInput, options: maybeOptions };\n}\n\nfunction validate<TInput, TOutput, TState, TContext>(\n  definition: WorkflowDefinition<TInput, TOutput, TState, TContext>,\n): void {\n  if (!definition.name || typeof definition.name !== \"string\") {\n    throw new WorkflowError(\"ai.workflow: `name` is required\");\n  }\n\n  if (!Array.isArray(definition.steps) || definition.steps.length === 0) {\n    throw new WorkflowError(`ai.workflow(\"${definition.name}\"): at least one step is required`);\n  }\n\n  const seen = new Set<string>();\n  const walk = (name: string) => {\n    if (seen.has(name)) {\n      throw new WorkflowError(`ai.workflow(\"${definition.name}\"): duplicate step name \"${name}\"`);\n    }\n    seen.add(name);\n  };\n\n  for (const step of definition.steps) {\n    walk(step.name);\n\n    if (step.parallel) {\n      for (const child of step.parallel) {\n        walk(child.name);\n      }\n    }\n  }\n}\n\nfunction generateRunId(): string {\n  // Non-crypto random — adequate for ephemeral workflow runs.\n  return `wf_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,SAAgB,SAMd,YACqD;CACrD,SAAS,UAAU;CACnB,MAAM,YAAY,iBAAiB,UAAU;CAC7C,MAAM,UAAU,IAAI,gBAAgB,WAAW,EAAE;CAEjD,eAAe,QACb,gBACA,cACkC;EAClC,MAAM,EAAE,OAAO,YAAY,qBACzB,gBACA,YACF;EACA,MAAM,QAAQ,SAAS,SAAS,cAAc;EAC9C,MAAM,SAAS,MAAM,YAAqB;GACxC;GACA;GACA;GACA;GACA,SAAS,SAAS;GAClB;GACA,QAAQ,SAAS;GACjB,mBAAmB,SAAS;GAC5B,WAAW,SAAS;EACtB,CAAC;EAQD,MAAM,gBAAgB,WAAW,SAAS,OAAO,MAAoC;EAErF,OAAO;CACT;CAEA,eAAe,OACb,OACA,SACkC;EAClC,MAAM,WAAW,MAAM,sBAAsB;GAC3C;GACA;GACA;GACA;EACF,CAAC;EAED,MAAM,SAAS,MAAM,YAAqB;GACxC;GACA;GACA;GACA,OAAO,SAAS;GAChB,SAAS,SAAS;GAClB;GACA,QAAQ,SAAS;GACjB,mBAAmB,SAAS;GAC5B,WAAW,SAAS;GACpB,YAAY;EACd,CAAC;EAED,MAAM,gBAAgB,WAAW,SAAS,OAAO,MAAoC;EAErF,OAAO;CACT;CAEA,MAAM,WAAgE;EACpE,MAAM,WAAW;EACjB,aAAa,WAAW;EACxB,aAAa,WAAW;EACxB;EACA,SAAS,WAAW;EACpB;EACA;EACA,GAAqC,OAAU,SAAkC;GAC/E,OAAO,QAAQ,GAAG,OAAO,OAAO;EAClC;EACA,IAAsC,OAAU,SAAkC;GAChF,QAAQ,IAAI,OAAO,OAAO;EAC5B;EACA,OAA4B,SAGU;GACpC,OAAO,OAAoC,UAAU,OAAO;EAC9D;CACF;CAEA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAS,qBACP,gBACA,cAC2D;CAC3D,IACE,iBAAiB,UACjB,mBAAmB,QACnB,OAAO,mBAAmB,YAC1B,WAAY,gBACZ;EAEA,MAAM,EAAE,OAAO,GAAG,YAAYA;EAC9B,OAAO;GAAE;GAAO;EAAQ;CAC1B;CAEA,OAAO;EAAE,OAAO;EAA0B,SAAS;CAAa;AAClE;AAEA,SAAS,SACP,YACM;CACN,IAAI,CAAC,WAAW,QAAQ,OAAO,WAAW,SAAS,UACjD,MAAM,IAAI,cAAc,iCAAiC;CAG3D,IAAI,CAAC,MAAM,QAAQ,WAAW,KAAK,KAAK,WAAW,MAAM,WAAW,GAClE,MAAM,IAAI,cAAc,gBAAgB,WAAW,KAAK,kCAAkC;CAG5F,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,QAAQ,SAAiB;EAC7B,IAAI,KAAK,IAAI,IAAI,GACf,MAAM,IAAI,cAAc,gBAAgB,WAAW,KAAK,2BAA2B,KAAK,EAAE;EAE5F,KAAK,IAAI,IAAI;CACf;CAEA,KAAK,MAAM,QAAQ,WAAW,OAAO;EACnC,KAAK,KAAK,IAAI;EAEd,IAAI,KAAK,UACP,KAAK,MAAM,SAAS,KAAK,UACvB,KAAK,MAAM,IAAI;CAGrB;AACF;AAEA,SAAS,gBAAwB;CAE/B,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE;AAChF"}