@ably/ai-transport 0.1.0 → 0.2.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 (163) hide show
  1. package/README.md +91 -100
  2. package/dist/ably-ai-transport.js +1553 -1238
  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 +29 -0
  8. package/dist/core/codec/decoder.d.ts +20 -23
  9. package/dist/core/codec/encoder.d.ts +11 -8
  10. package/dist/core/codec/index.d.ts +1 -2
  11. package/dist/core/codec/lifecycle-tracker.d.ts +10 -9
  12. package/dist/core/codec/types.d.ts +407 -115
  13. package/dist/core/transport/agent-session.d.ts +10 -0
  14. package/dist/core/transport/branch-chain.d.ts +43 -0
  15. package/dist/core/transport/client-session.d.ts +13 -0
  16. package/dist/core/transport/decode-fold.d.ts +47 -0
  17. package/dist/core/transport/headers.d.ts +96 -18
  18. package/dist/core/transport/index.d.ts +5 -6
  19. package/dist/core/transport/internal/bounded-map.d.ts +20 -0
  20. package/dist/core/transport/invocation.d.ts +74 -0
  21. package/dist/core/transport/load-conversation.d.ts +128 -0
  22. package/dist/core/transport/load-history.d.ts +39 -0
  23. package/dist/core/transport/pipe-stream.d.ts +9 -9
  24. package/dist/core/transport/run-manager.d.ts +78 -0
  25. package/dist/core/transport/tree.d.ts +373 -109
  26. package/dist/core/transport/types/agent.d.ts +353 -0
  27. package/dist/core/transport/types/client.d.ts +168 -0
  28. package/dist/core/transport/types/shared.d.ts +24 -0
  29. package/dist/core/transport/types/tree.d.ts +315 -0
  30. package/dist/core/transport/types/view.d.ts +222 -0
  31. package/dist/core/transport/types.d.ts +13 -553
  32. package/dist/core/transport/view.d.ts +272 -84
  33. package/dist/errors.d.ts +21 -10
  34. package/dist/index.d.ts +6 -8
  35. package/dist/logger.d.ts +12 -0
  36. package/dist/react/ably-ai-transport-react.js +976 -990
  37. package/dist/react/ably-ai-transport-react.js.map +1 -1
  38. package/dist/react/ably-ai-transport-react.umd.cjs +1 -1
  39. package/dist/react/ably-ai-transport-react.umd.cjs.map +1 -1
  40. package/dist/react/contexts/client-session-context.d.ts +36 -0
  41. package/dist/react/contexts/client-session-provider.d.ts +53 -0
  42. package/dist/react/create-session-hooks.d.ts +116 -0
  43. package/dist/react/index.d.ts +12 -12
  44. package/dist/react/internal/use-resolved-session.d.ts +36 -0
  45. package/dist/react/use-ably-messages.d.ts +17 -14
  46. package/dist/react/use-client-session.d.ts +81 -0
  47. package/dist/react/use-create-view.d.ts +14 -13
  48. package/dist/react/use-tree.d.ts +30 -15
  49. package/dist/react/use-view.d.ts +82 -51
  50. package/dist/utils.d.ts +32 -23
  51. package/dist/vercel/ably-ai-transport-vercel.js +2573 -2086
  52. package/dist/vercel/ably-ai-transport-vercel.js.map +1 -1
  53. package/dist/vercel/ably-ai-transport-vercel.umd.cjs +1 -1
  54. package/dist/vercel/ably-ai-transport-vercel.umd.cjs.map +1 -1
  55. package/dist/vercel/codec/decoder.d.ts +5 -18
  56. package/dist/vercel/codec/encoder.d.ts +6 -36
  57. package/dist/vercel/codec/events.d.ts +51 -0
  58. package/dist/vercel/codec/index.d.ts +24 -12
  59. package/dist/vercel/codec/reducer.d.ts +144 -0
  60. package/dist/vercel/codec/tool-transitions.d.ts +2 -2
  61. package/dist/vercel/index.d.ts +4 -5
  62. package/dist/vercel/react/ably-ai-transport-vercel-react.js +3907 -3266
  63. package/dist/vercel/react/ably-ai-transport-vercel-react.js.map +1 -1
  64. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs +33 -8
  65. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs.map +1 -1
  66. package/dist/vercel/react/contexts/chat-transport-context.d.ts +7 -6
  67. package/dist/vercel/react/contexts/chat-transport-provider.d.ts +53 -41
  68. package/dist/vercel/react/index.d.ts +1 -2
  69. package/dist/vercel/react/use-chat-transport.d.ts +30 -26
  70. package/dist/vercel/react/use-message-sync.d.ts +17 -30
  71. package/dist/vercel/run-end-reason.d.ts +29 -0
  72. package/dist/vercel/transport/chat-transport.d.ts +43 -24
  73. package/dist/vercel/transport/index.d.ts +25 -21
  74. package/dist/vercel/transport/run-output-stream.d.ts +56 -0
  75. package/dist/version.d.ts +2 -0
  76. package/package.json +30 -23
  77. package/src/constants.ts +124 -51
  78. package/src/core/agent.ts +68 -0
  79. package/src/core/codec/decoder.ts +71 -98
  80. package/src/core/codec/encoder.ts +113 -65
  81. package/src/core/codec/index.ts +13 -6
  82. package/src/core/codec/lifecycle-tracker.ts +10 -9
  83. package/src/core/codec/types.ts +436 -120
  84. package/src/core/transport/agent-session.ts +1344 -0
  85. package/src/core/transport/branch-chain.ts +58 -0
  86. package/src/core/transport/client-session.ts +775 -0
  87. package/src/core/transport/decode-fold.ts +91 -0
  88. package/src/core/transport/headers.ts +181 -22
  89. package/src/core/transport/index.ts +25 -26
  90. package/src/core/transport/internal/bounded-map.ts +27 -0
  91. package/src/core/transport/invocation.ts +98 -0
  92. package/src/core/transport/load-conversation.ts +355 -0
  93. package/src/core/transport/load-history.ts +269 -0
  94. package/src/core/transport/pipe-stream.ts +54 -39
  95. package/src/core/transport/run-manager.ts +249 -0
  96. package/src/core/transport/tree.ts +926 -308
  97. package/src/core/transport/types/agent.ts +407 -0
  98. package/src/core/transport/types/client.ts +211 -0
  99. package/src/core/transport/types/shared.ts +27 -0
  100. package/src/core/transport/types/tree.ts +344 -0
  101. package/src/core/transport/types/view.ts +259 -0
  102. package/src/core/transport/types.ts +13 -706
  103. package/src/core/transport/view.ts +864 -433
  104. package/src/errors.ts +22 -9
  105. package/src/event-emitter.ts +3 -2
  106. package/src/index.ts +52 -41
  107. package/src/logger.ts +14 -1
  108. package/src/react/contexts/client-session-context.ts +41 -0
  109. package/src/react/contexts/client-session-provider.tsx +186 -0
  110. package/src/react/create-session-hooks.ts +141 -0
  111. package/src/react/index.ts +23 -13
  112. package/src/react/internal/use-resolved-session.ts +63 -0
  113. package/src/react/use-ably-messages.ts +32 -22
  114. package/src/react/use-client-session.ts +201 -0
  115. package/src/react/use-create-view.ts +33 -29
  116. package/src/react/use-tree.ts +61 -30
  117. package/src/react/use-view.ts +139 -97
  118. package/src/utils.ts +63 -45
  119. package/src/vercel/codec/decoder.ts +336 -258
  120. package/src/vercel/codec/encoder.ts +343 -205
  121. package/src/vercel/codec/events.ts +87 -0
  122. package/src/vercel/codec/index.ts +60 -13
  123. package/src/vercel/codec/reducer.ts +977 -0
  124. package/src/vercel/codec/tool-transitions.ts +2 -2
  125. package/src/vercel/index.ts +6 -19
  126. package/src/vercel/react/contexts/chat-transport-context.ts +7 -6
  127. package/src/vercel/react/contexts/chat-transport-provider.tsx +87 -59
  128. package/src/vercel/react/index.ts +3 -5
  129. package/src/vercel/react/use-chat-transport.ts +47 -49
  130. package/src/vercel/react/use-message-sync.ts +80 -39
  131. package/src/vercel/run-end-reason.ts +78 -0
  132. package/src/vercel/transport/chat-transport.ts +392 -98
  133. package/src/vercel/transport/index.ts +39 -38
  134. package/src/vercel/transport/run-output-stream.ts +170 -0
  135. package/src/version.ts +2 -0
  136. package/dist/core/transport/client-transport.d.ts +0 -10
  137. package/dist/core/transport/decode-history.d.ts +0 -43
  138. package/dist/core/transport/server-transport.d.ts +0 -7
  139. package/dist/core/transport/stream-router.d.ts +0 -29
  140. package/dist/core/transport/turn-manager.d.ts +0 -37
  141. package/dist/react/contexts/transport-context.d.ts +0 -31
  142. package/dist/react/contexts/transport-provider.d.ts +0 -49
  143. package/dist/react/create-transport-hooks.d.ts +0 -124
  144. package/dist/react/use-active-turns.d.ts +0 -12
  145. package/dist/react/use-client-transport.d.ts +0 -80
  146. package/dist/vercel/codec/accumulator.d.ts +0 -21
  147. package/dist/vercel/react/use-staged-add-tool-approval-response.d.ts +0 -30
  148. package/dist/vercel/tool-approvals.d.ts +0 -124
  149. package/dist/vercel/tool-events.d.ts +0 -26
  150. package/src/core/transport/client-transport.ts +0 -977
  151. package/src/core/transport/decode-history.ts +0 -485
  152. package/src/core/transport/server-transport.ts +0 -612
  153. package/src/core/transport/stream-router.ts +0 -136
  154. package/src/core/transport/turn-manager.ts +0 -165
  155. package/src/react/contexts/transport-context.ts +0 -37
  156. package/src/react/contexts/transport-provider.tsx +0 -164
  157. package/src/react/create-transport-hooks.ts +0 -144
  158. package/src/react/use-active-turns.ts +0 -72
  159. package/src/react/use-client-transport.ts +0 -197
  160. package/src/vercel/codec/accumulator.ts +0 -588
  161. package/src/vercel/react/use-staged-add-tool-approval-response.ts +0 -87
  162. package/src/vercel/tool-approvals.ts +0 -380
  163. package/src/vercel/tool-events.ts +0 -53
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Vercel codec input/output unions.
3
+ *
4
+ * The codec splits cleanly along the protocol's `ai-input` / `ai-output`
5
+ * wire seam:
6
+ *
7
+ * - **`VercelOutput`** = `AI.UIMessageChunk` — the AI SDK's streamed-output
8
+ * domain model, published by the agent on `ai-output`.
9
+ * - **`VercelInput`** = a discriminated union of the SDK's well-known
10
+ * input shapes — published by the client on `ai-input`. The Vercel
11
+ * codec has no codec-local input variants today: every variant comes
12
+ * from `@ably/ai-transport`'s well-known set.
13
+ */
14
+
15
+ import type * as AI from 'ai';
16
+
17
+ import type {
18
+ Regenerate,
19
+ ToolApprovalResponse,
20
+ ToolResult,
21
+ ToolResultError,
22
+ UserMessage,
23
+ } from '../../core/codec/types.js';
24
+
25
+ // ---------------------------------------------------------------------------
26
+ // Domain payloads
27
+ //
28
+ // The core well-known tool variants are domain-independent: the Vercel
29
+ // layer supplies the concrete payload shapes. Tool outputs are inherently
30
+ // tool-defined, so `output` stays `unknown` — but confined here, never in
31
+ // the core.
32
+ // ---------------------------------------------------------------------------
33
+
34
+ /** Vercel domain payload for a {@link ToolResult}. */
35
+ export interface VercelToolResultPayload {
36
+ /** The tool call this result corresponds to. */
37
+ toolCallId: string;
38
+ /** The tool's output value. Tool-defined shape. */
39
+ output: unknown;
40
+ }
41
+
42
+ /** Vercel domain payload for a {@link ToolResultError}. */
43
+ export interface VercelToolResultErrorPayload {
44
+ /** The tool call this error corresponds to. */
45
+ toolCallId: string;
46
+ /** Human-readable description of the failure. */
47
+ message: string;
48
+ }
49
+
50
+ /** Vercel domain payload for a {@link ToolApprovalResponse}. */
51
+ export interface VercelToolApprovalResponsePayload {
52
+ /** The tool call this approval responds to. */
53
+ toolCallId: string;
54
+ /** Whether the user approved the tool execution. */
55
+ approved: boolean;
56
+ /** Optional human-readable reason (typically used on denial). */
57
+ reason?: string;
58
+ }
59
+
60
+ // ---------------------------------------------------------------------------
61
+ // Unions
62
+ // ---------------------------------------------------------------------------
63
+
64
+ /**
65
+ * The Vercel codec's `TInput` — every record-shape a client publishes on
66
+ * the `ai-input` wire. Composed from the SDK's well-known input shapes,
67
+ * with the tool variants parameterized by the Vercel domain payloads above.
68
+ */
69
+ export type VercelInput =
70
+ | UserMessage<AI.UIMessage>
71
+ | Regenerate
72
+ | ToolResult<VercelToolResultPayload>
73
+ | ToolResultError<VercelToolResultErrorPayload>
74
+ | ToolApprovalResponse<VercelToolApprovalResponsePayload>;
75
+
76
+ /**
77
+ * The Vercel codec's `TOutput` — every record-shape the agent publishes
78
+ * on the `ai-output` wire. The Vercel codec passes the AI SDK's
79
+ * `UIMessageChunk` through unchanged.
80
+ */
81
+ export type VercelOutput = AI.UIMessageChunk;
82
+
83
+ // ---------------------------------------------------------------------------
84
+ // Projection re-export
85
+ // ---------------------------------------------------------------------------
86
+
87
+ export type { VercelProjection } from './reducer.js';
@@ -1,35 +1,82 @@
1
1
  /**
2
- * Vercel AI SDK codec — maps UIMessageChunk events and UIMessage objects
3
- * to/from native Ably message primitives (publish, append, update, delete).
2
+ * Vercel AI SDK codec — implements
3
+ * `Codec<VercelInput, VercelOutput, VercelProjection, UIMessage>`.
4
+ *
5
+ * The codec is the reducer (extends `Reducer<VercelInput | VercelOutput,
6
+ * VercelProjection>`) plus encoder/decoder factories and `getMessages`
7
+ * for Tree population.
4
8
  *
5
9
  * ```ts
6
10
  * import { UIMessageCodec } from '@ably/ai-transport/vercel';
7
11
  *
8
12
  * const encoder = UIMessageCodec.createEncoder(writer, options);
9
13
  * const decoder = UIMessageCodec.createDecoder();
10
- * const accumulator = UIMessageCodec.createAccumulator();
14
+ * const projection = UIMessageCodec.init();
11
15
  * ```
12
16
  */
13
17
 
14
18
  import type * as AI from 'ai';
15
19
 
16
20
  import type { Codec } from '../../core/codec/types.js';
17
- import { createAccumulator } from './accumulator.js';
18
21
  import { createDecoder } from './decoder.js';
19
22
  import { createEncoder } from './encoder.js';
23
+ import type {
24
+ VercelInput,
25
+ VercelOutput,
26
+ VercelToolApprovalResponsePayload,
27
+ VercelToolResultErrorPayload,
28
+ VercelToolResultPayload,
29
+ } from './events.js';
30
+ import { fold, getMessages, init, type VercelProjection } from './reducer.js';
20
31
 
21
32
  /**
22
- * Vercel AI SDK codec implementing `Codec<UIMessageChunk, UIMessage>`.
33
+ * Vercel AI SDK codec implementing
34
+ * `Codec<VercelInput, VercelOutput, VercelProjection, UIMessage>`.
23
35
  *
24
- * Provides factory methods for creating encoders, decoders, and accumulators
25
- * that map between Vercel's UIMessageChunk/UIMessage types and Ably's native
26
- * message primitives.
36
+ * Folds `VercelInput`s and `VercelOutput`s into a `VercelProjection`
37
+ * carrying `UIMessage[]`. Encoder and decoder factories handle the wire
38
+ * mapping for both directions.
27
39
  */
28
- export const UIMessageCodec: Codec<AI.UIMessageChunk, AI.UIMessage> = {
40
+ const uiMessageCodecImpl = {
41
+ // Internal field - picked up by registerAgent via AdapterTagHolder cast. Spec: AIT-CT1a3, AIT-ST1a3.
42
+ adapterTag: 'vercel-ai-sdk-ui-message' as const,
43
+ init,
44
+ fold,
29
45
  createEncoder,
30
46
  createDecoder,
31
- createAccumulator,
32
-
33
- isTerminal: (event: AI.UIMessageChunk): boolean =>
34
- event.type === 'finish' || event.type === 'error' || event.type === 'abort',
47
+ getMessages,
48
+ createUserMessage: (message: AI.UIMessage): VercelInput => ({ kind: 'user-message', message }),
49
+ createRegenerate: (target: string, parent: string): VercelInput => ({
50
+ kind: 'regenerate',
51
+ target,
52
+ parent,
53
+ }),
54
+ createToolResult: (codecMessageId: string, payload: VercelToolResultPayload): VercelInput => ({
55
+ kind: 'tool-result',
56
+ codecMessageId,
57
+ payload,
58
+ }),
59
+ createToolResultError: (codecMessageId: string, payload: VercelToolResultErrorPayload): VercelInput => ({
60
+ kind: 'tool-result-error',
61
+ codecMessageId,
62
+ payload,
63
+ }),
64
+ createToolApprovalResponse: (codecMessageId: string, payload: VercelToolApprovalResponsePayload): VercelInput => ({
65
+ kind: 'tool-approval-response',
66
+ codecMessageId,
67
+ payload,
68
+ }),
35
69
  };
70
+
71
+ // Validate Codec conformance via `satisfies` on the variable (no excess-property
72
+ // check, so the internal `adapterTag` is permitted) while keeping the concrete
73
+ // type so the codec-specific factories (createToolResult, etc.) stay callable.
74
+ export const UIMessageCodec = uiMessageCodecImpl satisfies Codec<
75
+ VercelInput,
76
+ VercelOutput,
77
+ VercelProjection,
78
+ AI.UIMessage
79
+ >;
80
+
81
+ export type { VercelInput, VercelOutput } from './events.js';
82
+ export { type VercelProjection } from './reducer.js';