/** * RuntimeReceiptBus - Internal checkpoint-reactor synchronization receipts. * * This service exists to expose short-lived orchestration milestones that are * useful in tests and harnesses but are not part of the production runtime * event model. `CheckpointReactor` publishes receipts such as baseline capture, * diff finalization, and turn-processing quiescence so integration tests can * wait for those exact points without inferring them indirectly from persisted * state. * * Production code should only call `publish`. Test code may subscribe via * `streamEventsForTest`, which is intentionally named to make the intended * usage explicit. * * @module RuntimeReceiptBus */ import { CheckpointRef, IsoDateTime, NonNegativeInt, ThreadId, TurnId } from "@t3tools/contracts"; import { Schema, ServiceMap } from "effect"; import type { Effect, Stream } from "effect"; export const CheckpointBaselineCapturedReceipt = Schema.Struct({ type: Schema.Literal("checkpoint.baseline.captured"), threadId: ThreadId, checkpointTurnCount: NonNegativeInt, checkpointRef: CheckpointRef, createdAt: IsoDateTime, }); export type CheckpointBaselineCapturedReceipt = typeof CheckpointBaselineCapturedReceipt.Type; export const CheckpointDiffFinalizedReceipt = Schema.Struct({ type: Schema.Literal("checkpoint.diff.finalized"), threadId: ThreadId, turnId: TurnId, checkpointTurnCount: NonNegativeInt, checkpointRef: CheckpointRef, status: Schema.Literals(["ready", "missing", "error"]), createdAt: IsoDateTime, }); export type CheckpointDiffFinalizedReceipt = typeof CheckpointDiffFinalizedReceipt.Type; export const TurnProcessingQuiescedReceipt = Schema.Struct({ type: Schema.Literal("turn.processing.quiesced"), threadId: ThreadId, turnId: TurnId, checkpointTurnCount: NonNegativeInt, createdAt: IsoDateTime, }); export type TurnProcessingQuiescedReceipt = typeof TurnProcessingQuiescedReceipt.Type; export const OrchestrationRuntimeReceipt = Schema.Union([ CheckpointBaselineCapturedReceipt, CheckpointDiffFinalizedReceipt, TurnProcessingQuiescedReceipt, ]); export type OrchestrationRuntimeReceipt = typeof OrchestrationRuntimeReceipt.Type; export interface RuntimeReceiptBusShape { readonly publish: (receipt: OrchestrationRuntimeReceipt) => Effect.Effect; readonly streamEventsForTest: Stream.Stream; } export class RuntimeReceiptBus extends ServiceMap.Service< RuntimeReceiptBus, RuntimeReceiptBusShape >()("t3/orchestration/Services/RuntimeReceiptBus") {}