@agent-native/core 0.84.51 → 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.
Files changed (42) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +8 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/agent/run-store.ts +33 -6
  5. package/corpus/core/src/client/AssistantChat.tsx +84 -23
  6. package/corpus/core/src/client/agent-chat-adapter.ts +19 -0
  7. package/corpus/core/src/client/blocks/library/DiffBlock.tsx +7 -5
  8. package/corpus/core/src/client/session-replay.ts +170 -47
  9. package/corpus/core/src/client/sse-event-processor.ts +75 -14
  10. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +5 -0
  11. package/corpus/templates/analytics/changelog/2026-07-02-agent-chat-can-keep-working-through-longer-data-queries-inst.md +6 -0
  12. package/corpus/templates/analytics/changelog/2026-07-02-session-replay-playback-recovers-from-failed-snapshot-uploads.md +6 -0
  13. package/corpus/templates/analytics/netlify.toml +3 -0
  14. package/corpus/templates/analytics/server/lib/session-replay.ts +9 -5
  15. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -0
  16. package/corpus/templates/plan/changelog/2026-07-02-agent-chat-can-keep-working-through-longer-visual-plan-updat.md +6 -0
  17. package/corpus/templates/plan/netlify.toml +3 -0
  18. package/corpus/templates/plan/server/plugins/agent-chat.ts +4 -0
  19. package/dist/agent/run-store.d.ts.map +1 -1
  20. package/dist/agent/run-store.js +30 -6
  21. package/dist/agent/run-store.js.map +1 -1
  22. package/dist/client/AssistantChat.d.ts.map +1 -1
  23. package/dist/client/AssistantChat.js +64 -13
  24. package/dist/client/AssistantChat.js.map +1 -1
  25. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  26. package/dist/client/agent-chat-adapter.js +14 -0
  27. package/dist/client/agent-chat-adapter.js.map +1 -1
  28. package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
  29. package/dist/client/blocks/library/DiffBlock.js +6 -5
  30. package/dist/client/blocks/library/DiffBlock.js.map +1 -1
  31. package/dist/client/session-replay.d.ts.map +1 -1
  32. package/dist/client/session-replay.js +134 -39
  33. package/dist/client/session-replay.js.map +1 -1
  34. package/dist/client/sse-event-processor.d.ts +25 -0
  35. package/dist/client/sse-event-processor.d.ts.map +1 -1
  36. package/dist/client/sse-event-processor.js +50 -13
  37. package/dist/client/sse-event-processor.js.map +1 -1
  38. package/dist/collab/routes.d.ts +1 -1
  39. package/dist/notifications/routes.d.ts +1 -1
  40. package/dist/observability/routes.d.ts +5 -5
  41. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  42. package/package.json +1 -1
@@ -157,6 +157,12 @@ export interface SSEStreamOptions {
157
157
  * so one stuck action cannot pin the chat forever.
158
158
  */
159
159
  durableBackgroundRun?: boolean;
160
+ /**
161
+ * Optional caller-owned preparation watchdog state. Passing the same object
162
+ * across reconnect reads keeps a stuck action preparation from getting a
163
+ * fresh stall budget every time the browser reattaches to the same run.
164
+ */
165
+ preparingActionState?: PreparingActionState;
160
166
  }
161
167
 
162
168
  type ActivityTrailEntry = AgentActivityTrailEntry;
@@ -177,8 +183,9 @@ type PreparingActionEntry = {
177
183
  lastProgressAt?: number;
178
184
  };
179
185
 
180
- type PreparingActionState = {
186
+ export type PreparingActionState = {
181
187
  entries?: Map<string, PreparingActionEntry>;
188
+ toolEntries?: Map<string, PreparingActionEntry>;
182
189
  };
183
190
 
184
191
  function formatProgressBytes(bytes: number): string {
@@ -312,6 +319,37 @@ function appendActivityTrail(
312
319
  }
313
320
  }
314
321
 
322
+ function refreshPreparingToolEntry(state: PreparingActionState, tool: string) {
323
+ const remainingEntries = [...(state.entries?.values() ?? [])].filter(
324
+ (entry) => entry.tool === tool,
325
+ );
326
+ if (remainingEntries.length === 0) {
327
+ state.toolEntries?.delete(tool);
328
+ return;
329
+ }
330
+ const deadlineBasis = (entry: PreparingActionEntry) =>
331
+ entry.lastProgressAt ?? entry.startedAt ?? Number.POSITIVE_INFINITY;
332
+ const oldestEntry = remainingEntries.reduce((oldest, entry) =>
333
+ deadlineBasis(entry) < deadlineBasis(oldest) ? entry : oldest,
334
+ );
335
+ const lastProgressBytes = remainingEntries.reduce<number | undefined>(
336
+ (max, entry) =>
337
+ entry.lastProgressBytes === undefined
338
+ ? max
339
+ : Math.max(max ?? 0, entry.lastProgressBytes),
340
+ undefined,
341
+ );
342
+ const toolEntries =
343
+ state.toolEntries ?? new Map<string, PreparingActionEntry>();
344
+ state.toolEntries = toolEntries;
345
+ toolEntries.set(tool, {
346
+ tool,
347
+ startedAt: oldestEntry.startedAt,
348
+ lastProgressAt: oldestEntry.lastProgressAt,
349
+ lastProgressBytes,
350
+ });
351
+ }
352
+
315
353
  function updatePreparingActionState(
316
354
  state: PreparingActionState,
317
355
  ev: SSEEvent,
@@ -320,7 +358,8 @@ function updatePreparingActionState(
320
358
  if (ev.type === "activity" && isPreparingActionActivity(ev)) {
321
359
  const tool = ev.tool?.trim() || undefined;
322
360
  if (!tool) return false;
323
- const key = ev.id?.trim() || tool;
361
+ const id = ev.id?.trim();
362
+ const key = id || tool;
324
363
  const entries = state.entries ?? new Map<string, PreparingActionEntry>();
325
364
  state.entries = entries;
326
365
  let entry = entries.get(key);
@@ -333,22 +372,35 @@ function updatePreparingActionState(
333
372
  };
334
373
  entries.set(key, entry);
335
374
  }
375
+ const toolEntries =
376
+ state.toolEntries ?? new Map<string, PreparingActionEntry>();
377
+ state.toolEntries = toolEntries;
378
+ let toolEntry = toolEntries.get(tool);
379
+ if (!toolEntry) {
380
+ toolEntry = {
381
+ tool,
382
+ startedAt: now,
383
+ lastProgressAt: undefined,
384
+ lastProgressBytes: undefined,
385
+ };
386
+ toolEntries.set(tool, toolEntry);
387
+ }
336
388
  const progressBytes = activityProgressBytes(ev);
337
389
  const previousBytes = entry.lastProgressBytes ?? 0;
390
+ let madeProgress = false;
338
391
  if (progressBytes !== undefined) {
339
392
  entry.lastProgressBytes = Math.max(previousBytes, progressBytes);
393
+ toolEntry.lastProgressBytes = Math.max(
394
+ toolEntry.lastProgressBytes ?? 0,
395
+ progressBytes,
396
+ );
397
+ madeProgress = id ? progressBytes > previousBytes : progressBytes > 0;
340
398
  }
341
- if (!ev.id?.trim()) {
342
- if (progressBytes !== undefined && progressBytes > 0) {
343
- entry.lastProgressAt = now;
344
- return true;
345
- }
346
- return false;
347
- }
348
- if (progressBytes !== undefined && progressBytes > previousBytes) {
399
+ if (madeProgress) {
349
400
  // A byte increase is proof the model is still streaming this action's
350
401
  // argument. Repeated zero-byte prep activity is only a heartbeat.
351
402
  entry.lastProgressAt = now;
403
+ toolEntry.lastProgressAt = now;
352
404
  return true;
353
405
  }
354
406
  return false;
@@ -367,12 +419,16 @@ function updatePreparingActionState(
367
419
  const tool = ev.tool?.trim();
368
420
  const id = ev.id?.trim();
369
421
  for (const [key, entry] of state.entries ?? []) {
370
- if ((id && key === id) || (!id && entry.tool === tool)) {
422
+ if ((id && key === id) || (!id && tool && entry.tool === tool)) {
371
423
  state.entries?.delete(key);
372
424
  }
373
425
  }
426
+ if (tool) {
427
+ refreshPreparingToolEntry(state, tool);
428
+ }
374
429
  } else {
375
430
  state.entries?.clear();
431
+ state.toolEntries?.clear();
376
432
  }
377
433
  }
378
434
  return undefined;
@@ -384,7 +440,10 @@ function hasStalledPreparingAction(state: PreparingActionState, now: number) {
384
440
  // streaming for a long time. `lastProgressAt` advances on every delta
385
441
  // heartbeat, so an actively-streaming large output keeps resetting this and
386
442
  // survives; a genuinely stuck prep (keepalive-only, no deltas) trips it.
387
- for (const entry of state.entries?.values() ?? []) {
443
+ for (const entry of [
444
+ ...(state.toolEntries?.values() ?? []),
445
+ ...(state.entries?.values() ?? []),
446
+ ]) {
388
447
  if (
389
448
  entry.startedAt !== undefined &&
390
449
  now - (entry.lastProgressAt ?? entry.startedAt) >=
@@ -1239,7 +1298,8 @@ export async function* readSSEStream(
1239
1298
  let buf = "";
1240
1299
  let lastMeaningfulEventAt = Date.now();
1241
1300
  const activityTrail: ActivityTrailEntry[] = [];
1242
- const preparingActionState: PreparingActionState = {};
1301
+ const preparingActionState: PreparingActionState =
1302
+ options?.preparingActionState ?? {};
1243
1303
  const processEventState: ProcessEventState = {
1244
1304
  completedToolsAfterLastAssistantText: new Set(),
1245
1305
  };
@@ -1431,7 +1491,8 @@ export async function readSSEStreamRaw(
1431
1491
  let buf = "";
1432
1492
  let lastMeaningfulEventAt = Date.now();
1433
1493
  const activityTrail: ActivityTrailEntry[] = [];
1434
- const preparingActionState: PreparingActionState = {};
1494
+ const preparingActionState: PreparingActionState =
1495
+ options?.preparingActionState ?? {};
1435
1496
  const processEventState: ProcessEventState = {
1436
1497
  completedToolsAfterLastAssistantText: new Set(),
1437
1498
  };
@@ -429,6 +429,11 @@ function ReplayPlayer({
429
429
  if (events.length < 2) {
430
430
  throw new Error(t("sessions.noReplayEvents"));
431
431
  }
432
+ if (
433
+ !events.some((event) => event.type === RRWEB_EVENT_TYPE.FullSnapshot)
434
+ ) {
435
+ throw new Error(t("sessions.noReplayEvents"));
436
+ }
432
437
  setStatus("loading");
433
438
  setError(null);
434
439
  await import("@rrweb/replay/dist/style.css");
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-02
4
+ ---
5
+
6
+ Agent chat can keep working through longer data queries instead of stopping mid-action.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-02
4
+ ---
5
+
6
+ Session replay playback now preserves the initial page snapshot when an upload needs to retry.
@@ -9,11 +9,14 @@ GA_MEASUREMENT_ID = "G-ESF7FYXGN9"
9
9
  NITRO_PRESET = "netlify"
10
10
  NPM_CONFIG_PRODUCTION = "false"
11
11
  AGENT_PROD_CODE_EXECUTION = "sandboxed"
12
+ AGENT_CHAT_DURABLE_BACKGROUND = "true"
12
13
 
13
14
  # A2A delegation calls run a full agent loop (LLM + tool calls + DB queries).
14
15
  # Hosted agent chat uses a soft timeout before this function timeout so the
15
16
  # hidden auto-continuation path can hand off before Netlify kills the function.
16
17
  # If AGENT_RUN_SOFT_TIMEOUT_MS is customized, keep it below this timeout.
18
+ # Agent chat runs are dispatched to the emitted Netlify background function;
19
+ # the normal server timeout still protects non-background HTTP handlers.
17
20
  [functions."*"]
18
21
  timeout = 75
19
22
 
@@ -152,7 +152,8 @@ const MAX_REPLAY_BLOB_REF_LENGTH = 16 * 1024;
152
152
  const MAX_REPLAY_METADATA_BYTES = 16 * 1024;
153
153
  const MAX_REPLAY_EVENTS_PER_CHUNK = 1_000;
154
154
  const MAX_REPLAY_EVENTS_READ = 10_000;
155
- const MAX_REPLAY_EVENTS_RESPONSE_BYTES = 2 * 1024 * 1024;
155
+ const MAX_REPLAY_EVENTS_RESPONSE_BYTES =
156
+ MAX_BLOB_REPLAY_CHUNK_BYTES + 512 * 1024;
156
157
  const DEFAULT_SESSION_RECORDINGS_LIMIT = 50;
157
158
  const MAX_SESSION_RECORDINGS_LIMIT = 100;
158
159
  const DEFAULT_REPLAY_RETENTION_DAYS = 30;
@@ -550,6 +551,12 @@ async function storeReplayChunkBlob(
550
551
  503,
551
552
  );
552
553
  }
554
+ if (chunk.byteLength > MAX_INLINE_REPLAY_CHUNK_BYTES) {
555
+ throw replayError(
556
+ "Session replay chunk is too large for inline SQL fallback. Configure private blob storage for full snapshot playback.",
557
+ 503,
558
+ );
559
+ }
553
560
  warnInlineReplayFallback();
554
561
  return chunk;
555
562
  }
@@ -590,10 +597,7 @@ function normalizeReplayChunk(rawValue: unknown): NormalizedSessionReplayChunk {
590
597
  storageKind === "inline"
591
598
  ? Buffer.byteLength(inlineData ?? "", "utf8")
592
599
  : (replayInteger(raw.byteLength ?? raw.bytes) ?? 0);
593
- const maxBytes =
594
- storageKind === "inline"
595
- ? MAX_INLINE_REPLAY_CHUNK_BYTES
596
- : MAX_BLOB_REPLAY_CHUNK_BYTES;
600
+ const maxBytes = MAX_BLOB_REPLAY_CHUNK_BYTES;
597
601
  if (byteLength <= 0 || byteLength > maxBytes) {
598
602
  throw replayError(
599
603
  `Replay ${storageKind} chunks must be between 1 and ${maxBytes} bytes`,
@@ -28,6 +28,7 @@ import {
28
28
  } from "../lib/scoped-settings";
29
29
 
30
30
  const DATA_DICT_PREFIX = "data-dict-";
31
+ const ANALYTICS_BACKGROUND_RUN_SOFT_TIMEOUT_MS = 13 * 60_000;
31
32
 
32
33
  const INITIAL_TOOL_NAMES = [
33
34
  "view-screen",
@@ -170,6 +171,8 @@ export default createAgentChatPlugin({
170
171
  // Operators deploying to trusted internal environments can set
171
172
  // AGENT_PROD_CODE_EXECUTION=trusted to also enable bash/read/edit/write.
172
173
  codeExecution: { production: "sandboxed" },
174
+ durableBackgroundRuns: true,
175
+ runSoftTimeoutMs: ANALYTICS_BACKGROUND_RUN_SOFT_TIMEOUT_MS,
173
176
  resolveOrgId: async (event) => {
174
177
  const ctx = await getOrgContext(event);
175
178
  return ctx.orgId;
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-02
4
+ ---
5
+
6
+ Agent chat can keep working through longer visual plan updates instead of stopping mid-action.
@@ -8,8 +8,11 @@ functions = "templates/plan/.netlify/functions-internal"
8
8
  GA_MEASUREMENT_ID = "G-ESF7FYXGN9"
9
9
  NITRO_PRESET = "netlify"
10
10
  NPM_CONFIG_PRODUCTION = "false"
11
+ AGENT_CHAT_DURABLE_BACKGROUND = "true"
11
12
 
12
13
  # A2A/MCP calls may include plan generation, artifact serialization, and
13
14
  # feedback polling. Keep this aligned with other agent-heavy hosted templates.
15
+ # Agent chat runs are dispatched to the emitted Netlify background function;
16
+ # the normal server timeout still protects non-background HTTP handlers.
14
17
  [functions."*"]
15
18
  timeout = 75
@@ -10,6 +10,8 @@ import actionsRegistry from "../../.generated/actions-registry.js";
10
10
  import { PLAN_CONNECTOR_CATALOG } from "../lib/plan-connector-catalog.js";
11
11
  import { resolvePlanAnonymousOwner } from "../lib/public-plans.js";
12
12
 
13
+ const PLAN_BACKGROUND_RUN_SOFT_TIMEOUT_MS = 13 * 60_000;
14
+
13
15
  // ---------------------------------------------------------------------------
14
16
  // Register plan event-bus events
15
17
  // ---------------------------------------------------------------------------
@@ -130,6 +132,8 @@ const planAgentChatOptions = {
130
132
  resolveOrgId: async (event) => (await getOrgContext(event)).orgId,
131
133
  connectorCatalog: PLAN_CONNECTOR_CATALOG,
132
134
  disableMcp: true,
135
+ durableBackgroundRuns: true,
136
+ runSoftTimeoutMs: PLAN_BACKGROUND_RUN_SOFT_TIMEOUT_MS,
133
137
  };
134
138
 
135
139
  export default createAgentChatPlugin(planAgentChatOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/agent/run-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/agent/run-store.ts"],"names":[],"mappings":"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"}
@@ -679,9 +679,9 @@ export async function reconcileTerminalRunFromEvents(runId) {
679
679
  sql: `UPDATE agent_runs
680
680
  SET status = ?,
681
681
  completed_at = COALESCE(completed_at, ?, ${livenessBasisSql()}),
682
- error_code = CASE WHEN ? IS NOT NULL THEN ? ELSE error_code END,
683
- error_detail = CASE WHEN ? IS NOT NULL THEN ? ELSE error_detail END,
684
- terminal_reason = COALESCE(terminal_reason, ?)
682
+ error_code = ?,
683
+ error_detail = ?,
684
+ terminal_reason = ?
685
685
  WHERE id = ?
686
686
  AND (
687
687
  status = 'running'
@@ -691,8 +691,6 @@ export async function reconcileTerminalRunFromEvents(runId) {
691
691
  status,
692
692
  latest.eventAt,
693
693
  errorCode,
694
- errorCode,
695
- errorDetail,
696
694
  errorDetail,
697
695
  terminalReason,
698
696
  runId,
@@ -1053,7 +1051,7 @@ export async function listRunsForThread(threadId, options = {}) {
1053
1051
  await ensureRunTables();
1054
1052
  const limit = Math.min(Math.max(options.limit ?? 10, 1), 50);
1055
1053
  const client = getDbExec();
1056
- const { rows } = await client.execute({
1054
+ let { rows } = await client.execute({
1057
1055
  sql: `SELECT id, thread_id, turn_id, status, started_at, heartbeat_at, completed_at, last_progress_at, error_code, abort_reason, dispatch_mode, terminal_reason, diag_stage
1058
1056
  FROM agent_runs
1059
1057
  WHERE thread_id = ?
@@ -1061,6 +1059,32 @@ export async function listRunsForThread(threadId, options = {}) {
1061
1059
  LIMIT ?`,
1062
1060
  args: [threadId, limit],
1063
1061
  });
1062
+ let repairedTerminalRow = false;
1063
+ for (const r of rows) {
1064
+ const row = r;
1065
+ const runId = row.id;
1066
+ if (!runId)
1067
+ continue;
1068
+ const canReconcileFromEvents = row.status === "running" ||
1069
+ (row.status === "errored" &&
1070
+ row.error_code === STALE_RUN_ERROR_EVENT.errorCode);
1071
+ if (!canReconcileFromEvents)
1072
+ continue;
1073
+ repairedTerminalRow =
1074
+ (await reconcileTerminalRunFromEvents(runId).catch(() => false)) ||
1075
+ repairedTerminalRow;
1076
+ }
1077
+ if (repairedTerminalRow) {
1078
+ const refreshed = await client.execute({
1079
+ sql: `SELECT id, thread_id, turn_id, status, started_at, heartbeat_at, completed_at, last_progress_at, error_code, abort_reason, dispatch_mode, terminal_reason, diag_stage
1080
+ FROM agent_runs
1081
+ WHERE thread_id = ?
1082
+ ORDER BY started_at DESC
1083
+ LIMIT ?`,
1084
+ args: [threadId, limit],
1085
+ });
1086
+ rows = refreshed.rows;
1087
+ }
1064
1088
  return rows.map((r) => {
1065
1089
  const row = r;
1066
1090
  return {