@agent-native/core 0.84.51 → 0.84.53
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 +15 -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 +19 -0
- 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 +75 -14
- 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 +14 -0
- 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 +25 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +50 -13
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- 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
|
|
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 (
|
|
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
|
|
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");
|
|
@@ -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 =
|
|
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;
|
|
@@ -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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"}
|
package/dist/agent/run-store.js
CHANGED
|
@@ -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 =
|
|
683
|
-
error_detail =
|
|
684
|
-
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
|
-
|
|
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 {
|