@aexol/spectral 0.9.223 → 0.9.225

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 (44) hide show
  1. package/dist/agent/index.d.ts +1 -1
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +5 -4
  4. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  5. package/dist/sdk/ai/providers/openai-completions.js +44 -2
  6. package/dist/sdk/ai/types.d.ts +10 -0
  7. package/dist/sdk/ai/types.d.ts.map +1 -1
  8. package/dist/sdk/coding-agent/core/agent-session.d.ts +1 -1
  9. package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
  10. package/dist/sdk/coding-agent/core/agent-session.js +5 -1
  11. package/dist/sdk/coding-agent/core/model-registry.d.ts +8 -0
  12. package/dist/sdk/coding-agent/core/model-registry.d.ts.map +1 -1
  13. package/dist/sdk/coding-agent/core/model-registry.js +2 -0
  14. package/dist/sdk/coding-agent/core/settings-manager.d.ts +7 -0
  15. package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
  16. package/dist/sdk/coding-agent/core/settings-manager.js +9 -2
  17. package/dist/sdk/coding-agent/index.d.ts +1 -1
  18. package/dist/sdk/coding-agent/index.d.ts.map +1 -1
  19. package/dist/sdk/coding-agent/index.js +1 -1
  20. package/dist/server/agent-bridge/tps-metrics.d.ts +38 -0
  21. package/dist/server/agent-bridge/tps-metrics.d.ts.map +1 -0
  22. package/dist/server/agent-bridge/tps-metrics.js +50 -0
  23. package/dist/server/agent-bridge.d.ts +29 -0
  24. package/dist/server/agent-bridge.d.ts.map +1 -1
  25. package/dist/server/agent-bridge.js +134 -19
  26. package/dist/server/session-stream/turn-events.d.ts +15 -0
  27. package/dist/server/session-stream/turn-events.d.ts.map +1 -1
  28. package/dist/server/session-stream/turn-events.js +31 -0
  29. package/dist/server/session-stream.d.ts +1 -1
  30. package/dist/server/session-stream.d.ts.map +1 -1
  31. package/dist/server/session-stream.js +39 -2
  32. package/dist/server/storage/rows.d.ts +4 -0
  33. package/dist/server/storage/rows.d.ts.map +1 -1
  34. package/dist/server/storage/schema.d.ts +1 -1
  35. package/dist/server/storage/schema.d.ts.map +1 -1
  36. package/dist/server/storage/schema.js +4 -0
  37. package/dist/server/storage/types.d.ts +8 -0
  38. package/dist/server/storage/types.d.ts.map +1 -1
  39. package/dist/server/storage.d.ts +15 -0
  40. package/dist/server/storage.d.ts.map +1 -1
  41. package/dist/server/storage.js +66 -18
  42. package/dist/server/wire.d.ts +39 -0
  43. package/dist/server/wire.d.ts.map +1 -1
  44. package/package.json +1 -1
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Per-LLM-round timing metrics (duration / TPS / TTFT) for the agent bridge.
3
+ *
4
+ * Pure functions — no bridge state — so the math is unit-testable in
5
+ * isolation. The bridge stamps wall-clock `Date.now()` values while
6
+ * translating spectral events to wire frames (spectral's
7
+ * `AssistantMessageEvent` carries no timing) and feeds them through
8
+ * {@link computeTpsMetrics} when `token_usage` is emitted.
9
+ *
10
+ * Semantics (shared contract with the landing frontend):
11
+ * - `durationMs` = tEnd(message_end) − tFirstDelta — the generation
12
+ * window only, excludes time-to-first-token.
13
+ * - `ttftMs` = tFirstDelta − tStart(message_start).
14
+ * - `tokensPerSecond` = round(outputTokens / (durationMs / 1000), 1).
15
+ *
16
+ * Any metric that cannot be computed from sound inputs is `null` —
17
+ * consumers must treat these fields as optional/unreliable indicators.
18
+ */
19
+ function isUsableStamp(value) {
20
+ return typeof value === "number" && Number.isFinite(value);
21
+ }
22
+ /**
23
+ * Compute per-round timing metrics from wall-clock stamps and output token
24
+ * count. Null-safe: missing stamps, negative windows (clock skew) and
25
+ * non-positive token counts or durations yield `null` for the affected
26
+ * fields rather than fabricated numbers.
27
+ */
28
+ export function computeTpsMetrics(startAt, firstDeltaAt, endAt, outputTokens) {
29
+ // TTFT: message_start → first streamed delta. A negative window means
30
+ // clock nonsense — null it. Zero is legitimate (instant first delta).
31
+ const ttftMs = isUsableStamp(startAt) &&
32
+ isUsableStamp(firstDeltaAt) &&
33
+ firstDeltaAt >= startAt
34
+ ? firstDeltaAt - startAt
35
+ : null;
36
+ // Generation window: first streamed delta → message_end. Non-positive
37
+ // durations can't back a tokens/sec figure; negative ones are clock skew.
38
+ // Zero is representable (single flush at message_end) but yields null TPS.
39
+ const durationMs = isUsableStamp(firstDeltaAt) && isUsableStamp(endAt) && endAt >= firstDeltaAt
40
+ ? endAt - firstDeltaAt
41
+ : null;
42
+ const tokensPerSecond = durationMs != null &&
43
+ durationMs > 0 &&
44
+ typeof outputTokens === "number" &&
45
+ Number.isFinite(outputTokens) &&
46
+ outputTokens > 0
47
+ ? Math.round((outputTokens / (durationMs / 1000)) * 10) / 10
48
+ : null;
49
+ return { durationMs, tokensPerSecond, ttftMs };
50
+ }
@@ -207,6 +207,15 @@ export declare class AgentBridge {
207
207
  private activeCreditRates;
208
208
  private memoryPhase;
209
209
  private promptMutationPhase;
210
+ /**
211
+ * Wall-clock ms of the most recent `auto_retry_start` / `auto_retry_end`
212
+ * seen by the bridge. spectral's retry backoff/attempt cycles emit no
213
+ * meaningful progress events, so without this record the inactivity
214
+ * watchdog would abort a session that is merely waiting out a retry.
215
+ * Consumed by `isSessionAutoRetrying()` alongside spectral's own
216
+ * `session.isRetrying` flag.
217
+ */
218
+ private lastAutoRetryActivity;
210
219
  /**
211
220
  * Studio project id resolved from `.aexol/aexol.jsonc` in the session cwd.
212
221
  * Sent as the `X-Project-Id` header on every proxied LLM call so the
@@ -453,6 +462,26 @@ export declare class AgentBridge {
453
462
  private bumpPromptActivity;
454
463
  /** Arm a fresh inactivity watchdog timeout (used by bump/resume paths). */
455
464
  private schedulePromptActivityTimeout;
465
+ /**
466
+ * Whether the session is currently inside spectral's auto-retry machinery.
467
+ * Two signals, checked in order:
468
+ * 1. spectral's `isRetrying` flag — true only during the backoff sleep
469
+ * window, not across the whole backoff/retry cycle;
470
+ * 2. a recent `auto_retry_start`/`auto_retry_end` bridge sighting —
471
+ * `lastAutoRetryActivity` covers the gaps between attempts where the
472
+ * flag has flipped false (belt-and-braces for the windows between one
473
+ * retry cycle ending and the next attempt emitting its first event).
474
+ */
475
+ private isSessionAutoRetrying;
476
+ /**
477
+ * Fire the inactivity watchdog. A session mid auto-retry is NOT stuck —
478
+ * spectral is deliberately sleeping between provider attempts, which emits
479
+ * no meaningful progress events. Never abort a retrying session for
480
+ * inactivity: re-arm a fresh window instead of rejecting the prompt. The
481
+ * watchdog stays fully armed for non-retrying silence, and
482
+ * `clearPromptTimers()` still runs at turn end, so this pause cannot leak.
483
+ */
484
+ private firePromptInactivityTimeout;
456
485
  /**
457
486
  * Pause the parent inactivity watchdog while a subagent tool is running.
458
487
  * Idempotent per active subagent: the watchdog stays cleared until the last
@@ -1 +1 @@
1
- {"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
@@ -70,6 +70,7 @@ import { humanizeProviderError } from "./error-humanizer.js";
70
70
  import { readStudioBinding, getBindingFilePath } from "../studio-binding.js";
71
71
  // Facade imports: cohesive helpers extracted verbatim to `./agent-bridge/` modules.
72
72
  import { calculateCredits, getModelCost, resolveCreditRatesForModel, } from "./agent-bridge/pricing.js";
73
+ import { computeTpsMetrics } from "./agent-bridge/tps-metrics.js";
73
74
  import { SPECTRAL_PROXY_OPENAI, SPECTRAL_PROXY_USER_MODEL, inferSyntheticContextWindow, inferSyntheticOpenAICompat, inferSyntheticThinkingLevelMap, } from "./agent-bridge/synthetic-model.js";
74
75
  import { parseWireToolEvents, sanitizeRehydratedBlock, toRestoredMemorySnapshot, } from "./agent-bridge/rehydrate.js";
75
76
  import { createHeadlessUIContext } from "./agent-bridge/headless-ui.js";
@@ -255,6 +256,15 @@ export class AgentBridge {
255
256
  activeCreditRates = null;
256
257
  memoryPhase = "idle";
257
258
  promptMutationPhase = "idle";
259
+ /**
260
+ * Wall-clock ms of the most recent `auto_retry_start` / `auto_retry_end`
261
+ * seen by the bridge. spectral's retry backoff/attempt cycles emit no
262
+ * meaningful progress events, so without this record the inactivity
263
+ * watchdog would abort a session that is merely waiting out a retry.
264
+ * Consumed by `isSessionAutoRetrying()` alongside spectral's own
265
+ * `session.isRetrying` flag.
266
+ */
267
+ lastAutoRetryActivity = 0;
258
268
  /**
259
269
  * Studio project id resolved from `.aexol/aexol.jsonc` in the session cwd.
260
270
  * Sent as the `X-Project-Id` header on every proxied LLM call so the
@@ -790,6 +800,10 @@ export class AgentBridge {
790
800
  authHeader: true,
791
801
  headers: providerHeaders,
792
802
  api: "openai-completions",
803
+ // Backend-proxied traffic must never reuse pooled keep-alive sockets:
804
+ // a wedged connection would survive the agent-loop + OpenAI-SDK
805
+ // retries, hanging every retry for the full headersTimeout.
806
+ noKeepAlive: true,
793
807
  models: openaiCompatModels.map((m) => {
794
808
  return {
795
809
  id: m.modelId,
@@ -824,6 +838,9 @@ export class AgentBridge {
824
838
  authHeader: true,
825
839
  headers: providerHeaders,
826
840
  api: "openai-completions",
841
+ // Same as SPECTRAL_PROXY_OPENAI: never reuse pooled sockets for
842
+ // backend-proxied traffic (see the comment above).
843
+ noKeepAlive: true,
827
844
  models: userModelEntries.map((m) => {
828
845
  return {
829
846
  id: m.modelId,
@@ -1141,9 +1158,7 @@ export class AgentBridge {
1141
1158
  // tool calls. Triggers on total silence, NOT on long active prompts.
1142
1159
  const inactivityPromise = new Promise((_, reject) => {
1143
1160
  this.promptReject = reject;
1144
- this.promptActivityTimer = setTimeout(() => {
1145
- reject(new Error(`Agent prompt inactive for ${PROMPT_INACTIVITY_TIMEOUT_MS / 1000}s`));
1146
- }, PROMPT_INACTIVITY_TIMEOUT_MS);
1161
+ this.promptActivityTimer = setTimeout(() => this.firePromptInactivityTimeout(), PROMPT_INACTIVITY_TIMEOUT_MS);
1147
1162
  });
1148
1163
  try {
1149
1164
  await Promise.race([prompt, inactivityPromise]);
@@ -1178,9 +1193,12 @@ export class AgentBridge {
1178
1193
  case "tool_execution_end":
1179
1194
  return true;
1180
1195
  default:
1181
- // compaction_*, prompt_mutation_status,
1182
- // queue_update, auto_retry_*, length_continuation, session_info_changed,
1183
- // thinking_level_changed — churn / non-progress, do NOT reset watchdog.
1196
+ // compaction_*, prompt_mutation_status, queue_update,
1197
+ // length_continuation, session_info_changed, thinking_level_changed —
1198
+ // churn / non-progress, do NOT reset watchdog. (auto_retry_start/end
1199
+ // also land here, but their handleEvent cases explicitly record
1200
+ // `lastAutoRetryActivity` and bump the watchdog: a retry cycle is
1201
+ // real agent activity, just not message/tool progress.)
1184
1202
  return false;
1185
1203
  }
1186
1204
  }
@@ -1198,9 +1216,38 @@ export class AgentBridge {
1198
1216
  }
1199
1217
  /** Arm a fresh inactivity watchdog timeout (used by bump/resume paths). */
1200
1218
  schedulePromptActivityTimeout() {
1201
- return setTimeout(() => {
1202
- this.promptReject?.(new Error(`Agent prompt inactive for ${PROMPT_INACTIVITY_TIMEOUT_MS / 1000}s`));
1203
- }, PROMPT_INACTIVITY_TIMEOUT_MS);
1219
+ return setTimeout(() => this.firePromptInactivityTimeout(), PROMPT_INACTIVITY_TIMEOUT_MS);
1220
+ }
1221
+ /**
1222
+ * Whether the session is currently inside spectral's auto-retry machinery.
1223
+ * Two signals, checked in order:
1224
+ * 1. spectral's `isRetrying` flag — true only during the backoff sleep
1225
+ * window, not across the whole backoff/retry cycle;
1226
+ * 2. a recent `auto_retry_start`/`auto_retry_end` bridge sighting —
1227
+ * `lastAutoRetryActivity` covers the gaps between attempts where the
1228
+ * flag has flipped false (belt-and-braces for the windows between one
1229
+ * retry cycle ending and the next attempt emitting its first event).
1230
+ */
1231
+ isSessionAutoRetrying() {
1232
+ if (this.session?.isRetrying === true)
1233
+ return true;
1234
+ return (this.lastAutoRetryActivity > 0 &&
1235
+ Date.now() - this.lastAutoRetryActivity < PROMPT_INACTIVITY_TIMEOUT_MS);
1236
+ }
1237
+ /**
1238
+ * Fire the inactivity watchdog. A session mid auto-retry is NOT stuck —
1239
+ * spectral is deliberately sleeping between provider attempts, which emits
1240
+ * no meaningful progress events. Never abort a retrying session for
1241
+ * inactivity: re-arm a fresh window instead of rejecting the prompt. The
1242
+ * watchdog stays fully armed for non-retrying silence, and
1243
+ * `clearPromptTimers()` still runs at turn end, so this pause cannot leak.
1244
+ */
1245
+ firePromptInactivityTimeout() {
1246
+ if (this.isSessionAutoRetrying()) {
1247
+ this.promptActivityTimer = this.schedulePromptActivityTimeout();
1248
+ return;
1249
+ }
1250
+ this.promptReject?.(new Error(`Agent prompt inactive for ${PROMPT_INACTIVITY_TIMEOUT_MS / 1000}s`));
1204
1251
  }
1205
1252
  /**
1206
1253
  * Pause the parent inactivity watchdog while a subagent tool is running.
@@ -1429,7 +1476,7 @@ export class AgentBridge {
1429
1476
  if (!this.pending || this.pending.finalized)
1430
1477
  return;
1431
1478
  this.pending.finalized = true;
1432
- const { messageId, text, wireEvents, content, nativeResponseId } = this.pending;
1479
+ const { messageId, text, wireEvents, content, nativeResponseId, stopReason, } = this.pending;
1433
1480
  // Skip persistence for pure-framing intermediate "messages". Pi
1434
1481
  // emits a `message_end` for each internal step (e.g. between two
1435
1482
  // tool-calling rounds) and many of those carry no visible content
@@ -1449,7 +1496,14 @@ export class AgentBridge {
1449
1496
  e.type === "thinking_end" ||
1450
1497
  e.type === "tool_call" ||
1451
1498
  e.type === "tool_result");
1452
- if (!finalContent && !hasMeaningfulEvent) {
1499
+ // A terminal failed turn (stopReason "error") must NEVER be dropped: the
1500
+ // user has to see that the turn failed. When the provider died before
1501
+ // streaming text, the message_end handler has already rewritten
1502
+ // `content` to the humanized error; if even that is empty we still
1503
+ // persist the row — its JSONL carries message_end with
1504
+ // stopReason:"error", which the client renders as a failed turn.
1505
+ const isTerminalError = stopReason === "error";
1506
+ if (!finalContent && !hasMeaningfulEvent && !isTerminalError) {
1453
1507
  console.debug("[agent-bridge] skipping empty intermediate message");
1454
1508
  try {
1455
1509
  this.opts.onAssistantMessageSkipped?.(messageId);
@@ -1514,7 +1568,12 @@ export class AgentBridge {
1514
1568
  messageId,
1515
1569
  role: "assistant",
1516
1570
  };
1517
- this.pending = { messageId, text: "", wireEvents: [wireEvent] };
1571
+ this.pending = {
1572
+ messageId,
1573
+ text: "",
1574
+ wireEvents: [wireEvent],
1575
+ startedAt: Date.now(),
1576
+ };
1518
1577
  this.opts.emit(wireEvent);
1519
1578
  return;
1520
1579
  }
@@ -1523,6 +1582,11 @@ export class AgentBridge {
1523
1582
  return;
1524
1583
  const inner = ev.assistantMessageEvent;
1525
1584
  if (inner.type === "text_delta") {
1585
+ // Stamp the first streamed delta (text OR thinking) — it ends the
1586
+ // TTFT window and starts the generation window used by TPS.
1587
+ if (this.pending.firstDeltaAt === undefined) {
1588
+ this.pending.firstDeltaAt = Date.now();
1589
+ }
1526
1590
  this.pending.text += inner.delta;
1527
1591
  this.emitAndBuffer({
1528
1592
  type: "text_delta",
@@ -1538,6 +1602,9 @@ export class AgentBridge {
1538
1602
  });
1539
1603
  }
1540
1604
  else if (inner.type === "thinking_delta") {
1605
+ if (this.pending.firstDeltaAt === undefined) {
1606
+ this.pending.firstDeltaAt = Date.now();
1607
+ }
1541
1608
  this.emitAndBuffer({
1542
1609
  type: "thinking_delta",
1543
1610
  messageId: this.pending.messageId,
@@ -1802,6 +1869,9 @@ export class AgentBridge {
1802
1869
  case "message_end": {
1803
1870
  if (ev.message.role !== "assistant" || !this.pending)
1804
1871
  return;
1872
+ // Wall-clock stamp for per-round timing metrics (TPS/TTFT). Taken at
1873
+ // handler entry so the usage event below measures the whole stream.
1874
+ const endedAt = Date.now();
1805
1875
  const { messageId, text } = this.pending;
1806
1876
  if (ev.message.api === "openai-responses" &&
1807
1877
  typeof ev.message.responseId === "string" &&
@@ -1823,17 +1893,20 @@ export class AgentBridge {
1823
1893
  // Raw upstream provider errors (e.g. 429 JSON blobs with internal
1824
1894
  // ids) must not reach the UI verbatim — same policy as the `error`
1825
1895
  // ServerEvent path. The humanizer keeps a short, sanitized cause.
1896
+ // Humanized once here and shared by the wire event and the persisted
1897
+ // content fallback below, so the error text can never appear twice.
1898
+ const humanizedError = stopReason === "error" &&
1899
+ typeof errorMessage === "string" &&
1900
+ errorMessage.length > 0
1901
+ ? humanizeProviderError(errorMessage)
1902
+ : undefined;
1826
1903
  const endEvent = stopReason
1827
1904
  ? {
1828
1905
  type: "message_end",
1829
1906
  messageId,
1830
1907
  stopReason,
1831
1908
  ...(stopReason === "length" ? { truncated: true } : {}),
1832
- ...(stopReason === "error" &&
1833
- typeof errorMessage === "string" &&
1834
- errorMessage.length > 0
1835
- ? { errorMessage: humanizeProviderError(errorMessage) }
1836
- : {}),
1909
+ ...(humanizedError ? { errorMessage: humanizedError } : {}),
1837
1910
  }
1838
1911
  : { type: "message_end", messageId };
1839
1912
  this.pending.wireEvents.push(endEvent);
@@ -1855,6 +1928,10 @@ export class AgentBridge {
1855
1928
  (usage?.cacheRead ?? 0) +
1856
1929
  (usage?.cacheWrite ?? 0);
1857
1930
  if (usage && totalTokens > 0) {
1931
+ // Per-round timing: TTFT (message_start → first delta) and the
1932
+ // generation window (first delta → now). Null-safe — providers
1933
+ // that skip deltas or zero-usage rounds yield null fields.
1934
+ const tpsMetrics = computeTpsMetrics(this.pending.startedAt, this.pending.firstDeltaAt, endedAt, usage.output ?? 0);
1858
1935
  // Resolve current context window usage from spectral's built-in
1859
1936
  // `getContextUsage()`, which handles post-compaction ambiguity
1860
1937
  // and estimates total tokens from the full session tree.
@@ -1873,6 +1950,9 @@ export class AgentBridge {
1873
1950
  },
1874
1951
  contextWindowUsed: ctxUsage?.tokens ?? null,
1875
1952
  contextWindowMax: ctxUsage?.contextWindow ?? null,
1953
+ durationMs: tpsMetrics.durationMs,
1954
+ tokensPerSecond: tpsMetrics.tokensPerSecond,
1955
+ ttftMs: tpsMetrics.ttftMs,
1876
1956
  };
1877
1957
  this.pending.wireEvents.push(usageEvent);
1878
1958
  this.opts.emit(usageEvent);
@@ -1882,7 +1962,16 @@ export class AgentBridge {
1882
1962
  // BETWEEN messages) are buffered into `pending.wireEvents`. We store
1883
1963
  // the final content and persist later — when the next `message_start`
1884
1964
  // signals a new step, or when `agent_end` closes the turn.
1885
- this.pending.content = content;
1965
+ // Remember the terminal stop reason: finalizePendingMessage persists
1966
+ // failed turns even when they are otherwise empty.
1967
+ this.pending.stopReason = stopReason;
1968
+ // Terminal failed turns must persist visibly: when the provider died
1969
+ // before streaming any text, surface the humanized error as the
1970
+ // message content. When text WAS streamed, keep it as the content —
1971
+ // the humanized detail already rides on the message_end event, so
1972
+ // the error text is never duplicated.
1973
+ this.pending.content =
1974
+ content || (stopReason === "error" ? humanizedError : undefined);
1886
1975
  return;
1887
1976
  }
1888
1977
  case "agent_end": {
@@ -1954,9 +2043,35 @@ export class AgentBridge {
1954
2043
  return;
1955
2044
  }
1956
2045
  case "auto_retry_start": {
2046
+ // A retry cycle is real agent activity (backoff sleep + next provider
2047
+ // attempt) even though it emits no message/tool progress: record it
2048
+ // and re-arm the inactivity watchdog so a long backoff cannot be
2049
+ // mistaken for a hang (see firePromptInactivityTimeout).
2050
+ this.lastAutoRetryActivity = Date.now();
2051
+ this.bumpPromptActivity();
1957
2052
  this.opts.emit({ type: "turn_continue", reason: "retry" });
1958
2053
  return;
1959
2054
  }
2055
+ case "auto_retry_end": {
2056
+ this.lastAutoRetryActivity = Date.now();
2057
+ this.bumpPromptActivity();
2058
+ // Give-up signal: spectral exhausted all retry attempts. This
2059
+ // previously fell into the default case and was intentionally not on
2060
+ // the wire, so a finally-failed turn surfaced nothing in the UI or
2061
+ // logs. Emit the additive `retry_failed` event on give-up only —
2062
+ // successful retry ends are followed by the next attempt's own
2063
+ // message events, so they stay off the wire.
2064
+ if (ev.success === false) {
2065
+ this.opts.emit({
2066
+ type: "retry_failed",
2067
+ ...(typeof ev.attempt === "number" ? { attempt: ev.attempt } : {}),
2068
+ ...(typeof ev.finalError === "string" && ev.finalError.length > 0
2069
+ ? { finalError: humanizeProviderError(ev.finalError) }
2070
+ : {}),
2071
+ });
2072
+ }
2073
+ return;
2074
+ }
1960
2075
  case "length_continuation": {
1961
2076
  if (ev.status === "queued") {
1962
2077
  this.opts.emit({
@@ -1989,7 +2104,7 @@ export class AgentBridge {
1989
2104
  }
1990
2105
  default:
1991
2106
  // Other spectral-internal events (turn_start, queue_update,
1992
- // auto_retry_*, tool_execution_update) are intentionally not on
2107
+ // tool_execution_update) are intentionally not on
1993
2108
  // the wire surface for MVP and are NOT persisted — the wire format
1994
2109
  // is the source of truth for replay.
1995
2110
  return;
@@ -12,6 +12,21 @@ import type { InProgressTurnSnapshot, ReplayableTurnEvent, ServerEvent } from ".
12
12
  * column exists to bridge). Best-effort: malformed lines are skipped.
13
13
  */
14
14
  export declare function extractCreditsFromEventsJsonl(eventsJsonl: string): number | null;
15
+ /** Per-round timing metrics extractable from a `token_usage` wire event. */
16
+ export interface PersistedMessageMetrics {
17
+ outputTokens: number | null;
18
+ durationMs: number | null;
19
+ tokensPerSecond: number | null;
20
+ ttftMs: number | null;
21
+ }
22
+ /**
23
+ * Extract the per-round timing metrics (`durationMs` / `tokensPerSecond` /
24
+ * `ttftMs` plus the authoritative `usage.outputTokens`) from a `token_usage`
25
+ * event embedded in an events JSONL string. Returns `null` if no
26
+ * `token_usage` event is present at persist time. Best-effort: malformed
27
+ * lines are skipped.
28
+ */
29
+ export declare function extractMessageMetricsFromEventsJsonl(eventsJsonl: string): PersistedMessageMetrics | null;
15
30
  export type BufferedTurnEvent = Exclude<ReplayableTurnEvent, {
16
31
  type: "subagent_progress";
17
32
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"turn-events.d.ts","sourceRoot":"","sources":["../../../src/server/session-stream/turn-events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBhF;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CACrC,mBAAmB,EACnB;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAC9B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;yEACqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB;4EACwE;IACxE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,iBAAiB,CAoB3E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAM5E;AACD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,EACpB,sBAAsB,UAAQ,GAC7B,sBAAsB,CAWxB"}
1
+ {"version":3,"file":"turn-events.d.ts","sourceRoot":"","sources":["../../../src/server/session-stream/turn-events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBhF;AAED,4EAA4E;AAC5E,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAClD,WAAW,EAAE,MAAM,GAClB,uBAAuB,GAAG,IAAI,CAoBhC;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CACrC,mBAAmB,EACnB;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAC9B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;yEACqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB;4EACwE;IACxE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,iBAAiB,CAoB3E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAM5E;AACD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,EACpB,sBAAsB,UAAQ,GAC7B,sBAAsB,CAWxB"}
@@ -24,6 +24,37 @@ export function extractCreditsFromEventsJsonl(eventsJsonl) {
24
24
  }
25
25
  return creditsUsed;
26
26
  }
27
+ /**
28
+ * Extract the per-round timing metrics (`durationMs` / `tokensPerSecond` /
29
+ * `ttftMs` plus the authoritative `usage.outputTokens`) from a `token_usage`
30
+ * event embedded in an events JSONL string. Returns `null` if no
31
+ * `token_usage` event is present at persist time. Best-effort: malformed
32
+ * lines are skipped.
33
+ */
34
+ export function extractMessageMetricsFromEventsJsonl(eventsJsonl) {
35
+ if (!eventsJsonl)
36
+ return null;
37
+ let metrics = null;
38
+ for (const line of eventsJsonl.split("\n")) {
39
+ if (!line.includes("token_usage"))
40
+ continue;
41
+ try {
42
+ const ev = JSON.parse(line);
43
+ if (ev.type === "token_usage") {
44
+ metrics = {
45
+ outputTokens: ev.usage.outputTokens,
46
+ durationMs: ev.durationMs ?? null,
47
+ tokensPerSecond: ev.tokensPerSecond ?? null,
48
+ ttftMs: ev.ttftMs ?? null,
49
+ };
50
+ }
51
+ }
52
+ catch {
53
+ // Skip malformed lines — best-effort extraction.
54
+ }
55
+ }
56
+ return metrics;
57
+ }
27
58
  export function isReplayable(event) {
28
59
  return (event.type === "message_start" ||
29
60
  event.type === "text_delta" ||
@@ -47,7 +47,7 @@ export { formatCompactionTokenStats, isSkippedCompactionResult, } from "./sessio
47
47
  export { branchMessageRole, branchMessageSignature, branchMessageTimestampMs, contentAsPersistedText, getCompactionEndPruneSkipReason, getKeptBranchMessageSignatures, isRecord, matchKeptPersistedMessageIds, prunePersistedHistoryAfterCompaction, selectUniqueCandidate, } from "./session-stream/history-prune.js";
48
48
  export { applyDcpLiteRuntimeStatus, buildDcpLiteThresholds, contextPercent, dcpLiteEventFromServerEvent, defaultMemoryStatus, loadCompactionPolicy, persistObservationalMemorySnapshot, type SessionMemoryStatus, } from "./session-stream/memory.js";
49
49
  export { estimateStoredMessageReplayTokens, selectHistoryForBridge, } from "./session-stream/replay-tail.js";
50
- export { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
50
+ export { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, extractMessageMetricsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
51
51
  export { resolveTurnSilenceMaxRearm, resolveTurnSilenceTimeoutMs, } from "./session-stream/turn-silence.js";
52
52
  /**
53
53
  * Anything we can `send` and `close` on. The `ws` library's WebSocket fits;
@@ -1 +1 @@
1
- {"version":3,"file":"session-stream.d.ts","sourceRoot":"","sources":["../../src/server/session-stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-stream.d.ts","sourceRoot":"","sources":["../../src/server/session-stream.ts"],"names":[],"mappings":"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"}
@@ -57,13 +57,13 @@ import { formatCompactionTokenStats, isSkippedCompactionResult, } from "./sessio
57
57
  import { getCompactionEndPruneSkipReason, prunePersistedHistoryAfterCompaction, } from "./session-stream/history-prune.js";
58
58
  import { applyDcpLiteRuntimeStatus, dcpLiteEventFromServerEvent, defaultMemoryStatus, loadCompactionPolicy, persistObservationalMemorySnapshot, } from "./session-stream/memory.js";
59
59
  import { selectHistoryForBridge } from "./session-stream/replay-tail.js";
60
- import { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
60
+ import { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, extractMessageMetricsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
61
61
  import { resolveTurnSilenceMaxRearm, resolveTurnSilenceTimeoutMs, } from "./session-stream/turn-silence.js";
62
62
  export { formatCompactionTokenStats, isSkippedCompactionResult, } from "./session-stream/compaction-events.js";
63
63
  export { branchMessageRole, branchMessageSignature, branchMessageTimestampMs, contentAsPersistedText, getCompactionEndPruneSkipReason, getKeptBranchMessageSignatures, isRecord, matchKeptPersistedMessageIds, prunePersistedHistoryAfterCompaction, selectUniqueCandidate, } from "./session-stream/history-prune.js";
64
64
  export { applyDcpLiteRuntimeStatus, buildDcpLiteThresholds, contextPercent, dcpLiteEventFromServerEvent, defaultMemoryStatus, loadCompactionPolicy, persistObservationalMemorySnapshot, } from "./session-stream/memory.js";
65
65
  export { estimateStoredMessageReplayTokens, selectHistoryForBridge, } from "./session-stream/replay-tail.js";
66
- export { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
66
+ export { assistantMessageIdsForTurn, extractCreditsFromEventsJsonl, extractMessageMetricsFromEventsJsonl, isReplayable, snapshotTurn, } from "./session-stream/turn-events.js";
67
67
  export { resolveTurnSilenceMaxRearm, resolveTurnSilenceTimeoutMs, } from "./session-stream/turn-silence.js";
68
68
  const DEFAULT_BRIDGE_FACTORY = (args) => new AgentBridge(args);
69
69
  /** Safety limit for autonomous loop iterations per session. */
@@ -842,11 +842,21 @@ export class SessionStreamManager {
842
842
  emit: (event) => this.handleBridgeEvent(stream, event),
843
843
  onAssistantMessageComplete: ({ messageId, content, eventsJsonl, nativeResponseId, }) => {
844
844
  try {
845
+ // Re-extract credits and per-round timing metrics from the
846
+ // events JSONL so this INSERT OR REPLACE stays idempotent
847
+ // instead of nulling columns already written by
848
+ // updateMessageCredits / updateMessageMetrics (same pattern as
849
+ // the Path B persist below). Best-effort: null when no
850
+ // token_usage event is present yet.
851
+ const creditsUsed = extractCreditsFromEventsJsonl(eventsJsonl);
852
+ const messageMetrics = extractMessageMetricsFromEventsJsonl(eventsJsonl);
845
853
  this.store.appendMessage(sessionId, {
846
854
  id: messageId,
847
855
  role: "assistant",
848
856
  content,
849
857
  eventsJsonl,
858
+ ...(creditsUsed != null ? { creditsUsed } : {}),
859
+ ...(messageMetrics ?? {}),
850
860
  });
851
861
  if (nativeResponseId) {
852
862
  this.store.setSessionNativeResponseId(sessionId, nativeResponseId);
@@ -1659,12 +1669,19 @@ export class SessionStreamManager {
1659
1669
  // yet, credits_used stays null and updateMessageCredits will fill it
1660
1670
  // later when the event streams in.
1661
1671
  const creditsUsed = extractCreditsFromEventsJsonl(eventsJsonl);
1672
+ // Same for the per-round timing metrics (output_tokens,
1673
+ // duration_ms, tokens_per_second, ttft_ms): if token_usage already
1674
+ // streamed, re-extracting here keeps the final INSERT OR REPLACE
1675
+ // idempotent instead of nulling the columns updateMessageMetrics
1676
+ // wrote.
1677
+ const messageMetrics = extractMessageMetricsFromEventsJsonl(eventsJsonl);
1662
1678
  this.store.appendMessage(sessionId, {
1663
1679
  id: messageId,
1664
1680
  role: "assistant",
1665
1681
  content,
1666
1682
  eventsJsonl,
1667
1683
  ...(creditsUsed != null ? { creditsUsed } : {}),
1684
+ ...(messageMetrics ?? {}),
1668
1685
  });
1669
1686
  if (nativeResponseId) {
1670
1687
  this.store.setSessionNativeResponseId(sessionId, nativeResponseId);
@@ -1898,6 +1915,16 @@ export class SessionStreamManager {
1898
1915
  // should already exist. Best-effort: errors are logged in storage.
1899
1916
  if (event.messageId) {
1900
1917
  this.store.updateMessageCredits(event.messageId, event.usage.creditsUsed);
1918
+ // Persist per-round timing metrics (output tokens, generation
1919
+ // duration, TPS, TTFT) to dedicated columns — same pattern as
1920
+ // credits_used above. Synthetic context-window refresh events carry
1921
+ // no messageId, so they're skipped by the same guard.
1922
+ this.store.updateMessageMetrics(event.messageId, {
1923
+ outputTokens: event.usage.outputTokens,
1924
+ durationMs: event.durationMs ?? null,
1925
+ tokensPerSecond: event.tokensPerSecond ?? null,
1926
+ ttftMs: event.ttftMs ?? null,
1927
+ });
1901
1928
  }
1902
1929
  }
1903
1930
  // Relay compaction_delta events to subscribers so the frontend can show
@@ -2276,12 +2303,22 @@ export class SessionStreamManager {
2276
2303
  // always a complete, self-consistent snapshot. Older batches are
2277
2304
  // included so history rehydration doesn't need to stitch fragments.
2278
2305
  const eventsJsonl = turn.events.map((e) => JSON.stringify(e)).join("\n");
2306
+ // token_usage events are buffered into the turn, so credits and
2307
+ // per-round timing metrics can be re-extracted from the JSONL here.
2308
+ // Without them this INSERT OR REPLACE would null the credits_used /
2309
+ // metric columns that updateMessageCredits / updateMessageMetrics
2310
+ // already wrote for this message row during an earlier batch flush of
2311
+ // the same turn. Best-effort: null when no token_usage event yet.
2312
+ const creditsUsed = extractCreditsFromEventsJsonl(eventsJsonl);
2313
+ const messageMetrics = extractMessageMetricsFromEventsJsonl(eventsJsonl);
2279
2314
  this.store.appendMessage(stream.sessionId, {
2280
2315
  id: messageId,
2281
2316
  role: "assistant",
2282
2317
  content: turn.assistantText,
2283
2318
  eventsJsonl,
2284
2319
  createdAt: turn.startedAt,
2320
+ ...(creditsUsed != null ? { creditsUsed } : {}),
2321
+ ...(messageMetrics ?? {}),
2285
2322
  });
2286
2323
  stream.lastFlushedEventCount = turn.events.length;
2287
2324
  turn.persistedEventCount = turn.events.length;