@ably/ai-transport 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -111
- package/dist/ably-ai-transport.js +2401 -1387
- package/dist/ably-ai-transport.js.map +1 -1
- package/dist/ably-ai-transport.umd.cjs +1 -1
- package/dist/ably-ai-transport.umd.cjs.map +1 -1
- package/dist/constants.d.ts +116 -42
- package/dist/core/agent.d.ts +44 -0
- package/dist/core/channel-options.d.ts +57 -0
- package/dist/core/codec/codec-event.d.ts +9 -0
- package/dist/core/codec/decoder.d.ts +24 -24
- package/dist/core/codec/define-codec.d.ts +100 -0
- package/dist/core/codec/encoder.d.ts +10 -12
- package/dist/core/codec/field-bag.d.ts +85 -0
- package/dist/core/codec/fields.d.ts +141 -0
- package/dist/core/codec/index.d.ts +8 -2
- package/dist/core/codec/input-descriptor-decoder.d.ts +19 -0
- package/dist/core/codec/input-descriptor-encoder.d.ts +22 -0
- package/dist/core/codec/input-descriptors.d.ts +281 -0
- package/dist/core/codec/lifecycle-tracker.d.ts +10 -9
- package/dist/core/codec/output-descriptor-decoder.d.ts +29 -0
- package/dist/core/codec/output-descriptor-encoder.d.ts +31 -0
- package/dist/core/codec/output-descriptors.d.ts +237 -0
- package/dist/core/codec/types.d.ts +470 -119
- package/dist/core/codec/well-known-inputs.d.ts +52 -0
- package/dist/core/transport/agent-session.d.ts +10 -0
- package/dist/core/transport/agent-view.d.ts +296 -0
- package/dist/core/transport/client-session.d.ts +13 -0
- package/dist/core/transport/decode-fold.d.ts +55 -0
- package/dist/core/transport/headers.d.ts +121 -14
- package/dist/core/transport/index.d.ts +5 -6
- package/dist/core/transport/internal/bounded-map.d.ts +20 -0
- package/dist/core/transport/invocation.d.ts +74 -0
- package/dist/core/transport/load-history-pages.d.ts +71 -0
- package/dist/core/transport/load-history.d.ts +44 -0
- package/dist/core/transport/pipe-stream.d.ts +9 -9
- package/dist/core/transport/run-manager.d.ts +76 -0
- package/dist/core/transport/session-support.d.ts +55 -0
- package/dist/core/transport/tree.d.ts +523 -109
- package/dist/core/transport/types/agent.d.ts +375 -0
- package/dist/core/transport/types/client.d.ts +201 -0
- package/dist/core/transport/types/shared.d.ts +24 -0
- package/dist/core/transport/types/tree.d.ts +357 -0
- package/dist/core/transport/types/view.d.ts +249 -0
- package/dist/core/transport/types.d.ts +13 -553
- package/dist/core/transport/view.d.ts +390 -84
- package/dist/core/transport/wire-log.d.ts +102 -0
- package/dist/errors.d.ts +27 -10
- package/dist/index.d.ts +8 -9
- package/dist/logger.d.ts +12 -0
- package/dist/react/ably-ai-transport-react.js +1365 -1010
- package/dist/react/ably-ai-transport-react.js.map +1 -1
- package/dist/react/ably-ai-transport-react.umd.cjs +1 -1
- package/dist/react/ably-ai-transport-react.umd.cjs.map +1 -1
- package/dist/react/contexts/client-session-context.d.ts +37 -0
- package/dist/react/contexts/client-session-provider.d.ts +56 -0
- package/dist/react/create-session-hooks.d.ts +116 -0
- package/dist/react/index.d.ts +13 -12
- package/dist/react/internal/skipped-session.d.ts +8 -0
- package/dist/react/internal/use-resolved-session.d.ts +36 -0
- package/dist/react/use-ably-messages.d.ts +17 -14
- package/dist/react/use-client-session.d.ts +81 -0
- package/dist/react/use-create-view.d.ts +14 -13
- package/dist/react/use-tree.d.ts +30 -15
- package/dist/react/use-view.d.ts +81 -50
- package/dist/utils.d.ts +48 -71
- package/dist/vercel/ably-ai-transport-vercel.js +3257 -2499
- package/dist/vercel/ably-ai-transport-vercel.js.map +1 -1
- package/dist/vercel/ably-ai-transport-vercel.umd.cjs +1 -1
- package/dist/vercel/ably-ai-transport-vercel.umd.cjs.map +1 -1
- package/dist/vercel/codec/decode-lifecycle.d.ts +9 -0
- package/dist/vercel/codec/events.d.ts +50 -0
- package/dist/vercel/codec/fields.d.ts +44 -0
- package/dist/vercel/codec/fold-content.d.ts +16 -0
- package/dist/vercel/codec/fold-data.d.ts +16 -0
- package/dist/vercel/codec/fold-input.d.ts +67 -0
- package/dist/vercel/codec/fold-lifecycle.d.ts +16 -0
- package/dist/vercel/codec/fold-text.d.ts +16 -0
- package/dist/vercel/codec/fold-tool-input.d.ts +17 -0
- package/dist/vercel/codec/fold-tool-output.d.ts +16 -0
- package/dist/vercel/codec/index.d.ts +7 -20
- package/dist/vercel/codec/inputs.d.ts +11 -0
- package/dist/vercel/codec/outputs.d.ts +11 -0
- package/dist/vercel/codec/reducer-state.d.ts +121 -0
- package/dist/vercel/codec/reducer.d.ts +62 -0
- package/dist/vercel/codec/tool-transitions.d.ts +2 -8
- package/dist/vercel/codec/wire-data.d.ts +34 -0
- package/dist/vercel/index.d.ts +5 -5
- package/dist/vercel/react/ably-ai-transport-vercel-react.js +2859 -9705
- package/dist/vercel/react/ably-ai-transport-vercel-react.js.map +1 -1
- package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs +1 -45
- package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs.map +1 -1
- package/dist/vercel/react/contexts/chat-transport-context.d.ts +9 -7
- package/dist/vercel/react/contexts/chat-transport-provider.d.ts +53 -41
- package/dist/vercel/react/index.d.ts +1 -2
- package/dist/vercel/react/use-chat-transport.d.ts +30 -26
- package/dist/vercel/react/use-message-sync.d.ts +17 -30
- package/dist/vercel/run-end-reason.d.ts +84 -0
- package/dist/vercel/tool-part.d.ts +21 -0
- package/dist/vercel/transport/chat-transport.d.ts +41 -24
- package/dist/vercel/transport/index.d.ts +24 -20
- package/dist/vercel/transport/run-output-stream.d.ts +54 -0
- package/dist/version.d.ts +2 -0
- package/package.json +31 -24
- package/src/constants.ts +124 -51
- package/src/core/agent.ts +92 -0
- package/src/core/channel-options.ts +89 -0
- package/src/core/codec/codec-event.ts +27 -0
- package/src/core/codec/decoder.ts +202 -105
- package/src/core/codec/define-codec.ts +432 -0
- package/src/core/codec/encoder.ts +114 -107
- package/src/core/codec/field-bag.ts +142 -0
- package/src/core/codec/fields.ts +193 -0
- package/src/core/codec/index.ts +56 -6
- package/src/core/codec/input-descriptor-decoder.ts +97 -0
- package/src/core/codec/input-descriptor-encoder.ts +150 -0
- package/src/core/codec/input-descriptors.ts +373 -0
- package/src/core/codec/lifecycle-tracker.ts +10 -9
- package/src/core/codec/output-descriptor-decoder.ts +139 -0
- package/src/core/codec/output-descriptor-encoder.ts +101 -0
- package/src/core/codec/output-descriptors.ts +307 -0
- package/src/core/codec/types.ts +505 -126
- package/src/core/codec/well-known-inputs.ts +96 -0
- package/src/core/transport/agent-session.ts +1085 -0
- package/src/core/transport/agent-view.ts +738 -0
- package/src/core/transport/client-session.ts +780 -0
- package/src/core/transport/decode-fold.ts +101 -0
- package/src/core/transport/headers.ts +234 -22
- package/src/core/transport/index.ts +27 -27
- package/src/core/transport/internal/bounded-map.ts +27 -0
- package/src/core/transport/invocation.ts +98 -0
- package/src/core/transport/load-history-pages.ts +220 -0
- package/src/core/transport/load-history.ts +271 -0
- package/src/core/transport/pipe-stream.ts +63 -39
- package/src/core/transport/run-manager.ts +243 -0
- package/src/core/transport/session-support.ts +96 -0
- package/src/core/transport/tree.ts +1293 -308
- package/src/core/transport/types/agent.ts +434 -0
- package/src/core/transport/types/client.ts +247 -0
- package/src/core/transport/types/shared.ts +27 -0
- package/src/core/transport/types/tree.ts +393 -0
- package/src/core/transport/types/view.ts +288 -0
- package/src/core/transport/types.ts +13 -706
- package/src/core/transport/view.ts +1229 -450
- package/src/core/transport/wire-log.ts +189 -0
- package/src/errors.ts +29 -9
- package/src/event-emitter.ts +3 -2
- package/src/index.ts +86 -42
- package/src/logger.ts +14 -1
- package/src/react/contexts/client-session-context.ts +41 -0
- package/src/react/contexts/client-session-provider.tsx +222 -0
- package/src/react/create-session-hooks.ts +141 -0
- package/src/react/index.ts +24 -13
- package/src/react/internal/skipped-session.ts +62 -0
- package/src/react/internal/use-resolved-session.ts +63 -0
- package/src/react/use-ably-messages.ts +32 -22
- package/src/react/use-client-session.ts +178 -0
- package/src/react/use-create-view.ts +33 -29
- package/src/react/use-tree.ts +61 -30
- package/src/react/use-view.ts +138 -96
- package/src/utils.ts +83 -131
- package/src/vercel/codec/decode-lifecycle.ts +70 -0
- package/src/vercel/codec/events.ts +85 -0
- package/src/vercel/codec/fields.ts +58 -0
- package/src/vercel/codec/fold-content.ts +54 -0
- package/src/vercel/codec/fold-data.ts +46 -0
- package/src/vercel/codec/fold-input.ts +255 -0
- package/src/vercel/codec/fold-lifecycle.ts +85 -0
- package/src/vercel/codec/fold-text.ts +55 -0
- package/src/vercel/codec/fold-tool-input.ts +86 -0
- package/src/vercel/codec/fold-tool-output.ts +79 -0
- package/src/vercel/codec/index.ts +28 -21
- package/src/vercel/codec/inputs.ts +116 -0
- package/src/vercel/codec/outputs.ts +207 -0
- package/src/vercel/codec/reducer-state.ts +169 -0
- package/src/vercel/codec/reducer.ts +191 -0
- package/src/vercel/codec/tool-transitions.ts +3 -14
- package/src/vercel/codec/wire-data.ts +64 -0
- package/src/vercel/index.ts +7 -19
- package/src/vercel/react/contexts/chat-transport-context.ts +8 -7
- package/src/vercel/react/contexts/chat-transport-provider.tsx +87 -59
- package/src/vercel/react/index.ts +3 -5
- package/src/vercel/react/use-chat-transport.ts +44 -66
- package/src/vercel/react/use-message-sync.ts +75 -39
- package/src/vercel/run-end-reason.ts +157 -0
- package/src/vercel/tool-part.ts +25 -0
- package/src/vercel/transport/chat-transport.ts +380 -98
- package/src/vercel/transport/index.ts +38 -37
- package/src/vercel/transport/run-output-stream.ts +169 -0
- package/src/version.ts +2 -0
- package/dist/core/transport/client-transport.d.ts +0 -10
- package/dist/core/transport/decode-history.d.ts +0 -43
- package/dist/core/transport/server-transport.d.ts +0 -7
- package/dist/core/transport/stream-router.d.ts +0 -29
- package/dist/core/transport/turn-manager.d.ts +0 -37
- package/dist/react/contexts/transport-context.d.ts +0 -31
- package/dist/react/contexts/transport-provider.d.ts +0 -49
- package/dist/react/create-transport-hooks.d.ts +0 -124
- package/dist/react/use-active-turns.d.ts +0 -12
- package/dist/react/use-client-transport.d.ts +0 -80
- package/dist/vercel/codec/accumulator.d.ts +0 -21
- package/dist/vercel/codec/decoder.d.ts +0 -22
- package/dist/vercel/codec/encoder.d.ts +0 -41
- package/dist/vercel/react/use-staged-add-tool-approval-response.d.ts +0 -30
- package/dist/vercel/tool-approvals.d.ts +0 -124
- package/dist/vercel/tool-events.d.ts +0 -26
- package/src/core/transport/client-transport.ts +0 -977
- package/src/core/transport/decode-history.ts +0 -485
- package/src/core/transport/server-transport.ts +0 -612
- package/src/core/transport/stream-router.ts +0 -136
- package/src/core/transport/turn-manager.ts +0 -165
- package/src/react/contexts/transport-context.ts +0 -37
- package/src/react/contexts/transport-provider.tsx +0 -164
- package/src/react/create-transport-hooks.ts +0 -144
- package/src/react/use-active-turns.ts +0 -72
- package/src/react/use-client-transport.ts +0 -197
- package/src/vercel/codec/accumulator.ts +0 -588
- package/src/vercel/codec/decoder.ts +0 -618
- package/src/vercel/codec/encoder.ts +0 -410
- package/src/vercel/react/use-staged-add-tool-approval-response.ts +0 -87
- package/src/vercel/tool-approvals.ts +0 -380
- package/src/vercel/tool-events.ts +0 -53
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { DataCodec, FieldFor, HeaderField } from './fields.js';
|
|
2
|
+
import { MessagePayload, StreamPayload, WriteOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Declarative output descriptors — the single source of truth for a codec's
|
|
5
|
+
* `ai-output` wire mapping, the output-side sibling of {@link import('./input-descriptors.js')}.
|
|
6
|
+
*
|
|
7
|
+
* A codec declares each ordinary output event once, as a descriptor built on the
|
|
8
|
+
* typed header-field bindings ({@link HeaderField}). The generic encode/decode
|
|
9
|
+
* drivers consume the descriptor set, so adding an ordinary event is one
|
|
10
|
+
* descriptor entry instead of three hand-synchronised switch arms (encoder,
|
|
11
|
+
* decoder, stream reconstruction).
|
|
12
|
+
*
|
|
13
|
+
* Authoring is cast-free: the {@link outputBuilder} factory hands the codec an
|
|
14
|
+
* `{ event, stream }` pair curried on the codec's output union, so every `data` /
|
|
15
|
+
* `encode` / `decode` callback receives the exact narrowed member. The descriptors
|
|
16
|
+
* are then erased to a heterogeneous {@link OutputDescriptor} via a single
|
|
17
|
+
* documented cast at each constructor boundary — never in author code.
|
|
18
|
+
*/
|
|
19
|
+
import type * as Ably from 'ably';
|
|
20
|
+
/** The string-valued keys of `C` — the only keys `idField`/`deltaField` may name. */
|
|
21
|
+
export type StringKeyOf<C> = {
|
|
22
|
+
[K in keyof C]-?: C[K] extends string ? K : never;
|
|
23
|
+
}[keyof C];
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the union member a descriptor `type` literal selects. An exact match
|
|
26
|
+
* wins; a wildcard literal (`'data-*'`) resolves to the template member
|
|
27
|
+
* (`data-${string}`), so wildcard descriptors still narrow to the real member.
|
|
28
|
+
*/
|
|
29
|
+
export type ResolveType<U extends {
|
|
30
|
+
type: string;
|
|
31
|
+
}, T extends string> = Extract<U, {
|
|
32
|
+
type: T;
|
|
33
|
+
}> extends never ? T extends `${infer P}-*` ? Extract<U, {
|
|
34
|
+
type: `${P}-${string}`;
|
|
35
|
+
}> : never : Extract<U, {
|
|
36
|
+
type: T;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* The narrowed view of the encoder core that escape-hatch `encode` functions
|
|
40
|
+
* receive — only the publish/stream operations a hatch legitimately needs. The
|
|
41
|
+
* full internal `EncoderCore` satisfies this structurally.
|
|
42
|
+
*/
|
|
43
|
+
export interface EscapeHatchCore {
|
|
44
|
+
/** Publish a single discrete message. */
|
|
45
|
+
publishDiscrete(payload: MessagePayload, opts?: WriteOptions): Promise<Ably.PublishResult>;
|
|
46
|
+
/** Start a streamed message. */
|
|
47
|
+
startStream(streamId: string, payload: StreamPayload, opts?: WriteOptions): Promise<void>;
|
|
48
|
+
/** Append a fragment to an in-flight stream (fire-and-forget). */
|
|
49
|
+
appendStream(streamId: string, data: string): void;
|
|
50
|
+
/** Close a streamed message. */
|
|
51
|
+
closeStream(streamId: string, payload: StreamPayload): Promise<void>;
|
|
52
|
+
/** Cancel all in-progress streams. */
|
|
53
|
+
cancelAllStreams(opts?: WriteOptions): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Builds a codec headers record from a chunk through the descriptor's declared
|
|
57
|
+
* fields, stamping the dispatch `type` plus each field read off `chunk`. An
|
|
58
|
+
* optional `keys` subset restricts which declared fields are written; the keys
|
|
59
|
+
* are checked against the chunk so the imperative path can't drift.
|
|
60
|
+
* @template C - The narrowed chunk member.
|
|
61
|
+
*/
|
|
62
|
+
export type HeaderBuilder<C> = <K extends keyof C & string>(chunk: C, keys?: readonly K[]) => Record<string, string>;
|
|
63
|
+
/**
|
|
64
|
+
* Context passed to an escape-hatch `encode` function.
|
|
65
|
+
* @template C - The narrowed chunk member.
|
|
66
|
+
*/
|
|
67
|
+
export interface OutputEncodeHatchContext<C> {
|
|
68
|
+
/** Header builder bound to the descriptor's declared fields. */
|
|
69
|
+
h: HeaderBuilder<C>;
|
|
70
|
+
/** The wire message name for this direction (`ai-output` / `ai-input`). */
|
|
71
|
+
name: string;
|
|
72
|
+
/** The encoder's configured fallback message id, if any. */
|
|
73
|
+
messageId: string | undefined;
|
|
74
|
+
/** Per-write overrides to thread into the hatch's publish/cancel calls. */
|
|
75
|
+
opts: WriteOptions | undefined;
|
|
76
|
+
}
|
|
77
|
+
/** Context passed to a discrete escape-hatch `decode` function. */
|
|
78
|
+
export interface OutputDecodeContext {
|
|
79
|
+
/** The codec `kind` header value the message dispatched on (mirrors the input context's `codecKind`). */
|
|
80
|
+
codecKind: string;
|
|
81
|
+
/** The inbound codec-tier headers. */
|
|
82
|
+
codecHeaders: Record<string, string>;
|
|
83
|
+
/** The inbound transport-tier headers. */
|
|
84
|
+
transportHeaders: Record<string, string>;
|
|
85
|
+
/** The inbound message data. */
|
|
86
|
+
data: unknown;
|
|
87
|
+
}
|
|
88
|
+
/** Context passed to a stream descriptor's `decodeEnd` escape hatch. */
|
|
89
|
+
export interface OutputStreamEndContext {
|
|
90
|
+
/** The stream identifier (e.g. chunk id, toolCallId). */
|
|
91
|
+
streamId: string;
|
|
92
|
+
/** The full accumulated stream text. */
|
|
93
|
+
accumulated: string;
|
|
94
|
+
/** The stream's persistent (start) codec headers. */
|
|
95
|
+
codecHeaders: Record<string, string>;
|
|
96
|
+
/** The codec headers carried on close (may differ from the start headers). */
|
|
97
|
+
closingCodecHeaders: Record<string, string>;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* A discrete (non-streaming) output event descriptor spec, narrowed to chunk member `C`.
|
|
101
|
+
* @template C - The narrowed chunk member.
|
|
102
|
+
*/
|
|
103
|
+
export interface OutputEventSpec<C> {
|
|
104
|
+
/**
|
|
105
|
+
* Declared header fields, written on encode and read on decode. Each field's
|
|
106
|
+
* key names both the wire header and the chunk property it carries (see
|
|
107
|
+
* {@link FieldFor}). Omit for a header-less event.
|
|
108
|
+
*/
|
|
109
|
+
fields?: readonly FieldFor<C>[];
|
|
110
|
+
/** Wire `data` codec. Omit when the event carries no data (`data: ''`). */
|
|
111
|
+
data?: DataCodec<C>;
|
|
112
|
+
/** Whether the publish is ephemeral (not persisted). Default false. */
|
|
113
|
+
ephemeral?: (chunk: C) => boolean;
|
|
114
|
+
/** Escape-hatch encode — overrides the default discrete publish. */
|
|
115
|
+
encode?: (chunk: C, core: EscapeHatchCore, ctx: OutputEncodeHatchContext<C>) => Promise<void>;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* A streamed-family descriptor spec. `start`/`delta`/`end` are the domain chunk
|
|
119
|
+
* `type` literals; the family id (the {@link OutputBuilder.stream} first argument)
|
|
120
|
+
* is the wire `kind` header all three phases stamp.
|
|
121
|
+
* @template U - The codec's event union.
|
|
122
|
+
* @template S - The start chunk `type` literal.
|
|
123
|
+
* @template D - The delta chunk `type` literal.
|
|
124
|
+
* @template E - The end chunk `type` literal.
|
|
125
|
+
*/
|
|
126
|
+
export interface OutputStreamSpec<U extends {
|
|
127
|
+
type: string;
|
|
128
|
+
}, S extends U['type'], D extends U['type'], E extends U['type']> {
|
|
129
|
+
/** The start chunk `type` literal. */
|
|
130
|
+
start: S;
|
|
131
|
+
/** The delta chunk `type` literal. */
|
|
132
|
+
delta: D;
|
|
133
|
+
/** The end chunk `type` literal. */
|
|
134
|
+
end: E;
|
|
135
|
+
/** The string-valued chunk key carrying the stream id (e.g. `id`, `toolCallId`). */
|
|
136
|
+
idField: StringKeyOf<ResolveType<U, S>> & StringKeyOf<ResolveType<U, D>> & StringKeyOf<ResolveType<U, E>>;
|
|
137
|
+
/** The string-valued delta chunk key carrying the appended fragment. */
|
|
138
|
+
deltaField: StringKeyOf<ResolveType<U, D>>;
|
|
139
|
+
/**
|
|
140
|
+
* Declared header fields written/read on the start and end chunks. Each
|
|
141
|
+
* field's key names both the wire header and the chunk property (see
|
|
142
|
+
* {@link FieldFor}); a field may bind a property carried by either phase.
|
|
143
|
+
*/
|
|
144
|
+
fields: readonly (FieldFor<ResolveType<U, S>> | FieldFor<ResolveType<U, E>>)[];
|
|
145
|
+
/** Escape-hatch override for the stream-close step only (e.g. close-or-discrete fallback). */
|
|
146
|
+
onEnd?: (chunk: ResolveType<U, E>, core: EscapeHatchCore, ctx: OutputEncodeHatchContext<ResolveType<U, E>>) => Promise<void>;
|
|
147
|
+
/** Escape-hatch override for the end-chunk rebuild (e.g. input from accumulated text). */
|
|
148
|
+
decodeEnd?: (ctx: OutputStreamEndContext) => ResolveType<U, E>[];
|
|
149
|
+
/**
|
|
150
|
+
* Escape-hatch decode for when the family arrives as a discrete (non-streamed)
|
|
151
|
+
* message — the wire `kind` equals the family id but the wire wasn't streamed
|
|
152
|
+
* (e.g. history compaction). Reconstructs the start/end chunk pair.
|
|
153
|
+
*/
|
|
154
|
+
decodeDiscrete?: (ctx: OutputDecodeContext) => ResolveType<U, S | E>[];
|
|
155
|
+
}
|
|
156
|
+
/** A discrete output event descriptor erased to the codec's union `U`. */
|
|
157
|
+
export interface OutputEventDescriptor<U> {
|
|
158
|
+
/** Discriminator — the construct this descriptor was built with. */
|
|
159
|
+
construct: 'event';
|
|
160
|
+
/** The dispatch `type` literal (or wildcard sentinel), stamped as the wire `kind` header. */
|
|
161
|
+
type: string;
|
|
162
|
+
/** Declared header fields. */
|
|
163
|
+
fields: readonly HeaderField<unknown>[];
|
|
164
|
+
/** Wire `data` codec, if any. */
|
|
165
|
+
data?: DataCodec<U>;
|
|
166
|
+
/** Ephemeral predicate, if any. */
|
|
167
|
+
ephemeral?: (chunk: U) => boolean;
|
|
168
|
+
/** Wildcard dispatch predicate (both directions), derived by the builder from a `-*` type literal. */
|
|
169
|
+
match?: (type: string) => boolean;
|
|
170
|
+
/** Escape-hatch encode, if any. */
|
|
171
|
+
encode?: (chunk: U, core: EscapeHatchCore, ctx: OutputEncodeHatchContext<U>) => Promise<void>;
|
|
172
|
+
}
|
|
173
|
+
/** A streamed-family descriptor erased to the codec's union `U`. */
|
|
174
|
+
export interface OutputStreamDescriptor<U> {
|
|
175
|
+
/** Discriminator — the construct this descriptor was built with. */
|
|
176
|
+
construct: 'stream';
|
|
177
|
+
/** The stream family id, stamped as the wire `kind` header on every phase. */
|
|
178
|
+
kind: string;
|
|
179
|
+
/** The start chunk `type`. */
|
|
180
|
+
start: string;
|
|
181
|
+
/** The delta chunk `type`. */
|
|
182
|
+
delta: string;
|
|
183
|
+
/** The end chunk `type`. */
|
|
184
|
+
end: string;
|
|
185
|
+
/** The chunk key carrying the stream id. */
|
|
186
|
+
idField: string;
|
|
187
|
+
/** The delta chunk key carrying the appended fragment. */
|
|
188
|
+
deltaField: string;
|
|
189
|
+
/** Declared header fields. */
|
|
190
|
+
fields: readonly HeaderField<unknown>[];
|
|
191
|
+
/** Escape-hatch close override, if any. */
|
|
192
|
+
onEnd?: (chunk: U, core: EscapeHatchCore, ctx: OutputEncodeHatchContext<U>) => Promise<void>;
|
|
193
|
+
/** Escape-hatch end-rebuild override, if any. */
|
|
194
|
+
decodeEnd?: (ctx: OutputStreamEndContext) => U[];
|
|
195
|
+
/** Escape-hatch non-streamed decode, if any. */
|
|
196
|
+
decodeDiscrete?: (ctx: OutputDecodeContext) => U[];
|
|
197
|
+
}
|
|
198
|
+
/** An erased output descriptor — a discrete event or a streamed family. */
|
|
199
|
+
export type OutputDescriptor<U> = OutputEventDescriptor<U> | OutputStreamDescriptor<U>;
|
|
200
|
+
/**
|
|
201
|
+
* The direction-scoped output builder `defineCodec` injects into the `output`
|
|
202
|
+
* config function — `event` (single discrete) and `stream` (streamed family),
|
|
203
|
+
* both curried on the codec's output union so author entries narrow cast-free.
|
|
204
|
+
* @template U - The codec's output union.
|
|
205
|
+
*/
|
|
206
|
+
export interface OutputBuilder<U extends {
|
|
207
|
+
type: string;
|
|
208
|
+
}> {
|
|
209
|
+
/**
|
|
210
|
+
* Declare a single discrete output event. Curried on the output union; narrows
|
|
211
|
+
* `spec` to the member the `type` literal selects. The `type` literal is stamped
|
|
212
|
+
* as the wire `kind` dispatch header.
|
|
213
|
+
* @param type - The event's `type` literal (or a `*-*` wildcard); stamped as the wire `kind` header.
|
|
214
|
+
* @param spec - The narrowed output event spec. Omit for a header-less event with no data.
|
|
215
|
+
* @returns An erased {@link OutputDescriptor}.
|
|
216
|
+
*/
|
|
217
|
+
event: <T extends U['type'] | `${string}-*`>(type: T, spec?: OutputEventSpec<ResolveType<U, T>>) => OutputDescriptor<U>;
|
|
218
|
+
/**
|
|
219
|
+
* Declare a streamed output family (start / delta / end). `start`/`delta`/`end`
|
|
220
|
+
* are domain chunk `type` literals; the first argument is the family id, stamped
|
|
221
|
+
* as the wire `kind` dispatch header on every phase.
|
|
222
|
+
* @param kind - The stream family id, stamped as the wire `kind` header on every phase.
|
|
223
|
+
* @param spec - The narrowed stream spec.
|
|
224
|
+
* @returns An erased {@link OutputDescriptor}.
|
|
225
|
+
*/
|
|
226
|
+
stream: <S extends U['type'], D extends U['type'], E extends U['type']>(kind: string, spec: OutputStreamSpec<U, S, D, E>) => OutputDescriptor<U>;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Build the curried `{ event, stream }` output builder for a codec's output union.
|
|
230
|
+
* `defineCodec` calls this once and hands the result to the `output` config
|
|
231
|
+
* function; mirrors the input side's {@link import('./input-descriptors.js').inputBuilder}.
|
|
232
|
+
* @template U - The codec's output union.
|
|
233
|
+
* @returns The direction-scoped {@link OutputBuilder}.
|
|
234
|
+
*/
|
|
235
|
+
export declare const outputBuilder: <U extends {
|
|
236
|
+
type: string;
|
|
237
|
+
}>() => OutputBuilder<U>;
|