@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.
- package/README.md +10 -19
- package/dist/ably-ai-transport.js +1790 -1091
- 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 +2 -2
- package/dist/core/agent.d.ts +20 -5
- 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 +4 -1
- package/dist/core/codec/define-codec.d.ts +100 -0
- package/dist/core/codec/encoder.d.ts +2 -7
- 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 -1
- 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/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 +95 -36
- package/dist/core/codec/well-known-inputs.d.ts +52 -0
- package/dist/core/transport/agent-view.d.ts +296 -0
- package/dist/core/transport/decode-fold.d.ts +40 -32
- package/dist/core/transport/headers.d.ts +30 -1
- package/dist/core/transport/index.d.ts +1 -1
- package/dist/core/transport/invocation.d.ts +1 -1
- package/dist/core/transport/load-history-pages.d.ts +71 -0
- package/dist/core/transport/load-history.d.ts +21 -16
- package/dist/core/transport/run-manager.d.ts +9 -11
- package/dist/core/transport/session-support.d.ts +55 -0
- package/dist/core/transport/tree.d.ts +165 -15
- package/dist/core/transport/types/agent.d.ts +120 -98
- package/dist/core/transport/types/client.d.ts +45 -12
- package/dist/core/transport/types/tree.d.ts +52 -10
- package/dist/core/transport/types/view.d.ts +55 -28
- package/dist/core/transport/view.d.ts +176 -58
- package/dist/core/transport/wire-log.d.ts +102 -0
- package/dist/errors.d.ts +10 -4
- package/dist/index.d.ts +6 -5
- package/dist/react/ably-ai-transport-react.js +784 -415
- 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 +2 -1
- package/dist/react/contexts/client-session-provider.d.ts +3 -0
- package/dist/react/index.d.ts +2 -1
- package/dist/react/internal/skipped-session.d.ts +8 -0
- package/dist/react/use-view.d.ts +3 -3
- package/dist/utils.d.ts +22 -54
- package/dist/vercel/ably-ai-transport-vercel.js +2297 -2026
- 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 +1 -2
- 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 +5 -30
- 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 +20 -102
- package/dist/vercel/codec/tool-transitions.d.ts +0 -6
- package/dist/vercel/codec/wire-data.d.ts +34 -0
- package/dist/vercel/index.d.ts +1 -0
- package/dist/vercel/react/ably-ai-transport-vercel-react.js +2013 -9500
- 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 -70
- package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs.map +1 -1
- package/dist/vercel/react/contexts/chat-transport-context.d.ts +2 -1
- package/dist/vercel/run-end-reason.d.ts +66 -11
- package/dist/vercel/tool-part.d.ts +21 -0
- package/dist/vercel/transport/chat-transport.d.ts +0 -2
- package/dist/vercel/transport/index.d.ts +1 -1
- package/dist/vercel/transport/run-output-stream.d.ts +6 -8
- package/dist/version.d.ts +1 -1
- package/package.json +2 -2
- package/src/constants.ts +2 -2
- package/src/core/agent.ts +43 -19
- package/src/core/channel-options.ts +89 -0
- package/src/core/codec/codec-event.ts +27 -0
- package/src/core/codec/decoder.ts +145 -21
- package/src/core/codec/define-codec.ts +432 -0
- package/src/core/codec/encoder.ts +13 -54
- package/src/core/codec/field-bag.ts +142 -0
- package/src/core/codec/fields.ts +193 -0
- package/src/core/codec/index.ts +43 -0
- 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/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 +99 -36
- package/src/core/codec/well-known-inputs.ts +96 -0
- package/src/core/transport/agent-session.ts +330 -589
- package/src/core/transport/agent-view.ts +738 -0
- package/src/core/transport/client-session.ts +74 -69
- package/src/core/transport/decode-fold.ts +57 -47
- package/src/core/transport/headers.ts +57 -4
- package/src/core/transport/index.ts +2 -1
- package/src/core/transport/invocation.ts +1 -1
- package/src/core/transport/load-history-pages.ts +220 -0
- package/src/core/transport/load-history.ts +63 -61
- package/src/core/transport/pipe-stream.ts +10 -1
- package/src/core/transport/run-manager.ts +25 -31
- package/src/core/transport/session-support.ts +96 -0
- package/src/core/transport/tree.ts +414 -47
- package/src/core/transport/types/agent.ts +129 -102
- package/src/core/transport/types/client.ts +49 -13
- package/src/core/transport/types/tree.ts +61 -12
- package/src/core/transport/types/view.ts +57 -28
- package/src/core/transport/view.ts +520 -172
- package/src/core/transport/wire-log.ts +189 -0
- package/src/errors.ts +10 -3
- package/src/index.ts +44 -11
- package/src/react/contexts/client-session-context.ts +1 -1
- package/src/react/contexts/client-session-provider.tsx +38 -2
- package/src/react/index.ts +2 -1
- package/src/react/internal/skipped-session.ts +62 -0
- package/src/react/use-client-session.ts +7 -30
- package/src/react/use-view.ts +3 -3
- package/src/utils.ts +31 -97
- package/src/vercel/codec/decode-lifecycle.ts +70 -0
- package/src/vercel/codec/events.ts +1 -3
- 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 +23 -63
- 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 +52 -838
- package/src/vercel/codec/tool-transitions.ts +1 -12
- package/src/vercel/codec/wire-data.ts +64 -0
- package/src/vercel/index.ts +1 -0
- package/src/vercel/react/contexts/chat-transport-context.ts +1 -1
- package/src/vercel/react/use-chat-transport.ts +8 -28
- package/src/vercel/react/use-message-sync.ts +5 -10
- package/src/vercel/run-end-reason.ts +95 -16
- package/src/vercel/tool-part.ts +25 -0
- package/src/vercel/transport/chat-transport.ts +10 -22
- package/src/vercel/transport/index.ts +1 -1
- package/src/vercel/transport/run-output-stream.ts +7 -8
- package/src/version.ts +1 -1
- package/dist/core/transport/branch-chain.d.ts +0 -43
- package/dist/core/transport/load-conversation.d.ts +0 -128
- package/dist/vercel/codec/decoder.d.ts +0 -9
- package/dist/vercel/codec/encoder.d.ts +0 -11
- package/src/core/transport/branch-chain.ts +0 -58
- package/src/core/transport/load-conversation.ts +0 -355
- package/src/vercel/codec/decoder.ts +0 -696
- package/src/vercel/codec/encoder.ts +0 -548
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared lifecycle plumbing for the client and agent sessions.
|
|
3
|
+
*
|
|
4
|
+
* Both `DefaultClientSession` and `DefaultAgentSession` gate their writes on
|
|
5
|
+
* `connect()` having run, detach their channel best-effort on close, and react
|
|
6
|
+
* to channel continuity loss with the same detection rule and error shape.
|
|
7
|
+
* These helpers own that common machinery so the two sessions cannot drift on
|
|
8
|
+
* the connection guard, the detach-swallow behaviour, or — most importantly —
|
|
9
|
+
* the continuity-loss predicate, which encodes channel protocol semantics
|
|
10
|
+
* (Spec AIT-CT19 / AIT-ST12). Each session keeps its own divergent reaction to
|
|
11
|
+
* continuity loss (the client emits; the agent aborts runs and swaps its Tree).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import * as Ably from 'ably';
|
|
15
|
+
|
|
16
|
+
import { ErrorCode } from '../../errors.js';
|
|
17
|
+
import type { Logger } from '../../logger.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Resolve a session's connect guard: return the in-flight/settled connect
|
|
21
|
+
* promise, or reject with `InvalidArgument` when `connect()` has not been
|
|
22
|
+
* called. Callers `await` the result before any write.
|
|
23
|
+
* @param connectPromise - The session's connect promise, or `undefined` when not yet connected.
|
|
24
|
+
* @param method - The method name being guarded, for the error message.
|
|
25
|
+
* @returns The connect promise.
|
|
26
|
+
* @throws {Ably.ErrorInfo} `InvalidArgument` when `connectPromise` is `undefined`.
|
|
27
|
+
*/
|
|
28
|
+
export const requireConnected = async (connectPromise: Promise<void> | undefined, method: string): Promise<void> => {
|
|
29
|
+
if (!connectPromise) {
|
|
30
|
+
throw new Ably.ErrorInfo(
|
|
31
|
+
`unable to ${method}; connect() must be called before ${method}()`,
|
|
32
|
+
ErrorCode.InvalidArgument,
|
|
33
|
+
400,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return connectPromise;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Detach the session's channel on close, best-effort. `connect()` subscribes
|
|
41
|
+
* (which implicitly attaches), so a detach is only attempted when `connect()`
|
|
42
|
+
* ran. A detach failure (e.g. the channel is already FAILED) must not throw out
|
|
43
|
+
* of `close()`, so it is swallowed and logged at debug.
|
|
44
|
+
* @param channel - The session's channel.
|
|
45
|
+
* @param connectPromise - The session's connect promise; detach is skipped when `undefined`.
|
|
46
|
+
* @param logger - Logger for the swallowed-failure debug line, or `undefined`.
|
|
47
|
+
* @param component - The owning class name, used as the log message prefix.
|
|
48
|
+
*/
|
|
49
|
+
export const bestEffortDetach = async (
|
|
50
|
+
channel: Ably.RealtimeChannel,
|
|
51
|
+
connectPromise: Promise<void> | undefined,
|
|
52
|
+
logger: Logger | undefined,
|
|
53
|
+
component: string,
|
|
54
|
+
): Promise<void> => {
|
|
55
|
+
if (connectPromise === undefined) return;
|
|
56
|
+
try {
|
|
57
|
+
await channel.detach();
|
|
58
|
+
} catch (error) {
|
|
59
|
+
logger?.debug(`${component}.close(); channel detach failed`, { error });
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Whether a channel state change breaks message continuity:
|
|
65
|
+
* - FAILED, SUSPENDED, DETACHED — no more messages expected (or a gap)
|
|
66
|
+
* - ATTACHED with `resumed: false` (an UPDATE) — messages were lost
|
|
67
|
+
*
|
|
68
|
+
* The initial attach (ATTACHED with no prior attach) is the caller's concern
|
|
69
|
+
* and is not handled here.
|
|
70
|
+
* @param stateChange - The channel state change to classify.
|
|
71
|
+
* @returns True when continuity was lost.
|
|
72
|
+
*/
|
|
73
|
+
export const isContinuityLost = (stateChange: Ably.ChannelStateChange): boolean => {
|
|
74
|
+
const { current, resumed } = stateChange;
|
|
75
|
+
return (
|
|
76
|
+
current === 'failed' || current === 'suspended' || current === 'detached' || (current === 'attached' && !resumed)
|
|
77
|
+
);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Build the `ChannelContinuityLost` error for a continuity-breaking state
|
|
82
|
+
* change, attaching the state change's `reason` as `cause`.
|
|
83
|
+
* @param stateChange - The continuity-breaking state change.
|
|
84
|
+
* @param verb - The operation that can no longer proceed, for the
|
|
85
|
+
* `unable to <verb>; ...` message (e.g. "deliver events", "continue").
|
|
86
|
+
* @returns The continuity-loss error.
|
|
87
|
+
*/
|
|
88
|
+
export const continuityLostError = (stateChange: Ably.ChannelStateChange, verb: string): Ably.ErrorInfo => {
|
|
89
|
+
const { current } = stateChange;
|
|
90
|
+
return new Ably.ErrorInfo(
|
|
91
|
+
`unable to ${verb}; channel continuity lost (${current}${current === 'attached' ? ', resumed: false' : ''})`,
|
|
92
|
+
ErrorCode.ChannelContinuityLost,
|
|
93
|
+
500,
|
|
94
|
+
stateChange.reason,
|
|
95
|
+
);
|
|
96
|
+
};
|