@agent-native/core 0.84.49 → 0.84.52
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/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +20 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/run-store.ts +33 -6
- package/corpus/core/src/client/AssistantChat.tsx +84 -23
- package/corpus/core/src/client/agent-chat-adapter.ts +59 -9
- package/corpus/core/src/client/blocks/library/DiffBlock.tsx +7 -5
- package/corpus/core/src/client/session-replay.ts +170 -47
- package/corpus/core/src/client/sse-event-processor.ts +106 -29
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +5 -0
- package/corpus/templates/analytics/changelog/2026-07-02-agent-chat-can-keep-working-through-longer-data-queries-inst.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-02-session-replay-playback-recovers-from-failed-snapshot-uploads.md +6 -0
- package/corpus/templates/analytics/netlify.toml +3 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +9 -5
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -0
- package/corpus/templates/plan/changelog/2026-07-02-agent-chat-can-keep-working-through-longer-visual-plan-updat.md +6 -0
- package/corpus/templates/plan/netlify.toml +3 -0
- package/corpus/templates/plan/server/plugins/agent-chat.ts +4 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +30 -6
- package/dist/agent/run-store.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +64 -13
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +50 -9
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/DiffBlock.js +6 -5
- package/dist/client/blocks/library/DiffBlock.js.map +1 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +134 -39
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +29 -3
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +72 -18
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +7 -7
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-event-processor.d.ts","sourceRoot":"","sources":["../../src/client/sse-event-processor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sse-event-processor.d.ts","sourceRoot":"","sources":["../../src/client/sse-event-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -113,6 +113,19 @@ function findPendingToolCallIndex(content, toolName, toolCallId) {
|
|
|
113
113
|
}
|
|
114
114
|
return -1;
|
|
115
115
|
}
|
|
116
|
+
function findCompletedToolCallIndex(content, toolCallId) {
|
|
117
|
+
if (!toolCallId)
|
|
118
|
+
return -1;
|
|
119
|
+
for (let i = content.length - 1; i >= 0; i--) {
|
|
120
|
+
const part = content[i];
|
|
121
|
+
if (part.type === "tool-call" &&
|
|
122
|
+
part.toolCallId === toolCallId &&
|
|
123
|
+
part.result !== undefined) {
|
|
124
|
+
return i;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return -1;
|
|
128
|
+
}
|
|
116
129
|
function appendActivityTrail(trail, next) {
|
|
117
130
|
const label = next.label.trim();
|
|
118
131
|
if (!label)
|
|
@@ -126,12 +139,33 @@ function appendActivityTrail(trail, next) {
|
|
|
126
139
|
trail.splice(0, trail.length - 8);
|
|
127
140
|
}
|
|
128
141
|
}
|
|
142
|
+
function refreshPreparingToolEntry(state, tool) {
|
|
143
|
+
const remainingEntries = [...(state.entries?.values() ?? [])].filter((entry) => entry.tool === tool);
|
|
144
|
+
if (remainingEntries.length === 0) {
|
|
145
|
+
state.toolEntries?.delete(tool);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const deadlineBasis = (entry) => entry.lastProgressAt ?? entry.startedAt ?? Number.POSITIVE_INFINITY;
|
|
149
|
+
const oldestEntry = remainingEntries.reduce((oldest, entry) => deadlineBasis(entry) < deadlineBasis(oldest) ? entry : oldest);
|
|
150
|
+
const lastProgressBytes = remainingEntries.reduce((max, entry) => entry.lastProgressBytes === undefined
|
|
151
|
+
? max
|
|
152
|
+
: Math.max(max ?? 0, entry.lastProgressBytes), undefined);
|
|
153
|
+
const toolEntries = state.toolEntries ?? new Map();
|
|
154
|
+
state.toolEntries = toolEntries;
|
|
155
|
+
toolEntries.set(tool, {
|
|
156
|
+
tool,
|
|
157
|
+
startedAt: oldestEntry.startedAt,
|
|
158
|
+
lastProgressAt: oldestEntry.lastProgressAt,
|
|
159
|
+
lastProgressBytes,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
129
162
|
function updatePreparingActionState(state, ev, now) {
|
|
130
163
|
if (ev.type === "activity" && isPreparingActionActivity(ev)) {
|
|
131
164
|
const tool = ev.tool?.trim() || undefined;
|
|
132
165
|
if (!tool)
|
|
133
166
|
return false;
|
|
134
|
-
const
|
|
167
|
+
const id = ev.id?.trim();
|
|
168
|
+
const key = id || tool;
|
|
135
169
|
const entries = state.entries ?? new Map();
|
|
136
170
|
state.entries = entries;
|
|
137
171
|
let entry = entries.get(key);
|
|
@@ -144,22 +178,31 @@ function updatePreparingActionState(state, ev, now) {
|
|
|
144
178
|
};
|
|
145
179
|
entries.set(key, entry);
|
|
146
180
|
}
|
|
181
|
+
const toolEntries = state.toolEntries ?? new Map();
|
|
182
|
+
state.toolEntries = toolEntries;
|
|
183
|
+
let toolEntry = toolEntries.get(tool);
|
|
184
|
+
if (!toolEntry) {
|
|
185
|
+
toolEntry = {
|
|
186
|
+
tool,
|
|
187
|
+
startedAt: now,
|
|
188
|
+
lastProgressAt: undefined,
|
|
189
|
+
lastProgressBytes: undefined,
|
|
190
|
+
};
|
|
191
|
+
toolEntries.set(tool, toolEntry);
|
|
192
|
+
}
|
|
147
193
|
const progressBytes = activityProgressBytes(ev);
|
|
148
194
|
const previousBytes = entry.lastProgressBytes ?? 0;
|
|
195
|
+
let madeProgress = false;
|
|
149
196
|
if (progressBytes !== undefined) {
|
|
150
197
|
entry.lastProgressBytes = Math.max(previousBytes, progressBytes);
|
|
198
|
+
toolEntry.lastProgressBytes = Math.max(toolEntry.lastProgressBytes ?? 0, progressBytes);
|
|
199
|
+
madeProgress = id ? progressBytes > previousBytes : progressBytes > 0;
|
|
151
200
|
}
|
|
152
|
-
if (
|
|
153
|
-
if (progressBytes !== undefined && progressBytes > 0) {
|
|
154
|
-
entry.lastProgressAt = now;
|
|
155
|
-
return true;
|
|
156
|
-
}
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
if (progressBytes !== undefined && progressBytes > previousBytes) {
|
|
201
|
+
if (madeProgress) {
|
|
160
202
|
// A byte increase is proof the model is still streaming this action's
|
|
161
203
|
// argument. Repeated zero-byte prep activity is only a heartbeat.
|
|
162
204
|
entry.lastProgressAt = now;
|
|
205
|
+
toolEntry.lastProgressAt = now;
|
|
163
206
|
return true;
|
|
164
207
|
}
|
|
165
208
|
return false;
|
|
@@ -175,26 +218,31 @@ function updatePreparingActionState(state, ev, now) {
|
|
|
175
218
|
const tool = ev.tool?.trim();
|
|
176
219
|
const id = ev.id?.trim();
|
|
177
220
|
for (const [key, entry] of state.entries ?? []) {
|
|
178
|
-
if ((id && key === id) || (!id && entry.tool === tool)) {
|
|
221
|
+
if ((id && key === id) || (!id && tool && entry.tool === tool)) {
|
|
179
222
|
state.entries?.delete(key);
|
|
180
223
|
}
|
|
181
224
|
}
|
|
225
|
+
if (tool) {
|
|
226
|
+
refreshPreparingToolEntry(state, tool);
|
|
227
|
+
}
|
|
182
228
|
}
|
|
183
229
|
else {
|
|
184
230
|
state.entries?.clear();
|
|
231
|
+
state.toolEntries?.clear();
|
|
185
232
|
}
|
|
186
233
|
}
|
|
187
234
|
return undefined;
|
|
188
235
|
}
|
|
189
|
-
function hasStalledPreparingAction(state, now
|
|
190
|
-
if (options?.durableBackgroundRun === true)
|
|
191
|
-
return false;
|
|
236
|
+
function hasStalledPreparingAction(state, now) {
|
|
192
237
|
// Fire only when a tool input has gone SILENT — no further streaming deltas
|
|
193
238
|
// for the whole window — never merely because a large input has been
|
|
194
239
|
// streaming for a long time. `lastProgressAt` advances on every delta
|
|
195
240
|
// heartbeat, so an actively-streaming large output keeps resetting this and
|
|
196
241
|
// survives; a genuinely stuck prep (keepalive-only, no deltas) trips it.
|
|
197
|
-
for (const entry of
|
|
242
|
+
for (const entry of [
|
|
243
|
+
...(state.toolEntries?.values() ?? []),
|
|
244
|
+
...(state.entries?.values() ?? []),
|
|
245
|
+
]) {
|
|
198
246
|
if (entry.startedAt !== undefined &&
|
|
199
247
|
now - (entry.lastProgressAt ?? entry.startedAt) >=
|
|
200
248
|
SSE_ACTION_PREPARATION_STALL_TIMEOUT_MS) {
|
|
@@ -529,6 +577,9 @@ export function processEvent(ev, content, toolCallCounter, tabId, state) {
|
|
|
529
577
|
if (ev.type === "tool_start") {
|
|
530
578
|
const args = (ev.input ?? {});
|
|
531
579
|
const tool = ev.tool ?? "unknown";
|
|
580
|
+
if (findCompletedToolCallIndex(content, ev.id) >= 0) {
|
|
581
|
+
return { action: "continue" };
|
|
582
|
+
}
|
|
532
583
|
if (typeof window !== "undefined") {
|
|
533
584
|
window.dispatchEvent(new CustomEvent("agent-native:tool-start", {
|
|
534
585
|
detail: { tool, input: args },
|
|
@@ -602,6 +653,9 @@ export function processEvent(ev, content, toolCallCounter, tabId, state) {
|
|
|
602
653
|
// so a tool_done frame with an undefined tool name still matches its
|
|
603
654
|
// pending tool-call entry instead of leaving it forever unresolved.
|
|
604
655
|
const doneTool = ev.tool ?? "unknown";
|
|
656
|
+
if (findCompletedToolCallIndex(content, ev.id) >= 0) {
|
|
657
|
+
return { action: "continue" };
|
|
658
|
+
}
|
|
605
659
|
if (typeof window !== "undefined") {
|
|
606
660
|
window.dispatchEvent(new CustomEvent("agent-native:tool-done", {
|
|
607
661
|
detail: { tool: doneTool, result: ev.result },
|
|
@@ -918,7 +972,7 @@ export async function* readSSEStream(body, content, toolCallCounter, tabId, onSe
|
|
|
918
972
|
let buf = "";
|
|
919
973
|
let lastMeaningfulEventAt = Date.now();
|
|
920
974
|
const activityTrail = [];
|
|
921
|
-
const preparingActionState = {};
|
|
975
|
+
const preparingActionState = options?.preparingActionState ?? {};
|
|
922
976
|
const processEventState = {
|
|
923
977
|
completedToolsAfterLastAssistantText: new Set(),
|
|
924
978
|
};
|
|
@@ -1025,7 +1079,7 @@ export async function* readSSEStream(body, content, toolCallCounter, tabId, onSe
|
|
|
1025
1079
|
const { action, result, autoContinue } = processEvent(ev, content, toolCallCounter, tabId, processEventState);
|
|
1026
1080
|
if (result)
|
|
1027
1081
|
yield withStreamMetadata(result);
|
|
1028
|
-
if (hasStalledPreparingAction(preparingActionState, Date.now()
|
|
1082
|
+
if (hasStalledPreparingAction(preparingActionState, Date.now())) {
|
|
1029
1083
|
throw new AgentAutoContinueSignal({
|
|
1030
1084
|
reason: "no_progress",
|
|
1031
1085
|
activityTrail: [...activityTrail],
|
|
@@ -1081,7 +1135,7 @@ export async function readSSEStreamRaw(body, content, toolCallCounter, tabId, on
|
|
|
1081
1135
|
let buf = "";
|
|
1082
1136
|
let lastMeaningfulEventAt = Date.now();
|
|
1083
1137
|
const activityTrail = [];
|
|
1084
|
-
const preparingActionState = {};
|
|
1138
|
+
const preparingActionState = options?.preparingActionState ?? {};
|
|
1085
1139
|
const processEventState = {
|
|
1086
1140
|
completedToolsAfterLastAssistantText: new Set(),
|
|
1087
1141
|
};
|
|
@@ -1176,7 +1230,7 @@ export async function readSSEStreamRaw(body, content, toolCallCounter, tabId, on
|
|
|
1176
1230
|
? { ...autoContinue, activityTrail: [...activityTrail] }
|
|
1177
1231
|
: { reason: "stream_ended", activityTrail: [...activityTrail] });
|
|
1178
1232
|
}
|
|
1179
|
-
if (hasStalledPreparingAction(preparingActionState, Date.now()
|
|
1233
|
+
if (hasStalledPreparingAction(preparingActionState, Date.now())) {
|
|
1180
1234
|
onUpdate(contentSnapshot(content));
|
|
1181
1235
|
throw new AgentAutoContinueSignal({
|
|
1182
1236
|
reason: "no_progress",
|