Skip to content
Source
Sign inSign up

ProviderContinuationRequests.ts

58 lines2.1 KB

1import {
2 type OrchestrationV2Notification,
3 MessageId,
4 ProviderDriverKind,
5 ProviderThreadId,
6 RunId,
7 ThreadId,
8} from "@t3tools/contracts";
9import * as Context from "effect/Context";
10import * as Effect from "effect/Effect";
11import * as Layer from "effect/Layer";
12import * as Option from "effect/Option";
13import * as Queue from "effect/Queue";
14​
15export interface ProviderContinuationRequest {
16 readonly threadId: ThreadId;
17 readonly providerThreadId: ProviderThreadId;
18 readonly driver: ProviderDriverKind;
19 readonly detail: string | null;
20 readonly notification?: OrchestrationV2Notification;
21 readonly delegatedCompletion?: {
22 readonly parentRunId: RunId;
23 readonly generation: number;
24 readonly messageId: MessageId;
25 };
26 /** adapter_buffered (default) ingests existing CLI output; message_text delivers app-owned wake text. */
27 readonly delivery?: "adapter_buffered" | "message_text";
28 readonly messageId?: MessageId;
29 readonly dispatchIfCurrent?: <A, E, R>(
30 effect: Effect.Effect<A, E, R>,
31 ) => Effect.Effect<Option.Option<A>, E, R>;
32 readonly clearIfCurrent?: () => Effect.Effect<void>;
33 /** Called when the run this request dispatched ends without starting, such as a cancelled queued run. */
34 readonly onRunEndedWithoutStarting?: () => Effect.Effect<void>;
36​
37/** The default drops requests; share the live layer with the worker that drains them. */
38export class ProviderContinuationRequests extends Context.Reference<{
39 readonly offer: (request: ProviderContinuationRequest) => Effect.Effect<void>;
40 readonly take: Effect.Effect<ProviderContinuationRequest>;
41}>("@t3tools/provider-core/server/ProviderContinuationRequests", {
42 defaultValue: () => ({ offer: () => Effect.void, take: Effect.never }),
43}) {}
44​
45export const layer = Layer.effect(
46 ProviderContinuationRequests,
47 Effect.gen(function* () {
48 const queue = yield* Queue.unbounded<ProviderContinuationRequest>();
49 return {
50 offer: Effect.fn("ProviderContinuationRequests.offer")(function (
51 request: ProviderContinuationRequest,
52 ) {
53 return Queue.offer(queue, request).pipe(Effect.asVoid);
54 }),
55 take: Queue.take(queue),
56 };
57 }),
58);