@ably/ai-transport 0.2.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 (166) hide show
  1. package/README.md +10 -19
  2. package/dist/ably-ai-transport.js +1790 -1091
  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 +2 -2
  7. package/dist/core/agent.d.ts +20 -5
  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 +4 -1
  11. package/dist/core/codec/define-codec.d.ts +100 -0
  12. package/dist/core/codec/encoder.d.ts +2 -7
  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 -1
  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/output-descriptor-decoder.d.ts +29 -0
  20. package/dist/core/codec/output-descriptor-encoder.d.ts +31 -0
  21. package/dist/core/codec/output-descriptors.d.ts +237 -0
  22. package/dist/core/codec/types.d.ts +95 -36
  23. package/dist/core/codec/well-known-inputs.d.ts +52 -0
  24. package/dist/core/transport/agent-view.d.ts +296 -0
  25. package/dist/core/transport/decode-fold.d.ts +40 -32
  26. package/dist/core/transport/headers.d.ts +30 -1
  27. package/dist/core/transport/index.d.ts +1 -1
  28. package/dist/core/transport/invocation.d.ts +1 -1
  29. package/dist/core/transport/load-history-pages.d.ts +71 -0
  30. package/dist/core/transport/load-history.d.ts +21 -16
  31. package/dist/core/transport/run-manager.d.ts +9 -11
  32. package/dist/core/transport/session-support.d.ts +55 -0
  33. package/dist/core/transport/tree.d.ts +165 -15
  34. package/dist/core/transport/types/agent.d.ts +120 -98
  35. package/dist/core/transport/types/client.d.ts +45 -12
  36. package/dist/core/transport/types/tree.d.ts +52 -10
  37. package/dist/core/transport/types/view.d.ts +55 -28
  38. package/dist/core/transport/view.d.ts +176 -58
  39. package/dist/core/transport/wire-log.d.ts +102 -0
  40. package/dist/errors.d.ts +10 -4
  41. package/dist/index.d.ts +6 -5
  42. package/dist/react/ably-ai-transport-react.js +784 -415
  43. package/dist/react/ably-ai-transport-react.js.map +1 -1
  44. package/dist/react/ably-ai-transport-react.umd.cjs +1 -1
  45. package/dist/react/ably-ai-transport-react.umd.cjs.map +1 -1
  46. package/dist/react/contexts/client-session-context.d.ts +2 -1
  47. package/dist/react/contexts/client-session-provider.d.ts +3 -0
  48. package/dist/react/index.d.ts +2 -1
  49. package/dist/react/internal/skipped-session.d.ts +8 -0
  50. package/dist/react/use-view.d.ts +3 -3
  51. package/dist/utils.d.ts +22 -54
  52. package/dist/vercel/ably-ai-transport-vercel.js +2297 -2026
  53. package/dist/vercel/ably-ai-transport-vercel.js.map +1 -1
  54. package/dist/vercel/ably-ai-transport-vercel.umd.cjs +1 -1
  55. package/dist/vercel/ably-ai-transport-vercel.umd.cjs.map +1 -1
  56. package/dist/vercel/codec/decode-lifecycle.d.ts +9 -0
  57. package/dist/vercel/codec/events.d.ts +1 -2
  58. package/dist/vercel/codec/fields.d.ts +44 -0
  59. package/dist/vercel/codec/fold-content.d.ts +16 -0
  60. package/dist/vercel/codec/fold-data.d.ts +16 -0
  61. package/dist/vercel/codec/fold-input.d.ts +67 -0
  62. package/dist/vercel/codec/fold-lifecycle.d.ts +16 -0
  63. package/dist/vercel/codec/fold-text.d.ts +16 -0
  64. package/dist/vercel/codec/fold-tool-input.d.ts +17 -0
  65. package/dist/vercel/codec/fold-tool-output.d.ts +16 -0
  66. package/dist/vercel/codec/index.d.ts +5 -30
  67. package/dist/vercel/codec/inputs.d.ts +11 -0
  68. package/dist/vercel/codec/outputs.d.ts +11 -0
  69. package/dist/vercel/codec/reducer-state.d.ts +121 -0
  70. package/dist/vercel/codec/reducer.d.ts +20 -102
  71. package/dist/vercel/codec/tool-transitions.d.ts +0 -6
  72. package/dist/vercel/codec/wire-data.d.ts +34 -0
  73. package/dist/vercel/index.d.ts +1 -0
  74. package/dist/vercel/react/ably-ai-transport-vercel-react.js +2013 -9500
  75. package/dist/vercel/react/ably-ai-transport-vercel-react.js.map +1 -1
  76. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs +1 -70
  77. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs.map +1 -1
  78. package/dist/vercel/react/contexts/chat-transport-context.d.ts +2 -1
  79. package/dist/vercel/run-end-reason.d.ts +66 -11
  80. package/dist/vercel/tool-part.d.ts +21 -0
  81. package/dist/vercel/transport/chat-transport.d.ts +0 -2
  82. package/dist/vercel/transport/index.d.ts +1 -1
  83. package/dist/vercel/transport/run-output-stream.d.ts +6 -8
  84. package/dist/version.d.ts +1 -1
  85. package/package.json +2 -2
  86. package/src/constants.ts +2 -2
  87. package/src/core/agent.ts +43 -19
  88. package/src/core/channel-options.ts +89 -0
  89. package/src/core/codec/codec-event.ts +27 -0
  90. package/src/core/codec/decoder.ts +145 -21
  91. package/src/core/codec/define-codec.ts +432 -0
  92. package/src/core/codec/encoder.ts +13 -54
  93. package/src/core/codec/field-bag.ts +142 -0
  94. package/src/core/codec/fields.ts +193 -0
  95. package/src/core/codec/index.ts +43 -0
  96. package/src/core/codec/input-descriptor-decoder.ts +97 -0
  97. package/src/core/codec/input-descriptor-encoder.ts +150 -0
  98. package/src/core/codec/input-descriptors.ts +373 -0
  99. package/src/core/codec/output-descriptor-decoder.ts +139 -0
  100. package/src/core/codec/output-descriptor-encoder.ts +101 -0
  101. package/src/core/codec/output-descriptors.ts +307 -0
  102. package/src/core/codec/types.ts +99 -36
  103. package/src/core/codec/well-known-inputs.ts +96 -0
  104. package/src/core/transport/agent-session.ts +330 -589
  105. package/src/core/transport/agent-view.ts +738 -0
  106. package/src/core/transport/client-session.ts +74 -69
  107. package/src/core/transport/decode-fold.ts +57 -47
  108. package/src/core/transport/headers.ts +57 -4
  109. package/src/core/transport/index.ts +2 -1
  110. package/src/core/transport/invocation.ts +1 -1
  111. package/src/core/transport/load-history-pages.ts +220 -0
  112. package/src/core/transport/load-history.ts +63 -61
  113. package/src/core/transport/pipe-stream.ts +10 -1
  114. package/src/core/transport/run-manager.ts +25 -31
  115. package/src/core/transport/session-support.ts +96 -0
  116. package/src/core/transport/tree.ts +414 -47
  117. package/src/core/transport/types/agent.ts +129 -102
  118. package/src/core/transport/types/client.ts +49 -13
  119. package/src/core/transport/types/tree.ts +61 -12
  120. package/src/core/transport/types/view.ts +57 -28
  121. package/src/core/transport/view.ts +520 -172
  122. package/src/core/transport/wire-log.ts +189 -0
  123. package/src/errors.ts +10 -3
  124. package/src/index.ts +44 -11
  125. package/src/react/contexts/client-session-context.ts +1 -1
  126. package/src/react/contexts/client-session-provider.tsx +38 -2
  127. package/src/react/index.ts +2 -1
  128. package/src/react/internal/skipped-session.ts +62 -0
  129. package/src/react/use-client-session.ts +7 -30
  130. package/src/react/use-view.ts +3 -3
  131. package/src/utils.ts +31 -97
  132. package/src/vercel/codec/decode-lifecycle.ts +70 -0
  133. package/src/vercel/codec/events.ts +1 -3
  134. package/src/vercel/codec/fields.ts +58 -0
  135. package/src/vercel/codec/fold-content.ts +54 -0
  136. package/src/vercel/codec/fold-data.ts +46 -0
  137. package/src/vercel/codec/fold-input.ts +255 -0
  138. package/src/vercel/codec/fold-lifecycle.ts +85 -0
  139. package/src/vercel/codec/fold-text.ts +55 -0
  140. package/src/vercel/codec/fold-tool-input.ts +86 -0
  141. package/src/vercel/codec/fold-tool-output.ts +79 -0
  142. package/src/vercel/codec/index.ts +23 -63
  143. package/src/vercel/codec/inputs.ts +116 -0
  144. package/src/vercel/codec/outputs.ts +207 -0
  145. package/src/vercel/codec/reducer-state.ts +169 -0
  146. package/src/vercel/codec/reducer.ts +52 -838
  147. package/src/vercel/codec/tool-transitions.ts +1 -12
  148. package/src/vercel/codec/wire-data.ts +64 -0
  149. package/src/vercel/index.ts +1 -0
  150. package/src/vercel/react/contexts/chat-transport-context.ts +1 -1
  151. package/src/vercel/react/use-chat-transport.ts +8 -28
  152. package/src/vercel/react/use-message-sync.ts +5 -10
  153. package/src/vercel/run-end-reason.ts +95 -16
  154. package/src/vercel/tool-part.ts +25 -0
  155. package/src/vercel/transport/chat-transport.ts +10 -22
  156. package/src/vercel/transport/index.ts +1 -1
  157. package/src/vercel/transport/run-output-stream.ts +7 -8
  158. package/src/version.ts +1 -1
  159. package/dist/core/transport/branch-chain.d.ts +0 -43
  160. package/dist/core/transport/load-conversation.d.ts +0 -128
  161. package/dist/vercel/codec/decoder.d.ts +0 -9
  162. package/dist/vercel/codec/encoder.d.ts +0 -11
  163. package/src/core/transport/branch-chain.ts +0 -58
  164. package/src/core/transport/load-conversation.ts +0 -355
  165. package/src/vercel/codec/decoder.ts +0 -696
  166. package/src/vercel/codec/encoder.ts +0 -548
@@ -20,7 +20,7 @@ export interface ClientSessionSlot {
20
20
  * `nearest` is the slot from the innermost enclosing {@link ClientSessionProvider}.
21
21
  * `providers` is the full registry of all enclosing providers, keyed by channelName.
22
22
  */
23
- export interface ClientSessionContextValue {
23
+ interface ClientSessionContextValue {
24
24
  /** The innermost {@link ClientSessionProvider}'s slot. `undefined` when no provider is present. */
25
25
  nearest: ClientSessionSlot | undefined;
26
26
  /** All registered session slots from enclosing providers, keyed by channelName. */
@@ -34,3 +34,4 @@ export interface ClientSessionContextValue {
34
34
  * read by {@link useClientSession} and internal hooks.
35
35
  */
36
36
  export declare const ClientSessionContext: import('react').Context<ClientSessionContextValue>;
37
+ export {};
@@ -46,6 +46,9 @@ export interface ClientSessionProviderProps<TInput extends CodecInputEvent, TOut
46
46
  * const { session: main } = useClientSession({ channelName: 'ai:main' });
47
47
  * const { session: aux } = useClientSession({ channelName: 'ai:aux' });
48
48
  * ```
49
+ * `channelModes` must stay constant for the provider's lifetime: the session is
50
+ * only recreated when `channelName` changes, and removing the modes after mount
51
+ * silently reverts the channel's mode set without a reattach.
49
52
  * @param props - Provider configuration including `channelName`, `codec`, and all other {@link ClientSessionOptions} except `client`.
50
53
  * @param props.children - Descendant components that consume the session via {@link useClientSession}.
51
54
  * @returns A React element wrapping children with ClientSessionContext.
@@ -1,5 +1,6 @@
1
+ export { OBJECT_MODES } from '../core/channel-options.js';
1
2
  export type { CodecMessage } from '../core/codec/types.js';
2
- export type { ActiveRun, BranchSelection, ClientSession, ConversationNode, EventsNode, InputNode, MessageNode, RunInfo, RunNode, SendOptions, } from '../core/transport/types.js';
3
+ export type { ActiveRun, BranchSelection, ClientSession, ConversationNode, InputNode, MessageNode, RunInfo, RunNode, RunNodeState, SendOptions, } from '../core/transport/types.js';
3
4
  export type { ClientSessionSlot } from './contexts/client-session-context.js';
4
5
  export type { ClientSessionProviderProps } from './contexts/client-session-provider.js';
5
6
  export { ClientSessionProvider } from './contexts/client-session-provider.js';
@@ -0,0 +1,8 @@
1
+ import { CodecInputEvent, CodecOutputEvent } from '../../core/codec/types.js';
2
+ import { ClientSession } from '../../core/transport/types.js';
3
+ /**
4
+ * Create a throwing stub {@link ClientSession}. Held safely in state before a
5
+ * provider resolves; any access throws {@link Ably.ErrorInfo}.
6
+ * @returns A stub session whose every member throws.
7
+ */
8
+ export declare const makeSkippedClientSession: <TInput extends CodecInputEvent, TOutput extends CodecOutputEvent, TProjection, TMessage>() => ClientSession<TInput, TOutput, TProjection, TMessage>;
@@ -15,7 +15,7 @@ import * as Ably from 'ably';
15
15
  export interface UseViewOptions<TInput extends CodecInputEvent, TOutput extends CodecOutputEvent, TProjection, TMessage> extends BaseSessionOption<TInput, TOutput, TProjection, TMessage> {
16
16
  /** A specific {@link View} to subscribe to directly. Takes priority over `session`. */
17
17
  view?: View<TInput, TMessage> | null;
18
- /** Maximum number of older Runs to reveal per page (the pagination unit is the Run, not the message). When provided, auto-loads the first page on mount. */
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. */
19
19
  limit?: number;
20
20
  /** When `true`, skip all subscriptions and return an empty handle immediately. */
21
21
  skip?: boolean;
@@ -34,7 +34,7 @@ export interface ViewHandle<TInput extends CodecInputEvent, TMessage> {
34
34
  * identity the domain `message` may carry. See {@link View.getMessages}.
35
35
  */
36
36
  messages: CodecMessage<TMessage>[];
37
- /** Whether there are older Runs that can be revealed via `loadOlder`. */
37
+ /** Whether there are older messages that can be revealed via `loadOlder`. */
38
38
  hasOlder: boolean;
39
39
  /** Whether a page load is currently in progress. */
40
40
  loading: boolean;
@@ -103,7 +103,7 @@ export interface ViewHandle<TInput extends CodecInputEvent, TMessage> {
103
103
  * @param props - Options for selecting the view source and configuring auto-load.
104
104
  * @param props.session - Client session whose default view to subscribe to; defaults to the nearest provider.
105
105
  * @param props.view - A specific {@link View} to subscribe to directly. Takes priority over `session`.
106
- * @param props.limit - Max older Runs to reveal per page; when provided, auto-loads the first page on mount.
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.
107
107
  * @param props.skip - When `true`, skip all subscriptions and return an empty handle.
108
108
  * @returns A {@link ViewHandle} with messages, pagination state, navigation, write operations, and loadOlder.
109
109
  */
package/dist/utils.d.ts CHANGED
@@ -5,7 +5,22 @@
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
+ /**
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;
9
24
  /**
10
25
  * Extract the transport-tier headers (`extras.ai.transport`) from an Ably
11
26
  * InboundMessage. These are the generic transport headers (run/stream/identity/
@@ -29,13 +44,13 @@ export declare const getCodecHeaders: (message: Ably.InboundMessage) => Record<s
29
44
  */
30
45
  export declare const parseJson: (value: string | undefined) => unknown;
31
46
  /**
32
- * Set a header value if defined, skipping undefined and null. Strings are set directly,
33
- * booleans and numbers are stringified, objects are JSON-serialized.
34
- * @param headers - The headers object to mutate.
35
- * @param key - The header key.
36
- * @param value - The value 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.
37
52
  */
38
- export declare const setIfPresent: (headers: Record<string, string>, key: string, value: unknown) => void;
53
+ export declare const parseJsonOrString: (value: string) => unknown;
39
54
  /**
40
55
  * Merge two header records into a new object. Later values override earlier ones.
41
56
  * Undefined inputs are treated as empty.
@@ -64,13 +79,6 @@ interface HasSerial {
64
79
  * @returns Negative if `a` precedes `b`, positive if `a` follows `b`, 0 if equal.
65
80
  */
66
81
  export declare const compareBySerial: (a: HasSerial, b: HasSerial) => number;
67
- /**
68
- * Read a domain header value from a codec-tier headers record.
69
- * @param headers - The codec headers record to read from.
70
- * @param key - The domain key (e.g. `'toolCallId'`).
71
- * @returns The header value, or undefined if absent.
72
- */
73
- export declare const getDomainHeader: (headers: Record<string, string>, key: string) => string | undefined;
74
82
  /**
75
83
  * Mapped type that converts properties whose type includes `undefined`
76
84
  * into optional properties with `undefined` excluded from the value.
@@ -93,44 +101,4 @@ export type Stripped<T> = {
93
101
  * @returns A shallow copy with undefined-valued keys removed.
94
102
  */
95
103
  export declare const stripUndefined: <T extends Record<string, unknown>>(obj: T) => Stripped<T>;
96
- /**
97
- * Typed accessor wrapper around a headers record for reading domain headers.
98
- * Reduces repetitive `getDomainHeader` + `parseBool` / `parseJson` chains.
99
- */
100
- export interface DomainHeaderReader {
101
- /** Read a domain header as a string, or undefined if absent. */
102
- str(key: string): string | undefined;
103
- /** Read a domain header as a string, falling back to a default if absent. */
104
- strOr(key: string, fallback: string): string;
105
- /** Read a domain header as a boolean: `true` only for the exact string "true", `false` for any other present value, or undefined if absent. */
106
- bool(key: string): boolean | undefined;
107
- /** Read a domain header as parsed JSON, or undefined if absent or invalid. */
108
- json(key: string): unknown;
109
- }
110
- /**
111
- * Create a {@link DomainHeaderReader} over a headers record.
112
- * @param headers - The raw headers record to read domain headers from.
113
- * @returns A typed accessor for domain header values.
114
- */
115
- export declare const headerReader: (headers: Record<string, string>) => DomainHeaderReader;
116
- /**
117
- * Fluent builder for constructing domain header records with typed setters.
118
- * Mirrors {@link DomainHeaderReader} with the same method names for symmetry.
119
- * Undefined values are silently skipped on all setters.
120
- */
121
- export interface DomainHeaderWriter {
122
- /** Set a string domain header. Skips if value is undefined. */
123
- str(key: string, value: string | undefined): DomainHeaderWriter;
124
- /** Set a boolean domain header (serialized as "true"/"false"). Skips if value is undefined. */
125
- bool(key: string, value: boolean | undefined): DomainHeaderWriter;
126
- /** Set a JSON-serialized domain header. Skips if value is undefined or null. */
127
- json(key: string, value: unknown): DomainHeaderWriter;
128
- /** Return the accumulated headers record. */
129
- build(): Record<string, string>;
130
- }
131
- /**
132
- * Create a {@link DomainHeaderWriter} for building a codec-tier headers record.
133
- * @returns A fluent builder that accumulates codec headers under their bare keys.
134
- */
135
- export declare const headerWriter: () => DomainHeaderWriter;
136
104
  export {};