{"version":3,"file":"instructions-3vdgXtRx.mjs","names":[],"sources":["../src/tagged.ts","../../shared/runtime/index.ts","../src/execution/abort-settlement.ts","../src/execution/instructions.ts"],"sourcesContent":["export interface Tagged<Tag extends string> {\n  readonly _tag: Tag;\n}\n\ntype AbstractCtor = abstract new (...args: readonly never[]) => object;\n\ntype TaggedConstructor<\n  Tag extends string,\n  Base extends AbstractCtor | undefined,\n> = Base extends undefined\n  ? new () => Tagged<Tag>\n  : Base extends AbstractCtor\n    ? new (...args: ConstructorParameters<Base>) => InstanceType<Base> & Tagged<Tag>\n    : never;\n\nexport function Tagged<Tag extends string>(tag: Tag): TaggedConstructor<Tag, undefined>;\nexport function Tagged<Tag extends string, Base extends AbstractCtor>(\n  tag: Tag,\n  Base: Base,\n): TaggedConstructor<Tag, Base>;\nexport function Tagged<Tag extends string, Base extends AbstractCtor>(tag: Tag, Base?: Base) {\n  if (Base !== undefined) {\n    // @ts-expect-error 2545: TS can't reconcile `class extends Base`\n    // with `ConstructorParameters<Base>` and infers `readonly never[]`\n    return class extends Base implements Tagged<Tag> {\n      readonly _tag = tag;\n    };\n  }\n\n  return class implements Tagged<Tag> {\n    readonly _tag = tag;\n  };\n}\n","/** Structural abort signal compatible with platform globals and userland stand-ins. */\nexport interface AbortSignalLike {\n  readonly aborted: boolean;\n  readonly reason: unknown;\n  addEventListener(type: \"abort\", listener: () => void, options?: { once?: boolean }): void;\n  removeEventListener(type: \"abort\", listener: () => void): void;\n}\n\nexport function abortReason(signal: AbortSignalLike): unknown {\n  return signal.reason ?? new Error(\"Aborted\");\n}\n\nexport function sleepWithSignal(ms: number, signal: AbortSignalLike): Promise<void> {\n  if (!Number.isFinite(ms)) {\n    return Promise.reject(new RangeError(\"sleep duration must be a finite number\"));\n  }\n\n  const durationMs = Math.max(0, ms);\n  return new Promise<void>((resolve, reject) => {\n    if (signal.aborted) {\n      reject(signal.reason);\n      return;\n    }\n\n    const onAbort = () => {\n      clearTimeout(timer);\n      reject(signal.reason);\n    };\n    const timer = setTimeout(() => {\n      signal.removeEventListener(\"abort\", onAbort);\n      resolve();\n    }, durationMs);\n\n    signal.addEventListener(\"abort\", onAbort, { once: true });\n  });\n}\n\n/**\n * UNSAFE: casts any value to a given type\n *\n * @warning Use only when the type is known to be correct. Prefer a comment at each call site.\n */\nexport function unsafeCoerce<T>(value: unknown): T {\n  // oxlint-disable-next-line typescript/consistent-type-assertions - only used here\n  return value as T;\n}\n\n/** `never`-typed sentinel for phantom brand slots and unused instruction payloads. */\nexport const NEVER: never =\n  // SAFETY: phantom meta slots need a never value; undefined is the sentinel and must not be read as data.\n  unsafeCoerce<never>(undefined);\n\nexport function isRecordLike(value: unknown): value is Record<PropertyKey, unknown> {\n  return (typeof value === \"object\" || typeof value === \"function\") && value !== null;\n}\n\n/** True when `value` is record-like and `value[key] === expected`. */\nexport function keyIs<K extends PropertyKey, const V>(\n  value: unknown,\n  key: K,\n  expected: V,\n): value is Record<K, V> {\n  return isRecordLike(value) && value[key] === expected;\n}\n\nexport function isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n  if (value instanceof Promise) return true;\n\n  return (\n    (typeof value === \"object\" || typeof value === \"function\") &&\n    value !== null &&\n    \"then\" in value &&\n    typeof value.then === \"function\"\n  );\n}\n\nexport function isAwaited<T>(value: T | PromiseLike<T> | Awaited<T>): value is Awaited<T> {\n  return !isPromiseLike(value);\n}\n\nexport function identity<T>(value: T): T {\n  return value;\n}\n","import { keyIs } from \"@prodkit/shared/runtime\";\n\n/**\n * Driver-level abort mechanics for suspended work and nested plan execution.\n *\n * Contributor call sites declare intent through `Settlement` in `settlement.ts`.\n * Suspend work wrapped with {@link withAbortDrain} maps to\n * {@link AbortSettlement.interruptAndDrainOnAbort} when the enclosing suspend uses\n * {@link AbortSettlement.interruptOnAbort} (see {@link settlementForSuspendedWork}).\n */\n\nexport type AbortSettlement =\n  | { readonly kind: \"passThrough\" }\n  | { readonly kind: \"rejectOnAbort\"; readonly getAbortReason: () => unknown }\n  | { readonly kind: \"interruptOnAbort\"; readonly getAbortReason: () => unknown }\n  | { readonly kind: \"interruptAndDrainOnAbort\"; readonly getAbortReason: () => unknown };\n\nexport const AbortSettlement = {\n  passThrough: { kind: \"passThrough\" } as const satisfies AbortSettlement,\n\n  rejectOnAbort(getAbortReason: () => unknown): AbortSettlement {\n    return { kind: \"rejectOnAbort\", getAbortReason };\n  },\n\n  interruptOnAbort(getAbortReason: () => unknown): AbortSettlement {\n    return { kind: \"interruptOnAbort\", getAbortReason };\n  },\n\n  interruptAndDrainOnAbort(getAbortReason: () => unknown): AbortSettlement {\n    return { kind: \"interruptAndDrainOnAbort\", getAbortReason };\n  },\n};\n\nconst ABORT_DRAINED_WORK = Symbol(\"prodkit.op.abort-drained-work\");\nconst ABORT_OWNED_WORK = Symbol(\"prodkit.op.abort-owned-work\");\n\ntype AbortDrainedWork<T> = {\n  readonly [ABORT_DRAINED_WORK]: true;\n  readonly promise: PromiseLike<T>;\n};\n\ntype AbortOwnedWork<T> = {\n  readonly [ABORT_OWNED_WORK]: true;\n  readonly promise: PromiseLike<T>;\n};\n\n/** Suspend callback return type: plain, drain-on-abort, or abort-owned work. */\nexport type SuspendWork<T> = PromiseLike<T> | AbortDrainedWork<T> | AbortOwnedWork<T>;\n\nexport function withAbortDrain<T>(promise: PromiseLike<T>): AbortDrainedWork<T> {\n  return { [ABORT_DRAINED_WORK]: true, promise };\n}\n\n/** Marks work that handles parent abort and teardown settlement inside its own scenario. */\nexport function withAbortOwnership<T>(promise: PromiseLike<T>): AbortOwnedWork<T> {\n  return { [ABORT_OWNED_WORK]: true, promise };\n}\n\nexport function isAbortDrainedWork<T>(work: SuspendWork<T>): work is AbortDrainedWork<T> {\n  return keyIs(work, ABORT_DRAINED_WORK, true);\n}\n\nexport function isAbortOwnedWork<T>(work: SuspendWork<T>): work is AbortOwnedWork<T> {\n  return keyIs(work, ABORT_OWNED_WORK, true);\n}\n\nexport function settlementForSuspendedWork(\n  driveSettlement: AbortSettlement,\n  suspendWork: SuspendWork<unknown>,\n): {\n  readonly settlement: AbortSettlement;\n  readonly suspended: PromiseLike<unknown>;\n} {\n  if (isAbortOwnedWork(suspendWork)) {\n    return { settlement: AbortSettlement.passThrough, suspended: suspendWork.promise };\n  }\n\n  const shouldDrainOnAbort = isAbortDrainedWork(suspendWork);\n  const settlement =\n    driveSettlement.kind === \"interruptOnAbort\" && shouldDrainOnAbort\n      ? AbortSettlement.interruptAndDrainOnAbort(driveSettlement.getAbortReason)\n      : driveSettlement;\n  const suspended = shouldDrainOnAbort ? suspendWork.promise : suspendWork;\n  return { settlement, suspended };\n}\n\nfunction scheduleInterruptFallback(abortReason: unknown): Promise<never> {\n  return new Promise((_, reject) => {\n    setTimeout(() => reject(abortReason), 0);\n  });\n}\n\n/** Race in-flight work against a macrotimer fallback after the cooperative interrupt window. */\nexport function raceInFlightAfterInterrupt<T>(\n  inFlight: PromiseLike<T>,\n  abortReason: unknown,\n): Promise<T> {\n  return new Promise<T>((resolve, reject) => {\n    queueMicrotask(() => {\n      void Promise.race([inFlight, scheduleInterruptFallback(abortReason)]).then(resolve, reject);\n    });\n  });\n}\n\nexport function awaitWithAbort<T>(\n  suspended: PromiseLike<T>,\n  signal: AbortSignal,\n  settlement: AbortSettlement,\n): PromiseLike<T> {\n  if (settlement.kind === \"passThrough\") return suspended;\n\n  if (signal.aborted) {\n    return Promise.reject(settlement.getAbortReason());\n  }\n\n  return new Promise<T>((resolve, reject) => {\n    let settled = false;\n    const settleResolve = (value: T) => {\n      if (settled) return;\n      settled = true;\n      signal.removeEventListener(\"abort\", onAbort);\n      resolve(value);\n    };\n    const settleReject = (error: unknown) => {\n      if (settled) return;\n      settled = true;\n      signal.removeEventListener(\"abort\", onAbort);\n      reject(error);\n    };\n\n    const onAbort = () => {\n      if (settled) return;\n      if (settlement.kind === \"rejectOnAbort\") {\n        settleReject(settlement.getAbortReason());\n        return;\n      }\n\n      void raceInFlightAfterInterrupt(suspended, settlement.getAbortReason()).then(\n        settleResolve,\n        settleReject,\n      );\n    };\n\n    signal.addEventListener(\"abort\", onAbort, { once: true });\n    Promise.resolve(suspended).then(settleResolve, settleReject);\n  });\n}\n\nexport async function drainInFlightWork(suspended: PromiseLike<unknown>): Promise<void> {\n  try {\n    await suspended;\n  } catch {\n    // ignore: abort rejection or child settlement errors while draining fan-out/provision work\n  }\n}\n","// oxlint-disable typescript/no-explicit-any\nimport { isRecordLike } from \"@prodkit/shared/runtime\";\nimport { Tagged } from \"../tagged.js\";\nimport { Err } from \"../result.js\";\nimport type { SuspendWork } from \"./abort-settlement.js\";\nimport type { ExitContext, RunContext } from \"./runtime.js\";\nimport type { EmptyMeta, MergeUnionMeta } from \"../core/metadata.js\";\n\nexport type { SuspendWork } from \"./abort-settlement.js\";\nexport { isAbortDrainedWork, withAbortDrain } from \"./abort-settlement.js\";\n\nexport const CUSTOM_INSTRUCTION_META = Symbol(\"prodkit.op.custom-instruction-meta\");\n\n/**\n * Extension protocol for custom generator yield instructions.\n *\n * Implementations are detected at runtime via {@link CUSTOM_INSTRUCTION_META}\n * and executed through {@link CustomInstruction.resolve}.\n *\n * Typed failures should be surfaced by yielding {@link Err} values from\n * `[Symbol.iterator]` or from the enclosing generator; throws from `resolve`\n * surface as {@link UnhandledException}.\n */\nexport interface CustomInstruction<T, M = EmptyMeta> {\n  readonly [CUSTOM_INSTRUCTION_META]: M;\n  resolve(context: RunContext<readonly unknown[]>): T | PromiseLike<T>;\n  [Symbol.iterator](): Generator<this, T, unknown>;\n}\n\ntype ExtractInstructionMeta<Y> = Y extends CustomInstruction<any, infer M> ? M : never;\n\ntype NonEmptyInstructionMeta<Y> = Exclude<ExtractInstructionMeta<Y>, EmptyMeta>;\n\nexport type InferInstructionMeta<Y> = [NonEmptyInstructionMeta<Y>] extends [never]\n  ? EmptyMeta\n  : MergeUnionMeta<NonEmptyInstructionMeta<Y>>;\n\ntype DropUnknown<E> = unknown extends E ? never : E;\ntype ExtractResultErr<Y> = Y extends Err<unknown, infer E> ? DropUnknown<E> : never;\n\nexport type InferInstructionErr<Y> = ExtractResultErr<Y>;\n\nexport type SuspendFn = (ctx: RunContext<readonly unknown[]>) => SuspendWork<unknown>;\n\nexport class SuspendInstruction extends Tagged(\"SuspendInstruction\") {\n  readonly suspend: SuspendFn;\n\n  constructor(suspend: SuspendFn) {\n    super();\n    this.suspend = suspend;\n  }\n\n  // SAFETY: SuspendInstruction yield type is call-site specific; one any avoids per-site coercion.\n  // oxlint-disable-next-line typescript/no-explicit-any\n  *[Symbol.iterator](): Generator<Instruction<never, any>, any, unknown> {\n    return yield this;\n  }\n}\n\ntype FinalizeFn = (ctx: ExitContext<unknown, unknown, readonly unknown[]>) => PromiseLike<void>;\n\nexport class RegisterExitFinalizerInstruction extends Tagged(\"RegisterExitFinalizerInstruction\") {\n  readonly finalize: FinalizeFn;\n  readonly args: readonly unknown[] | undefined;\n\n  constructor(finalize: FinalizeFn, args: readonly unknown[] | undefined) {\n    super();\n    this.finalize = finalize;\n    this.args = args;\n  }\n}\n\n/** Internal driver instruction for direct Op-to-Op generator delegation. */\nexport class NestedOpInstruction<T, E, M = EmptyMeta> extends Tagged(\"NestedOpInstruction\") {\n  readonly iterate: () => Generator<RuntimeInstruction<E, M>, T, unknown>;\n  readonly finalizerArgs: readonly unknown[] | undefined;\n\n  constructor(\n    iterate: () => Generator<RuntimeInstruction<E, M>, T, unknown>,\n    finalizerArgs?: readonly unknown[],\n  ) {\n    super();\n    this.iterate = iterate;\n    this.finalizerArgs = finalizerArgs;\n  }\n}\n\nexport type Instruction<E, M = EmptyMeta> =\n  | Err<unknown, E>\n  | SuspendInstruction\n  | RegisterExitFinalizerInstruction\n  | CustomInstruction<unknown, M>;\n\n/** Driver instruction set. Kept separate so NestedOpInstruction is not part of the extension API. */\nexport type RuntimeInstruction<E, M = EmptyMeta> =\n  | Instruction<E, M>\n  | NestedOpInstruction<unknown, E, M>;\n\nexport function isErrInstruction<E>(value: unknown): value is Err<unknown, E> {\n  return (\n    isRecordLike(value) && \"isErr\" in value && typeof value.isErr === \"function\" && value.isErr()\n  );\n}\n"],"mappings":"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"}