@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
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Per-node event log.
3
+ *
4
+ * Each node retains the decoded events it was folded from, grouped by
5
+ * wire-message serial and ordered ascending by serial. The log captures
6
+ * canonical serial order regardless of delivery order, so a node's event
7
+ * sequence can be re-derived in that order even when wires arrive late
8
+ * (cross-publisher reordering) or out of order (history pages applying older
9
+ * messages after newer ones).
10
+ *
11
+ * Within one serial, deliveries are sequenced by `Message.version.serial`
12
+ * (lexicographically ordered per mutation — platform guarantee): each entry
13
+ * records the highest version decoded into it, so a delivery the entry has
14
+ * already incorporated — a whole-wire replay from a second hydration, a
15
+ * remount, or an agent re-walk — is recognised and dropped at the transport.
16
+ *
17
+ * {@link WireLog} encapsulates the entry list and all of its mutation: the
18
+ * caller hands it a wire and is told only how to fold (see {@link WireLogFold}).
19
+ */
20
+ /** How a {@link WireLog.record} call tells the caller to fold the wire's events. */
21
+ export type WireLogFold =
22
+ /**
23
+ * The version guard rejected a re-delivery the log already incorporated — a
24
+ * whole-wire replay, or a newer version of a non-streamed wire (an edited
25
+ * discrete). Nothing was recorded; fold nothing.
26
+ */
27
+ 'dropped'
28
+ /**
29
+ * The events extend the log tail (in-order delivery) or landed on a swept
30
+ * log; fold them onto the node's existing projection.
31
+ */
32
+ | 'incremental'
33
+ /**
34
+ * An earlier-serial wire arrived late, so incremental folding would corrupt
35
+ * serial order; rebuild the projection from the whole log via {@link replay}.
36
+ */
37
+ | 'refold';
38
+ /**
39
+ * A node's event log: one entry per wire-message serial, kept ascending by
40
+ * serial, each accumulating that serial's decoded events in arrival order.
41
+ */
42
+ export declare class WireLog<TEvent> {
43
+ private readonly _entries;
44
+ private _swept;
45
+ /**
46
+ * Whether the retention sweep has dropped this log's decoded payloads. A
47
+ * swept log keeps each entry's replay key (serial + `decodedThrough`) so it
48
+ * still recognises whole-wire replays, but it can no longer be refolded.
49
+ * @returns True once {@link sweep} has run.
50
+ */
51
+ get swept(): boolean;
52
+ /**
53
+ * Record a wire message's decoded events and report how to fold them.
54
+ *
55
+ * Events for an already-logged serial are guarded by the entry's
56
+ * `decodedThrough` version before being recorded; a new serial is inserted
57
+ * at the position that keeps the log ascending by serial (Ably serials order
58
+ * lexicographically). The version guard fires only for deliveries carrying
59
+ * an explicit `version.serial`: in-contract mutations always do, while a
60
+ * version-less delivery records unguarded (and never advances
61
+ * `decodedThrough`), matching the decoder's convention.
62
+ *
63
+ * On a swept log the payload is not retained (only the replay key is), so
64
+ * the fold is never `refold` — a genuinely-new wire there is outside the
65
+ * reorder window and folds incrementally in arrival order.
66
+ * @param serial - The Ably channel serial of the wire message.
67
+ * @param messageId - The wire's codec-message-id, or undefined.
68
+ * @param events - The decoded events to record, in arrival order.
69
+ * @param version - The delivery's `Message.version.serial`, or undefined
70
+ * when the delivery carried none (guard disabled for this delivery).
71
+ * @param streamed - Whether the delivery is part of a streamed wire; a
72
+ * guarded newer delivery for a non-streamed wire is an edited discrete and
73
+ * is dropped.
74
+ * @returns How the caller should fold the events.
75
+ */
76
+ record(serial: string, messageId: string | undefined, events: TEvent[], version: string | undefined, streamed: boolean): WireLogFold;
77
+ /**
78
+ * Replay every recorded event in canonical order — wire messages ascending
79
+ * by serial, events within a wire in arrival order — each with its wire's
80
+ * routing metadata, for a refold.
81
+ * @param visit - Called once per event, in canonical order.
82
+ */
83
+ replay(visit: (event: TEvent, serial: string, messageId: string | undefined) => void): void;
84
+ /**
85
+ * Drop the decoded payloads (the unbounded cost) but keep each entry's
86
+ * replay key, so a post-sweep whole-wire replay is still recognised and
87
+ * dropped rather than re-folded. The log becomes {@link swept}; a refold can
88
+ * no longer rebuild the dropped events, which `swept` reflects.
89
+ */
90
+ sweep(): void;
91
+ /**
92
+ * Insert or extend the entry for `serial`, guarding replays by version.
93
+ * @param serial - The Ably channel serial of the wire message.
94
+ * @param messageId - The wire's codec-message-id, or undefined.
95
+ * @param events - The decoded events to store (empty on a swept log).
96
+ * @param version - The delivery's `Message.version.serial`, or undefined.
97
+ * @param streamed - Whether the delivery is part of a streamed wire.
98
+ * @returns The index of the entry the events landed in, or `undefined` when
99
+ * the version guard dropped the delivery.
100
+ */
101
+ private _recordEntry;
102
+ }
package/dist/errors.d.ts CHANGED
@@ -59,11 +59,17 @@ export declare enum ErrorCode {
59
59
  */
60
60
  StreamError = 104008,
61
61
  /**
62
- * The agent attached to the channel and waited for the input event(s) the
63
- * invocation points at (rewind + live wait) but `inputEventLookupTimeoutMs`
64
- * lapsed without seeing them.
62
+ * The agent waited for the input event(s) the invocation points at —
63
+ * across the bounded history scan and the live subscription but
64
+ * `inputEventLookupTimeoutMs` lapsed without seeing them.
65
65
  */
66
- InputEventNotFound = 104010
66
+ InputEventNotFound = 104010,
67
+ /**
68
+ * Channel history pagination failed after bounded retry — either the initial
69
+ * `channel.history()` call or a subsequent `page.next()` exhausted its
70
+ * retry budget. The original failure is preserved as `cause`.
71
+ */
72
+ HistoryFetchFailed = 104011
67
73
  }
68
74
  /**
69
75
  * Returns true if the {@link Ably.ErrorInfo} code matches the provided ErrorCode value.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- export type { ActiveRun, AgentSession, AgentSessionOptions, BranchSelection, CancelRequest, ClientSession, ClientSessionOptions, ConversationNode, EventsNode, InputNode, InvocationData, LoadConversationOptions, MessageNode, OutputEvent, PipeOptions, Run, RunEndReason, RunInfo, RunLifecycleEvent, RunNode, RunRuntime, RunView, SendOptions, StreamResult, Tree, View, } from './core/transport/index.js';
1
+ export type { ActiveRun, AgentSession, AgentSessionOptions, BranchSelection, CancelRequest, ClientSession, ClientSessionOptions, ConversationNode, InputNode, InvocationData, LoadConversationOptions, MessageNode, OutputEvent, PipeOptions, Run, RunEndParams, RunEndReason, RunInfo, RunLifecycleEvent, RunNode, RunNodeState, RunRuntime, RunView, SendOptions, StreamResult, Tree, View, } from './core/transport/index.js';
2
2
  export { buildTransportHeaders, createAgentSession, createClientSession, Invocation } from './core/transport/index.js';
3
- export type { ChannelWriter, Codec, CodecInputEvent, CodecMessage, CodecOutputEvent, DecodedMessage, Decoder, DecoderCore, DecoderCoreHooks, DecoderCoreOptions, Encoder, EncoderCore, EncoderCoreOptions, EncoderOptions, Extras, LifecycleTracker, MessagePayload, PhaseConfig, Reducer, ReducerMeta, Regenerate, StreamPayload, StreamTrackerState, ToolApprovalResponse, ToolResult, ToolResultError, UserMessage, WriteOptions, } from './core/codec/index.js';
4
- export { createDecoderCore, createEncoderCore, createLifecycleTracker } from './core/codec/index.js';
3
+ export { OBJECT_MODES } from './core/channel-options.js';
4
+ export type { BatchAssembleContext, BatchMessageHeaders, BatchSpec, ChannelWriter, Codec, CodecEvent, CodecInputEvent, CodecMessage, CodecOutputEvent, CodecReducer, DataCodec, DecodedMessage, Decoder, DecoderCore, DecoderCoreHooks, DecoderCoreOptions, DefineCodecConfig, DefinedCodec, Encoder, EncoderCore, EncoderCoreOptions, EncoderOptions, EscapeHatchCore, Extras, FieldFor, HeaderBuilder, HeaderField, InputBuilder, InputDescriptor, InputEventSpec, LifecycleDiscreteContext, LifecyclePolicy, LifecycleTracker, MessagePayload, OutputBuilder, OutputDecodeContext, OutputDescriptor, OutputEncodeHatchContext, OutputEventSpec, OutputStreamEndContext, OutputStreamSpec, PartBuilder, PartSpec, PhaseConfig, Reducer, ReducerMeta, Regenerate, StreamPayload, StreamTrackerState, ToolApprovalResponse, ToolResult, ToolResultError, UserMessage, WellKnownInputFactories, WriteOptions, } from './core/codec/index.js';
5
+ export { boolField, createDecoderCore, createEncoderCore, createLifecycleTracker, defineCodec, enumField, jsonField, strField, } from './core/codec/index.js';
5
6
  export { EVENT_CANCEL, EVENT_RUN_END, EVENT_RUN_START, HEADER_CODEC_MESSAGE_ID, HEADER_ERROR_CODE, HEADER_ERROR_MESSAGE, HEADER_FORK_OF, HEADER_INPUT_CLIENT_ID, HEADER_MSG_REGENERATE, HEADER_PARENT, HEADER_ROLE, HEADER_RUN_CLIENT_ID, HEADER_RUN_ID, HEADER_RUN_REASON, HEADER_STATUS, HEADER_STREAM, HEADER_STREAM_ID, } from './constants.js';
6
- export type { DomainHeaderReader, DomainHeaderWriter, Stripped } from './utils.js';
7
- export { getCodecHeaders, getTransportHeaders, headerReader, headerWriter, mergeHeaders, stripUndefined, } from './utils.js';
7
+ export type { Stripped } from './utils.js';
8
+ export { getCodecHeaders, getTransportHeaders, mergeHeaders, stripUndefined } from './utils.js';
8
9
  export { EventEmitter } from './event-emitter.js';
9
10
  export { ErrorCode, errorInfoIs } from './errors.js';
10
11
  export type { LogContext, Logger, LoggerOptions, LogHandler } from './logger.js';