@copilotkit/channels-core 0.5.0 → 0.5.1-canary.1785633429
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 +35 -14
- package/dist/action-registry.d.ts +15 -3
- package/dist/action-registry.d.ts.map +1 -1
- package/dist/action-registry.js +61 -9
- package/dist/action-registry.test.js +107 -2
- package/dist/action-store.d.ts +23 -0
- package/dist/action-store.d.ts.map +1 -1
- package/dist/action-store.js +11 -0
- package/dist/canonical-run-loop.test.js +6 -1
- package/dist/channel-identity.test.d.ts +2 -0
- package/dist/channel-identity.test.d.ts.map +1 -0
- package/dist/channel-identity.test.js +297 -0
- package/dist/channel-memory.test.d.ts +2 -0
- package/dist/channel-memory.test.d.ts.map +1 -0
- package/dist/channel-memory.test.js +199 -0
- package/dist/commands.d.ts +5 -3
- package/dist/commands.d.ts.map +1 -1
- package/dist/create-channel.d.ts +30 -56
- package/dist/create-channel.d.ts.map +1 -1
- package/dist/create-channel.foundations.test.js +30 -7
- package/dist/create-channel.js +209 -72
- package/dist/create-channel.test.js +293 -66
- package/dist/hitl-continuation.test.d.ts +2 -0
- package/dist/hitl-continuation.test.d.ts.map +1 -0
- package/dist/hitl-continuation.test.js +393 -0
- package/dist/identity.d.ts +51 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +56 -0
- package/dist/identity.test.d.ts +2 -0
- package/dist/identity.test.d.ts.map +1 -0
- package/dist/identity.test.js +109 -0
- package/dist/index.d.ts +10 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/managed-v1-await-choice-guard.test.js +4 -1
- package/dist/memory.d.ts +23 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +25 -0
- package/dist/modal-submit.test.js +21 -6
- package/dist/open-modal.test.js +16 -4
- package/dist/platform-adapter.d.ts +29 -6
- package/dist/platform-adapter.d.ts.map +1 -1
- package/dist/platform-adapter.test.js +2 -0
- package/dist/reactions.test.js +49 -11
- package/dist/run-loop.test.js +30 -5
- package/dist/sanitize-agent-events.test.js +2 -0
- package/dist/source-platform.test.js +24 -9
- package/dist/state/kv-action-store.d.ts.map +1 -1
- package/dist/state/kv-action-store.js +1 -0
- package/dist/state/kv-action-store.test.js +11 -0
- package/dist/state/memory-store.d.ts +1 -0
- package/dist/state/memory-store.d.ts.map +1 -1
- package/dist/state/memory-store.js +9 -0
- package/dist/state/state-store.d.ts +2 -0
- package/dist/state/state-store.d.ts.map +1 -1
- package/dist/telemetry/create-channel-telemetry.test.js +4 -2
- package/dist/telemetry/e2e-telemetry.test.js +1 -0
- package/dist/telemetry/install-id.test.js +5 -0
- package/dist/testing/fake-adapter.d.ts +26 -9
- package/dist/testing/fake-adapter.d.ts.map +1 -1
- package/dist/testing/fake-adapter.js +65 -21
- package/dist/testing/state-store-conformance.d.ts.map +1 -1
- package/dist/testing/state-store-conformance.js +16 -0
- package/dist/thread-capabilities.test.js +29 -9
- package/dist/thread-ephemeral.test.js +8 -5
- package/dist/thread-promise-contract.test.js +4 -0
- package/dist/thread-reactions.test.js +8 -2
- package/dist/thread.d.ts +50 -7
- package/dist/thread.d.ts.map +1 -1
- package/dist/thread.js +163 -17
- package/dist/thread.test.js +4 -0
- package/dist/tools.d.ts +5 -3
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +2 -1
- package/dist/transcripts.d.ts +6 -13
- package/dist/transcripts.d.ts.map +1 -1
- package/dist/transcripts.js +12 -12
- package/dist/transcripts.test.js +28 -29
- package/dist/welcome.test.d.ts +2 -0
- package/dist/welcome.test.d.ts.map +1 -0
- package/dist/welcome.test.js +53 -0
- package/package.json +5 -5
package/dist/create-channel.d.ts
CHANGED
|
@@ -5,9 +5,10 @@ import type { ChannelTool, ContextEntry } from "./tools.js";
|
|
|
5
5
|
import type { ChannelCommand, CommandContext } from "./commands.js";
|
|
6
6
|
import { Thread } from "./thread.js";
|
|
7
7
|
import type { AbstractAgent } from "@ag-ui/client";
|
|
8
|
-
import type { ChannelMessage, InteractionContext, IncomingMessage,
|
|
8
|
+
import type { ChannelMessage, InteractionContext, IncomingMessage, ProviderActor, ApplicationUser, EmojiValue, ComponentFn, MessageRef } from "@copilotkit/channels-ui";
|
|
9
9
|
import { Transcripts } from "./transcripts.js";
|
|
10
|
-
import type {
|
|
10
|
+
import type { TranscriptsConfig } from "./transcripts.js";
|
|
11
|
+
import type { ChannelIdentifyUser } from "./identity.js";
|
|
11
12
|
import type { StandardSchemaV1, InferSchemaOutput } from "./standard-schema.js";
|
|
12
13
|
export type LockConflictDecision = "drop" | "force";
|
|
13
14
|
/**
|
|
@@ -53,28 +54,6 @@ export declare function resolveChannelConcurrency(cfg: {
|
|
|
53
54
|
concurrency?: ChannelConcurrency;
|
|
54
55
|
onLockConflict?: LockConflictDecision | ((conversationKey: string, message: IncomingMessage) => LockConflictDecision | Promise<LockConflictDecision>);
|
|
55
56
|
}): ChannelConcurrency | "legacy-callback";
|
|
56
|
-
/**
|
|
57
|
-
* The managed delivery provider a no-adapter Channel targets when it is
|
|
58
|
-
* activated through CopilotKit Intelligence.
|
|
59
|
-
*
|
|
60
|
-
* This is the platform the runtime *declares* to the Intelligence gateway on
|
|
61
|
-
* join; the gateway resolves the actual connection (workspace, credentials,
|
|
62
|
-
* transport) for that provider. It is a per-Channel choice — one runtime can
|
|
63
|
-
* declare a Slack-backed Channel and a Teams-backed Channel side by side.
|
|
64
|
-
*
|
|
65
|
-
* A CLOSED union of the providers the gateway has real/coordinated support for.
|
|
66
|
-
* `"slack"` is generally available. `"teams"` is GATED/COORDINATED: the gateway
|
|
67
|
-
* accepts only `"slack"` at join today, so declaring `provider: "teams"` is
|
|
68
|
-
* SDK-ready but NOT generally available until the coordinated gateway path lands
|
|
69
|
-
* (Intelligence OSS-450 / #511).
|
|
70
|
-
*
|
|
71
|
-
* Distinct from a {@link PlatformAdapter} attached via
|
|
72
|
-
* `createChannel({ adapters })` / `channel.ɵruntime.addAdapter`: an adapter is
|
|
73
|
-
* a *direct*, developer-owned connection this handler does not manage,
|
|
74
|
-
* whereas `provider` selects the *managed* platform for a Channel with no
|
|
75
|
-
* adapters.
|
|
76
|
-
*/
|
|
77
|
-
export type ManagedChannelProvider = "slack" | "teams";
|
|
78
57
|
/**
|
|
79
58
|
* Any `@copilotkit/channels-ui` component function, regardless of its props type.
|
|
80
59
|
* Accepting `(props: never)` lets a component with required, strongly-typed
|
|
@@ -90,7 +69,15 @@ export type ChannelHandler<TState = unknown> = (ctx: {
|
|
|
90
69
|
/** Handler for a "conversation opened" lifecycle event (e.g. the Slack assistant pane). */
|
|
91
70
|
export type ThreadStartHandler<TState = unknown> = (ctx: {
|
|
92
71
|
thread: StatefulThread<TState>;
|
|
93
|
-
user
|
|
72
|
+
user: ApplicationUser | null;
|
|
73
|
+
actor: ProviderActor;
|
|
74
|
+
}) => void | Promise<void>;
|
|
75
|
+
/** Handler for a provider installation or conversation activation. */
|
|
76
|
+
export type WelcomeHandler<TState = unknown> = (ctx: {
|
|
77
|
+
thread: StatefulThread<TState>;
|
|
78
|
+
user: ApplicationUser | null;
|
|
79
|
+
actor: ProviderActor;
|
|
80
|
+
platform: string;
|
|
94
81
|
}) => void | Promise<void>;
|
|
95
82
|
/** Event passed to an `onReaction` handler. */
|
|
96
83
|
export interface ReactionEvent {
|
|
@@ -101,7 +88,8 @@ export interface ReactionEvent {
|
|
|
101
88
|
/** true = added, false = removed. */
|
|
102
89
|
added: boolean;
|
|
103
90
|
/** The reacting user, when the platform reports one. */
|
|
104
|
-
user
|
|
91
|
+
user: ApplicationUser | null;
|
|
92
|
+
actor: ProviderActor;
|
|
105
93
|
messageId: string;
|
|
106
94
|
/** Update-capable ref to the reacted message (`thread.update(messageRef, ui)`). */
|
|
107
95
|
messageRef: MessageRef;
|
|
@@ -115,7 +103,8 @@ export type ReactionHandler = (evt: ReactionEvent) => void | Promise<void>;
|
|
|
115
103
|
export interface ModalSubmitEvent {
|
|
116
104
|
callbackId: string;
|
|
117
105
|
values: Record<string, unknown>;
|
|
118
|
-
user
|
|
106
|
+
user: ApplicationUser | null;
|
|
107
|
+
actor: ProviderActor;
|
|
119
108
|
/** Present when the submission carried a conversation context. */
|
|
120
109
|
thread?: Thread;
|
|
121
110
|
privateMetadata?: string;
|
|
@@ -125,7 +114,8 @@ export type ModalSubmitHandler = (evt: ModalSubmitEvent) => ModalSubmitResult |
|
|
|
125
114
|
/** Event passed to an `onModalClose` handler. */
|
|
126
115
|
export interface ModalCloseEvent {
|
|
127
116
|
callbackId: string;
|
|
128
|
-
user
|
|
117
|
+
user: ApplicationUser | null;
|
|
118
|
+
actor: ProviderActor;
|
|
129
119
|
privateMetadata?: string;
|
|
130
120
|
raw: unknown;
|
|
131
121
|
}
|
|
@@ -147,9 +137,7 @@ export interface StoreConfig<TStateSchema extends StandardSchemaV1 | undefined =
|
|
|
147
137
|
adapter?: StateStore;
|
|
148
138
|
/** Standard Schema for per-thread state. When set, thread.state()/setState() are typed to its output and setState validates at runtime. */
|
|
149
139
|
state?: TStateSchema;
|
|
150
|
-
/**
|
|
151
|
-
identity?: Identity;
|
|
152
|
-
/** Cross-platform transcript storage config. Paired with `identity`. */
|
|
140
|
+
/** Cross-platform transcript storage keyed by the identified application user. */
|
|
153
141
|
transcripts?: TranscriptsConfig;
|
|
154
142
|
/**
|
|
155
143
|
* How overlapping turns on the same conversationKey are handled.
|
|
@@ -168,6 +156,8 @@ export interface StoreConfig<TStateSchema extends StandardSchemaV1 | undefined =
|
|
|
168
156
|
lockTtl?: number;
|
|
169
157
|
/** TTL (ms) for the inbound event dedup window. Default 300_000. */
|
|
170
158
|
dedupTtl?: number;
|
|
159
|
+
/** TTL (ms) for durable actions and HITL continuations. Default 604_800_000 (7 days). */
|
|
160
|
+
actionRetentionMs?: number;
|
|
171
161
|
}
|
|
172
162
|
/**
|
|
173
163
|
* Tuning for how a long reply is spread across continuation messages.
|
|
@@ -197,6 +187,8 @@ export interface ReplyContinuationOptions {
|
|
|
197
187
|
readonly truncationMarker?: string;
|
|
198
188
|
}
|
|
199
189
|
export interface CreateChannelOptions<TStateSchema extends StandardSchemaV1 | undefined = undefined> {
|
|
190
|
+
/** Select the canonical application user for every incoming Channel event. */
|
|
191
|
+
identifyUser: ChannelIdentifyUser;
|
|
200
192
|
/**
|
|
201
193
|
* Project-unique Intelligence Channel name. Required for Intelligence Channel
|
|
202
194
|
* Bots — it ties the runtime declaration to the Intelligence setup — and
|
|
@@ -210,22 +202,6 @@ export interface CreateChannelOptions<TStateSchema extends StandardSchemaV1 | un
|
|
|
210
202
|
* (the Channel runtime uses this).
|
|
211
203
|
*/
|
|
212
204
|
adapters?: PlatformAdapter[];
|
|
213
|
-
/**
|
|
214
|
-
* The managed delivery provider this Channel targets when it is activated via
|
|
215
|
-
* CopilotKit Intelligence (a no-adapter, managed Channel). The runtime
|
|
216
|
-
* declares this provider to the Intelligence gateway on join; the gateway
|
|
217
|
-
* resolves the actual connection. Defaults to `"slack"` when unset.
|
|
218
|
-
*
|
|
219
|
-
* `provider: "teams"` is GATED: it is SDK-ready, but the gateway accepts only
|
|
220
|
-
* `"slack"` at join today, so Teams is not generally available until the
|
|
221
|
-
* coordinated gateway path lands (Intelligence OSS-450 / #511). See
|
|
222
|
-
* {@link ManagedChannelProvider}.
|
|
223
|
-
*
|
|
224
|
-
* Ignored for direct-adapter Channels (those created with `adapters` /
|
|
225
|
-
* `channel.ɵruntime.addAdapter`) — a direct Channel is owned by the
|
|
226
|
-
* developer's own adapter, not by managed activation.
|
|
227
|
-
*/
|
|
228
|
-
provider?: ManagedChannelProvider;
|
|
229
205
|
/**
|
|
230
206
|
* Override visible tool-call progress for a managed Channel. Managed Slack
|
|
231
207
|
* defaults to hidden; other managed providers retain their existing default
|
|
@@ -277,13 +253,6 @@ export interface Channel<TState = unknown> {
|
|
|
277
253
|
readonly name?: string;
|
|
278
254
|
/** Adapters currently attached to this Channel (read-only snapshot). The Channel runtime uses this to distinguish a managed-eligible Channel (no adapters) from one carrying developer-supplied direct adapters. */
|
|
279
255
|
readonly adapters: readonly PlatformAdapter[];
|
|
280
|
-
/**
|
|
281
|
-
* The managed delivery provider a no-adapter Channel targets when activated
|
|
282
|
-
* via CopilotKit Intelligence (from `createChannel({ provider })`). Declared
|
|
283
|
-
* to the Intelligence gateway on join; `undefined` means the managed default
|
|
284
|
-
* (`"slack"`). Ignored for direct-adapter Channels.
|
|
285
|
-
*/
|
|
286
|
-
readonly provider?: ManagedChannelProvider;
|
|
287
256
|
/**
|
|
288
257
|
* Managed tool-call visibility override from
|
|
289
258
|
* `createChannel({ showToolStatus })`. Managed Slack defaults to hidden when
|
|
@@ -299,6 +268,8 @@ export interface Channel<TState = unknown> {
|
|
|
299
268
|
readonly commandNames: string[];
|
|
300
269
|
onMention(h: ChannelHandler<TState>): void;
|
|
301
270
|
onMessage(h: ChannelHandler<TState>): void;
|
|
271
|
+
/** Welcome a newly installed or activated provider conversation. */
|
|
272
|
+
onWelcome(h: WelcomeHandler<TState>): void;
|
|
302
273
|
/**
|
|
303
274
|
* A conversation surface opened (e.g. the Slack assistant pane). Greet, set
|
|
304
275
|
* suggested prompts, set a title, or run the agent. Adapters without the
|
|
@@ -315,6 +286,8 @@ export interface Channel<TState = unknown> {
|
|
|
315
286
|
onInterrupt<TPayload = unknown>(eventName: string, h: (args: {
|
|
316
287
|
payload: TPayload;
|
|
317
288
|
thread: StatefulThread<TState>;
|
|
289
|
+
user: ApplicationUser | null;
|
|
290
|
+
actor: ProviderActor;
|
|
318
291
|
}) => void | Promise<void>): void;
|
|
319
292
|
/** Register a slash command (with optional typed options). */
|
|
320
293
|
onCommand(command: ChannelCommand): void;
|
|
@@ -333,14 +306,15 @@ export interface Channel<TState = unknown> {
|
|
|
333
306
|
/**
|
|
334
307
|
* Internal lifecycle seam. Holds the `start`/`stop`/`addAdapter`
|
|
335
308
|
* implementations that the runtime uses to drive the lifecycle directly —
|
|
336
|
-
* there is no public equivalent; channels are runtime-driven only.
|
|
337
|
-
* managed provider off the top-level `channel.provider`, not here.)
|
|
309
|
+
* there is no public equivalent; channels are runtime-driven only.
|
|
338
310
|
* @internal
|
|
339
311
|
*/
|
|
340
312
|
ɵruntime: {
|
|
341
313
|
start(): Promise<void>;
|
|
342
314
|
stop(): Promise<void>;
|
|
343
315
|
addAdapter(adapter: PlatformAdapter): void;
|
|
316
|
+
/** @internal Mark this Channel as attached to an Intelligence Memory backend. */
|
|
317
|
+
enableIntelligenceMemory(): void;
|
|
344
318
|
};
|
|
345
319
|
}
|
|
346
320
|
export declare function createChannel<TStateSchema extends StandardSchemaV1 | undefined = undefined>(opts: CreateChannelOptions<TStateSchema>): Channel<ThreadStateOf<TStateSchema>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-channel.d.ts","sourceRoot":"","sources":["../src/create-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,
|
|
1
|
+
{"version":3,"file":"create-channel.d.ts","sourceRoot":"","sources":["../src/create-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAUf,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,eAAe,EACf,UAAU,EAGV,WAAW,EACX,UAAU,EACX,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAgChF,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,MAAM,GACf,aAAa,CAkCf;AAyCD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE;IAC7C,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,cAAc,CAAC,EACX,oBAAoB,GACpB,CAAC,CACC,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,eAAe,KACrB,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;CAChE,GAAG,kBAAkB,GAAG,iBAAiB,CAMzC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,UAAU,CAAC,WAAW,CAAC,CAAC;AAEzE,MAAM,MAAM,cAAc,CAAC,MAAM,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE;IACnD,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,cAAc,CAAC;CACzB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B,2FAA2F;AAC3F,MAAM,MAAM,kBAAkB,CAAC,MAAM,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE;IACvD,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;CACtB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B,sEAAsE;AACtE,MAAM,MAAM,cAAc,CAAC,MAAM,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE;IACnD,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,KAAK,EAAE,UAAU,CAAC;IAClB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,wDAAwD;IACxD,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;IACzB,GAAG,EAAE,OAAO,CAAC;CACd;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3E,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,OAAO,CAAC;CACd;AACD,MAAM,MAAM,kBAAkB,GAAG,CAC/B,GAAG,EAAE,gBAAgB,KAClB,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;AAElE,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,OAAO,CAAC;CACd;AACD,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/E,gFAAgF;AAChF,KAAK,aAAa,CAAC,OAAO,SAAS,gBAAgB,GAAG,SAAS,IAC7D,OAAO,SAAS,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAE1E,mFAAmF;AACnF,MAAM,MAAM,cAAc,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACtC,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,WAAW,CAC1B,YAAY,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS;IAE7D,0FAA0F;IAC1F,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,2IAA2I;IAC3I,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,kFAAkF;IAClF,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;;;;OAMG;IACH,cAAc,CAAC,EACX,oBAAoB,GACpB,CAAC,CACC,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,eAAe,KACrB,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC/D,kGAAkG;IAClG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB,CACnC,YAAY,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS;IAE7D,8EAA8E;IAC9E,YAAY,EAAE,mBAAmB,CAAC;IAClC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C,KAAK,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,aAAa,CAAC,CAAC;IAC9D;;;;;;;;;;;;OAYG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gDAAgD;IAChD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,kFAAkF;IAClF,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,gFAAgF;IAChF,KAAK,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,OAAO,CAAC,MAAM,GAAG,OAAO;IACvC,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,oNAAoN;IACpN,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IACtD,2FAA2F;IAC3F,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAChC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,oEAAoE;IACpE,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C;;;;OAIG;IACH,eAAe,CAAC,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACrD,wFAAwF;IACxF,aAAa,CAAC,MAAM,GAAG,OAAO,EAC5B,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC3D,IAAI,CAAC;IACR;;;;OAIG;IACH,WAAW,CAAC,QAAQ,GAAG,OAAO,EAC5B,SAAS,EAAE,MAAM,EACjB,CAAC,EAAE,CAAC,IAAI,EAAE;QACR,OAAO,EAAE,QAAQ,CAAC;QAClB,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;QAC7B,KAAK,EAAE,aAAa,CAAC;KACtB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACzB,IAAI,CAAC;IACR,8DAA8D;IAC9D,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IACzC,kDAAkD;IAClD,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACrD,IAAI,CAAC;IACR,kGAAkG;IAClG,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7E,uFAAuF;IACvF,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACrE,uEAAuE;IACvE,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnE,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,kFAAkF;IAClF,WAAW,EAAE,WAAW,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,EAAE;QACR,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;QAC3C,iFAAiF;QACjF,wBAAwB,IAAI,IAAI,CAAC;KAClC,CAAC;CACH;AA0FD,wBAAgB,aAAa,CAC3B,YAAY,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAE7D,IAAI,EAAE,oBAAoB,CAAC,YAAY,CAAC,GACvC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAg8BtC"}
|
|
@@ -4,16 +4,34 @@ import { FakeAdapter } from "./testing/fake-adapter.js";
|
|
|
4
4
|
import { FakeAgent } from "./testing/fake-agent.js";
|
|
5
5
|
import { MemoryStore } from "./state/memory-store.js";
|
|
6
6
|
const tick = () => new Promise((r) => setTimeout(r, 0));
|
|
7
|
+
class ManagedFakeAdapter extends FakeAdapter {
|
|
8
|
+
__intelligenceChannel = true;
|
|
9
|
+
}
|
|
7
10
|
describe("createChannel — optional adapters + addAdapter", () => {
|
|
11
|
+
it("allows a managed delivery adapter to coexist with a direct adapter", async () => {
|
|
12
|
+
const managed = new ManagedFakeAdapter({ platform: "intelligence" });
|
|
13
|
+
const direct = new FakeAdapter({ platform: "direct" });
|
|
14
|
+
const channel = createChannel({
|
|
15
|
+
identifyUser: "platform",
|
|
16
|
+
adapters: [managed, direct],
|
|
17
|
+
});
|
|
18
|
+
await channel.ɵruntime.start();
|
|
19
|
+
expect(managed.started).toBe(true);
|
|
20
|
+
expect(direct.started).toBe(true);
|
|
21
|
+
});
|
|
8
22
|
it("starts with no adapters and runs one added before start()", async () => {
|
|
9
23
|
const fake = new FakeAdapter();
|
|
10
|
-
const channel = createChannel({
|
|
24
|
+
const channel = createChannel({
|
|
25
|
+
identifyUser: "platform",
|
|
26
|
+
agent: () => new FakeAgent(),
|
|
27
|
+
});
|
|
11
28
|
channel.ɵruntime.addAdapter(fake);
|
|
12
29
|
await channel.ɵruntime.start();
|
|
13
30
|
expect(fake.started).toBe(true);
|
|
14
31
|
});
|
|
15
32
|
it("throws when addAdapter is called after start()", async () => {
|
|
16
33
|
const channel = createChannel({
|
|
34
|
+
identifyUser: "platform",
|
|
17
35
|
adapters: [new FakeAdapter()],
|
|
18
36
|
agent: () => new FakeAgent(),
|
|
19
37
|
});
|
|
@@ -23,6 +41,7 @@ describe("createChannel — optional adapters + addAdapter", () => {
|
|
|
23
41
|
it("is idempotent: a second start() does not re-start adapters or rebuild state", async () => {
|
|
24
42
|
const fake = new FakeAdapter();
|
|
25
43
|
const channel = createChannel({
|
|
44
|
+
identifyUser: "platform",
|
|
26
45
|
adapters: [fake],
|
|
27
46
|
agent: () => new FakeAgent(),
|
|
28
47
|
});
|
|
@@ -37,6 +56,7 @@ describe("createChannel — optional adapters + addAdapter", () => {
|
|
|
37
56
|
it("allows a real restart after stop() (start → stop → start re-inits)", async () => {
|
|
38
57
|
const fake = new FakeAdapter();
|
|
39
58
|
const channel = createChannel({
|
|
59
|
+
identifyUser: "platform",
|
|
40
60
|
adapters: [fake],
|
|
41
61
|
agent: () => new FakeAgent(),
|
|
42
62
|
});
|
|
@@ -50,11 +70,11 @@ describe("createChannel — optional adapters + addAdapter", () => {
|
|
|
50
70
|
describe("createChannel — transcripts deferred to start()", () => {
|
|
51
71
|
it("throws if channel.transcripts is accessed before start()", () => {
|
|
52
72
|
const channel = createChannel({
|
|
73
|
+
identifyUser: "platform",
|
|
53
74
|
adapters: [new FakeAdapter()],
|
|
54
75
|
agent: () => new FakeAgent(),
|
|
55
76
|
store: {
|
|
56
77
|
adapter: new MemoryStore(),
|
|
57
|
-
identity: () => "u@x.com",
|
|
58
78
|
transcripts: {},
|
|
59
79
|
},
|
|
60
80
|
});
|
|
@@ -67,25 +87,26 @@ describe("createChannel — store resolution", () => {
|
|
|
67
87
|
// Seed the adapter's store via a throwaway channel so we can prove the real
|
|
68
88
|
// channel reads from that exact instance.
|
|
69
89
|
const seeder = createChannel({
|
|
90
|
+
identifyUser: "platform",
|
|
70
91
|
adapters: [new FakeAdapter()],
|
|
71
92
|
agent: () => new FakeAgent(),
|
|
72
93
|
store: {
|
|
73
94
|
adapter: adapterStore,
|
|
74
|
-
identity: () => "u@x.com",
|
|
75
95
|
transcripts: {},
|
|
76
96
|
},
|
|
77
97
|
});
|
|
78
98
|
await seeder.ɵruntime.start();
|
|
79
|
-
await seeder.transcripts.append({ platform: "fake", conversationKey: "c" }, { role: "user", text: "seeded" }, {
|
|
99
|
+
await seeder.transcripts.append({ platform: "fake", conversationKey: "c" }, { role: "user", text: "seeded" }, { userId: "u@x.com" });
|
|
80
100
|
const fake = new FakeAdapter();
|
|
81
101
|
fake.stateStore = adapterStore;
|
|
82
102
|
const channel = createChannel({
|
|
103
|
+
identifyUser: "platform",
|
|
83
104
|
adapters: [fake],
|
|
84
105
|
agent: () => new FakeAgent(),
|
|
85
|
-
store: {
|
|
106
|
+
store: { transcripts: {} },
|
|
86
107
|
});
|
|
87
108
|
await channel.ɵruntime.start();
|
|
88
|
-
const entries = await channel.transcripts.list({
|
|
109
|
+
const entries = await channel.transcripts.list({ userId: "u@x.com" });
|
|
89
110
|
expect(entries.map((e) => e.text)).toContain("seeded");
|
|
90
111
|
});
|
|
91
112
|
it("explicit store.adapter wins over an adapter-provided one, silently", async () => {
|
|
@@ -94,11 +115,11 @@ describe("createChannel — store resolution", () => {
|
|
|
94
115
|
fake.stateStore = new MemoryStore();
|
|
95
116
|
const explicit = new MemoryStore();
|
|
96
117
|
const channel = createChannel({
|
|
118
|
+
identifyUser: "platform",
|
|
97
119
|
adapters: [fake],
|
|
98
120
|
agent: () => new FakeAgent(),
|
|
99
121
|
store: {
|
|
100
122
|
adapter: explicit,
|
|
101
|
-
identity: () => "u@x.com",
|
|
102
123
|
transcripts: {},
|
|
103
124
|
},
|
|
104
125
|
});
|
|
@@ -113,6 +134,7 @@ describe("createChannel — store resolution", () => {
|
|
|
113
134
|
const b = new FakeAdapter({ platform: "b" });
|
|
114
135
|
b.stateStore = new MemoryStore();
|
|
115
136
|
const channel = createChannel({
|
|
137
|
+
identifyUser: "platform",
|
|
116
138
|
adapters: [a, b],
|
|
117
139
|
agent: () => new FakeAgent(),
|
|
118
140
|
});
|
|
@@ -125,6 +147,7 @@ describe("createChannel — id propagation to handler context", () => {
|
|
|
125
147
|
it("threads turnId/deliveryId from IncomingTurn onto message", async () => {
|
|
126
148
|
const fake = new FakeAdapter();
|
|
127
149
|
const channel = createChannel({
|
|
150
|
+
identifyUser: "platform",
|
|
128
151
|
adapters: [fake],
|
|
129
152
|
agent: () => new FakeAgent(),
|
|
130
153
|
});
|