@copilotkit/channels-core 0.9.0 → 0.9.2
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 +2 -2
- package/dist/canonical-run-loop.test.js +110 -3
- package/dist/channel-memory.test.js +2 -0
- package/dist/codec.d.ts +6 -4
- package/dist/codec.d.ts.map +1 -1
- package/dist/create-channel.d.ts +19 -2
- package/dist/create-channel.d.ts.map +1 -1
- package/dist/create-channel.js +6 -0
- package/dist/create-channel.test.js +8 -0
- package/dist/hitl-continuation.test.js +17 -4
- package/dist/identity.d.ts +44 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +31 -0
- package/dist/identity.test.js +28 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/interrupt-event-echo.test.d.ts +2 -0
- package/dist/interrupt-event-echo.test.d.ts.map +1 -0
- package/dist/interrupt-event-echo.test.js +161 -0
- package/dist/platform-adapter.d.ts +3 -1
- package/dist/platform-adapter.d.ts.map +1 -1
- package/dist/run-loop.d.ts +21 -2
- package/dist/run-loop.d.ts.map +1 -1
- package/dist/run-loop.js +46 -5
- package/dist/run-loop.test.js +56 -0
- package/dist/sanitize-agent-events.test.js +27 -6
- package/dist/testing/fake-agent.d.ts +3 -1
- package/dist/testing/fake-agent.d.ts.map +1 -1
- package/dist/testing/fake-agent.js +4 -1
- package/dist/thread.d.ts +22 -0
- package/dist/thread.d.ts.map +1 -1
- package/dist/thread.js +67 -1
- package/package.json +6 -6
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@copilotkit/channels-core/jsx-runtime";
|
|
2
|
+
import { Button } from "@copilotkit/channels-ui";
|
|
3
|
+
import { afterEach, expect, test } from "vitest";
|
|
4
|
+
import { createChannel } from "./create-channel.js";
|
|
5
|
+
import { MemoryStore } from "./state/memory-store.js";
|
|
6
|
+
import { FakeAdapter } from "./testing/fake-adapter.js";
|
|
7
|
+
import { FakeAgent } from "./testing/fake-agent.js";
|
|
8
|
+
const activeChannels = [];
|
|
9
|
+
afterEach(async () => {
|
|
10
|
+
await Promise.all(activeChannels.splice(0).map((channel) => channel.stop()));
|
|
11
|
+
});
|
|
12
|
+
/** The correlation-bearing shape a Mastra-style bridge sends and requires back. */
|
|
13
|
+
const MASTRA_LIKE_VALUE = {
|
|
14
|
+
type: "mastra_suspend",
|
|
15
|
+
toolCallId: "call_abc123",
|
|
16
|
+
runId: "run_xyz789",
|
|
17
|
+
suspendPayload: {
|
|
18
|
+
kind: "confirm_create_thing",
|
|
19
|
+
action: "Create thing: widget",
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Records the `RunAgentParameters` of every run so the wire shape is assertable.
|
|
24
|
+
*
|
|
25
|
+
* `clone()` is overridden for two reasons, both enforced by createChannel's
|
|
26
|
+
* clone guard: `FakeAgent.clone()` returns a base `FakeAgent` (which would strip
|
|
27
|
+
* this recorder entirely), and every turn runs on a fresh clone — so `params`
|
|
28
|
+
* must be SHARED, not copied, or the resume run's parameters land on an instance
|
|
29
|
+
* the test never sees.
|
|
30
|
+
*/
|
|
31
|
+
class RecordingAgent extends FakeAgent {
|
|
32
|
+
params;
|
|
33
|
+
script0;
|
|
34
|
+
constructor(script, params = []) {
|
|
35
|
+
super(script);
|
|
36
|
+
this.script0 = script;
|
|
37
|
+
this.params = params;
|
|
38
|
+
}
|
|
39
|
+
clone() {
|
|
40
|
+
const cloned = new RecordingAgent(this.script0, this.params);
|
|
41
|
+
cloned.threadId = this.threadId;
|
|
42
|
+
cloned.agentId = this.agentId;
|
|
43
|
+
return cloned;
|
|
44
|
+
}
|
|
45
|
+
async runAgent(parameters, subscriber) {
|
|
46
|
+
this.params.push(parameters);
|
|
47
|
+
return super.runAgent(parameters, subscriber);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** The `forwardedProps.command` of the first run that carried one. */
|
|
51
|
+
function sentCommand(agent) {
|
|
52
|
+
for (const p of agent.params) {
|
|
53
|
+
const command = p?.forwardedProps
|
|
54
|
+
?.command;
|
|
55
|
+
if (command)
|
|
56
|
+
return command;
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
function firstActionId(adapter) {
|
|
61
|
+
const button = adapter.posted.flat().find((node) => node.type === "button");
|
|
62
|
+
const action = button?.props.onClick;
|
|
63
|
+
if (typeof action?.id !== "string")
|
|
64
|
+
throw new Error("missing action id");
|
|
65
|
+
return action.id;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Drives one interrupt → picker → click → resume cycle.
|
|
69
|
+
* `interruptValue: undefined` emits a named custom event with NO value, which is
|
|
70
|
+
* how the "nothing captured" case is reached.
|
|
71
|
+
*/
|
|
72
|
+
async function runCycle(interruptValue) {
|
|
73
|
+
const adapter = new FakeAdapter();
|
|
74
|
+
const state = new MemoryStore();
|
|
75
|
+
// Interrupt on the FIRST run only. Clones restart the script (the shift happens
|
|
76
|
+
// on the clone, not the original), so without this shared counter the resume run
|
|
77
|
+
// would interrupt again — re-storing the value straight after the resume consumed
|
|
78
|
+
// it, and quietly invalidating the one-use assertion below.
|
|
79
|
+
const runs = { count: 0 };
|
|
80
|
+
const agent = new RecordingAgent([
|
|
81
|
+
(subscriber) => {
|
|
82
|
+
if (runs.count++ === 0) {
|
|
83
|
+
subscriber.onCustomEvent?.({
|
|
84
|
+
event: { name: "approval", value: interruptValue },
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
subscriber.onRunFinishedEvent?.({ event: {} });
|
|
88
|
+
},
|
|
89
|
+
]);
|
|
90
|
+
function Approval() {
|
|
91
|
+
return (_jsx(Button, { value: { approved: true }, onClick: async ({ thread }) => {
|
|
92
|
+
await thread.resume({ approved: true });
|
|
93
|
+
}, children: "Approve" }));
|
|
94
|
+
}
|
|
95
|
+
const channel = createChannel({
|
|
96
|
+
name: "approvals",
|
|
97
|
+
identifyUser: "platform",
|
|
98
|
+
adapters: [adapter],
|
|
99
|
+
agent,
|
|
100
|
+
components: [Approval],
|
|
101
|
+
store: { adapter: state },
|
|
102
|
+
});
|
|
103
|
+
channel.onMessage(async ({ thread }) => {
|
|
104
|
+
await thread.runAgent();
|
|
105
|
+
});
|
|
106
|
+
channel.onInterrupt("approval", async ({ thread }) => {
|
|
107
|
+
await thread.post(_jsx(Approval, {}));
|
|
108
|
+
});
|
|
109
|
+
await channel.ɵruntime.start();
|
|
110
|
+
activeChannels.push({ stop: () => channel.ɵruntime.stop() });
|
|
111
|
+
await adapter.getSink().onTurn({
|
|
112
|
+
conversationKey: "thread-1",
|
|
113
|
+
replyTarget: {},
|
|
114
|
+
userText: "start",
|
|
115
|
+
platform: "fake",
|
|
116
|
+
actor: { id: "alice", kind: "human", name: "Alice" },
|
|
117
|
+
});
|
|
118
|
+
return { adapter, agent, state, Approval };
|
|
119
|
+
}
|
|
120
|
+
async function click(adapter) {
|
|
121
|
+
await adapter.getSink().onInteraction({
|
|
122
|
+
id: firstActionId(adapter),
|
|
123
|
+
conversationKey: "thread-1",
|
|
124
|
+
replyTarget: {},
|
|
125
|
+
eventId: "click-1",
|
|
126
|
+
actor: { id: "alice", kind: "human", name: "Alice" },
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
test("resume echoes the captured interrupt value as command.interruptEvent", async () => {
|
|
130
|
+
const { adapter, agent } = await runCycle(MASTRA_LIKE_VALUE);
|
|
131
|
+
await click(adapter);
|
|
132
|
+
const command = sentCommand(agent);
|
|
133
|
+
expect(command).toBeDefined();
|
|
134
|
+
expect(command?.resume).toEqual({ approved: true });
|
|
135
|
+
// Opaque round-trip: byte-for-byte what the agent sent, not a reshaped subset.
|
|
136
|
+
expect(command?.interruptEvent).toEqual(MASTRA_LIKE_VALUE);
|
|
137
|
+
});
|
|
138
|
+
test("the interrupt value is persisted, so a resume can survive a restart", async () => {
|
|
139
|
+
const { state } = await runCycle(MASTRA_LIKE_VALUE);
|
|
140
|
+
// In the DURABLE store, not process memory — the click can arrive in a later
|
|
141
|
+
// process, which is the entire point of the interrupt path over awaitChoice.
|
|
142
|
+
await expect(state.kv.get("interruptevent:thread-1")).resolves.toEqual(MASTRA_LIKE_VALUE);
|
|
143
|
+
});
|
|
144
|
+
test("the retained value is one-use: consumed by the resume that sends it", async () => {
|
|
145
|
+
const { adapter, state } = await runCycle(MASTRA_LIKE_VALUE);
|
|
146
|
+
await click(adapter);
|
|
147
|
+
// Matches the one-use continuation the resume already claims: a replayed click
|
|
148
|
+
// must not resurrect a spent resume.
|
|
149
|
+
await expect(state.kv.get("interruptevent:thread-1")).resolves.toBeUndefined();
|
|
150
|
+
});
|
|
151
|
+
test("omits interruptEvent entirely when no value was captured", async () => {
|
|
152
|
+
const { adapter, agent } = await runCycle(undefined);
|
|
153
|
+
await click(adapter);
|
|
154
|
+
const command = sentCommand(agent);
|
|
155
|
+
expect(command?.resume).toEqual({ approved: true });
|
|
156
|
+
// The compatibility guarantee: not `interruptEvent: undefined` — absent. The
|
|
157
|
+
// serialized command is identical to what channels sent before this change,
|
|
158
|
+
// so agents that never carry correlation data see no difference at all.
|
|
159
|
+
expect(command).not.toHaveProperty("interruptEvent");
|
|
160
|
+
expect(Object.keys(command ?? {})).toEqual(["resume"]);
|
|
161
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AgentSubscriber, AbstractAgent } from "@ag-ui/client";
|
|
2
|
-
import type { AgentContentPart, ChannelNode, EmojiValue, EphemeralResult, MessageRef, MessageOperation, ProviderActor, ThreadMessage } from "@copilotkit/channels-ui";
|
|
2
|
+
import type { AgentContentPart, ApplicationUser, ChannelNode, EmojiValue, EphemeralResult, MessageRef, MessageOperation, ProviderActor, ThreadMessage } from "@copilotkit/channels-ui";
|
|
3
3
|
import type { IngressIdentityContext } from "./identity.js";
|
|
4
4
|
import type { ResolvedChannelMemory } from "./memory.js";
|
|
5
5
|
import type { CommandSpec } from "./commands.js";
|
|
@@ -96,6 +96,8 @@ export interface ChannelAgentLifecycleArgs {
|
|
|
96
96
|
* agent command and never crosses the managed run-open boundary.
|
|
97
97
|
*/
|
|
98
98
|
isResume?: boolean;
|
|
99
|
+
/** Canonical application user resolved for the current Channel event. */
|
|
100
|
+
user?: ApplicationUser | null;
|
|
99
101
|
/** Explicit Memory access resolved before agent execution. */
|
|
100
102
|
memory?: ResolvedChannelMemory;
|
|
101
103
|
execute(subscriber: AgentSubscriber, canonicalRun?: CanonicalRunIdentity): Promise<ChannelAgentLoopResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-adapter.d.ts","sourceRoot":"","sources":["../src/platform-adapter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-adapter.d.ts","sourceRoot":"","sources":["../src/platform-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/run-loop.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { AbstractAgent, AgentSubscriber, RunErrorEvent } from "@ag-ui/client";
|
|
1
|
+
import type { AbstractAgent, AgentSubscriber, RunErrorEvent, RunFinishedEvent } from "@ag-ui/client";
|
|
2
2
|
import type { RunRenderer, CapturedToolCall, CapturedInterrupt, CanonicalRunIdentity, ChannelAgentLoopResult } from "./platform-adapter.js";
|
|
3
3
|
import type { ChannelTool, ChannelToolContext, AgentToolDescriptor, ContextEntry } from "./tools.js";
|
|
4
|
+
import type { ChannelActorIdentity } from "./identity.js";
|
|
4
5
|
export interface RunLoopArgs {
|
|
5
6
|
agent: AbstractAgent;
|
|
6
7
|
renderer: RunRenderer;
|
|
@@ -14,9 +15,15 @@ export interface RunLoopArgs {
|
|
|
14
15
|
isAborted?: () => boolean;
|
|
15
16
|
/** Hard cap on loop iterations. Default 6. */
|
|
16
17
|
maxIterations?: number;
|
|
17
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* When re-entering via thread.resume, the resume command to replay. Sent
|
|
20
|
+
* verbatim as `forwardedProps.command`, so any field here reaches the agent.
|
|
21
|
+
* `interruptEvent` echoes the originating interrupt back for bridges that key
|
|
22
|
+
* their resume off it (@ag-ui/mastra); it is absent unless one was captured.
|
|
23
|
+
*/
|
|
18
24
|
initialResume?: {
|
|
19
25
|
resume: unknown;
|
|
26
|
+
interruptEvent?: unknown;
|
|
20
27
|
};
|
|
21
28
|
/** Subscriber used for each underlying agent step. Defaults to the renderer. */
|
|
22
29
|
subscriber?: AgentSubscriber;
|
|
@@ -26,10 +33,22 @@ export interface RunLoopArgs {
|
|
|
26
33
|
* lifecycle around the whole loop.
|
|
27
34
|
*/
|
|
28
35
|
canonicalRun?: CanonicalRunIdentity;
|
|
36
|
+
/**
|
|
37
|
+
* Who is speaking this turn. Forwarded to the agent as
|
|
38
|
+
* `forwardedProps.channelActor` on every run this loop performs, including a
|
|
39
|
+
* resume — a resume's actor is whoever pressed the button, which is not
|
|
40
|
+
* always whoever started the turn.
|
|
41
|
+
*
|
|
42
|
+
* Supplied by the Thread from the ingress event, never by a caller passing a
|
|
43
|
+
* value of its own: an agent that acts as this person has to be reading the
|
|
44
|
+
* platform's word for who spoke.
|
|
45
|
+
*/
|
|
46
|
+
identity?: ChannelActorIdentity;
|
|
29
47
|
}
|
|
30
48
|
interface SubscriberFanoutOptions {
|
|
31
49
|
canonicalRun?: CanonicalRunIdentity;
|
|
32
50
|
onInnerRunError?: (event: RunErrorEvent) => void;
|
|
51
|
+
onInnerRunFinished?: (event: RunFinishedEvent) => void;
|
|
33
52
|
onRendererError?: (error: unknown) => void;
|
|
34
53
|
/** Stops provider callbacks after their first terminal delivery error. */
|
|
35
54
|
isRendererClosed?: () => boolean;
|
package/dist/run-loop.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-loop.d.ts","sourceRoot":"","sources":["../src/run-loop.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EAGf,aAAa,
|
|
1
|
+
{"version":3,"file":"run-loop.d.ts","sourceRoot":"","sources":["../src/run-loop.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EAGf,aAAa,EACb,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAM1D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,sDAAsD;IACtD,WAAW,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,kBAAkB,CAAC;IAC5D,sFAAsF;IACtF,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9D,gFAAgF;IAChF,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B;;;;OAIG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CACjC;AAgBD,UAAU,uBAAuB;IAC/B,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACjD,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACvD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC;CAClC;AA8HD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,uBAA4B,GACpC,eAAe,CAkCjB;AAoFD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,sBAAsB,CAAC,CA8MjC;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,GACrC,IAAI,CA4BN;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,IAAI,CAQN"}
|
package/dist/run-loop.js
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { EventType } from "@ag-ui/client";
|
|
2
|
+
import { aggregateTokenUsage } from "@ag-ui/core";
|
|
2
3
|
import { parseToolArgs, stringifyHandlerResult } from "./tools.js";
|
|
3
4
|
import { channelDeliveryErrorDetails, isChannelDeliveryTerminatedError, } from "./delivery-error.js";
|
|
5
|
+
/**
|
|
6
|
+
* The identity half of `forwardedProps`, as a spreadable object.
|
|
7
|
+
*
|
|
8
|
+
* Empty when the turn named nobody, so the run carries no `channelActor` key at
|
|
9
|
+
* all rather than one holding `undefined`. An agent then gets the same answer
|
|
10
|
+
* from a missing key and an anonymous turn, instead of two shapes meaning one
|
|
11
|
+
* thing.
|
|
12
|
+
*/
|
|
13
|
+
function forwardedIdentity(identity) {
|
|
14
|
+
return identity ? { channelActor: identity } : {};
|
|
15
|
+
}
|
|
4
16
|
/**
|
|
5
17
|
* Merge two subscriber callback results while preserving either subscriber's
|
|
6
18
|
* request to stop propagation.
|
|
@@ -78,8 +90,14 @@ function canonicalizeSubscriberParams(params, options, stampedEvents) {
|
|
|
78
90
|
(event.type === EventType.RUN_STARTED ||
|
|
79
91
|
event.type === EventType.RUN_FINISHED ||
|
|
80
92
|
event.type === EventType.RUN_ERROR)) {
|
|
81
|
-
if (event
|
|
82
|
-
|
|
93
|
+
if (!stampedEvents.has(event)) {
|
|
94
|
+
stampedEvents.set(event, event);
|
|
95
|
+
if (event.type === EventType.RUN_ERROR) {
|
|
96
|
+
options.onInnerRunError?.(event);
|
|
97
|
+
}
|
|
98
|
+
else if (event.type === EventType.RUN_FINISHED) {
|
|
99
|
+
options.onInnerRunFinished?.(event);
|
|
100
|
+
}
|
|
83
101
|
}
|
|
84
102
|
return undefined;
|
|
85
103
|
}
|
|
@@ -147,7 +165,9 @@ async function emitCanonicalLifecycleEvent(event, result, args, onRendererError,
|
|
|
147
165
|
state: args.agent.state,
|
|
148
166
|
tools: [...args.toolDescriptors],
|
|
149
167
|
context: [...args.context],
|
|
150
|
-
|
|
168
|
+
// Mirrors what the loop actually sends, so a subscriber reading `input`
|
|
169
|
+
// sees the same turn the agent saw.
|
|
170
|
+
forwardedProps: forwardedIdentity(args.identity),
|
|
151
171
|
};
|
|
152
172
|
const baseParams = {
|
|
153
173
|
messages: args.agent.messages,
|
|
@@ -184,6 +204,8 @@ async function emitCanonicalLifecycleEvent(event, result, args, onRendererError,
|
|
|
184
204
|
export async function runAgentLoop(args) {
|
|
185
205
|
const { agent, renderer, tools, toolDescriptors, context, makeToolCtx, handleInterrupt, isAborted, initialResume, } = args;
|
|
186
206
|
let innerRunError;
|
|
207
|
+
const innerRunUsage = [];
|
|
208
|
+
let innerRunFinishReason;
|
|
187
209
|
let hasDeliveryError = false;
|
|
188
210
|
let deliveryError;
|
|
189
211
|
const deferRendererError = (error) => {
|
|
@@ -200,6 +222,11 @@ export async function runAgentLoop(args) {
|
|
|
200
222
|
onInnerRunError: (event) => {
|
|
201
223
|
innerRunError ??= errorFromInnerRun(event);
|
|
202
224
|
},
|
|
225
|
+
onInnerRunFinished: (event) => {
|
|
226
|
+
innerRunFinishReason = event.finishReason;
|
|
227
|
+
if (event.usage)
|
|
228
|
+
innerRunUsage.push(...event.usage);
|
|
229
|
+
},
|
|
203
230
|
onRendererError: deferRendererError,
|
|
204
231
|
isRendererClosed,
|
|
205
232
|
}
|
|
@@ -211,11 +238,20 @@ export async function runAgentLoop(args) {
|
|
|
211
238
|
const executeIterations = async () => {
|
|
212
239
|
for (let i = 0; i < maxIterations; i++) {
|
|
213
240
|
if (resume) {
|
|
214
|
-
await agent.runAgent({
|
|
241
|
+
await agent.runAgent({
|
|
242
|
+
forwardedProps: {
|
|
243
|
+
...forwardedIdentity(args.identity),
|
|
244
|
+
command: resume,
|
|
245
|
+
},
|
|
246
|
+
}, subscriber);
|
|
215
247
|
resume = undefined;
|
|
216
248
|
}
|
|
217
249
|
else {
|
|
218
|
-
await agent.runAgent({
|
|
250
|
+
await agent.runAgent({
|
|
251
|
+
tools: toolDescriptors,
|
|
252
|
+
context: context,
|
|
253
|
+
forwardedProps: forwardedIdentity(args.identity),
|
|
254
|
+
}, subscriber);
|
|
219
255
|
}
|
|
220
256
|
if (innerRunError)
|
|
221
257
|
throw innerRunError;
|
|
@@ -277,10 +313,15 @@ export async function runAgentLoop(args) {
|
|
|
277
313
|
try {
|
|
278
314
|
await emitCanonicalLifecycleEvent(startEvent, undefined, args, deferRendererError, isRendererClosed);
|
|
279
315
|
const result = await executeIterations();
|
|
316
|
+
const usage = aggregateTokenUsage(innerRunUsage);
|
|
280
317
|
const finishedEvent = {
|
|
281
318
|
type: EventType.RUN_FINISHED,
|
|
282
319
|
threadId: args.canonicalRun.threadId,
|
|
283
320
|
runId: args.canonicalRun.runId,
|
|
321
|
+
...(usage.length > 0 ? { usage } : {}),
|
|
322
|
+
...(innerRunFinishReason !== undefined
|
|
323
|
+
? { finishReason: innerRunFinishReason }
|
|
324
|
+
: {}),
|
|
284
325
|
};
|
|
285
326
|
await emitCanonicalLifecycleEvent(finishedEvent, result, args, deferRendererError, isRendererClosed);
|
|
286
327
|
return hasDeliveryError ? { ...result, deliveryError } : result;
|
package/dist/run-loop.test.js
CHANGED
|
@@ -184,4 +184,60 @@ describe("runAgentLoop", () => {
|
|
|
184
184
|
expect(result.interrupted).toBe(false);
|
|
185
185
|
expect(result.iterations).toBeGreaterThanOrEqual(1);
|
|
186
186
|
});
|
|
187
|
+
describe("forwarded identity", () => {
|
|
188
|
+
const finishOnce = () => [
|
|
189
|
+
(sub) => {
|
|
190
|
+
sub.onRunFinishedEvent?.({ event: {} });
|
|
191
|
+
},
|
|
192
|
+
];
|
|
193
|
+
const baseArgs = (agent) => ({
|
|
194
|
+
agent,
|
|
195
|
+
renderer: makeFakeRunRenderer(),
|
|
196
|
+
tools: new Map(),
|
|
197
|
+
toolDescriptors,
|
|
198
|
+
context,
|
|
199
|
+
makeToolCtx: () => ({
|
|
200
|
+
thread: {},
|
|
201
|
+
user: null,
|
|
202
|
+
actor: { id: "actor", kind: "unknown" },
|
|
203
|
+
platform: "fake",
|
|
204
|
+
}),
|
|
205
|
+
});
|
|
206
|
+
const identity = {
|
|
207
|
+
id: "29:1a2b3c",
|
|
208
|
+
kind: "human",
|
|
209
|
+
platform: "teams",
|
|
210
|
+
name: "Ada",
|
|
211
|
+
};
|
|
212
|
+
it("forwards the actor to the agent on a normal run", async () => {
|
|
213
|
+
const agent = new FakeAgent(finishOnce());
|
|
214
|
+
await runAgentLoop({ ...baseArgs(agent), identity });
|
|
215
|
+
expect(agent.runAgentParameters[0]?.forwardedProps).toEqual({
|
|
216
|
+
channelActor: identity,
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
it("keeps a provider id verbatim, including characters a model provider would reject", async () => {
|
|
220
|
+
const agent = new FakeAgent(finishOnce());
|
|
221
|
+
await runAgentLoop({ ...baseArgs(agent), identity });
|
|
222
|
+
const forwarded = agent.runAgentParameters[0]?.forwardedProps;
|
|
223
|
+
expect(forwarded.channelActor.id).toBe("29:1a2b3c");
|
|
224
|
+
});
|
|
225
|
+
it("forwards the actor alongside the resume command", async () => {
|
|
226
|
+
const agent = new FakeAgent(finishOnce());
|
|
227
|
+
await runAgentLoop({
|
|
228
|
+
...baseArgs(agent),
|
|
229
|
+
identity,
|
|
230
|
+
initialResume: { resume: { decision: "approve" } },
|
|
231
|
+
});
|
|
232
|
+
expect(agent.runAgentParameters[0]?.forwardedProps).toEqual({
|
|
233
|
+
channelActor: identity,
|
|
234
|
+
command: { resume: { decision: "approve" } },
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
it("carries no actor key at all when the turn named nobody", async () => {
|
|
238
|
+
const agent = new FakeAgent(finishOnce());
|
|
239
|
+
await runAgentLoop(baseArgs(agent));
|
|
240
|
+
expect(agent.runAgentParameters[0]?.forwardedProps).toEqual({});
|
|
241
|
+
});
|
|
242
|
+
});
|
|
187
243
|
});
|
|
@@ -24,8 +24,15 @@ function streamResponse(chunks, contentType = "text/event-stream") {
|
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* A run whose `TOOL_CALL_START` carries `parentMessageId: null` — the shape
|
|
27
|
-
* `@ag-ui/langgraph` emits for the tool call that triggers an interrupt
|
|
28
|
-
*
|
|
27
|
+
* `@ag-ui/langgraph` emits for the tool call that triggers an interrupt.
|
|
28
|
+
*
|
|
29
|
+
* Up to @ag-ui/client 0.0.57 this was rejected by `EventSchemas.parse` with
|
|
30
|
+
* "Expected string, received null", which is why the sanitizer exists. As of
|
|
31
|
+
* 0.0.59 the client accepts it: a null `parentMessageId` on TOOL_CALL_START is
|
|
32
|
+
* one of a small set of receive tolerances kept for producers that still emit
|
|
33
|
+
* it, and the reducer treats the null as absent. The sanitizer still coerces
|
|
34
|
+
* the byte on the wire (see the coercion tests below), but it is no longer
|
|
35
|
+
* what keeps such a run alive.
|
|
29
36
|
*/
|
|
30
37
|
const nullParentRun = () => [
|
|
31
38
|
frame({ type: "RUN_STARTED", threadId: "t1", runId: "r1" }),
|
|
@@ -60,9 +67,20 @@ describe("sanitizeAgentEventStream", () => {
|
|
|
60
67
|
});
|
|
61
68
|
expect(started).toEqual(["ask_human"]);
|
|
62
69
|
});
|
|
63
|
-
it("
|
|
70
|
+
it("survives that same run without the sanitizer, since 0.0.59 tolerates the null", async () => {
|
|
71
|
+
// Before @ag-ui/client 0.0.59 this rejected with "Expected string,
|
|
72
|
+
// received null" — the failure the sanitizer was written to prevent. The
|
|
73
|
+
// client now accepts the null and treats it as absent, so the raw run
|
|
74
|
+
// reaches the tool call on its own. Asserting the tool call still arrives
|
|
75
|
+
// (rather than just "does not throw") keeps this a real check: a client
|
|
76
|
+
// that dropped the malformed event instead of tolerating it would fail
|
|
77
|
+
// here.
|
|
64
78
|
const agent = agentServing(nullParentRun());
|
|
65
|
-
|
|
79
|
+
const started = [];
|
|
80
|
+
await agent.runAgent({}, {
|
|
81
|
+
onToolCallStartEvent: ({ event }) => void started.push(event.toolCallName),
|
|
82
|
+
});
|
|
83
|
+
expect(started).toEqual(["ask_human"]);
|
|
66
84
|
});
|
|
67
85
|
it("coerces the null to an empty string and leaves every other byte alone", async () => {
|
|
68
86
|
const agent = sanitizeAgentEventStream(agentServing([
|
|
@@ -187,10 +205,13 @@ describe("createChannel({ sanitizeAgentEvents })", () => {
|
|
|
187
205
|
await tick();
|
|
188
206
|
expect(failure).toBeUndefined();
|
|
189
207
|
});
|
|
190
|
-
it("
|
|
208
|
+
it("no longer aborts the turn when sanitizing is disabled", async () => {
|
|
209
|
+
// The channel-level counterpart of the test above: with 0.0.59 tolerating
|
|
210
|
+
// the null parentMessageId, opting out of the sanitizer no longer costs
|
|
211
|
+
// the turn.
|
|
191
212
|
const failure = await runTurn(agentServing(nullParentRun()), {
|
|
192
213
|
sanitizeAgentEvents: false,
|
|
193
214
|
});
|
|
194
|
-
expect(
|
|
215
|
+
expect(failure).toBeUndefined();
|
|
195
216
|
});
|
|
196
217
|
});
|
|
@@ -17,12 +17,14 @@ export declare class FakeAgent extends AbstractAgent {
|
|
|
17
17
|
private script;
|
|
18
18
|
/** Number of `runAgent` invocations seen — handy for loop-termination asserts. */
|
|
19
19
|
runAgentCalls: number;
|
|
20
|
+
/** Every `runAgent` argument in order, for asserting what a run carried. */
|
|
21
|
+
runAgentParameters: Array<RunAgentParameters | undefined>;
|
|
20
22
|
/** Flipped to true by `abortRun()`. */
|
|
21
23
|
aborted: boolean;
|
|
22
24
|
constructor(script?: FakeAgentScriptStep[]);
|
|
23
25
|
setScript(script: FakeAgentScriptStep[]): void;
|
|
24
26
|
run(_input: RunAgentInput): ReturnType<AbstractAgent["run"]>;
|
|
25
|
-
runAgent(
|
|
27
|
+
runAgent(parameters?: RunAgentParameters, subscriber?: AgentSubscriber): Promise<RunAgentResult>;
|
|
26
28
|
abortRun(): void;
|
|
27
29
|
/**
|
|
28
30
|
* Distinct instance for concurrent channel turns (singleton agent isolation).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake-agent.d.ts","sourceRoot":"","sources":["../../src/testing/fake-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,cAAc,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,UAAU,EAAE,eAAe,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,aAAa;IAC1C,OAAO,CAAC,MAAM,CAAwB;IACtC,kFAAkF;IAClF,aAAa,SAAK;IAClB,uCAAuC;IACvC,OAAO,UAAS;gBAEJ,MAAM,GAAE,mBAAmB,EAAO;IAK9C,SAAS,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI;IAM9C,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAI7C,QAAQ,CACrB,
|
|
1
|
+
{"version":3,"file":"fake-agent.d.ts","sourceRoot":"","sources":["../../src/testing/fake-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,cAAc,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,UAAU,EAAE,eAAe,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,aAAa;IAC1C,OAAO,CAAC,MAAM,CAAwB;IACtC,kFAAkF;IAClF,aAAa,SAAK;IAClB,4EAA4E;IAC5E,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAM;IAC/D,uCAAuC;IACvC,OAAO,UAAS;gBAEJ,MAAM,GAAE,mBAAmB,EAAO;IAK9C,SAAS,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI;IAM9C,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAI7C,QAAQ,CACrB,UAAU,CAAC,EAAE,kBAAkB,EAC/B,UAAU,CAAC,EAAE,eAAe,GAC3B,OAAO,CAAC,cAAc,CAAC;IAUjB,QAAQ,IAAI,IAAI;IAIzB;;;OAGG;IACM,KAAK,IAAI,SAAS;CAQ5B"}
|
|
@@ -8,6 +8,8 @@ export class FakeAgent extends AbstractAgent {
|
|
|
8
8
|
script;
|
|
9
9
|
/** Number of `runAgent` invocations seen — handy for loop-termination asserts. */
|
|
10
10
|
runAgentCalls = 0;
|
|
11
|
+
/** Every `runAgent` argument in order, for asserting what a run carried. */
|
|
12
|
+
runAgentParameters = [];
|
|
11
13
|
/** Flipped to true by `abortRun()`. */
|
|
12
14
|
aborted = false;
|
|
13
15
|
constructor(script = []) {
|
|
@@ -22,8 +24,9 @@ export class FakeAgent extends AbstractAgent {
|
|
|
22
24
|
run(_input) {
|
|
23
25
|
throw new Error("FakeAgent.run unused; runAgent is overridden");
|
|
24
26
|
}
|
|
25
|
-
async runAgent(
|
|
27
|
+
async runAgent(parameters, subscriber) {
|
|
26
28
|
this.runAgentCalls += 1;
|
|
29
|
+
this.runAgentParameters.push(parameters);
|
|
27
30
|
const step = this.script.shift();
|
|
28
31
|
if (step && subscriber) {
|
|
29
32
|
await step(subscriber);
|
package/dist/thread.d.ts
CHANGED
|
@@ -48,6 +48,13 @@ export interface ThreadDeps {
|
|
|
48
48
|
}) => void | Promise<void>>;
|
|
49
49
|
/** Pluggable persistence. Injected by createChannel; always required. */
|
|
50
50
|
state: StateStore;
|
|
51
|
+
/**
|
|
52
|
+
* How long a captured interrupt value is retained so `resume` can echo it back
|
|
53
|
+
* as `command.interruptEvent`. Should match the action retention, since the
|
|
54
|
+
* button that triggers the resume is what bounds its useful life. Defaults to
|
|
55
|
+
* {@link DEFAULT_INTERRUPT_RETENTION_MS}.
|
|
56
|
+
*/
|
|
57
|
+
interruptRetentionMs?: number;
|
|
51
58
|
/**
|
|
52
59
|
* Optional Standard Schema for per-thread state. When set, `setState`
|
|
53
60
|
* validates its argument before persisting and throws on a schema mismatch.
|
|
@@ -160,6 +167,21 @@ export declare class Thread implements ThreadInterface {
|
|
|
160
167
|
setState<T>(v: T): Promise<void>;
|
|
161
168
|
/** Read back per-thread state previously written with `setState`. */
|
|
162
169
|
state<T>(): Promise<T | undefined>;
|
|
170
|
+
private interruptEventKey;
|
|
171
|
+
/**
|
|
172
|
+
* Retain the raw value of a captured interrupt so a later {@link resume} can
|
|
173
|
+
* echo it back to the agent as `command.interruptEvent`.
|
|
174
|
+
*
|
|
175
|
+
* PERSISTED, not in-memory, because the resume arrives in a DIFFERENT run —
|
|
176
|
+
* possibly in a different process after a restart, which is the whole reason
|
|
177
|
+
* this HITL path exists. Stored per conversation, matching the fact that a
|
|
178
|
+
* renderer tracks a single pending interrupt: a second interrupt in the same
|
|
179
|
+
* conversation legitimately supersedes the first.
|
|
180
|
+
*
|
|
181
|
+
* Best-effort: an agent that needs no correlation data (LangGraph) resumes
|
|
182
|
+
* fine without this, so a store failure must not take the interrupt down.
|
|
183
|
+
*/
|
|
184
|
+
private rememberInterruptEvent;
|
|
163
185
|
/** Read the conversation's messages (returns `[]` when the adapter can't read history). */
|
|
164
186
|
getMessages(): Promise<ThreadMessage[]>;
|
|
165
187
|
/** Resolve a platform user by free-form query (returns `undefined` when unsupported). */
|
package/dist/thread.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../src/thread.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK3D,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,MAAM,IAAI,eAAe,EACzB,UAAU,EACV,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EACV,WAAW,EAEX,YAAY,EACZ,mBAAmB,EACpB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../src/thread.ts"],"names":[],"mappings":"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"}
|