{"version":3,"file":"readiness.cjs","names":[],"sources":["../../src/schemas/readiness.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\n\n/** Cordis service name for session-scoped package initialization. */\nexport const DOOM_READINESS_SERVICE = 'doom/readiness';\n\n/** Stable machine-readable failures produced by the readiness contract. */\nexport const DOOM_READINESS_ERROR_CODE = {\n  cancelled: 'DOOM_READINESS_CANCELLED',\n  disposed: 'DOOM_READINESS_DISPOSED',\n  duplicate: 'DOOM_READINESS_DUPLICATE',\n  failed: 'DOOM_READINESS_FAILED',\n  invalidArgument: 'DOOM_READINESS_INVALID_ARGUMENT',\n  unavailable: 'DOOM_READINESS_UNAVAILABLE',\n  waitAborted: 'DOOM_READINESS_WAIT_ABORTED',\n} as const;\n\nexport type DoomReadinessErrorCode = (typeof DOOM_READINESS_ERROR_CODE)[keyof typeof DOOM_READINESS_ERROR_CODE];\nexport type DoomReadinessState = 'pending' | 'ready' | 'degraded' | 'failed' | 'cancelled';\n\nexport interface DoomReadinessErrorDetail {\n  readonly code: DoomReadinessErrorCode;\n  readonly message: string;\n}\n\n/** Immutable public state for the latest generation of one package. */\nexport interface DoomReadinessSnapshot {\n  readonly packageId: string;\n  readonly generation: string;\n  readonly state: DoomReadinessState;\n  readonly diagnostics: readonly string[];\n  readonly error?: DoomReadinessErrorDetail;\n}\n\nexport interface DoomReadinessTaskResult<TValue> {\n  readonly value: TValue;\n  readonly diagnostics?: readonly string[];\n}\n\nexport type DoomReadinessTask<TValue> = (signal: AbortSignal) => Promise<DoomReadinessTaskResult<TValue>>;\n\nexport interface DoomReadinessWaitOptions {\n  readonly signal?: AbortSignal;\n}\n\nexport interface DoomReadinessHandle<TValue> {\n  readonly packageId: string;\n  readonly generation: string;\n  /** Waits for this package only. Degraded initialization still returns its value. */\n  wait(options?: DoomReadinessWaitOptions): Promise<TValue>;\n  /** Reads this handle's generation, even after a newer generation replaces it. */\n  snapshot(): DoomReadinessSnapshot;\n}\n\nexport interface DoomReadinessNotification {\n  readonly packageId: string;\n  readonly generation: string;\n  readonly state: 'degraded' | 'failed';\n  readonly diagnostics: readonly string[];\n  readonly error?: DoomReadinessErrorDetail;\n}\n\nexport interface DoomReadinessCoordinatorOptions {\n  /** Called once when a task becomes degraded or failed. */\n  readonly notify?: (notification: DoomReadinessNotification) => void | Promise<void>;\n}\n\nexport interface DoomReadinessCoordinator {\n  start<TValue>(packageId: string, generation: string, task: DoomReadinessTask<TValue>): DoomReadinessHandle<TValue>;\n  /** Reads the latest generation registered for a package. */\n  read(packageId: string): DoomReadinessSnapshot | undefined;\n  /** Reads the latest generation of every registered package. */\n  snapshots(): readonly DoomReadinessSnapshot[];\n  /** Aborts pending work and waits for every started task to settle. */\n  dispose(): Promise<void>;\n}\n\ninterface ReadinessRecord {\n  readonly token: symbol;\n  readonly packageId: string;\n  readonly generation: string;\n  readonly controller: AbortController;\n  readonly terminal: Promise<void>;\n  readonly resolveTerminal: () => void;\n  operation: Promise<unknown>;\n  state: DoomReadinessState;\n  diagnostics: readonly string[];\n  error?: DoomReadinessError;\n  value?: unknown;\n  hasValue: boolean;\n  notified: boolean;\n}\n\nexport interface DoomReadinessErrorOptions {\n  readonly packageId?: string;\n  readonly generation?: string;\n  readonly cause?: unknown;\n}\n\n/** Error returned to package callers without exposing task-specific rejection shapes. */\nexport class DoomReadinessError extends Error {\n  readonly code: DoomReadinessErrorCode;\n  readonly packageId?: string;\n  readonly generation?: string;\n\n  constructor(code: DoomReadinessErrorCode, message: string, input: DoomReadinessErrorOptions = {}) {\n    super(message, input.cause === undefined ? undefined : { cause: input.cause });\n    this.name = 'DoomReadinessError';\n    this.code = code;\n    this.packageId = input.packageId;\n    this.generation = input.generation;\n  }\n}\n\nfunction createTerminal(): { readonly promise: Promise<void>; readonly resolve: () => void } {\n  let resolve = (): void => undefined;\n  const promise = new Promise<void>((settle) => {\n    resolve = settle;\n  });\n  return { promise, resolve };\n}\n\nfunction frozenDiagnostics(diagnostics: readonly string[] | undefined): readonly string[] {\n  if (diagnostics === undefined) return Object.freeze([]);\n  if (!Array.isArray(diagnostics) || diagnostics.some((diagnostic) => typeof diagnostic !== 'string')) {\n    throw new TypeError('Doom readiness task diagnostics must be an array of strings.');\n  }\n  return Object.freeze([...diagnostics]);\n}\n\nfunction errorDetail(error: DoomReadinessError | undefined): DoomReadinessErrorDetail | undefined {\n  return error === undefined ? undefined : Object.freeze({ code: error.code, message: error.message });\n}\n\nfunction recordSnapshot(record: ReadinessRecord): DoomReadinessSnapshot {\n  return Object.freeze({\n    packageId: record.packageId,\n    generation: record.generation,\n    state: record.state,\n    diagnostics: record.diagnostics,\n    ...(record.error === undefined ? {} : { error: errorDetail(record.error) }),\n  });\n}\n\nfunction rethrowAsync(error: unknown): void {\n  queueMicrotask(() => {\n    throw error instanceof Error ? error : new Error(String(error));\n  });\n}\n\nfunction waitAbortedError(record: ReadinessRecord, signal: AbortSignal): DoomReadinessError {\n  return new DoomReadinessError(\n    DOOM_READINESS_ERROR_CODE.waitAborted,\n    `Waiting for Doom package '${record.packageId}' readiness was aborted.`,\n    { packageId: record.packageId, generation: record.generation, cause: signal.reason },\n  );\n}\n\nfunction waitForTerminal(record: ReadinessRecord, signal: AbortSignal | undefined): Promise<void> {\n  if (signal === undefined) return record.terminal;\n  if (signal.aborted) return Promise.reject(waitAbortedError(record, signal));\n\n  return new Promise<void>((resolve, reject) => {\n    const onAbort = (): void => {\n      reject(waitAbortedError(record, signal));\n    };\n    signal.addEventListener('abort', onAbort, { once: true });\n    void record.terminal.then(() => {\n      signal.removeEventListener('abort', onAbort);\n      resolve();\n    });\n  });\n}\n\n/** Creates the session-scoped coordinator value published through Cordis. */\nexport function createDoomReadinessCoordinator(\n  options: DoomReadinessCoordinatorOptions = {},\n): DoomReadinessCoordinator {\n  const records = new Map<string, ReadinessRecord>();\n  let disposed = false;\n  let disposal: Promise<void> | undefined;\n\n  const current = (record: ReadinessRecord): boolean =>\n    !disposed && records.get(record.packageId)?.token === record.token && record.state === 'pending';\n\n  const notify = (record: ReadinessRecord): void => {\n    if (record.notified || (record.state !== 'degraded' && record.state !== 'failed')) return;\n    record.notified = true;\n    const notification = Object.freeze({\n      packageId: record.packageId,\n      generation: record.generation,\n      state: record.state,\n      diagnostics: record.diagnostics,\n      ...(record.error === undefined ? {} : { error: errorDetail(record.error) }),\n    });\n    if (options.notify) void Promise.resolve(options.notify(notification)).catch(rethrowAsync);\n  };\n\n  const finish = (\n    record: ReadinessRecord,\n    state: Exclude<DoomReadinessState, 'pending'>,\n    input: {\n      readonly value?: unknown;\n      readonly hasValue?: boolean;\n      readonly diagnostics?: readonly string[];\n      readonly error?: DoomReadinessError;\n    } = {},\n  ): void => {\n    if (!current(record)) return;\n    record.state = state;\n    record.value = input.value;\n    record.hasValue = input.hasValue ?? false;\n    record.diagnostics = input.diagnostics ?? Object.freeze([]);\n    record.error = input.error;\n    record.resolveTerminal();\n    notify(record);\n  };\n\n  const handleFor = <TValue>(record: ReadinessRecord): DoomReadinessHandle<TValue> =>\n    Object.freeze({\n      packageId: record.packageId,\n      generation: record.generation,\n      snapshot: () => recordSnapshot(record),\n      wait: async (waitOptions: DoomReadinessWaitOptions = {}): Promise<TValue> => {\n        await waitForTerminal(record, waitOptions.signal);\n        if (record.state === 'ready' || record.state === 'degraded') {\n          if (!record.hasValue) {\n            throw new DoomReadinessError(\n              DOOM_READINESS_ERROR_CODE.failed,\n              `Doom package '${record.packageId}' readiness completed without a value.`,\n              { packageId: record.packageId, generation: record.generation },\n            );\n          }\n          return record.value as TValue;\n        }\n        if (record.error) throw record.error;\n        throw new DoomReadinessError(\n          DOOM_READINESS_ERROR_CODE.failed,\n          `Doom package '${record.packageId}' readiness did not complete.`,\n          { packageId: record.packageId, generation: record.generation },\n        );\n      },\n    });\n\n  return Object.freeze({\n    start<TValue>(packageId: string, generation: string, task: DoomReadinessTask<TValue>): DoomReadinessHandle<TValue> {\n      if (disposed) {\n        throw new DoomReadinessError(\n          DOOM_READINESS_ERROR_CODE.disposed,\n          'The Doom readiness coordinator has been disposed.',\n          { packageId, generation },\n        );\n      }\n      if (typeof packageId !== 'string' || packageId.trim().length === 0) {\n        throw new DoomReadinessError(\n          DOOM_READINESS_ERROR_CODE.invalidArgument,\n          'Doom readiness requires a non-empty package id.',\n          { packageId, generation },\n        );\n      }\n      if (typeof generation !== 'string' || generation.trim().length === 0) {\n        throw new DoomReadinessError(\n          DOOM_READINESS_ERROR_CODE.invalidArgument,\n          'Doom readiness requires a non-empty generation.',\n          { packageId, generation },\n        );\n      }\n      if (typeof task !== 'function') {\n        throw new DoomReadinessError(\n          DOOM_READINESS_ERROR_CODE.invalidArgument,\n          'Doom readiness requires an initialization task.',\n          { packageId, generation },\n        );\n      }\n\n      const previous = records.get(packageId);\n      if (previous?.state === 'pending') {\n        throw new DoomReadinessError(\n          DOOM_READINESS_ERROR_CODE.duplicate,\n          `Doom package '${packageId}' already has live readiness work.`,\n          { packageId, generation },\n        );\n      }\n\n      const terminal = createTerminal();\n      const controller = new AbortController();\n      const record: ReadinessRecord = {\n        token: Symbol(packageId),\n        packageId,\n        generation,\n        controller,\n        terminal: terminal.promise,\n        resolveTerminal: terminal.resolve,\n        operation: Promise.resolve(),\n        state: 'pending',\n        diagnostics: Object.freeze([]),\n        hasValue: false,\n        notified: false,\n      };\n      records.set(packageId, record);\n\n      const operation = Promise.resolve().then(() => {\n        if (controller.signal.aborted) throw controller.signal.reason;\n        return task(controller.signal);\n      });\n      record.operation = operation;\n      void operation\n        .then(\n          (result) => {\n            if (!current(record)) return;\n            if (result === null || typeof result !== 'object' || !Object.hasOwn(result, 'value')) {\n              finish(record, 'failed', {\n                error: new DoomReadinessError(\n                  DOOM_READINESS_ERROR_CODE.failed,\n                  `Doom package '${packageId}' returned an invalid readiness result.`,\n                  { packageId, generation },\n                ),\n              });\n              return;\n            }\n            try {\n              const diagnostics = frozenDiagnostics(result.diagnostics);\n              finish(record, diagnostics.length === 0 ? 'ready' : 'degraded', {\n                value: result.value,\n                hasValue: true,\n                diagnostics,\n              });\n            } catch (error) {\n              finish(record, 'failed', {\n                error: new DoomReadinessError(\n                  DOOM_READINESS_ERROR_CODE.failed,\n                  `Doom package '${packageId}' returned an invalid readiness result.`,\n                  { packageId, generation, cause: error },\n                ),\n              });\n            }\n          },\n          (error: unknown) => {\n            finish(record, 'failed', {\n              error: new DoomReadinessError(\n                DOOM_READINESS_ERROR_CODE.failed,\n                `Doom package '${packageId}' readiness failed: ${error instanceof Error ? error.message : String(error)}`,\n                { packageId, generation, cause: error },\n              ),\n            });\n          },\n        )\n        .catch(rethrowAsync);\n\n      return handleFor<TValue>(record);\n    },\n\n    read(packageId: string): DoomReadinessSnapshot | undefined {\n      const record = records.get(packageId);\n      return record === undefined ? undefined : recordSnapshot(record);\n    },\n\n    snapshots(): readonly DoomReadinessSnapshot[] {\n      return Object.freeze([...records.values()].map(recordSnapshot));\n    },\n\n    dispose(): Promise<void> {\n      if (disposal) return disposal;\n      disposed = true;\n      const operations = [...records.values()].map((record) => {\n        if (record.state === 'pending') {\n          const error = new DoomReadinessError(\n            DOOM_READINESS_ERROR_CODE.cancelled,\n            `Doom package '${record.packageId}' readiness was cancelled.`,\n            { packageId: record.packageId, generation: record.generation },\n          );\n          record.state = 'cancelled';\n          record.error = error;\n          record.resolveTerminal();\n          record.controller.abort(error);\n        }\n        return record.operation;\n      });\n      disposal = Promise.allSettled(operations).then(() => undefined);\n      return disposal;\n    },\n  });\n}\n\n/** Reads the coordinator visible to the current Cordis plugin context. */\nexport function readDoomReadinessCoordinator(ctx: Context): DoomReadinessCoordinator | undefined {\n  return ctx.get(DOOM_READINESS_SERVICE) as DoomReadinessCoordinator | undefined;\n}\n\n/** Reads the coordinator or reports that Config has not published session readiness. */\nexport function requireDoomReadinessCoordinator(ctx: Context): DoomReadinessCoordinator {\n  const coordinator = readDoomReadinessCoordinator(ctx);\n  if (coordinator) return coordinator;\n  throw new DoomReadinessError(\n    DOOM_READINESS_ERROR_CODE.unavailable,\n    'Doom readiness is unavailable. Load the DoomPi Config core.',\n  );\n}\n"],"mappings":"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"}