@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.
Files changed (221) hide show
  1. package/README.md +93 -111
  2. package/dist/ably-ai-transport.js +2401 -1387
  3. package/dist/ably-ai-transport.js.map +1 -1
  4. package/dist/ably-ai-transport.umd.cjs +1 -1
  5. package/dist/ably-ai-transport.umd.cjs.map +1 -1
  6. package/dist/constants.d.ts +116 -42
  7. package/dist/core/agent.d.ts +44 -0
  8. package/dist/core/channel-options.d.ts +57 -0
  9. package/dist/core/codec/codec-event.d.ts +9 -0
  10. package/dist/core/codec/decoder.d.ts +24 -24
  11. package/dist/core/codec/define-codec.d.ts +100 -0
  12. package/dist/core/codec/encoder.d.ts +10 -12
  13. package/dist/core/codec/field-bag.d.ts +85 -0
  14. package/dist/core/codec/fields.d.ts +141 -0
  15. package/dist/core/codec/index.d.ts +8 -2
  16. package/dist/core/codec/input-descriptor-decoder.d.ts +19 -0
  17. package/dist/core/codec/input-descriptor-encoder.d.ts +22 -0
  18. package/dist/core/codec/input-descriptors.d.ts +281 -0
  19. package/dist/core/codec/lifecycle-tracker.d.ts +10 -9
  20. package/dist/core/codec/output-descriptor-decoder.d.ts +29 -0
  21. package/dist/core/codec/output-descriptor-encoder.d.ts +31 -0
  22. package/dist/core/codec/output-descriptors.d.ts +237 -0
  23. package/dist/core/codec/types.d.ts +470 -119
  24. package/dist/core/codec/well-known-inputs.d.ts +52 -0
  25. package/dist/core/transport/agent-session.d.ts +10 -0
  26. package/dist/core/transport/agent-view.d.ts +296 -0
  27. package/dist/core/transport/client-session.d.ts +13 -0
  28. package/dist/core/transport/decode-fold.d.ts +55 -0
  29. package/dist/core/transport/headers.d.ts +121 -14
  30. package/dist/core/transport/index.d.ts +5 -6
  31. package/dist/core/transport/internal/bounded-map.d.ts +20 -0
  32. package/dist/core/transport/invocation.d.ts +74 -0
  33. package/dist/core/transport/load-history-pages.d.ts +71 -0
  34. package/dist/core/transport/load-history.d.ts +44 -0
  35. package/dist/core/transport/pipe-stream.d.ts +9 -9
  36. package/dist/core/transport/run-manager.d.ts +76 -0
  37. package/dist/core/transport/session-support.d.ts +55 -0
  38. package/dist/core/transport/tree.d.ts +523 -109
  39. package/dist/core/transport/types/agent.d.ts +375 -0
  40. package/dist/core/transport/types/client.d.ts +201 -0
  41. package/dist/core/transport/types/shared.d.ts +24 -0
  42. package/dist/core/transport/types/tree.d.ts +357 -0
  43. package/dist/core/transport/types/view.d.ts +249 -0
  44. package/dist/core/transport/types.d.ts +13 -553
  45. package/dist/core/transport/view.d.ts +390 -84
  46. package/dist/core/transport/wire-log.d.ts +102 -0
  47. package/dist/errors.d.ts +27 -10
  48. package/dist/index.d.ts +8 -9
  49. package/dist/logger.d.ts +12 -0
  50. package/dist/react/ably-ai-transport-react.js +1365 -1010
  51. package/dist/react/ably-ai-transport-react.js.map +1 -1
  52. package/dist/react/ably-ai-transport-react.umd.cjs +1 -1
  53. package/dist/react/ably-ai-transport-react.umd.cjs.map +1 -1
  54. package/dist/react/contexts/client-session-context.d.ts +37 -0
  55. package/dist/react/contexts/client-session-provider.d.ts +56 -0
  56. package/dist/react/create-session-hooks.d.ts +116 -0
  57. package/dist/react/index.d.ts +13 -12
  58. package/dist/react/internal/skipped-session.d.ts +8 -0
  59. package/dist/react/internal/use-resolved-session.d.ts +36 -0
  60. package/dist/react/use-ably-messages.d.ts +17 -14
  61. package/dist/react/use-client-session.d.ts +81 -0
  62. package/dist/react/use-create-view.d.ts +14 -13
  63. package/dist/react/use-tree.d.ts +30 -15
  64. package/dist/react/use-view.d.ts +81 -50
  65. package/dist/utils.d.ts +48 -71
  66. package/dist/vercel/ably-ai-transport-vercel.js +3257 -2499
  67. package/dist/vercel/ably-ai-transport-vercel.js.map +1 -1
  68. package/dist/vercel/ably-ai-transport-vercel.umd.cjs +1 -1
  69. package/dist/vercel/ably-ai-transport-vercel.umd.cjs.map +1 -1
  70. package/dist/vercel/codec/decode-lifecycle.d.ts +9 -0
  71. package/dist/vercel/codec/events.d.ts +50 -0
  72. package/dist/vercel/codec/fields.d.ts +44 -0
  73. package/dist/vercel/codec/fold-content.d.ts +16 -0
  74. package/dist/vercel/codec/fold-data.d.ts +16 -0
  75. package/dist/vercel/codec/fold-input.d.ts +67 -0
  76. package/dist/vercel/codec/fold-lifecycle.d.ts +16 -0
  77. package/dist/vercel/codec/fold-text.d.ts +16 -0
  78. package/dist/vercel/codec/fold-tool-input.d.ts +17 -0
  79. package/dist/vercel/codec/fold-tool-output.d.ts +16 -0
  80. package/dist/vercel/codec/index.d.ts +7 -20
  81. package/dist/vercel/codec/inputs.d.ts +11 -0
  82. package/dist/vercel/codec/outputs.d.ts +11 -0
  83. package/dist/vercel/codec/reducer-state.d.ts +121 -0
  84. package/dist/vercel/codec/reducer.d.ts +62 -0
  85. package/dist/vercel/codec/tool-transitions.d.ts +2 -8
  86. package/dist/vercel/codec/wire-data.d.ts +34 -0
  87. package/dist/vercel/index.d.ts +5 -5
  88. package/dist/vercel/react/ably-ai-transport-vercel-react.js +2859 -9705
  89. package/dist/vercel/react/ably-ai-transport-vercel-react.js.map +1 -1
  90. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs +1 -45
  91. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs.map +1 -1
  92. package/dist/vercel/react/contexts/chat-transport-context.d.ts +9 -7
  93. package/dist/vercel/react/contexts/chat-transport-provider.d.ts +53 -41
  94. package/dist/vercel/react/index.d.ts +1 -2
  95. package/dist/vercel/react/use-chat-transport.d.ts +30 -26
  96. package/dist/vercel/react/use-message-sync.d.ts +17 -30
  97. package/dist/vercel/run-end-reason.d.ts +84 -0
  98. package/dist/vercel/tool-part.d.ts +21 -0
  99. package/dist/vercel/transport/chat-transport.d.ts +41 -24
  100. package/dist/vercel/transport/index.d.ts +24 -20
  101. package/dist/vercel/transport/run-output-stream.d.ts +54 -0
  102. package/dist/version.d.ts +2 -0
  103. package/package.json +31 -24
  104. package/src/constants.ts +124 -51
  105. package/src/core/agent.ts +92 -0
  106. package/src/core/channel-options.ts +89 -0
  107. package/src/core/codec/codec-event.ts +27 -0
  108. package/src/core/codec/decoder.ts +202 -105
  109. package/src/core/codec/define-codec.ts +432 -0
  110. package/src/core/codec/encoder.ts +114 -107
  111. package/src/core/codec/field-bag.ts +142 -0
  112. package/src/core/codec/fields.ts +193 -0
  113. package/src/core/codec/index.ts +56 -6
  114. package/src/core/codec/input-descriptor-decoder.ts +97 -0
  115. package/src/core/codec/input-descriptor-encoder.ts +150 -0
  116. package/src/core/codec/input-descriptors.ts +373 -0
  117. package/src/core/codec/lifecycle-tracker.ts +10 -9
  118. package/src/core/codec/output-descriptor-decoder.ts +139 -0
  119. package/src/core/codec/output-descriptor-encoder.ts +101 -0
  120. package/src/core/codec/output-descriptors.ts +307 -0
  121. package/src/core/codec/types.ts +505 -126
  122. package/src/core/codec/well-known-inputs.ts +96 -0
  123. package/src/core/transport/agent-session.ts +1085 -0
  124. package/src/core/transport/agent-view.ts +738 -0
  125. package/src/core/transport/client-session.ts +780 -0
  126. package/src/core/transport/decode-fold.ts +101 -0
  127. package/src/core/transport/headers.ts +234 -22
  128. package/src/core/transport/index.ts +27 -27
  129. package/src/core/transport/internal/bounded-map.ts +27 -0
  130. package/src/core/transport/invocation.ts +98 -0
  131. package/src/core/transport/load-history-pages.ts +220 -0
  132. package/src/core/transport/load-history.ts +271 -0
  133. package/src/core/transport/pipe-stream.ts +63 -39
  134. package/src/core/transport/run-manager.ts +243 -0
  135. package/src/core/transport/session-support.ts +96 -0
  136. package/src/core/transport/tree.ts +1293 -308
  137. package/src/core/transport/types/agent.ts +434 -0
  138. package/src/core/transport/types/client.ts +247 -0
  139. package/src/core/transport/types/shared.ts +27 -0
  140. package/src/core/transport/types/tree.ts +393 -0
  141. package/src/core/transport/types/view.ts +288 -0
  142. package/src/core/transport/types.ts +13 -706
  143. package/src/core/transport/view.ts +1229 -450
  144. package/src/core/transport/wire-log.ts +189 -0
  145. package/src/errors.ts +29 -9
  146. package/src/event-emitter.ts +3 -2
  147. package/src/index.ts +86 -42
  148. package/src/logger.ts +14 -1
  149. package/src/react/contexts/client-session-context.ts +41 -0
  150. package/src/react/contexts/client-session-provider.tsx +222 -0
  151. package/src/react/create-session-hooks.ts +141 -0
  152. package/src/react/index.ts +24 -13
  153. package/src/react/internal/skipped-session.ts +62 -0
  154. package/src/react/internal/use-resolved-session.ts +63 -0
  155. package/src/react/use-ably-messages.ts +32 -22
  156. package/src/react/use-client-session.ts +178 -0
  157. package/src/react/use-create-view.ts +33 -29
  158. package/src/react/use-tree.ts +61 -30
  159. package/src/react/use-view.ts +138 -96
  160. package/src/utils.ts +83 -131
  161. package/src/vercel/codec/decode-lifecycle.ts +70 -0
  162. package/src/vercel/codec/events.ts +85 -0
  163. package/src/vercel/codec/fields.ts +58 -0
  164. package/src/vercel/codec/fold-content.ts +54 -0
  165. package/src/vercel/codec/fold-data.ts +46 -0
  166. package/src/vercel/codec/fold-input.ts +255 -0
  167. package/src/vercel/codec/fold-lifecycle.ts +85 -0
  168. package/src/vercel/codec/fold-text.ts +55 -0
  169. package/src/vercel/codec/fold-tool-input.ts +86 -0
  170. package/src/vercel/codec/fold-tool-output.ts +79 -0
  171. package/src/vercel/codec/index.ts +28 -21
  172. package/src/vercel/codec/inputs.ts +116 -0
  173. package/src/vercel/codec/outputs.ts +207 -0
  174. package/src/vercel/codec/reducer-state.ts +169 -0
  175. package/src/vercel/codec/reducer.ts +191 -0
  176. package/src/vercel/codec/tool-transitions.ts +3 -14
  177. package/src/vercel/codec/wire-data.ts +64 -0
  178. package/src/vercel/index.ts +7 -19
  179. package/src/vercel/react/contexts/chat-transport-context.ts +8 -7
  180. package/src/vercel/react/contexts/chat-transport-provider.tsx +87 -59
  181. package/src/vercel/react/index.ts +3 -5
  182. package/src/vercel/react/use-chat-transport.ts +44 -66
  183. package/src/vercel/react/use-message-sync.ts +75 -39
  184. package/src/vercel/run-end-reason.ts +157 -0
  185. package/src/vercel/tool-part.ts +25 -0
  186. package/src/vercel/transport/chat-transport.ts +380 -98
  187. package/src/vercel/transport/index.ts +38 -37
  188. package/src/vercel/transport/run-output-stream.ts +169 -0
  189. package/src/version.ts +2 -0
  190. package/dist/core/transport/client-transport.d.ts +0 -10
  191. package/dist/core/transport/decode-history.d.ts +0 -43
  192. package/dist/core/transport/server-transport.d.ts +0 -7
  193. package/dist/core/transport/stream-router.d.ts +0 -29
  194. package/dist/core/transport/turn-manager.d.ts +0 -37
  195. package/dist/react/contexts/transport-context.d.ts +0 -31
  196. package/dist/react/contexts/transport-provider.d.ts +0 -49
  197. package/dist/react/create-transport-hooks.d.ts +0 -124
  198. package/dist/react/use-active-turns.d.ts +0 -12
  199. package/dist/react/use-client-transport.d.ts +0 -80
  200. package/dist/vercel/codec/accumulator.d.ts +0 -21
  201. package/dist/vercel/codec/decoder.d.ts +0 -22
  202. package/dist/vercel/codec/encoder.d.ts +0 -41
  203. package/dist/vercel/react/use-staged-add-tool-approval-response.d.ts +0 -30
  204. package/dist/vercel/tool-approvals.d.ts +0 -124
  205. package/dist/vercel/tool-events.d.ts +0 -26
  206. package/src/core/transport/client-transport.ts +0 -977
  207. package/src/core/transport/decode-history.ts +0 -485
  208. package/src/core/transport/server-transport.ts +0 -612
  209. package/src/core/transport/stream-router.ts +0 -136
  210. package/src/core/transport/turn-manager.ts +0 -165
  211. package/src/react/contexts/transport-context.ts +0 -37
  212. package/src/react/contexts/transport-provider.tsx +0 -164
  213. package/src/react/create-transport-hooks.ts +0 -144
  214. package/src/react/use-active-turns.ts +0 -72
  215. package/src/react/use-client-transport.ts +0 -197
  216. package/src/vercel/codec/accumulator.ts +0 -588
  217. package/src/vercel/codec/decoder.ts +0 -618
  218. package/src/vercel/codec/encoder.ts +0 -410
  219. package/src/vercel/react/use-staged-add-tool-approval-response.ts +0 -87
  220. package/src/vercel/tool-approvals.ts +0 -380
  221. package/src/vercel/tool-events.ts +0 -53
@@ -1,25 +1,39 @@
1
- import { ActiveTurn, ClientTransport, MessageNode, SendOptions, View } from '../core/transport/types.js';
1
+ import { CodecInputEvent, CodecMessage, CodecOutputEvent } from '../core/codec/types.js';
2
+ import { ActiveRun, BranchSelection, RunInfo, SendOptions, View } from '../core/transport/types.js';
3
+ import { BaseSessionOption } from './internal/use-resolved-session.js';
2
4
  /**
3
5
  * useView — reactive paginated view of the conversation.
4
6
  *
5
- * Subscribes to view updates and exposes the visible nodes, branch navigation,
6
- * write operations, pagination state, and a `loadOlder` callback. Pass `transport`
7
- * to use a transport's default view, or `view` to subscribe to a specific
8
- * {@link View} directly. When both are omitted, defaults to the nearest
9
- * {@link TransportProvider}'s transport via context.
7
+ * Subscribes to view updates and exposes the visible messages, msg-anchored
8
+ * branch navigation, write operations, pagination state, and a `loadOlder`
9
+ * callback. Pass `session` to use a session's default view, or `view` to
10
+ * subscribe to a specific {@link View} directly. When both are omitted,
11
+ * defaults to the nearest {@link ClientSessionProvider}'s session via context.
10
12
  */
11
13
  import * as Ably from 'ably';
12
- /** Options for configuring the view's initial load behavior. */
13
- export interface UseViewOptions {
14
- /** Maximum number of older messages to load per page. Defaults to 100. */
14
+ /** Options for {@link useView}. */
15
+ export interface UseViewOptions<TInput extends CodecInputEvent, TOutput extends CodecOutputEvent, TProjection, TMessage> extends BaseSessionOption<TInput, TOutput, TProjection, TMessage> {
16
+ /** A specific {@link View} to subscribe to directly. Takes priority over `session`. */
17
+ view?: View<TInput, TMessage> | null;
18
+ /** Number of older codecMessages to reveal per page (exactly `limit`, fewer only at the end of history). When provided, auto-loads the first page on mount. */
15
19
  limit?: number;
20
+ /** When `true`, skip all subscriptions and return an empty handle immediately. */
21
+ skip?: boolean;
16
22
  }
17
23
  /** Handle for the paginated, branch-aware conversation view. */
18
- export interface ViewHandle<TEvent, TMessage> {
19
- /** The visible domain messages along the selected branch. */
20
- messages: TMessage[];
21
- /** Visible conversation nodes along the selected branch. */
22
- nodes: MessageNode<TMessage>[];
24
+ export interface ViewHandle<TInput extends CodecInputEvent, TMessage> {
25
+ /**
26
+ * The visible messages along the selected branch, concatenated across all
27
+ * visible Runs, each paired with its codec-message-id (see
28
+ * {@link CodecMessage}). Read the domain object from each entry's
29
+ * `message` field.
30
+ *
31
+ * Correlate a rendered message back to the View — `runOf`,
32
+ * `branchSelection`, `selectSibling`, `regenerate`, or `edit` — via its
33
+ * `codecMessageId`, which the SDK assigns and tracks independently of any
34
+ * identity the domain `message` may carry. See {@link View.getMessages}.
35
+ */
36
+ messages: CodecMessage<TMessage>[];
23
37
  /** Whether there are older messages that can be revealed via `loadOlder`. */
24
38
  hasOlder: boolean;
25
39
  /** Whether a page load is currently in progress. */
@@ -32,48 +46,65 @@ export interface ViewHandle<TEvent, TMessage> {
32
46
  loadError: Ably.ErrorInfo | undefined;
33
47
  /**
34
48
  * Load older messages into the view. No-op if already loading.
35
- * On failure, `error` is set; on success, `error` is cleared.
49
+ * On failure, `loadError` is set; on success, `loadError` is cleared.
36
50
  */
37
51
  loadOlder: () => Promise<void>;
38
- /** Select a sibling at a fork point by index. Triggers a view update with the new branch. */
39
- select: (msgId: string, index: number) => void;
40
- /** Index of the currently selected sibling at a fork point. */
41
- getSelectedIndex: (msgId: string) => number;
42
- /** Get all sibling messages at a fork point, ordered chronologically by serial. */
43
- getSiblings: (msgId: string) => TMessage[];
44
- /** Whether a message has sibling alternatives (i.e., show navigation arrows). */
45
- hasSiblings: (msgId: string) => boolean;
46
- /** Get a node by msgId, or undefined if not found. */
47
- getNode: (msgId: string) => MessageNode<TMessage> | undefined;
48
- /** Send one or more messages in the context of this view's selected branch. */
49
- send: (messages: TMessage | TMessage[], options?: SendOptions) => Promise<ActiveTurn<TEvent>>;
50
- /** Regenerate an assistant message, using this view's branch for history. */
51
- regenerate: (messageId: string, options?: SendOptions) => Promise<ActiveTurn<TEvent>>;
52
- /** Edit a user message, forking from this view's branch. */
53
- edit: (messageId: string, newMessages: TMessage | TMessage[], options?: SendOptions) => Promise<ActiveTurn<TEvent>>;
54
- /** Amend an existing message and start a continuation turn (e.g. tool results). */
55
- update: (msgId: string, events: TEvent[], options?: SendOptions) => Promise<ActiveTurn<TEvent>>;
52
+ /**
53
+ * Look up the {@link RunInfo} for the Run that owns `codecMessageId`.
54
+ * Returns `undefined` when the codec-message-id hasn't been observed.
55
+ * See {@link View.runOf}.
56
+ */
57
+ runOf: (codecMessageId: string) => RunInfo | undefined;
58
+ /**
59
+ * Direct lookup by runId. Returns `undefined` when the Run hasn't been
60
+ * observed. See {@link View.run}.
61
+ */
62
+ run: (runId: string) => RunInfo | undefined;
63
+ /**
64
+ * Snapshot of the visible Runs along the selected branch, in
65
+ * chronological order. Returns `[]` when the view isn't resolved.
66
+ * See {@link View.runs}.
67
+ */
68
+ runs: () => RunInfo[];
69
+ /**
70
+ * Resolve the {@link BranchSelection} bundle anchored at
71
+ * `codecMessageId`. Always returns a safe object — see
72
+ * {@link BranchSelection}. See {@link View.branchSelection}.
73
+ */
74
+ branchSelection: (codecMessageId: string) => BranchSelection<TMessage>;
75
+ /**
76
+ * Select a sibling at the branch point anchored at `codecMessageId`.
77
+ * `index` is clamped to `[0, siblings.length - 1]`. Silent no-op when
78
+ * `codecMessageId` isn't a branch anchor. See {@link View.selectSibling}.
79
+ */
80
+ selectSibling: (codecMessageId: string, index: number) => void;
81
+ /**
82
+ * Send one or more TInputs on the channel and fire a POST. See {@link View.send}.
83
+ * @throws Ably.ErrorInfo with code {@link ErrorCode.InvalidArgument} when no view is resolved (before the session is available, or when `skip` is `true`).
84
+ */
85
+ send: (events: TInput | TInput[], options?: SendOptions) => Promise<ActiveRun>;
86
+ /**
87
+ * Regenerate an assistant message, using this view's branch for history.
88
+ * @throws Ably.ErrorInfo with code {@link ErrorCode.InvalidArgument} when no view is resolved (before the session is available, or when `skip` is `true`).
89
+ */
90
+ regenerate: (messageId: string, options?: SendOptions) => Promise<ActiveRun>;
91
+ /**
92
+ * Edit a user message, forking from this view's branch.
93
+ * Rejects with an `Ably.ErrorInfo` (code {@link ErrorCode.InvalidArgument}) if no view is resolved — e.g. before the session is available, or when `skip` is `true`.
94
+ */
95
+ edit: (messageId: string, inputs: TInput | TInput[], options?: SendOptions) => Promise<ActiveRun>;
56
96
  }
57
97
  /**
58
- * Subscribe to a view and return the visible node list with pagination, navigation, and write operations.
98
+ * Subscribe to a view and return the visible messages with pagination, navigation, and write operations.
59
99
  *
60
- * `view` takes priority over `transport`. When neither is provided, the nearest
61
- * {@link TransportProvider}'s transport is used. When `limit` is provided, auto-loads
100
+ * `view` takes priority over `session`. When neither is provided, the nearest
101
+ * {@link ClientSessionProvider}'s session is used. When `limit` is provided, auto-loads
62
102
  * the first page on mount (SWR-style).
63
103
  * @param props - Options for selecting the view source and configuring auto-load.
64
- * @param props.transport - Client transport whose default view to subscribe to; defaults to the nearest provider.
65
- * @param props.view - A specific {@link View} to subscribe to directly. Takes priority over `transport`.
66
- * @param props.limit - Max older messages per page; when provided, auto-loads on mount.
104
+ * @param props.session - Client session whose default view to subscribe to; defaults to the nearest provider.
105
+ * @param props.view - A specific {@link View} to subscribe to directly. Takes priority over `session`.
106
+ * @param props.limit - Number of older codecMessages to reveal per page (exactly `limit`, fewer only at end of history); when provided, auto-loads the first page on mount.
67
107
  * @param props.skip - When `true`, skip all subscriptions and return an empty handle.
68
- * @returns A {@link ViewHandle} with nodes, pagination state, navigation, write operations, and loadOlder.
108
+ * @returns A {@link ViewHandle} with messages, pagination state, navigation, write operations, and loadOlder.
69
109
  */
70
- export declare const useView: <TEvent, TMessage>({ transport, view, limit, skip, }?: {
71
- /** Client transport whose default view to subscribe to; defaults to the nearest provider when omitted. */
72
- transport?: ClientTransport<TEvent, TMessage> | null;
73
- /** A specific {@link View} to subscribe to directly. Takes priority over `transport`. */
74
- view?: View<TEvent, TMessage> | null;
75
- /** When provided, auto-loads the first page on mount. Omit for manual loading. */
76
- limit?: number;
77
- /** When `true`, skip all subscriptions and return an empty handle immediately. */
78
- skip?: boolean;
79
- }) => ViewHandle<TEvent, TMessage>;
110
+ export declare const useView: <TInput extends CodecInputEvent, TOutput extends CodecOutputEvent, TProjection, TMessage>({ session, view, limit, skip, }?: UseViewOptions<TInput, TOutput, TProjection, TMessage>) => ViewHandle<TInput, TMessage>;
package/dist/utils.d.ts CHANGED
@@ -5,13 +5,38 @@
5
5
  * layers. They live at the top level to avoid either layer depending on
6
6
  * the other.
7
7
  */
8
- import type * as Ably from 'ably';
8
+ import * as Ably from 'ably';
9
9
  /**
10
- * Extract extras.headers from an Ably InboundMessage.
10
+ * Extract a human-readable message from an unknown thrown value.
11
+ * @param error - The thrown value.
12
+ * @returns The error's `message` when it is an `Error`, otherwise its string form.
13
+ */
14
+ export declare const errorMessage: (error: unknown) => string;
15
+ /**
16
+ * Narrow an unknown thrown value to an `Ably.ErrorInfo` for use as a wrapping
17
+ * `cause`, returning `undefined` when it is not one. Pass the result as the
18
+ * fourth argument to the `Ably.ErrorInfo` constructor to preserve the error
19
+ * chain without asserting a type the value may not have.
20
+ * @param error - The thrown value.
21
+ * @returns The value when it is an `Ably.ErrorInfo`, otherwise `undefined`.
22
+ */
23
+ export declare const errorCause: (error: unknown) => Ably.ErrorInfo | undefined;
24
+ /**
25
+ * Extract the transport-tier headers (`extras.ai.transport`) from an Ably
26
+ * InboundMessage. These are the generic transport headers (run/stream/identity/
27
+ * branching), set and read by the transport layer.
11
28
  * @param message - The Ably message to extract headers from.
12
- * @returns The headers record, or an empty object if absent.
29
+ * @returns The transport headers record, or an empty object if absent.
13
30
  */
14
- export declare const getHeaders: (message: Ably.InboundMessage) => Record<string, string>;
31
+ export declare const getTransportHeaders: (message: Ably.InboundMessage) => Record<string, string>;
32
+ /**
33
+ * Extract the codec-tier headers (`extras.ai.codec`) from an Ably
34
+ * InboundMessage. These are the codec's own headers, with no prefix — the
35
+ * tier isolates them from transport headers.
36
+ * @param message - The Ably message to extract headers from.
37
+ * @returns The codec headers record, or an empty object if absent.
38
+ */
39
+ export declare const getCodecHeaders: (message: Ably.InboundMessage) => Record<string, string>;
15
40
  /**
16
41
  * Parse a JSON string, returning undefined on failure.
17
42
  * @param value - The JSON string to parse.
@@ -19,20 +44,13 @@ export declare const getHeaders: (message: Ably.InboundMessage) => Record<string
19
44
  */
20
45
  export declare const parseJson: (value: string | undefined) => unknown;
21
46
  /**
22
- * Set a header value if defined, skipping undefined and null. Strings are set directly,
23
- * booleans and numbers are stringified, objects are JSON-serialized.
24
- * @param headers - The headers object to mutate.
25
- * @param key - The header key.
26
- * @param value - The value to set.
27
- */
28
- export declare const setIfPresent: (headers: Record<string, string>, key: string, value: unknown) => void;
29
- /**
30
- * Set multiple headers at once, skipping entries whose values are undefined or null.
31
- * Each value is converted using the same rules as {@link setIfPresent}.
32
- * @param headers - The headers object to mutate.
33
- * @param entries - Key-value pairs to set.
47
+ * Parse a string as JSON, falling back to the raw string when it isn't valid
48
+ * JSON. An empty string yields `undefined`. Used for accumulated stream text
49
+ * whose payload may be JSON or a plain string.
50
+ * @param value - The string to parse.
51
+ * @returns The parsed value, the raw string on parse failure, or undefined if empty.
34
52
  */
35
- export declare const setHeadersIfPresent: (headers: Record<string, string>, entries: Record<string, unknown>) => void;
53
+ export declare const parseJsonOrString: (value: string) => unknown;
36
54
  /**
37
55
  * Merge two header records into a new object. Later values override earlier ones.
38
56
  * Undefined inputs are treated as empty.
@@ -47,22 +65,20 @@ export declare const mergeHeaders: (base: Record<string, string> | undefined, ov
47
65
  * @returns True if "true", false for any other string, or undefined if absent.
48
66
  */
49
67
  export declare const parseBool: (value: string | undefined) => boolean | undefined;
68
+ /** A record carrying an optional Ably `serial`, orderable by {@link compareBySerial}. */
69
+ interface HasSerial {
70
+ /** Ably serial, or undefined if the server has not yet assigned one. */
71
+ readonly serial?: string;
72
+ }
50
73
  /**
51
- * Build a domain headers record from key-value pairs. Each key is automatically
52
- * prefixed with {@link DOMAIN_HEADER_PREFIX}. Values that are undefined or null
53
- * are skipped; strings are set directly; booleans, numbers, and objects are
54
- * converted using the same rules as {@link setIfPresent}.
55
- * @param entries - Unprefixed key-value pairs (e.g. `{ toolCallId: 'tc-1' }` becomes `{ 'x-domain-toolCallId': 'tc-1' }`).
56
- * @returns A new headers record with prefixed keys.
57
- */
58
- export declare const domainHeaders: (entries: Record<string, unknown>) => Record<string, string>;
59
- /**
60
- * Read a domain header value from a headers record.
61
- * @param headers - The headers record to read from.
62
- * @param key - The unprefixed domain key (e.g. `'toolCallId'` reads `'x-domain-toolCallId'`).
63
- * @returns The header value, or undefined if absent.
74
+ * Comparator that orders records by their Ably `serial` ascending
75
+ * (chronological). Serials are lexicographically comparable; records whose
76
+ * serial is undefined sort last. Pass directly to `Array.prototype.sort`.
77
+ * @param a - First record to compare.
78
+ * @param b - Second record to compare.
79
+ * @returns Negative if `a` precedes `b`, positive if `a` follows `b`, 0 if equal.
64
80
  */
65
- export declare const getDomainHeader: (headers: Record<string, string>, key: string) => string | undefined;
81
+ export declare const compareBySerial: (a: HasSerial, b: HasSerial) => number;
66
82
  /**
67
83
  * Mapped type that converts properties whose type includes `undefined`
68
84
  * into optional properties with `undefined` excluded from the value.
@@ -85,43 +101,4 @@ export type Stripped<T> = {
85
101
  * @returns A shallow copy with undefined-valued keys removed.
86
102
  */
87
103
  export declare const stripUndefined: <T extends Record<string, unknown>>(obj: T) => Stripped<T>;
88
- /**
89
- * Typed accessor wrapper around a headers record for reading domain headers.
90
- * Reduces repetitive `getDomainHeader` + `parseBool` / `parseJson` chains.
91
- */
92
- export interface DomainHeaderReader {
93
- /** Read a domain header as a string, or undefined if absent. */
94
- str(key: string): string | undefined;
95
- /** Read a domain header as a string, falling back to a default if absent. */
96
- strOr(key: string, fallback: string): string;
97
- /** Read a domain header as a boolean ("true"/"false"), or undefined if absent. */
98
- bool(key: string): boolean | undefined;
99
- /** Read a domain header as parsed JSON, or undefined if absent or invalid. */
100
- json(key: string): unknown;
101
- }
102
- /**
103
- * Create a {@link DomainHeaderReader} over a headers record.
104
- * @param headers - The raw headers record to read domain headers from.
105
- * @returns A typed accessor for domain header values.
106
- */
107
- export declare const headerReader: (headers: Record<string, string>) => DomainHeaderReader;
108
- /**
109
- * Fluent builder for constructing domain header records with typed setters.
110
- * Mirrors {@link DomainHeaderReader} with the same method names for symmetry.
111
- * Undefined values are silently skipped on all setters.
112
- */
113
- export interface DomainHeaderWriter {
114
- /** Set a string domain header. Skips if value is undefined. */
115
- str(key: string, value: string | undefined): DomainHeaderWriter;
116
- /** Set a boolean domain header (serialized as "true"/"false"). Skips if value is undefined. */
117
- bool(key: string, value: boolean | undefined): DomainHeaderWriter;
118
- /** Set a JSON-serialized domain header. Skips if value is undefined or null. */
119
- json(key: string, value: unknown): DomainHeaderWriter;
120
- /** Return the accumulated headers record. */
121
- build(): Record<string, string>;
122
- }
123
- /**
124
- * Create a {@link DomainHeaderWriter} for building a domain headers record.
125
- * @returns A fluent builder that prefixes each key with the domain header prefix.
126
- */
127
- export declare const headerWriter: () => DomainHeaderWriter;
104
+ export {};