@agentdeck/bridge 1.0.23 → 1.1.0

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 (120) hide show
  1. package/dist/adapters/openclaw.d.ts +74 -4
  2. package/dist/adapters/openclaw.d.ts.map +1 -1
  3. package/dist/adapters/openclaw.js +235 -43
  4. package/dist/adapters/openclaw.js.map +1 -1
  5. package/dist/apme/adapters/openclaw-hook.d.ts +38 -10
  6. package/dist/apme/adapters/openclaw-hook.d.ts.map +1 -1
  7. package/dist/apme/adapters/openclaw-hook.js +181 -37
  8. package/dist/apme/adapters/openclaw-hook.js.map +1 -1
  9. package/dist/apme/collector.d.ts +37 -1
  10. package/dist/apme/collector.d.ts.map +1 -1
  11. package/dist/apme/collector.js +277 -35
  12. package/dist/apme/collector.js.map +1 -1
  13. package/dist/apme/pareto.d.ts +2 -1
  14. package/dist/apme/pareto.d.ts.map +1 -1
  15. package/dist/apme/pareto.js +15 -4
  16. package/dist/apme/pareto.js.map +1 -1
  17. package/dist/apme/recommend.d.ts +24 -1
  18. package/dist/apme/recommend.d.ts.map +1 -1
  19. package/dist/apme/recommend.js +43 -7
  20. package/dist/apme/recommend.js.map +1 -1
  21. package/dist/apme/store.d.ts +6 -0
  22. package/dist/apme/store.d.ts.map +1 -1
  23. package/dist/apme/store.js +244 -72
  24. package/dist/apme/store.js.map +1 -1
  25. package/dist/bridge-core.d.ts +10 -1
  26. package/dist/bridge-core.d.ts.map +1 -1
  27. package/dist/bridge-core.js +20 -5
  28. package/dist/bridge-core.js.map +1 -1
  29. package/dist/card-feed.d.ts +46 -1
  30. package/dist/card-feed.d.ts.map +1 -1
  31. package/dist/card-feed.js +166 -6
  32. package/dist/card-feed.js.map +1 -1
  33. package/dist/cli.d.ts +45 -0
  34. package/dist/cli.d.ts.map +1 -1
  35. package/dist/cli.js +388 -27
  36. package/dist/cli.js.map +1 -1
  37. package/dist/daemon-build-identity.d.ts +124 -0
  38. package/dist/daemon-build-identity.d.ts.map +1 -0
  39. package/dist/daemon-build-identity.js +310 -0
  40. package/dist/daemon-build-identity.js.map +1 -0
  41. package/dist/daemon-server.d.ts +34 -6
  42. package/dist/daemon-server.d.ts.map +1 -1
  43. package/dist/daemon-server.js +613 -108
  44. package/dist/daemon-server.js.map +1 -1
  45. package/dist/daemon-takeover.d.ts +11 -0
  46. package/dist/daemon-takeover.d.ts.map +1 -1
  47. package/dist/daemon-takeover.js +62 -17
  48. package/dist/daemon-takeover.js.map +1 -1
  49. package/dist/daemon.js +1 -1
  50. package/dist/daemon.js.map +1 -1
  51. package/dist/esp32-flash.d.ts.map +1 -1
  52. package/dist/esp32-flash.js +19 -3
  53. package/dist/esp32-flash.js.map +1 -1
  54. package/dist/esp32-serial.d.ts +14 -0
  55. package/dist/esp32-serial.d.ts.map +1 -1
  56. package/dist/esp32-serial.js +19 -1
  57. package/dist/esp32-serial.js.map +1 -1
  58. package/dist/glance-frame.d.ts.map +1 -1
  59. package/dist/glance-frame.js +3 -1
  60. package/dist/glance-frame.js.map +1 -1
  61. package/dist/hook-codex-sessions.d.ts +3 -1
  62. package/dist/hook-codex-sessions.d.ts.map +1 -1
  63. package/dist/hook-codex-sessions.js +27 -7
  64. package/dist/hook-codex-sessions.js.map +1 -1
  65. package/dist/legacy-rearm-ledger.d.ts +56 -0
  66. package/dist/legacy-rearm-ledger.d.ts.map +1 -0
  67. package/dist/legacy-rearm-ledger.js +66 -0
  68. package/dist/legacy-rearm-ledger.js.map +1 -0
  69. package/dist/mdns.d.ts +33 -0
  70. package/dist/mdns.d.ts.map +1 -1
  71. package/dist/mdns.js +91 -2
  72. package/dist/mdns.js.map +1 -1
  73. package/dist/openclaw-session.d.ts.map +1 -1
  74. package/dist/openclaw-session.js +13 -0
  75. package/dist/openclaw-session.js.map +1 -1
  76. package/dist/openclaw-timeline-feed.d.ts +84 -0
  77. package/dist/openclaw-timeline-feed.d.ts.map +1 -0
  78. package/dist/openclaw-timeline-feed.js +162 -0
  79. package/dist/openclaw-timeline-feed.js.map +1 -0
  80. package/dist/openclaw-transcript-timeline.d.ts +103 -0
  81. package/dist/openclaw-transcript-timeline.d.ts.map +1 -0
  82. package/dist/openclaw-transcript-timeline.js +328 -0
  83. package/dist/openclaw-transcript-timeline.js.map +1 -0
  84. package/dist/passive-observer.d.ts +21 -1
  85. package/dist/passive-observer.d.ts.map +1 -1
  86. package/dist/passive-observer.js +37 -3
  87. package/dist/passive-observer.js.map +1 -1
  88. package/dist/relayed-usage.d.ts +68 -0
  89. package/dist/relayed-usage.d.ts.map +1 -0
  90. package/dist/relayed-usage.js +80 -0
  91. package/dist/relayed-usage.js.map +1 -0
  92. package/dist/session-aggregator.d.ts +3 -0
  93. package/dist/session-aggregator.d.ts.map +1 -1
  94. package/dist/session-aggregator.js.map +1 -1
  95. package/dist/session-registry.d.ts +1 -0
  96. package/dist/session-registry.d.ts.map +1 -1
  97. package/dist/surface-protocol.d.ts +84 -0
  98. package/dist/surface-protocol.d.ts.map +1 -0
  99. package/dist/surface-protocol.js +235 -0
  100. package/dist/surface-protocol.js.map +1 -0
  101. package/dist/timeline-store.d.ts +1 -1
  102. package/dist/timeline-store.d.ts.map +1 -1
  103. package/dist/timeline-store.js +16 -1
  104. package/dist/timeline-store.js.map +1 -1
  105. package/dist/tui/renderer.d.ts.map +1 -1
  106. package/dist/tui/renderer.js +35 -0
  107. package/dist/tui/renderer.js.map +1 -1
  108. package/dist/weather-config.d.ts +17 -0
  109. package/dist/weather-config.d.ts.map +1 -0
  110. package/dist/weather-config.js +54 -0
  111. package/dist/weather-config.js.map +1 -0
  112. package/dist/weather.d.ts +44 -4
  113. package/dist/weather.d.ts.map +1 -1
  114. package/dist/weather.js +223 -15
  115. package/dist/weather.js.map +1 -1
  116. package/dist/ws-server.d.ts.map +1 -1
  117. package/dist/ws-server.js +55 -5
  118. package/dist/ws-server.js.map +1 -1
  119. package/fm-helper/AgentDeckFMHelper.swift +51 -5
  120. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw-hook.js","sourceRoot":"","sources":["../../../src/apme/adapters/openclaw-hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openclaw-hook.js","sourceRoot":"","sources":["../../../src/apme/adapters/openclaw-hook.ts"],"names":[],"mappings":"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"}
@@ -99,6 +99,13 @@ export declare class ApmeCollector {
99
99
  private readonly sessionToTask;
100
100
  private readonly runTaskCount;
101
101
  private readonly sessionToUsage;
102
+ /** Running cost total for producers that report PER-MESSAGE cost.
103
+ * Separate from `sessionToUsage` because `updateUsage` writes the cost
104
+ * column absolutely and would otherwise stamp one message's cost as the
105
+ * run's. `seen` keeps a reported ZERO distinct from nothing reported —
106
+ * glm-5.2 answers `usage.cost.total = 0` on every message, so folding the
107
+ * two would record "free" as "unknown" for a whole class of run. */
108
+ private readonly sessionToCostTotal;
102
109
  /** Optional listener fired after `closeTask` persists the row. The runner
103
110
  * wires this to enqueue a task-level judge call. */
104
111
  onTaskClosed: OnTaskClosed | null;
@@ -262,7 +269,7 @@ export declare class ApmeCollector {
262
269
  * Falls back to the last closed turn if closeTurn() already ran (race with session exit).
263
270
  * Tags turns.efficiency_json.response_kind so the runner can skip tool-only / empty
264
271
  * turns — judging silence produces noise scores. */
265
- setTurnResponse(sessionId: string, response: string): void;
272
+ setTurnResponse(sessionId: string, response: string, source?: 'chat_final' | 'session_message_projection' | 'direct'): void;
266
273
  /** Apply response to the last closed turn if it has no response yet.
267
274
  * Used as fallback when Stop hook doesn't fire (PTY output capture). */
268
275
  setLastClosedTurnResponse(sessionId: string, response: string): void;
@@ -281,6 +288,31 @@ export declare class ApmeCollector {
281
288
  * Snapshots carry CUMULATIVE session totals, so we emit a priced ModelEvent
282
289
  * for the delta and attribute it to the active task (the SessionSample cost
283
290
  * is the sum of its ModelEvents). */
291
+ /**
292
+ * Record usage a producer reports for ONE message.
293
+ *
294
+ * `updateUsage` is cumulative by contract: it assigns `inputTokens` to the run
295
+ * row absolutely and derives its per-task ModelEvent as `max(0, cur - prev)`.
296
+ * Its original and only other caller is the PTY poller's `UsageTracker`
297
+ * snapshot, which really is a running total.
298
+ *
299
+ * A `session.message`(assistant) frame reports THIS message's tokens, and those
300
+ * are not monotonic — measured on a real OpenClaw session: 30302, 21375, 335,
301
+ * 96, 114. Fed to `updateUsage` directly, the run row ends at the LAST
302
+ * message's count (114 for a session that consumed 52,222), every decrease
303
+ * clamps its delta to 0 so most messages append no ModelEvent at all, and
304
+ * `recomputeSampleCost` then prices the run from what survives. Two messages
305
+ * sharing an `(in,out)` pair are additionally deduped away, because the dedup
306
+ * key assumes cumulative values are unique.
307
+ *
308
+ * So convert here rather than at each producer: keep the running total and
309
+ * hand `updateUsage` the cumulative series its arithmetic is written for.
310
+ */
311
+ addUsageIncrement(sessionId: string, delta: {
312
+ inputTokens: number;
313
+ outputTokens: number;
314
+ costUsd: number | null;
315
+ }): void;
284
316
  updateUsage(sessionId: string, snapshot: UsageSnapshot): void;
285
317
  /** Split the current run — closes the active run and opens a fresh one.
286
318
  * Triggered on `/clear` or other context-reset events so each logical
@@ -288,6 +320,10 @@ export declare class ApmeCollector {
288
320
  splitRun(sessionId: string, projectPath?: string): string | null;
289
321
  /** Update model id when the bridge resolves which model is in use. */
290
322
  updateModel(sessionId: string, modelId: string | undefined | null): void;
323
+ /** Persist the model/provider on the assistant message's own turn.
324
+ * `session_meta` can arrive after `chat.final` closed that turn, so the same
325
+ * current→last fallback used by setTurnResponse is required here too. */
326
+ private updateTurnIdentity;
291
327
  /** Finalize a run. Returns the runId so callers can enqueue evaluation.
292
328
  * Empty runs (no prompts, no steps, no turns) are deleted — they're just
293
329
  * connection noise and clutter the dashboard. */
@@ -1 +1 @@
1
- {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/apme/collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/apme/collector.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ import { mkdirSync, writeFileSync } from 'fs';
18
18
  import { homedir } from 'os';
19
19
  import { debug } from '../logger.js';
20
20
  import { resolveProjectName } from '../utils/project-name.js';
21
- import { priceUsd, providerFor } from '@agentdeck/shared';
21
+ import { isPricedModel, normalizeModelProvider, priceUsd } from '@agentdeck/shared';
22
22
  import { classifyRunSmart, computeSignals, classify } from './classifier.js';
23
23
  import { readOpenTurnEvidence } from './claude-transcript-reader.js';
24
24
  /** A turn_start with the same prompt landing on a fresh, still-empty turn
@@ -32,6 +32,37 @@ const DUPLICATE_TURN_OPEN_WINDOW_MS = 15_000;
32
32
  * a cancel milliseconds into a turn reads as belonging to the previous one.
33
33
  * Matches the watchdog's `TURN_OPEN_SLACK_MS` — same comparison, same risk. */
34
34
  const TURN_INTERRUPT_SLACK_MS = 2_000;
35
+ /**
36
+ * Is `echo` the same user prompt as `original`, arriving a second time?
37
+ *
38
+ * Two producers open a turn for one prompt: our own `chat.send` span, which
39
+ * carries the text verbatim, and the Gateway's `session.message`(user) echo,
40
+ * which has been trimmed, envelope-stripped and capped at 8,000 characters
41
+ * before it reaches us. Exact equality therefore misses on inputs as ordinary
42
+ * as a trailing newline — and a miss is not benign: the duplicate then closes
43
+ * the open turn with `resolveDisplacedTurnSource`, which for a non-`claude-code`
44
+ * agent returns `next_prompt`, i.e. the unrecovered-Stop-loss bucket. A stray
45
+ * "\n" would invent a Stop loss for an agent that has no Stop hook at all,
46
+ * strand an empty turn, and shift every later `turn_index`.
47
+ *
48
+ * Comparing TRIMMED is the whole fix, and deliberately all of it. A first pass
49
+ * here also allowed a prefix match when the shorter side sat at the Gateway's
50
+ * 8,000-character cap — that branch could never fire: both operands reach this
51
+ * function through the caller's own `slice(0, 8_000)`, so "the shorter one is
52
+ * at 8,000" forces both to be exactly 8,000 characters, and two equal-length
53
+ * strings where one is a prefix of the other are identical, which the equality
54
+ * check above already answered. Reintroducing truncation tolerance means
55
+ * comparing BEFORE that slice, not adding a branch after it.
56
+ *
57
+ * Known and NOT closed by this: because the caller slices first, two genuinely
58
+ * different prompts that share their first 8,000 characters compare equal and
59
+ * collapse into one turn — an eval harness sending a long fixed preamble with a
60
+ * differing tail is exactly that shape. That predates this comparison and is
61
+ * fixed by keying on a hash of the unsliced prompt, not here.
62
+ */
63
+ function samePromptEcho(original, echo) {
64
+ return original.trim() === echo.trim();
65
+ }
35
66
  export class ApmeCollector {
36
67
  store;
37
68
  hwSampler;
@@ -43,6 +74,13 @@ export class ApmeCollector {
43
74
  sessionToTask = new Map(); // sessionId → current task
44
75
  runTaskCount = new Map(); // runId → next task_index
45
76
  sessionToUsage = new Map(); // last cumulative usage
77
+ /** Running cost total for producers that report PER-MESSAGE cost.
78
+ * Separate from `sessionToUsage` because `updateUsage` writes the cost
79
+ * column absolutely and would otherwise stamp one message's cost as the
80
+ * run's. `seen` keeps a reported ZERO distinct from nothing reported —
81
+ * glm-5.2 answers `usage.cost.total = 0` on every message, so folding the
82
+ * two would record "free" as "unknown" for a whole class of run. */
83
+ sessionToCostTotal = new Map();
46
84
  /** Optional listener fired after `closeTask` persists the row. The runner
47
85
  * wires this to enqueue a task-level judge call. */
48
86
  onTaskClosed = null;
@@ -78,6 +116,7 @@ export class ApmeCollector {
78
116
  sessionId: input.sessionId,
79
117
  agentType: input.agentType,
80
118
  modelId: input.modelId ?? null,
119
+ provider: input.modelId ? normalizeModelProvider(undefined, input.modelId) : null,
81
120
  projectName: input.projectName ?? (input.projectPath ? resolveProjectName({ cwd: input.projectPath }) : null),
82
121
  projectPath: input.projectPath ?? null,
83
122
  taskPrompt: input.taskPrompt ?? null,
@@ -126,7 +165,8 @@ export class ApmeCollector {
126
165
  // empty phantom turn and shift every later turn_index, so an identical
127
166
  // prompt landing on a fresh, still-empty turn is a no-op.
128
167
  const openTurn = this.sessionToTurn.get(sessionId);
129
- if (openTurn && prompt !== null && openTurn.prompt === prompt &&
168
+ if (openTurn && prompt !== null && openTurn.prompt !== null &&
169
+ samePromptEcho(openTurn.prompt, prompt) &&
130
170
  openTurn.toolCalls === 0 && !openTurn.hasResponse &&
131
171
  Date.now() - openTurn.startedAt < DUPLICATE_TURN_OPEN_WINDOW_MS) {
132
172
  debug('APME', `duplicate turn_start ignored (echo) turn=${openTurn.id.slice(0, 8)}`);
@@ -599,6 +639,14 @@ export class ApmeCollector {
599
639
  try {
600
640
  this.store.updateTask(task.id, {
601
641
  endedAt: Date.now(),
642
+ // `first_turn_index` too, not just the last. The task row is INSERTed
643
+ // from inside the turn_start handler, i.e. before the turn exists, so
644
+ // it is written NULL and the real index only ever landed in memory —
645
+ // 294 of 1080 closed claude-code tasks carry NULL here, and the task
646
+ // rollup the layer-2 judge reads is keyed on these two columns.
647
+ // `reapAbandonedRun` already COALESCEs a value in at reap time, which
648
+ // is this defect's workaround rather than its fix.
649
+ firstTurnIndex: task.firstTurnIndex,
602
650
  lastTurnIndex: task.lastTurnIndex ?? task.firstTurnIndex,
603
651
  boundarySignal,
604
652
  taskCategory,
@@ -700,6 +748,7 @@ export class ApmeCollector {
700
748
  inputTokens: ev.inputTokens ?? null,
701
749
  outputTokens: ev.outputTokens ?? null,
702
750
  costUsd: ev.costUsd ?? null,
751
+ costKnown: ev.costKnown ?? null,
703
752
  latencyMs: ev.latencyMs ?? null,
704
753
  toolName: ev.toolName ?? null,
705
754
  toolStatus: ev.toolStatus ?? null,
@@ -742,7 +791,7 @@ export class ApmeCollector {
742
791
  * Falls back to the last closed turn if closeTurn() already ran (race with session exit).
743
792
  * Tags turns.efficiency_json.response_kind so the runner can skip tool-only / empty
744
793
  * turns — judging silence produces noise scores. */
745
- setTurnResponse(sessionId, response) {
794
+ setTurnResponse(sessionId, response, source = 'direct') {
746
795
  if (!this.store.enabled)
747
796
  return;
748
797
  const turn = this.sessionToTurn.get(sessionId);
@@ -750,15 +799,27 @@ export class ApmeCollector {
750
799
  debug('APME', `setTurnResponse session=${sessionId.slice(0, 8)} turnId=${turnId?.slice(0, 8) ?? 'null'} respLen=${response.length}`);
751
800
  if (!turnId)
752
801
  return;
802
+ const existingTurn = this.store.getTurn(turnId);
803
+ const existingMeta = parseEfficiencyJson(existingTurn);
804
+ const existingSource = typeof existingMeta.response_source === 'string'
805
+ ? existingMeta.response_source
806
+ : (existingTurn?.response ? 'direct' : undefined);
807
+ if (responseSourcePriority(source) < responseSourcePriority(existingSource)) {
808
+ debug('APME', `setTurnResponse ignored lower-priority source=${source} existing=${existingSource}`);
809
+ return;
810
+ }
753
811
  const trimmedLen = response.trim().length;
754
812
  // Active-turn toolCalls is authoritative; after closeTurn() the counter is
755
813
  // already flushed to the DB row, so we fetch from there instead.
756
814
  const toolCalls = turn?.toolCalls
757
- ?? (this.store.getTurn(turnId)?.tool_calls ?? 0);
815
+ ?? (existingTurn?.tool_calls ?? 0);
758
816
  const kind = trimmedLen >= 1
759
817
  ? 'text'
760
818
  : (toolCalls > 0 ? 'tool_only' : 'empty');
761
- const efficiencyJson = mergeEfficiencyJson(this.store.getTurn(turnId), { response_kind: kind });
819
+ const efficiencyJson = mergeEfficiencyJson(existingTurn, {
820
+ response_kind: kind,
821
+ response_source: source,
822
+ });
762
823
  try {
763
824
  this.store.updateTurn(turnId, {
764
825
  response: response.slice(0, 10_000),
@@ -773,11 +834,18 @@ export class ApmeCollector {
773
834
  // Sample trajectory: the assistant response closes the turn's event arc.
774
835
  const ctx = this.sampleCtxForTurn(sessionId, turnId);
775
836
  if (ctx) {
776
- this.appendSampleEvent(ctx, {
777
- kind: 'assistant_message',
778
- dedupCore: hashCore(response.slice(0, 400)),
779
- payloadObj: { text: response.slice(0, 10_000), responseKind: kind },
780
- });
837
+ const payload = safeStringify({ text: response.slice(0, 10_000), responseKind: kind });
838
+ const existingEvent = this.store.findAssistantMessageEvent(ctx.taskId, turnId);
839
+ if (existingEvent?.id != null) {
840
+ this.store.updateSampleEvent(existingEvent.id, { payload, ts: Date.now() });
841
+ }
842
+ else {
843
+ this.appendSampleEvent(ctx, {
844
+ kind: 'assistant_message',
845
+ dedupCore: `turn:${turnId}`,
846
+ payloadObj: { text: response.slice(0, 10_000), responseKind: kind },
847
+ });
848
+ }
781
849
  }
782
850
  }
783
851
  /** Apply response to the last closed turn if it has no response yet.
@@ -835,16 +903,27 @@ export class ApmeCollector {
835
903
  }
836
904
  case 'turn_response': {
837
905
  const text = a['agentdeck.response_text'] ?? '';
906
+ const source = a['agentdeck.response_source'] ?? 'direct';
838
907
  const fallback = a['agentdeck.fallback_to_last_closed'] === true;
839
908
  if (fallback)
840
909
  this.setLastClosedTurnResponse(sessionId, text);
841
910
  else
842
- this.setTurnResponse(sessionId, text);
911
+ this.setTurnResponse(sessionId, text, source);
843
912
  return;
844
913
  }
845
- case 'turn_end':
846
- // No-op: turns auto-close on the next `turn_start` or session end.
914
+ case 'turn_end': {
915
+ // An explicit close, from a source that HAS a stop signal of its own.
916
+ // This used to be a no-op on the theory that turns auto-close on the
917
+ // next `turn_start` — which is true, and is exactly the shape the
918
+ // `end_source` column exists to avoid: closing at the next prompt puts
919
+ // the user's thinking time inside the turn's duration, and a
920
+ // conversation with one turn never closes it at all. OpenClaw is the
921
+ // first emitter (its `chat.final` is the stop signal); every other
922
+ // adapter still auto-closes, unchanged.
923
+ const source = a['agentdeck.turn_end_source'] ?? 'stop';
924
+ this.closeTurn(sessionId, source);
847
925
  return;
926
+ }
848
927
  case 'tool_call': {
849
928
  const toolName = (a['gen_ai.tool.name'] ?? a['agentdeck.tool_name']);
850
929
  const raw = a['agentdeck.raw_payload'] ?? {};
@@ -891,17 +970,18 @@ export class ApmeCollector {
891
970
  }
892
971
  case 'session_meta': {
893
972
  const model = a['gen_ai.request.model'];
894
- if (model)
895
- this.updateModel(sessionId, model);
973
+ const rawProvider = a['gen_ai.system'];
974
+ if (model || rawProvider)
975
+ this.updateTurnIdentity(sessionId, model, rawProvider);
896
976
  const inputTokens = a['agentdeck.usage.input_tokens'];
897
977
  const outputTokens = a['agentdeck.usage.output_tokens'];
898
978
  const costUsd = a['agentdeck.usage.cost_usd'];
899
979
  if (inputTokens !== undefined || outputTokens !== undefined || costUsd !== undefined) {
900
- // Synthesize a UsageSnapshot-compatible shape. Missing fields stay null.
901
- this.updateUsage(sessionId, {
980
+ // PER-MESSAGE numbers, not a running total see `addUsageIncrement`.
981
+ this.addUsageIncrement(sessionId, {
902
982
  inputTokens: inputTokens ?? 0,
903
983
  outputTokens: outputTokens ?? 0,
904
- estimatedCostUsd: costUsd ?? null,
984
+ costUsd: costUsd ?? null,
905
985
  });
906
986
  }
907
987
  return;
@@ -957,45 +1037,128 @@ export class ApmeCollector {
957
1037
  * Snapshots carry CUMULATIVE session totals, so we emit a priced ModelEvent
958
1038
  * for the delta and attribute it to the active task (the SessionSample cost
959
1039
  * is the sum of its ModelEvents). */
1040
+ /**
1041
+ * Record usage a producer reports for ONE message.
1042
+ *
1043
+ * `updateUsage` is cumulative by contract: it assigns `inputTokens` to the run
1044
+ * row absolutely and derives its per-task ModelEvent as `max(0, cur - prev)`.
1045
+ * Its original and only other caller is the PTY poller's `UsageTracker`
1046
+ * snapshot, which really is a running total.
1047
+ *
1048
+ * A `session.message`(assistant) frame reports THIS message's tokens, and those
1049
+ * are not monotonic — measured on a real OpenClaw session: 30302, 21375, 335,
1050
+ * 96, 114. Fed to `updateUsage` directly, the run row ends at the LAST
1051
+ * message's count (114 for a session that consumed 52,222), every decrease
1052
+ * clamps its delta to 0 so most messages append no ModelEvent at all, and
1053
+ * `recomputeSampleCost` then prices the run from what survives. Two messages
1054
+ * sharing an `(in,out)` pair are additionally deduped away, because the dedup
1055
+ * key assumes cumulative values are unique.
1056
+ *
1057
+ * So convert here rather than at each producer: keep the running total and
1058
+ * hand `updateUsage` the cumulative series its arithmetic is written for.
1059
+ */
1060
+ addUsageIncrement(sessionId, delta) {
1061
+ if (!this.store.enabled)
1062
+ return;
1063
+ // ONE guard for both accumulators. `updateUsage` drops everything when the
1064
+ // session has no open run, so advancing the cost total before that check
1065
+ // let cost count messages the token total did not: a span arriving before
1066
+ // the run opened, then one after, recorded 7 tokens at $10.50. Two
1067
+ // accumulators with different failure modes is the same defect shape as a
1068
+ // guard cleared only by a `defer` it shares a failure mode with.
1069
+ if (!this.sessionToRun.get(sessionId))
1070
+ return;
1071
+ const prev = this.sessionToUsage.get(sessionId) ?? { in: 0, out: 0, cost: null };
1072
+ const prevCost = this.sessionToCostTotal.get(sessionId) ?? { total: 0, seen: false };
1073
+ const reported = typeof delta.costUsd === 'number';
1074
+ const cost = { total: prevCost.total + (reported ? delta.costUsd : 0),
1075
+ seen: prevCost.seen || reported };
1076
+ this.sessionToCostTotal.set(sessionId, cost);
1077
+ this.updateUsage(sessionId, {
1078
+ // The clamp is deliberate, not defensive: `updateUsage` derives its
1079
+ // ModelEvent as `max(0, cur - prev)`, so the series handed to it must be
1080
+ // monotonic. No producer here reports a negative correction; if one ever
1081
+ // does, it needs its own path rather than silently shrinking the total.
1082
+ inputTokens: prev.in + Math.max(0, delta.inputTokens),
1083
+ outputTokens: prev.out + Math.max(0, delta.outputTokens),
1084
+ estimatedCostUsd: cost.seen ? cost.total : null,
1085
+ });
1086
+ }
960
1087
  updateUsage(sessionId, snapshot) {
961
1088
  if (!this.store.enabled)
962
1089
  return;
963
1090
  const runId = this.sessionToRun.get(sessionId);
964
1091
  if (!runId)
965
1092
  return;
1093
+ const curIn = snapshot.inputTokens ?? 0;
1094
+ const curOut = snapshot.outputTokens ?? 0;
1095
+ const prev = this.sessionToUsage.get(sessionId) ?? { in: 0, out: 0, cost: null };
1096
+ const hadPreviousUsage = prev.in > 0 || prev.out > 0;
1097
+ const dIn = Math.max(0, curIn - prev.in);
1098
+ const dOut = Math.max(0, curOut - prev.out);
1099
+ const run = this.store.getRun(runId);
1100
+ const turnId = this.turnIdFor(sessionId);
1101
+ const turn = turnId ? this.store.getTurn(turnId) : null;
1102
+ const model = turn?.model_id ?? run?.modelId ?? null;
1103
+ const reportedTotal = snapshot.estimatedCostUsd ?? snapshot.costSpent ?? null;
1104
+ const reportedDelta = reportedTotal == null
1105
+ ? null
1106
+ : Math.max(0, reportedTotal - (prev.cost ?? 0));
1107
+ const priced = isPricedModel(model);
1108
+ const eventCostKnown = priced || (reportedDelta != null && reportedDelta > 0);
1109
+ const eventCost = reportedDelta ?? priceUsd(model, dIn, dOut);
1110
+ const hasUsageDelta = dIn > 0 || dOut > 0;
1111
+ const hasAccountingDelta = hasUsageDelta || (reportedDelta ?? 0) > 0;
1112
+ const runCostKnown = !hasAccountingDelta
1113
+ ? Boolean(run?.costKnown)
1114
+ : hadPreviousUsage
1115
+ ? Boolean(run?.costKnown) && eventCostKnown
1116
+ : eventCostKnown;
1117
+ const runCost = reportedTotal ?? (priced ? priceUsd(model, curIn, curOut) : null);
1118
+ this.sessionToUsage.set(sessionId, { in: curIn, out: curOut, cost: reportedTotal });
966
1119
  try {
967
1120
  this.store.updateRun(runId, {
968
1121
  inputTokens: snapshot.inputTokens,
969
1122
  outputTokens: snapshot.outputTokens,
970
- costUsd: snapshot.estimatedCostUsd ?? snapshot.costSpent ?? null,
1123
+ costUsd: runCost,
1124
+ costKnown: runCostKnown,
971
1125
  });
972
1126
  }
973
1127
  catch { /* ignore */ }
974
1128
  // ── Per-task ModelEvent from the cumulative delta ──
975
- const curIn = snapshot.inputTokens ?? 0;
976
- const curOut = snapshot.outputTokens ?? 0;
977
- const prev = this.sessionToUsage.get(sessionId) ?? { in: 0, out: 0 };
978
- const dIn = Math.max(0, curIn - prev.in);
979
- const dOut = Math.max(0, curOut - prev.out);
980
- this.sessionToUsage.set(sessionId, { in: curIn, out: curOut });
981
1129
  if (dIn === 0 && dOut === 0)
982
1130
  return;
983
1131
  const task = this.sessionToTask.get(sessionId);
984
1132
  if (!task)
985
1133
  return;
986
- const run = this.store.getRun(runId);
987
- const model = run?.modelId ?? null;
1134
+ const provider = turn?.provider
1135
+ ?? run?.provider
1136
+ ?? normalizeModelProvider(undefined, model);
1137
+ const taskRow = this.store.getTask(task.id);
1138
+ const taskModel = !model
1139
+ ? taskRow?.modelId
1140
+ : !taskRow?.modelId || taskRow.modelId === model
1141
+ ? model
1142
+ : 'mixed';
1143
+ const taskProvider = !provider || provider === 'unknown'
1144
+ ? taskRow?.provider
1145
+ : !taskRow?.provider || taskRow.provider === provider
1146
+ ? provider
1147
+ : 'mixed';
988
1148
  const turnIndex = this.sessionToTurn.get(sessionId)?.index ?? task.lastTurnIndex ?? 0;
989
- // Prefer the agent-reported marginal cost when available, else price the delta.
990
- const cost = priceUsd(model, dIn, dOut);
991
- this.appendSampleEvent({ taskId: task.id, runId, turnIndex, turnId: this.turnIdFor(sessionId) }, {
1149
+ this.appendSampleEvent({ taskId: task.id, runId, turnIndex, turnId }, {
992
1150
  kind: 'model', model: model ?? undefined, inputTokens: dIn, outputTokens: dOut,
993
- costUsd: cost, latencyMs: 0, dedupCore: `${curIn}:${curOut}`,
1151
+ costUsd: eventCost, costKnown: eventCostKnown,
1152
+ latencyMs: 0, dedupCore: `${curIn}:${curOut}`,
994
1153
  });
995
1154
  try {
996
1155
  this.store.updateTask(task.id, {
997
- modelId: model ?? undefined,
998
- modelConfig: JSON.stringify({ modelId: model ?? 'unknown', provider: providerFor(model) }),
1156
+ modelId: taskModel,
1157
+ provider: taskProvider,
1158
+ modelConfig: JSON.stringify({
1159
+ modelId: taskModel ?? 'unknown',
1160
+ provider: taskProvider ?? null,
1161
+ }),
999
1162
  });
1000
1163
  this.store.recomputeSampleCost(task.id);
1001
1164
  }
@@ -1046,7 +1209,71 @@ export class ApmeCollector {
1046
1209
  if (!runId)
1047
1210
  return;
1048
1211
  try {
1049
- this.store.updateRun(runId, { modelId });
1212
+ this.store.updateRun(runId, {
1213
+ modelId,
1214
+ provider: normalizeModelProvider(undefined, modelId),
1215
+ });
1216
+ }
1217
+ catch { /* ignore */ }
1218
+ }
1219
+ /** Persist the model/provider on the assistant message's own turn.
1220
+ * `session_meta` can arrive after `chat.final` closed that turn, so the same
1221
+ * current→last fallback used by setTurnResponse is required here too. */
1222
+ updateTurnIdentity(sessionId, reportedModel, reportedProvider) {
1223
+ const runId = this.sessionToRun.get(sessionId);
1224
+ if (!runId)
1225
+ return;
1226
+ const turnId = this.turnIdFor(sessionId);
1227
+ const turn = turnId ? this.store.getTurn(turnId) : null;
1228
+ const run = this.store.getRun(runId);
1229
+ const model = reportedModel ?? turn?.model_id ?? run?.modelId ?? undefined;
1230
+ if (!model && !reportedProvider)
1231
+ return;
1232
+ const normalized = normalizeModelProvider(reportedProvider, model);
1233
+ const provider = normalized === 'unknown' ? null : normalized;
1234
+ if (turnId) {
1235
+ try {
1236
+ this.store.updateTurn(turnId, {
1237
+ ...(model ? { modelId: model } : {}),
1238
+ provider,
1239
+ });
1240
+ }
1241
+ catch { /* ignore */ }
1242
+ }
1243
+ // Preserve the established run-level "latest observed model" contract for
1244
+ // legacy consumers. Scorecards no longer depend on it when a turn has its
1245
+ // own identity, so updating this compatibility fallback cannot reassign
1246
+ // earlier turns.
1247
+ if (run) {
1248
+ const patch = {
1249
+ ...(model ? { modelId: model } : {}),
1250
+ provider,
1251
+ };
1252
+ if (Object.keys(patch).length > 0) {
1253
+ try {
1254
+ this.store.updateRun(runId, patch);
1255
+ }
1256
+ catch { /* ignore */ }
1257
+ }
1258
+ }
1259
+ const taskId = turn?.task_id ?? this.sessionToTask.get(sessionId)?.id;
1260
+ if (!taskId || !model)
1261
+ return;
1262
+ const task = this.store.getTask(taskId);
1263
+ if (!task)
1264
+ return;
1265
+ const taskModel = !task.modelId || task.modelId === model ? model : 'mixed';
1266
+ const taskProvider = !provider
1267
+ ? task.provider
1268
+ : task.provider == null || task.provider === provider
1269
+ ? provider
1270
+ : 'mixed';
1271
+ try {
1272
+ this.store.updateTask(taskId, {
1273
+ modelId: taskModel,
1274
+ provider: taskProvider,
1275
+ modelConfig: JSON.stringify({ modelId: taskModel, provider: taskProvider }),
1276
+ });
1050
1277
  }
1051
1278
  catch { /* ignore */ }
1052
1279
  }
@@ -1068,6 +1295,7 @@ export class ApmeCollector {
1068
1295
  this.sessionToLastTurnId.delete(sessionId);
1069
1296
  this.runTaskCount.delete(runId);
1070
1297
  this.sessionToUsage.delete(sessionId);
1298
+ this.sessionToCostTotal.delete(sessionId);
1071
1299
  // Mark empty runs so the dashboard can filter them out.
1072
1300
  // Don't delete — FK constraints and concurrent access make deletion risky.
1073
1301
  const run = this.store.getRun(runId);
@@ -1260,6 +1488,10 @@ function safeStringify(v) {
1260
1488
  * sibling keys. Returns a JSON string suitable for the column. Unparseable
1261
1489
  * existing values are replaced outright. */
1262
1490
  function mergeEfficiencyJson(turn, patch) {
1491
+ const base = parseEfficiencyJson(turn);
1492
+ return JSON.stringify({ ...base, ...patch });
1493
+ }
1494
+ function parseEfficiencyJson(turn) {
1263
1495
  let base = {};
1264
1496
  const raw = turn?.efficiency_json;
1265
1497
  if (typeof raw === 'string' && raw.length > 0) {
@@ -1271,6 +1503,16 @@ function mergeEfficiencyJson(turn, patch) {
1271
1503
  }
1272
1504
  catch { /* replace */ }
1273
1505
  }
1274
- return JSON.stringify({ ...base, ...patch });
1506
+ return base;
1507
+ }
1508
+ /** Full/final responses outrank lossy session-message projections. Unknown
1509
+ * historical provenance is treated as direct so a new projection cannot
1510
+ * downgrade data written before source tracking existed. */
1511
+ function responseSourcePriority(source) {
1512
+ if (source === 'session_message_projection')
1513
+ return 1;
1514
+ if (source === 'chat_final')
1515
+ return 3;
1516
+ return source ? 2 : 0;
1275
1517
  }
1276
1518
  //# sourceMappingURL=collector.js.map