@assistant-ui/react-ag-ui 0.1.3 → 0.1.5
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/dist/runtime/AgUiThreadController.d.ts +5 -0
- package/dist/runtime/AgUiThreadController.d.ts.map +1 -1
- package/dist/runtime/AgUiThreadController.js +106 -10
- package/dist/runtime/AgUiThreadController.js.map +1 -1
- package/dist/useAgUiRuntime.d.ts.map +1 -1
- package/dist/useAgUiRuntime.js +1 -0
- package/dist/useAgUiRuntime.js.map +1 -1
- package/package.json +2 -2
- package/src/runtime/AgUiThreadController.snapshot-head-history.test.ts +226 -0
- package/src/runtime/AgUiThreadController.snapshot-nested-settle.test.ts +210 -0
- package/src/runtime/AgUiThreadController.ts +148 -15
- package/src/useAgUiRuntime.cloud-run-leases.test.tsx +85 -7
- package/src/useAgUiRuntime.ts +1 -0
|
@@ -42,11 +42,13 @@ export declare class AgUiThreadController {
|
|
|
42
42
|
private state;
|
|
43
43
|
private abortController;
|
|
44
44
|
private activeRunAgent;
|
|
45
|
+
private runCount;
|
|
45
46
|
private history;
|
|
46
47
|
private readonly assistantHistoryParents;
|
|
47
48
|
private readonly subagentParentToolCallIds;
|
|
48
49
|
private readonly snapshotHistoryIds;
|
|
49
50
|
private readonly persistedHistoryIds;
|
|
51
|
+
private readonly unappendedHistoryIds;
|
|
50
52
|
private readonly historyWrites;
|
|
51
53
|
private _historyImportPromise;
|
|
52
54
|
private _loadPromise;
|
|
@@ -79,6 +81,8 @@ export declare class AgUiThreadController {
|
|
|
79
81
|
reload(parentId: string | null, config?: {
|
|
80
82
|
runConfig?: RunConfig;
|
|
81
83
|
}): Promise<void>;
|
|
84
|
+
/** Deletes a message that has no replies under it, and its stored history entry. */
|
|
85
|
+
deleteMessage(messageId: string): Promise<void>;
|
|
82
86
|
cancel(): Promise<void>;
|
|
83
87
|
private abortActiveRun;
|
|
84
88
|
private supersedeActiveRun;
|
|
@@ -179,6 +183,7 @@ export declare class AgUiThreadController {
|
|
|
179
183
|
private markPendingAssistantHistory;
|
|
180
184
|
private persistSettledAssistant;
|
|
181
185
|
private persistAssistantHistory;
|
|
186
|
+
private appendOnce;
|
|
182
187
|
private appendHistoryItem;
|
|
183
188
|
}
|
|
184
189
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgUiThreadController.d.ts","sourceRoot":"","sources":["../../src/runtime/AgUiThreadController.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EAEzB,4BAA4B,EAC5B,SAAS,EAET,oBAAoB,EACpB,aAAa,EAEb,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAS5B,OAAO,KAAK,EACV,aAAa,EAKd,MAAM,eAAe,CAAC;AAQvB,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAiB;AAEvC,OAAO,KAAK,EAGV,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACtB,mBAAgB;AAEjB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA+JhE,KAAK,YAAY,GAAG,CAClB,OAAO,EAAE,mBAAmB,KACzB,cAAc,CAAC,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACvD,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAYF,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACrD,aAAa,CAAC,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC;IACvD,gBAAgB,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACpD,0BAA0B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;CACnC,CAAC;
|
|
1
|
+
{"version":3,"file":"AgUiThreadController.d.ts","sourceRoot":"","sources":["../../src/runtime/AgUiThreadController.ts"],"names":[],"mappings":"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"}
|
|
@@ -94,13 +94,29 @@ const replaceTextParts = (content, source) => {
|
|
|
94
94
|
}
|
|
95
95
|
return result;
|
|
96
96
|
};
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Settles nested sub-agent messages with `status`. Without `runSubagentIds`,
|
|
99
|
+
* only running messages settle. With it, only that run's sub-agent messages
|
|
100
|
+
* settle, and an incomplete `status` also settles one still waiting on its own
|
|
101
|
+
* tool call: the run that could answer it has ended.
|
|
102
|
+
*/
|
|
103
|
+
const settleNestedContent = (content, status, runSubagentIds) => mapToolCallPartsDeep(content, (part) => {
|
|
104
|
+
if (!part.messages) return part;
|
|
105
|
+
let changed = false;
|
|
106
|
+
const messages = part.messages.map((message) => {
|
|
107
|
+
if (message.role !== "assistant") return message;
|
|
108
|
+
if (!(!runSubagentIds ? message.status?.type === "running" : runSubagentIds.has(message.id) && (message.status?.type === "running" || status.type === "incomplete" && message.status?.type === "requires-action" && message.status.reason === "tool-calls"))) return message;
|
|
109
|
+
changed = true;
|
|
110
|
+
return {
|
|
111
|
+
...message,
|
|
112
|
+
status
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
return changed ? {
|
|
116
|
+
...part,
|
|
117
|
+
messages
|
|
118
|
+
} : part;
|
|
119
|
+
}).content;
|
|
104
120
|
const invokeRuntimeCallback = (name, callback, ...args) => {
|
|
105
121
|
invokeUserCallback("react-ag-ui", name, callback, ...args);
|
|
106
122
|
};
|
|
@@ -149,11 +165,13 @@ var AgUiThreadController = class {
|
|
|
149
165
|
state = createAgUiThreadState();
|
|
150
166
|
abortController = null;
|
|
151
167
|
activeRunAgent = null;
|
|
168
|
+
runCount = 0;
|
|
152
169
|
history;
|
|
153
170
|
assistantHistoryParents = /* @__PURE__ */ new Map();
|
|
154
171
|
subagentParentToolCallIds = /* @__PURE__ */ new Map();
|
|
155
172
|
snapshotHistoryIds = /* @__PURE__ */ new Set();
|
|
156
173
|
persistedHistoryIds = /* @__PURE__ */ new Set();
|
|
174
|
+
unappendedHistoryIds = /* @__PURE__ */ new Set();
|
|
157
175
|
historyWrites = createHistoryWriteChain();
|
|
158
176
|
_historyImportPromise;
|
|
159
177
|
_loadPromise;
|
|
@@ -252,6 +270,7 @@ var AgUiThreadController = class {
|
|
|
252
270
|
this.subagentParentToolCallIds.clear();
|
|
253
271
|
this.snapshotHistoryIds.clear();
|
|
254
272
|
this.persistedHistoryIds.clear();
|
|
273
|
+
this.unappendedHistoryIds.clear();
|
|
255
274
|
for (const { message } of repo.messages) this.persistedHistoryIds.add(message.id);
|
|
256
275
|
this.publishUpdate();
|
|
257
276
|
if (repo.state !== void 0) this.loadExternalState(repo.state);
|
|
@@ -355,6 +374,19 @@ var AgUiThreadController = class {
|
|
|
355
374
|
this.maybeAutoCancelPendingToolCalls();
|
|
356
375
|
await this.startRun(parentId, config.runConfig);
|
|
357
376
|
}
|
|
377
|
+
/** Deletes a message that has no replies under it, and its stored history entry. */
|
|
378
|
+
async deleteMessage(messageId) {
|
|
379
|
+
const item = this.session.tryGetMessage(messageId);
|
|
380
|
+
if (!item) return;
|
|
381
|
+
const parentId = item.parentId ?? null;
|
|
382
|
+
this.session.deleteMessage(messageId, parentId);
|
|
383
|
+
this.snapshotHistoryIds.delete(messageId);
|
|
384
|
+
this.publishUpdate();
|
|
385
|
+
await this.history?.delete?.([{
|
|
386
|
+
parentId,
|
|
387
|
+
message: item.message
|
|
388
|
+
}]);
|
|
389
|
+
}
|
|
358
390
|
async cancel() {
|
|
359
391
|
this.dispatch({ type: "historyMutationAdvanced" });
|
|
360
392
|
this.abortActiveRun();
|
|
@@ -975,6 +1007,8 @@ var AgUiThreadController = class {
|
|
|
975
1007
|
const assistantParentId = parent ? parentId : this.session.headId;
|
|
976
1008
|
let assistantMessageId;
|
|
977
1009
|
let snapshotAssistantId;
|
|
1010
|
+
const importedRunAssistants = /* @__PURE__ */ new Set();
|
|
1011
|
+
const runSubagentIds = /* @__PURE__ */ new Set();
|
|
978
1012
|
let replayInterruptMessageId;
|
|
979
1013
|
let assistantCollided = false;
|
|
980
1014
|
const heldMessages = /* @__PURE__ */ new Map();
|
|
@@ -1249,9 +1283,29 @@ var AgUiThreadController = class {
|
|
|
1249
1283
|
adoptServerMessageId(serverId, true, frameOpenIds);
|
|
1250
1284
|
}
|
|
1251
1285
|
});
|
|
1286
|
+
const settleRunSubagents = (status) => {
|
|
1287
|
+
if (runSubagentIds.size === 0) return;
|
|
1288
|
+
for (const message of this.session.getMessages()) {
|
|
1289
|
+
if (message.role !== "assistant") continue;
|
|
1290
|
+
const content = settleNestedContent(message.content, status, runSubagentIds);
|
|
1291
|
+
if (content === message.content) continue;
|
|
1292
|
+
this.updateAssistantMessage(message.id, { content });
|
|
1293
|
+
this.persistSettledAssistant(message.id);
|
|
1294
|
+
}
|
|
1295
|
+
};
|
|
1296
|
+
const persistRunAssistants = (aboveAnswer) => {
|
|
1297
|
+
for (const message of this.session.getMessages()) {
|
|
1298
|
+
if (message.id === assistantMessageId) {
|
|
1299
|
+
if (aboveAnswer) return;
|
|
1300
|
+
continue;
|
|
1301
|
+
}
|
|
1302
|
+
if (message.role === "assistant" && !runStartMessageIds.has(message.id)) this.persistAssistantHistory(message.id);
|
|
1303
|
+
}
|
|
1304
|
+
};
|
|
1252
1305
|
let runFinished = false;
|
|
1253
1306
|
const dispatch = (event) => {
|
|
1254
1307
|
if (this.abortController !== abortController) return;
|
|
1308
|
+
if (event.type === "SUBAGENT_STARTED") runSubagentIds.add(event.subagentRunId);
|
|
1255
1309
|
if (event.type === "RUN_FINISHED") {
|
|
1256
1310
|
runFinished = true;
|
|
1257
1311
|
if (event.outcome?.type === "interrupt") replayInterruptMessageId = assistantMessageId ?? replayTail;
|
|
@@ -1263,10 +1317,21 @@ var AgUiThreadController = class {
|
|
|
1263
1317
|
for (const openToolCallIds of heldMessages.values()) openToolCallIds.delete(event.toolCallId);
|
|
1264
1318
|
}
|
|
1265
1319
|
settlingRun = event.type === "RUN_FINISHED" || event.type === "RUN_ERROR" || event.type === "RUN_CANCELLED";
|
|
1320
|
+
if (settlingRun) persistRunAssistants(true);
|
|
1266
1321
|
const beforeSnapshot = event.type === "MESSAGES_SNAPSHOT" ? this.session.getMessages() : [];
|
|
1267
1322
|
try {
|
|
1268
1323
|
const nextAssistantMessageId = this.handleEvent(aggregator, event, assistantMessageId, joinStrategy, runStartMessageIds, hasRunUserBoundary, candidateContexts.size ? reconcileReplaySnapshot : void 0);
|
|
1269
1324
|
if (event.type === "MESSAGES_SNAPSHOT") {
|
|
1325
|
+
const previousIds = new Set(beforeSnapshot.map(({ id }) => id));
|
|
1326
|
+
for (const message of this.session.getMessages()) {
|
|
1327
|
+
if (message.role !== "assistant" || runStartMessageIds.has(message.id)) continue;
|
|
1328
|
+
if (!previousIds.has(message.id)) importedRunAssistants.add(message.id);
|
|
1329
|
+
if (!this.persistedHistoryIds.has(message.id) && this.historyWrites.pending(message.id) === void 0) this.snapshotHistoryIds.delete(message.id);
|
|
1330
|
+
}
|
|
1331
|
+
for (const messageId of importedRunAssistants) {
|
|
1332
|
+
const item = this.session.tryGetMessage(messageId);
|
|
1333
|
+
if (item) this.markPendingAssistantHistory(messageId, item.parentId);
|
|
1334
|
+
}
|
|
1270
1335
|
for (const message of beforeSnapshot) {
|
|
1271
1336
|
const context = replayContexts.get(message.id);
|
|
1272
1337
|
const current = this.session.tryGetMessage(message.id)?.message;
|
|
@@ -1285,6 +1350,16 @@ var AgUiThreadController = class {
|
|
|
1285
1350
|
snapshotAssistantId = tail?.role === "assistant" ? tail.id : void 0;
|
|
1286
1351
|
}
|
|
1287
1352
|
}
|
|
1353
|
+
if (event.type === "RUN_ERROR") settleRunSubagents({
|
|
1354
|
+
type: "incomplete",
|
|
1355
|
+
reason: "error",
|
|
1356
|
+
...event.message !== void 0 ? { error: event.message } : {}
|
|
1357
|
+
});
|
|
1358
|
+
else if (event.type === "RUN_CANCELLED") settleRunSubagents({
|
|
1359
|
+
type: "incomplete",
|
|
1360
|
+
reason: "cancelled"
|
|
1361
|
+
});
|
|
1362
|
+
if (settlingRun) persistRunAssistants(false);
|
|
1288
1363
|
} finally {
|
|
1289
1364
|
settlingRun = false;
|
|
1290
1365
|
}
|
|
@@ -1292,6 +1367,7 @@ var AgUiThreadController = class {
|
|
|
1292
1367
|
this.abortController = abortController;
|
|
1293
1368
|
const runAgentInstance = this.agent;
|
|
1294
1369
|
this.activeRunAgent = runAgentInstance;
|
|
1370
|
+
const runNumber = ++this.runCount;
|
|
1295
1371
|
let cancelRun = () => dispatch({ type: "RUN_CANCELLED" });
|
|
1296
1372
|
abortSignal.addEventListener("abort", () => {
|
|
1297
1373
|
cancelRun();
|
|
@@ -1354,6 +1430,7 @@ var AgUiThreadController = class {
|
|
|
1354
1430
|
} finally {
|
|
1355
1431
|
const current = assistantMessageId ? this.session.tryGetMessage(assistantMessageId)?.message : void 0;
|
|
1356
1432
|
if (this.abortController === abortController && current?.role === "assistant" && current.status?.type === "running") {
|
|
1433
|
+
persistRunAssistants(true);
|
|
1357
1434
|
const status = {
|
|
1358
1435
|
type: "incomplete",
|
|
1359
1436
|
reason: "error",
|
|
@@ -1365,6 +1442,15 @@ var AgUiThreadController = class {
|
|
|
1365
1442
|
content: settleNestedContent(current.content, status)
|
|
1366
1443
|
});
|
|
1367
1444
|
}
|
|
1445
|
+
if (this.abortController === abortController && !runFinished) {
|
|
1446
|
+
const settled = assistantMessageId ? this.session.tryGetMessage(assistantMessageId)?.message : void 0;
|
|
1447
|
+
settleRunSubagents(settled?.status?.type === "incomplete" ? settled.status : {
|
|
1448
|
+
type: "incomplete",
|
|
1449
|
+
reason: "error",
|
|
1450
|
+
error: "The connection ended before the answer finished."
|
|
1451
|
+
});
|
|
1452
|
+
}
|
|
1453
|
+
if (this.runCount === runNumber) persistRunAssistants(false);
|
|
1368
1454
|
this.finishRun(abortController);
|
|
1369
1455
|
}
|
|
1370
1456
|
if (pendingError) {
|
|
@@ -1582,9 +1668,11 @@ var AgUiThreadController = class {
|
|
|
1582
1668
|
if (!collidesWithExisting) ids.add(newId);
|
|
1583
1669
|
}
|
|
1584
1670
|
const pendingWrite = this.historyWrites.move(oldId, collidesWithExisting ? void 0 : newId);
|
|
1671
|
+
if (this.unappendedHistoryIds.delete(oldId) && !collidesWithExisting) this.unappendedHistoryIds.add(newId);
|
|
1585
1672
|
if (pendingWrite && !collidesWithExisting) pendingWrite.then(() => {
|
|
1586
1673
|
this.persistedHistoryIds.delete(oldId);
|
|
1587
1674
|
this.persistedHistoryIds.add(newId);
|
|
1675
|
+
this.unappendedHistoryIds.delete(newId);
|
|
1588
1676
|
}, () => {});
|
|
1589
1677
|
this.publishUpdate();
|
|
1590
1678
|
return !collidesWithExisting;
|
|
@@ -2109,7 +2197,10 @@ var AgUiThreadController = class {
|
|
|
2109
2197
|
const wasPersisted = this.persistedHistoryIds.has(messageId);
|
|
2110
2198
|
const update = history.update;
|
|
2111
2199
|
if (update !== void 0 && (wasPersisted || this.snapshotHistoryIds.has(messageId) || this.historyWrites.pending(messageId) !== void 0)) {
|
|
2112
|
-
const write = this.historyWrites.chain(messageId, () =>
|
|
2200
|
+
const write = this.historyWrites.chain(messageId, () => this.unappendedHistoryIds.has(messageId) ? this.appendOnce(history, messageId, {
|
|
2201
|
+
parentId,
|
|
2202
|
+
message
|
|
2203
|
+
}) : update.call(history, {
|
|
2113
2204
|
parentId,
|
|
2114
2205
|
message
|
|
2115
2206
|
}));
|
|
@@ -2136,12 +2227,17 @@ var AgUiThreadController = class {
|
|
|
2136
2227
|
this.logger.error?.("[agui] failed to append history entry", error);
|
|
2137
2228
|
});
|
|
2138
2229
|
}
|
|
2230
|
+
async appendOnce(history, messageId, item) {
|
|
2231
|
+
await history.append(item);
|
|
2232
|
+
this.unappendedHistoryIds.delete(messageId);
|
|
2233
|
+
}
|
|
2139
2234
|
appendHistoryItem(parentId, message) {
|
|
2140
2235
|
if (!this.history || this.persistedHistoryIds.has(message.id)) return;
|
|
2141
2236
|
const pending = this.historyWrites.pending(message.id);
|
|
2142
2237
|
if (pending) return pending;
|
|
2143
|
-
const
|
|
2144
|
-
|
|
2238
|
+
const history = this.history;
|
|
2239
|
+
this.unappendedHistoryIds.add(message.id);
|
|
2240
|
+
const write = this.historyWrites.chain(message.id, () => this.appendOnce(history, message.id, {
|
|
2145
2241
|
parentId,
|
|
2146
2242
|
message
|
|
2147
2243
|
}));
|