@0xmaxma/claude-gateway 2.0.4 → 2.0.5

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 (228) hide show
  1. package/README.md +10 -1
  2. package/dist/agent/builtin-commands.d.ts +1 -1
  3. package/dist/agent/builtin-commands.d.ts.map +1 -1
  4. package/dist/agent/builtin-commands.js +3 -2
  5. package/dist/agent/builtin-commands.js.map +1 -1
  6. package/dist/agent/runner.d.ts +109 -9
  7. package/dist/agent/runner.d.ts.map +1 -1
  8. package/dist/agent/runner.js +148 -119
  9. package/dist/agent/runner.js.map +1 -1
  10. package/dist/agent/skill-learning/index.d.ts.map +1 -1
  11. package/dist/agent/skill-learning/index.js +27 -8
  12. package/dist/agent/skill-learning/index.js.map +1 -1
  13. package/dist/agent/skill-learning/reviewer.d.ts +3 -1
  14. package/dist/agent/skill-learning/reviewer.d.ts.map +1 -1
  15. package/dist/agent/skill-learning/reviewer.js +6 -2
  16. package/dist/agent/skill-learning/reviewer.js.map +1 -1
  17. package/dist/agent/turn-stream.d.ts +3 -1
  18. package/dist/agent/turn-stream.d.ts.map +1 -1
  19. package/dist/agent/turn-stream.js +8 -4
  20. package/dist/agent/turn-stream.js.map +1 -1
  21. package/dist/api/gateway-router.d.ts +2 -0
  22. package/dist/api/gateway-router.d.ts.map +1 -1
  23. package/dist/api/gateway-router.js +229 -12
  24. package/dist/api/gateway-router.js.map +1 -1
  25. package/dist/api/router.js +11 -11
  26. package/dist/api/router.js.map +1 -1
  27. package/dist/api/slack-webhook-router.js +1 -1
  28. package/dist/api/slack-webhook-router.js.map +1 -1
  29. package/dist/api/voice-router.d.ts +1 -0
  30. package/dist/api/voice-router.d.ts.map +1 -1
  31. package/dist/api/voice-router.js +129 -7
  32. package/dist/api/voice-router.js.map +1 -1
  33. package/dist/config/claude-settings.d.ts +14 -0
  34. package/dist/config/claude-settings.d.ts.map +1 -1
  35. package/dist/config/claude-settings.js +20 -0
  36. package/dist/config/claude-settings.js.map +1 -1
  37. package/dist/orchestration/agent-cli-session.d.ts +46 -0
  38. package/dist/orchestration/agent-cli-session.d.ts.map +1 -0
  39. package/dist/orchestration/agent-cli-session.js +121 -0
  40. package/dist/orchestration/agent-cli-session.js.map +1 -0
  41. package/dist/orchestration/agent-tool-schemas.d.ts +6 -0
  42. package/dist/orchestration/agent-tool-schemas.d.ts.map +1 -0
  43. package/dist/orchestration/agent-tool-schemas.js +23 -0
  44. package/dist/orchestration/agent-tool-schemas.js.map +1 -0
  45. package/dist/orchestration/bridge.d.ts +6 -3
  46. package/dist/orchestration/bridge.d.ts.map +1 -1
  47. package/dist/orchestration/bridge.js +31 -14
  48. package/dist/orchestration/bridge.js.map +1 -1
  49. package/dist/orchestration/browser-voice.d.ts +14 -0
  50. package/dist/orchestration/browser-voice.d.ts.map +1 -0
  51. package/dist/orchestration/browser-voice.js +30 -0
  52. package/dist/orchestration/browser-voice.js.map +1 -0
  53. package/dist/orchestration/context-footprint.d.ts +14 -0
  54. package/dist/orchestration/context-footprint.d.ts.map +1 -0
  55. package/dist/orchestration/context-footprint.js +57 -0
  56. package/dist/orchestration/context-footprint.js.map +1 -0
  57. package/dist/orchestration/dashboard-reader-worker.d.ts +2 -0
  58. package/dist/orchestration/dashboard-reader-worker.d.ts.map +1 -0
  59. package/dist/orchestration/dashboard-reader-worker.js +155 -0
  60. package/dist/orchestration/dashboard-reader-worker.js.map +1 -0
  61. package/dist/orchestration/dashboard-reader.d.ts +15 -0
  62. package/dist/orchestration/dashboard-reader.d.ts.map +1 -0
  63. package/dist/orchestration/dashboard-reader.js +87 -0
  64. package/dist/orchestration/dashboard-reader.js.map +1 -0
  65. package/dist/orchestration/decision-context.d.ts +15 -0
  66. package/dist/orchestration/decision-context.d.ts.map +1 -0
  67. package/dist/orchestration/decision-context.js +57 -0
  68. package/dist/orchestration/decision-context.js.map +1 -0
  69. package/dist/orchestration/display-stream.d.ts +21 -2
  70. package/dist/orchestration/display-stream.d.ts.map +1 -1
  71. package/dist/orchestration/display-stream.js +61 -8
  72. package/dist/orchestration/display-stream.js.map +1 -1
  73. package/dist/orchestration/inference-errors.d.ts.map +1 -1
  74. package/dist/orchestration/inference-errors.js +19 -21
  75. package/dist/orchestration/inference-errors.js.map +1 -1
  76. package/dist/orchestration/mutation-recovery.d.ts +12 -0
  77. package/dist/orchestration/mutation-recovery.d.ts.map +1 -0
  78. package/dist/orchestration/mutation-recovery.js +41 -0
  79. package/dist/orchestration/mutation-recovery.js.map +1 -0
  80. package/dist/orchestration/native-compact.d.ts +5 -0
  81. package/dist/orchestration/native-compact.d.ts.map +1 -0
  82. package/dist/orchestration/native-compact.js +29 -0
  83. package/dist/orchestration/native-compact.js.map +1 -0
  84. package/dist/orchestration/notification-mailbox.d.ts +3 -1
  85. package/dist/orchestration/notification-mailbox.d.ts.map +1 -1
  86. package/dist/orchestration/notification-mailbox.js +4 -2
  87. package/dist/orchestration/notification-mailbox.js.map +1 -1
  88. package/dist/orchestration/process-turn.d.ts +15 -2
  89. package/dist/orchestration/process-turn.d.ts.map +1 -1
  90. package/dist/orchestration/process-turn.js +78 -14
  91. package/dist/orchestration/process-turn.js.map +1 -1
  92. package/dist/orchestration/progress-review.d.ts +8 -18
  93. package/dist/orchestration/progress-review.d.ts.map +1 -1
  94. package/dist/orchestration/progress-review.js +12 -14
  95. package/dist/orchestration/progress-review.js.map +1 -1
  96. package/dist/orchestration/provider-message.d.ts +7 -0
  97. package/dist/orchestration/provider-message.d.ts.map +1 -0
  98. package/dist/orchestration/provider-message.js +63 -0
  99. package/dist/orchestration/provider-message.js.map +1 -0
  100. package/dist/orchestration/response-errors.d.ts +6 -0
  101. package/dist/orchestration/response-errors.d.ts.map +1 -0
  102. package/dist/orchestration/response-errors.js +88 -0
  103. package/dist/orchestration/response-errors.js.map +1 -0
  104. package/dist/orchestration/response-schema.d.ts +33 -0
  105. package/dist/orchestration/response-schema.d.ts.map +1 -0
  106. package/dist/orchestration/response-schema.js +61 -0
  107. package/dist/orchestration/response-schema.js.map +1 -0
  108. package/dist/orchestration/runtime.d.ts +67 -0
  109. package/dist/orchestration/runtime.d.ts.map +1 -1
  110. package/dist/orchestration/runtime.js +266 -62
  111. package/dist/orchestration/runtime.js.map +1 -1
  112. package/dist/orchestration/skills.d.ts.map +1 -1
  113. package/dist/orchestration/skills.js +3 -2
  114. package/dist/orchestration/skills.js.map +1 -1
  115. package/dist/orchestration/source-policy.d.ts +1 -1
  116. package/dist/orchestration/source-policy.d.ts.map +1 -1
  117. package/dist/orchestration/source-policy.js +1 -1
  118. package/dist/orchestration/speech.d.ts +15 -17
  119. package/dist/orchestration/speech.d.ts.map +1 -1
  120. package/dist/orchestration/speech.js +90 -30
  121. package/dist/orchestration/speech.js.map +1 -1
  122. package/dist/orchestration/store.d.ts +2 -0
  123. package/dist/orchestration/store.d.ts.map +1 -1
  124. package/dist/orchestration/store.js +16 -1
  125. package/dist/orchestration/store.js.map +1 -1
  126. package/dist/orchestration/tasks/driver.d.ts.map +1 -1
  127. package/dist/orchestration/tasks/driver.js +8 -3
  128. package/dist/orchestration/tasks/driver.js.map +1 -1
  129. package/dist/orchestration/tasks/pool.d.ts.map +1 -1
  130. package/dist/orchestration/tasks/pool.js +8 -4
  131. package/dist/orchestration/tasks/pool.js.map +1 -1
  132. package/dist/orchestration/tasks/service.d.ts +48 -1
  133. package/dist/orchestration/tasks/service.d.ts.map +1 -1
  134. package/dist/orchestration/tasks/service.js +41 -17
  135. package/dist/orchestration/tasks/service.js.map +1 -1
  136. package/dist/orchestration/token-ledger.d.ts +125 -0
  137. package/dist/orchestration/token-ledger.d.ts.map +1 -0
  138. package/dist/orchestration/token-ledger.js +232 -0
  139. package/dist/orchestration/token-ledger.js.map +1 -0
  140. package/dist/orchestration/token-usage.d.ts +46 -0
  141. package/dist/orchestration/token-usage.d.ts.map +1 -0
  142. package/dist/orchestration/token-usage.js +102 -0
  143. package/dist/orchestration/token-usage.js.map +1 -0
  144. package/dist/orchestration/tool-activity.d.ts.map +1 -1
  145. package/dist/orchestration/tool-activity.js +5 -3
  146. package/dist/orchestration/tool-activity.js.map +1 -1
  147. package/dist/orchestration/tool-name.d.ts +10 -0
  148. package/dist/orchestration/tool-name.d.ts.map +1 -0
  149. package/dist/orchestration/tool-name.js +14 -0
  150. package/dist/orchestration/tool-name.js.map +1 -0
  151. package/dist/orchestration/transcript-checkpoint.d.ts +14 -0
  152. package/dist/orchestration/transcript-checkpoint.d.ts.map +1 -0
  153. package/dist/orchestration/transcript-checkpoint.js +83 -0
  154. package/dist/orchestration/transcript-checkpoint.js.map +1 -0
  155. package/dist/orchestration/unanswered-inputs.d.ts +6 -0
  156. package/dist/orchestration/unanswered-inputs.d.ts.map +1 -0
  157. package/dist/orchestration/unanswered-inputs.js +18 -0
  158. package/dist/orchestration/unanswered-inputs.js.map +1 -0
  159. package/dist/session/process.d.ts +10 -0
  160. package/dist/session/process.d.ts.map +1 -1
  161. package/dist/session/process.js +91 -9
  162. package/dist/session/process.js.map +1 -1
  163. package/dist/session/request-tool-capture.d.ts +31 -0
  164. package/dist/session/request-tool-capture.d.ts.map +1 -0
  165. package/dist/session/request-tool-capture.js +194 -0
  166. package/dist/session/request-tool-capture.js.map +1 -0
  167. package/dist/session/runtime-profile.d.ts +7 -3
  168. package/dist/session/runtime-profile.d.ts.map +1 -1
  169. package/dist/session/runtime-profile.js +3 -1
  170. package/dist/session/runtime-profile.js.map +1 -1
  171. package/dist/session/store.d.ts +7 -0
  172. package/dist/session/store.d.ts.map +1 -1
  173. package/dist/session/store.js +27 -0
  174. package/dist/session/store.js.map +1 -1
  175. package/dist/shell/tailer.d.ts +7 -5
  176. package/dist/shell/tailer.d.ts.map +1 -1
  177. package/dist/shell/tailer.js +6 -17
  178. package/dist/shell/tailer.js.map +1 -1
  179. package/dist/ui/cli-viewer-ui.js +1 -1
  180. package/dist/ui/dashboard-client.d.ts +3 -0
  181. package/dist/ui/dashboard-client.d.ts.map +1 -0
  182. package/dist/ui/dashboard-client.js +188 -0
  183. package/dist/ui/dashboard-client.js.map +1 -0
  184. package/dist/ui/dashboard-presentation.d.ts +9 -0
  185. package/dist/ui/dashboard-presentation.d.ts.map +1 -0
  186. package/dist/ui/dashboard-presentation.js +56 -0
  187. package/dist/ui/dashboard-presentation.js.map +1 -0
  188. package/dist/ui/dashboard-range.d.ts +5 -0
  189. package/dist/ui/dashboard-range.d.ts.map +1 -0
  190. package/dist/ui/dashboard-range.js +20 -0
  191. package/dist/ui/dashboard-range.js.map +1 -0
  192. package/dist/ui/dashboard-theme.d.ts +4 -0
  193. package/dist/ui/dashboard-theme.d.ts.map +1 -0
  194. package/dist/ui/dashboard-theme.js +485 -0
  195. package/dist/ui/dashboard-theme.js.map +1 -0
  196. package/dist/ui/token-report-client.d.ts +3 -0
  197. package/dist/ui/token-report-client.d.ts.map +1 -0
  198. package/dist/ui/token-report-client.js +34 -0
  199. package/dist/ui/token-report-client.js.map +1 -0
  200. package/dist/ui/token-report.d.ts +89 -0
  201. package/dist/ui/token-report.d.ts.map +1 -0
  202. package/dist/ui/token-report.js +200 -0
  203. package/dist/ui/token-report.js.map +1 -0
  204. package/dist/ui/web-ui.d.ts.map +1 -1
  205. package/dist/ui/web-ui.js +124 -181
  206. package/dist/ui/web-ui.js.map +1 -1
  207. package/dist/voice/replay.d.ts +8 -0
  208. package/dist/voice/replay.d.ts.map +1 -0
  209. package/dist/voice/replay.js +48 -0
  210. package/dist/voice/replay.js.map +1 -0
  211. package/dist/voice/session.d.ts +9 -0
  212. package/dist/voice/session.d.ts.map +1 -1
  213. package/dist/voice/session.js +72 -14
  214. package/dist/voice/session.js.map +1 -1
  215. package/mcp/lazy-connector.test.ts +58 -0
  216. package/mcp/lazy-connector.ts +67 -0
  217. package/mcp/lazy-tools.test.ts +152 -0
  218. package/mcp/lazy-tools.ts +41 -0
  219. package/mcp/server.ts +53 -34
  220. package/mcp/tools/discord/commands.ts +2 -0
  221. package/mcp/tools/tasks/module.ts +1 -12
  222. package/mcp/tools/telegram/receiver-server.ts +14 -14
  223. package/package.json +2 -1
  224. package/resource/dashboard/OFL.txt +93 -0
  225. package/resource/dashboard/poppins-300.woff2 +0 -0
  226. package/resource/dashboard/poppins-400.woff2 +0 -0
  227. package/resource/dashboard/poppins-500.woff2 +0 -0
  228. package/resource/dashboard/poppins-600.woff2 +0 -0
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.measuredTurns = measuredTurns;
4
+ exports.recordTokenTurn = recordTokenTurn;
5
+ exports.tokenReport = tokenReport;
6
+ exports.pendingInputTurns = pendingInputTurns;
7
+ exports.readTokenReport = readTokenReport;
8
+ exports.summarizeTokenTurns = summarizeTokenTurns;
9
+ const token_usage_1 = require("./token-usage");
10
+ const initialized = new WeakSet();
11
+ /** Latest observed request in the most recent agent turn, including its output.
12
+ * A peak earlier in the turn may predate compaction and is not current context. */
13
+ function latestAgentContextWindow(store, sessionId) {
14
+ const row = store.get(`SELECT payload_json FROM token_turns WHERE session_id=? AND role='agent' AND EXISTS (SELECT 1 FROM json_each(token_turns.payload_json,'$.requests') r WHERE json_type(r.value,'$.usage')='object') ORDER BY started_at DESC,id DESC LIMIT 1`, sessionId);
15
+ if (!row)
16
+ return null;
17
+ let turn;
18
+ try {
19
+ turn = JSON.parse(String(row.payload_json));
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ const requests = Array.isArray(turn.requests) ? turn.requests : [];
25
+ let best = null;
26
+ for (const request of requests) {
27
+ const usage = request?.usage;
28
+ if (!usage)
29
+ continue;
30
+ const context = Number(usage.inputTokens ?? 0) + Number(usage.cacheReadTokens ?? 0) + Number(usage.cacheCreationTokens ?? 0);
31
+ best = { context, total: Number(usage.totalTokens ?? 0) };
32
+ }
33
+ if (!best)
34
+ return null;
35
+ return { used: best.total, total: null, model: typeof turn.model === 'string' ? turn.model : null };
36
+ }
37
+ // Dashboard polling never reloads full request arrays or conversation text.
38
+ // Cache only projected measurements, invalidate the affected session on writes.
39
+ const summaries = new WeakMap();
40
+ function measuredTurns(store, sessionId) {
41
+ ensure(store);
42
+ let cache = summaries.get(store);
43
+ if (!cache) {
44
+ cache = new Map();
45
+ summaries.set(store, cache);
46
+ }
47
+ const found = cache.get(sessionId);
48
+ if (found)
49
+ return found;
50
+ const turns = store.all(`SELECT id, role, task_id, started_at,
51
+ json_extract(payload_json,'$.usage') AS usage,
52
+ json_extract(payload_json,'$.loadedTools') AS loaded_tools,
53
+ json_extract(payload_json,'$.contextTools') AS context_tools,
54
+ json_extract(payload_json,'$.usedTools') AS used_tools
55
+ FROM token_turns WHERE session_id=? ORDER BY started_at,id`, sessionId).map(row => ({
56
+ id: String(row.id), sessionId, role: String(row.role), category: String(row.role) === 'worker' ? 'worker' : 'input',
57
+ taskId: row.task_id == null ? undefined : String(row.task_id), startedAt: Number(row.started_at), toolIds: [], inputTokens: 0, totalTokens: 0,
58
+ contextTools: row.context_tools == null ? null : JSON.parse(String(row.context_tools)),
59
+ usage: row.usage == null ? null : JSON.parse(String(row.usage)), loadedTools: row.loaded_tools == null ? null : JSON.parse(String(row.loaded_tools)),
60
+ usedTools: row.used_tools == null ? [] : JSON.parse(String(row.used_tools)),
61
+ }));
62
+ if (cache.size >= 64)
63
+ cache.delete(cache.keys().next().value);
64
+ cache.set(sessionId, turns);
65
+ return turns;
66
+ }
67
+ function ensure(store) {
68
+ if (initialized.has(store))
69
+ return;
70
+ store.run(`CREATE TABLE IF NOT EXISTS token_turns(id TEXT PRIMARY KEY, session_id TEXT NOT NULL,
71
+ role TEXT NOT NULL, task_id TEXT, started_at INTEGER NOT NULL, payload_json TEXT NOT NULL)`);
72
+ store.run('CREATE INDEX IF NOT EXISTS token_turns_session ON token_turns(session_id,started_at)');
73
+ store.run(`CREATE TABLE IF NOT EXISTS token_turn_metrics(id TEXT PRIMARY KEY, session_id TEXT NOT NULL, started_at INTEGER NOT NULL, payload_json TEXT NOT NULL)`);
74
+ store.run('CREATE INDEX IF NOT EXISTS token_turn_metrics_session ON token_turn_metrics(session_id,started_at)');
75
+ store.run('CREATE INDEX IF NOT EXISTS token_turns_started ON token_turns(started_at)');
76
+ initialized.add(store);
77
+ }
78
+ function recordTokenTurn(store, turn) {
79
+ ensure(store);
80
+ store.compose(() => {
81
+ store.run(`INSERT INTO token_turns VALUES(?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET payload_json=excluded.payload_json`, turn.id, turn.sessionId, turn.role, turn.taskId ?? null, turn.startedAt, JSON.stringify(turn));
82
+ store.run(`INSERT INTO token_turn_metrics VALUES(?,?,?,?) ON CONFLICT(id) DO UPDATE SET payload_json=excluded.payload_json`, turn.id, turn.sessionId, turn.startedAt, JSON.stringify({ ...turn, requests: undefined, inputTexts: undefined, responseText: undefined }));
83
+ });
84
+ const cached = summaries.get(store)?.get(turn.sessionId);
85
+ if (cached) {
86
+ const projection = { ...turn, requests: undefined, inputTexts: undefined, responseText: undefined };
87
+ const index = cached.findIndex(previous => previous.id === turn.id);
88
+ if (index < 0)
89
+ cached.push(projection);
90
+ else
91
+ cached[index] = projection;
92
+ }
93
+ }
94
+ function tokenReport(store, sessionId, includeDetails = true) {
95
+ ensure(store);
96
+ return readTokenReport(store, sessionId, includeDetails);
97
+ }
98
+ /** Accepted inputs that have no measured ledger turn yet.
99
+ *
100
+ * Turns are serialised per session on purpose (runtime.ts skips a session that already
101
+ * has a decision in flight), so a message sent while the previous turn is still running
102
+ * waits — occasionally minutes — before its own decision starts, and the token_turns row
103
+ * only appears with that turn's first usage event. Until then the report had no row for
104
+ * the message at all, which is why a queued message looked lost.
105
+ *
106
+ * These rows are DERIVED ON EVERY READ from conversation_inputs rather than written into
107
+ * token_turns, which is what the rest of this read path already does for decisions,
108
+ * responses, tasks and attempts. Two properties fall out of that choice for free:
109
+ * - the ledger stays purely measured usage, so no total, average, distribution or
110
+ * %cached query can ever see a pending row (they all sum token_turns);
111
+ * - a pending row cannot get stuck. It exists only while the input is genuinely still
112
+ * 'accepted'/'assigned' with no measured turn, so a handled, interrupted or replaced
113
+ * input drops out immediately, and a gateway restart (recovery.ts resets 'assigned'
114
+ * back to 'accepted') leaves it truthfully queued rather than permanently "running".
115
+ */
116
+ function pendingInputTurns(store, sessionId, since = 0, hasLedger = true, now = Date.now()) {
117
+ // An input whose decision already recorded usage is represented by that real turn.
118
+ const measured = hasLedger ? `AND NOT EXISTS (SELECT 1 FROM conversation_decisions d JOIN token_turns t ON t.id=d.id
119
+ WHERE d.conversation_id=i.conversation_id
120
+ AND EXISTS (SELECT 1 FROM json_each(d.input_ids_json) j WHERE j.value=i.id))` : '';
121
+ return store.all(`SELECT i.id,i.input_seq,i.text,i.modality,i.created_at,i.status,i.store_user_message
122
+ FROM conversation_inputs i JOIN conversations c ON c.id=i.conversation_id
123
+ WHERE c.agent_session_id=? AND i.status IN ('accepted','assigned') AND i.created_at>=? ${measured}
124
+ ORDER BY i.created_at DESC,i.input_seq DESC LIMIT 50`, sessionId, since).map(row => ({
125
+ id: String(row.id), sessionId, role: 'agent',
126
+ // store_user_message=0 is an orchestration report request, not a user message.
127
+ category: row.store_user_message ? 'input' : 'report',
128
+ pending: true, startedAt: Number(row.created_at),
129
+ queuedMs: Math.max(0, now - Number(row.created_at)),
130
+ toolIds: [], inputTokens: 0, totalTokens: 0, usage: null,
131
+ inputTexts: [String(row.text)], inputModalities: [String(row.modality)], inputSequences: [Number(row.input_seq)],
132
+ // 'assigned' means its decision has begun but no usage has been reported yet.
133
+ state: String(row.status) === 'assigned' ? 'starting' : 'queued',
134
+ }));
135
+ }
136
+ function readTokenReport(store, sessionId, includeDetails = true, page) {
137
+ const since = page?.since ?? 0;
138
+ const order = page?.newestFirst ? 'DESC' : 'ASC';
139
+ const turns = store.all(`SELECT payload_json FROM token_turns WHERE session_id=? AND started_at>=? ORDER BY started_at ${order},id ${order} LIMIT ? OFFSET ?`, sessionId, since, page?.limit ?? -1, page?.offset ?? 0)
140
+ .map(row => {
141
+ const turn = JSON.parse(String(row.payload_json));
142
+ if (!includeDetails)
143
+ return turn;
144
+ if (turn.role === 'agent') {
145
+ const decision = store.get('SELECT d.* FROM conversation_decisions d JOIN conversations c ON c.id=d.conversation_id WHERE d.id=? AND c.agent_session_id=?', turn.id, sessionId);
146
+ if (decision) {
147
+ const inputs = store.all('SELECT text,modality,input_seq,created_at FROM conversation_inputs WHERE conversation_id=? AND id IN (SELECT value FROM json_each(?)) ORDER BY input_seq', decision.conversation_id, decision.input_ids_json);
148
+ turn.inputTexts = inputs.map(input => String(input.text));
149
+ turn.inputModalities = inputs.map(input => String(input.modality));
150
+ turn.inputSequences = inputs.map(input => Number(input.input_seq));
151
+ // How long the earliest input waited for this turn to start. Serialised turns
152
+ // mean a short message can sit queued for minutes; without this the turn just
153
+ // looks slow instead of "queued behind the previous turn".
154
+ const accepted = inputs.map(input => Number(input.created_at)).filter(value => Number.isFinite(value) && value > 0);
155
+ if (accepted.length && Number.isFinite(Number(decision.started_at)))
156
+ turn.queuedMs = Math.max(0, Number(decision.started_at) - Math.min(...accepted));
157
+ turn.responseText = store.all('SELECT generated_text FROM assistant_responses WHERE decision_id=? ORDER BY created_at,id', turn.id).map(response => String(response.generated_text)).join('\n\n');
158
+ turn.state = String(decision.state);
159
+ if (turn.state === 'failed') {
160
+ const failure = store.get("SELECT json_extract(payload_json,'$.payload.code') code FROM conversation_events WHERE conversation_id=? AND type='response.error' AND json_extract(payload_json,'$.payload.responseId') IN (SELECT id FROM assistant_responses WHERE decision_id=?) ORDER BY seq DESC LIMIT 1", decision.conversation_id, turn.id);
161
+ if (typeof failure?.code === 'string' && /^[A-Z][A-Z0-9_]{0,79}$/.test(failure.code))
162
+ turn.failureCode = failure.code;
163
+ }
164
+ }
165
+ }
166
+ else if (turn.taskId) {
167
+ const task = store.get('SELECT t.snapshot_json FROM tasks t JOIN conversations c ON c.id=t.conversation_id WHERE t.id=? AND c.agent_session_id=?', turn.taskId, sessionId);
168
+ const attempt = store.attempt(turn.id);
169
+ if (task && attempt) {
170
+ const snapshot = JSON.parse(String(task.snapshot_json));
171
+ const revision = store.get('SELECT payload_json FROM task_revisions WHERE task_id=? AND revision=?', turn.taskId, attempt.revision);
172
+ turn.taskTitle = snapshot.title;
173
+ if (revision) {
174
+ const applied = JSON.parse(String(revision.payload_json));
175
+ turn.inputTexts = [`Current applied task revision ${attempt.revision}:\n${applied.instructions}`,
176
+ ...(applied.answers?.length ? ['Answers applied to the assignment (orchestrator interpretation):\n' + JSON.stringify(applied.answers, null, 2)] : []),
177
+ ...(applied.guidance ? ['Recorded supervision advice (may have been superseded by newer evidence):\n' + applied.guidance] : [])];
178
+ if (turn.taskRevision != null && turn.taskRevision !== attempt.revision) {
179
+ const initial = store.get('SELECT payload_json FROM task_revisions WHERE task_id=? AND revision=?', turn.taskId, turn.taskRevision);
180
+ if (initial)
181
+ turn.inputTexts.unshift(`Assignment at attempt start, revision ${turn.taskRevision}:\n${String(initial.payload_json)}`);
182
+ }
183
+ }
184
+ const latestAttempt = snapshot.activeAttemptId === turn.id || store.get('SELECT id FROM task_attempts WHERE task_id=? ORDER BY generation DESC LIMIT 1', turn.taskId)?.id === turn.id;
185
+ turn.state = attempt.state === 'ended'
186
+ ? latestAttempt && snapshot.state === 'cancelled' ? 'cancelled'
187
+ : attempt.result ? 'completed'
188
+ : attempt.failure ? (attempt.failure.code === 'WORKER_STOPPED' ? 'interrupted' : 'failed') : 'ended'
189
+ : attempt.state;
190
+ if (attempt.failure && turn.state !== 'cancelled')
191
+ turn.failureCode = attempt.failure.code;
192
+ if (attempt.result)
193
+ turn.responseText = attempt.result.summary;
194
+ // Stored, stable label for a worker row: it has no input_seq of its own.
195
+ turn.attemptGeneration = Number(attempt.generation);
196
+ // A task's newest result must not be attributed to an older retry.
197
+ if (!attempt.result && latestAttempt)
198
+ turn.responseText = snapshot.result?.summary;
199
+ }
200
+ }
201
+ return turn;
202
+ });
203
+ // Newest page only: a queued input is by definition newer than every recorded turn, so
204
+ // repeating it while paging back through history would be noise. Pending rows are
205
+ // appended to the view, never to token_turns, so every aggregate below ignores them.
206
+ if (includeDetails && !(page?.offset ?? 0))
207
+ turns.push(...pendingInputTurns(store, sessionId, since));
208
+ const totalsByRole = store.all(`SELECT role, SUM(json_extract(payload_json,'$.usage.totalTokens')) total FROM token_turns WHERE session_id=? AND started_at>=? GROUP BY role`, sessionId, since);
209
+ const agentTokens = totalsByRole.find(row => row.role === 'agent')?.total ?? null;
210
+ const workerTokens = totalsByRole.find(row => row.role === 'worker')?.total ?? null;
211
+ const totalTokens = agentTokens === null && workerTokens === null ? null : Number(agentTokens ?? 0) + Number(workerTokens ?? 0);
212
+ const distribution = store.all(`SELECT json_extract(payload_json,'$.category') category, SUM(json_extract(payload_json,'$.usage.totalTokens')) tokens FROM token_turns WHERE session_id=? AND started_at>=? AND json_type(payload_json,'$.usage')='object' GROUP BY category`, sessionId, since).map(r => ({ category: String(r.category), tokens: Number(r.tokens ?? 0) }));
213
+ const usageByRole = store.all(`SELECT role,
214
+ SUM(json_extract(payload_json,'$.usage.inputTokens')) inputTokens,
215
+ SUM(json_extract(payload_json,'$.usage.cacheCreationTokens')) cacheCreationTokens,
216
+ SUM(json_extract(payload_json,'$.usage.cacheReadTokens')) cacheReadTokens,
217
+ SUM(json_extract(payload_json,'$.usage.outputTokens')) outputTokens
218
+ FROM token_turns WHERE session_id=? AND started_at>=? AND json_type(payload_json,'$.usage')='object' GROUP BY role`, sessionId, since)
219
+ .map(row => ({ role: String(row.role), inputTokens: Number(row.inputTokens ?? 0), cacheCreationTokens: Number(row.cacheCreationTokens ?? 0), cacheReadTokens: Number(row.cacheReadTokens ?? 0), outputTokens: Number(row.outputTokens ?? 0) }));
220
+ return { sessionId, turns, usageByRole, contextWindow: latestAgentContextWindow(store, sessionId), totals: { agentTokens: agentTokens === null ? null : Number(agentTokens), workerTokens: workerTokens === null ? null : Number(workerTokens), totalTokens }, distribution,
221
+ pagination: page ? { ...page, total: Number(store.get('SELECT COUNT(*) n FROM token_turns WHERE session_id=? AND started_at>=?', sessionId, since).n) } : undefined,
222
+ coverage: 'recorded-turns-only' };
223
+ }
224
+ function summarizeTokenTurns(turns) {
225
+ const measured = turns.filter(turn => turn.usage);
226
+ const usage = measured.length ? (0, token_usage_1.sumUsage)(measured.map(turn => turn.usage)) : null;
227
+ return { totalTokens: usage?.totalTokens ?? null,
228
+ contextTools: turns.some(turn => turn.contextTools != null) ? [...new Set(turns.flatMap(turn => turn.contextTools ?? []))].sort() : null,
229
+ loadedTools: turns.some(turn => turn.loadedTools != null) ? [...new Set(turns.flatMap(turn => turn.loadedTools ?? []))].sort() : null,
230
+ usedTools: [...new Set(turns.flatMap(turn => turn.usedTools ?? []))].sort() };
231
+ }
232
+ //# sourceMappingURL=token-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-ledger.js","sourceRoot":"","sources":["../../src/orchestration/token-ledger.ts"],"names":[],"mappings":";;AAkDA,sCAqBC;AAWD,0CAcC;AACD,kCAGC;AAmBD,8CAoBC;AACD,0CA+EC;AAAA,kDAOA;AAhOD,+CAAyC;AA0BzC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAsB,CAAC;AACtD;mFACmF;AACnF,SAAS,wBAAwB,CAAC,KAAsC,EAAE,SAAiB;IACzF,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,6OAA6O,EAAE,SAAS,CAAC,CAAC;IAChR,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,IAAe,CAAC;IACpB,IAAI,CAAC;QAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAc,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,IAAI,IAAI,GAA8C,IAAI,CAAC;IAC3D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,CAAC,CAAC;QAC7H,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtG,CAAC;AACD,4EAA4E;AAC5E,gFAAgF;AAChF,MAAM,SAAS,GAAG,IAAI,OAAO,EAAgD,CAAC;AAC9E,SAAgB,aAAa,CAAC,KAAyB,EAAE,SAAiB;IACxE,MAAM,CAAC,KAAK,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;;;;;+DAKqC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClF,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAsB,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAiB,CAAC,CAAC,CAAC,OAAgB;QAC1J,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;QAC7I,YAAY,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACtF,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACpJ,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KAC5E,CAAC,CAAC,CAAC;IACN,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE;QAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAC;IAC/D,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,MAAM,CAAC,KAAyB;IACvC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO;IACnC,KAAK,CAAC,GAAG,CAAC;+FACmF,CAAC,CAAC;IAC/F,KAAK,CAAC,GAAG,CAAC,sFAAsF,CAAC,CAAC;IAClG,KAAK,CAAC,GAAG,CAAC,uJAAuJ,CAAC,CAAC;IACnK,KAAK,CAAC,GAAG,CAAC,oGAAoG,CAAC,CAAC;IAChH,KAAK,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IACvF,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AACD,SAAgB,eAAe,CAAC,KAAyB,EAAE,IAAe;IACxE,MAAM,CAAC,KAAK,CAAC,CAAC;IACd,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACnB,KAAK,CAAC,GAAG,CAAC,8GAA8G,EACtH,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACjG,KAAK,CAAC,GAAG,CAAC,iHAAiH,EACzH,IAAI,CAAC,EAAE,EAAC,IAAI,CAAC,SAAS,EAAC,IAAI,CAAC,SAAS,EAAC,IAAI,CAAC,SAAS,CAAC,EAAC,GAAG,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,CAAC,CAAC,CAAC;IAClI,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAC,CAAC;QAClG,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;YAAM,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;IAC1E,CAAC;AACH,CAAC;AACD,SAAgB,WAAW,CAAC,KAAyB,EAAE,SAAiB,EAAE,cAAc,GAAG,IAAI;IAC7F,MAAM,CAAC,KAAK,CAAC,CAAC;IACd,OAAO,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC;AACD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,iBAAiB,CAAC,KAAsC,EAAE,SAAiB,EACzF,KAAK,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC7C,mFAAmF;IACnF,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;;mFAEoD,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,OAAO,KAAK,CAAC,GAAG,CAAC;;6FAE0E,QAAQ;yDAC5C,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnF,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAgB;QACrD,+EAA+E;QAC/E,QAAQ,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAgB,CAAC,CAAC,CAAC,QAAiB;QACvE,OAAO,EAAE,IAAa,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QACzD,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI;QACxD,UAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChH,8EAA8E;QAC9E,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;KACjE,CAAC,CAAC,CAAC;AACR,CAAC;AACD,SAAgB,eAAe,CAAC,KAA0D,EAAE,SAAiB,EAAE,cAAc,GAAG,IAAI,EAAE,IAA6E;IACjN,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,iGAAiG,KAAK,OAAO,KAAK,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;SACnN,GAAG,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAc,CAAC;QAC/D,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,+HAA+H,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAChL,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,0JAA0J,EAAE,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;gBACxO,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1D,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACnE,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBACnE,8EAA8E;gBAC9E,8EAA8E;gBAC9E,2DAA2D;gBAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;gBACpH,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;gBACtJ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,2FAA2F,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClM,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,gRAAgR,EAAE,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC/U,IAAI,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;wBAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;gBACxH,CAAC;YAEH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,0HAA0H,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC3K,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,wEAAwE,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpI,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAChC,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;oBAC1D,IAAI,CAAC,UAAU,GAAG,CAAC,iCAAiC,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,YAAY,EAAE;wBAC9F,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,oEAAoE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrJ,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,6EAA6E,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACnI,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;wBACxE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,wEAAwE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;wBACpI,IAAI,OAAO;4BAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,yCAAyC,IAAI,CAAC,YAAY,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;oBACvI,CAAC;gBACH,CAAC;gBACD,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,KAAK,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,+EAA+E,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBACtL,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO;oBACpC,CAAC,CAAC,aAAa,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW;wBAC7D,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;4BAC9B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO;oBACtG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;gBAClB,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;oBAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC3F,IAAI,OAAO,CAAC,MAAM;oBAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC/D,yEAAyE;gBACzE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACpD,mEAAmE;gBACnE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,aAAa;oBAAE,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;YACrF,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACL,uFAAuF;IACvF,kFAAkF;IAClF,qFAAqF;IACrF,IAAI,cAAc,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACtG,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,8IAA8I,EAAC,SAAS,EAAC,KAAK,CAAC,CAAC;IAC/L,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAA,EAAE,CAAA,GAAG,CAAC,IAAI,KAAG,OAAO,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;IAC9E,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAA,EAAE,CAAA,GAAG,CAAC,IAAI,KAAG,QAAQ,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;IAChF,MAAM,WAAW,GAAG,WAAW,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,IAAE,CAAC,CAAC,GAAC,MAAM,CAAC,YAAY,IAAE,CAAC,CAAC,CAAC;IAC1H,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,8OAA8O,EAAC,SAAS,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,EAAC,QAAQ,EAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAC,MAAM,EAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAE,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IAClW,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC;;;;;uHAKuF,EAAE,SAAS,EAAE,KAAK,CAAC;SACrI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAC,IAAI,EAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAC,WAAW,EAAC,MAAM,CAAC,GAAG,CAAC,WAAW,IAAE,CAAC,CAAC,EAAC,mBAAmB,EAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,IAAE,CAAC,CAAC,EAAC,eAAe,EAAC,MAAM,CAAC,GAAG,CAAC,eAAe,IAAE,CAAC,CAAC,EAAC,YAAY,EAAC,MAAM,CAAC,GAAG,CAAC,YAAY,IAAE,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IAC/N,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,EAAC,WAAW,EAAC,WAAW,KAAG,IAAI,CAAA,CAAC,CAAA,IAAI,CAAA,CAAC,CAAA,MAAM,CAAC,WAAW,CAAC,EAAC,YAAY,EAAC,YAAY,KAAG,IAAI,CAAA,CAAC,CAAA,IAAI,CAAA,CAAC,CAAA,MAAM,CAAC,YAAY,CAAC,EAAC,WAAW,EAAC,EAAE,YAAY;QACvP,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAC,GAAG,IAAI,EAAC,KAAK,EAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,yEAAyE,EAAC,SAAS,EAAC,KAAK,CAAE,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,SAAS;QAC9J,QAAQ,EAAE,qBAA8B,EAAE,CAAC;AAC/C,CAAC;AAAA,SAAgB,mBAAmB,CAAC,KAAkB;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAA,sBAAQ,EAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnF,OAAO,EAAC,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,IAAI;QAC7C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,CAAC,YAAY,IAAE,IAAI,CAAC,CAAA,CAAC,CAAA,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,CAAC,YAAY,IAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA,CAAC,CAAA,IAAI;QAC5H,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QACrI,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { RequestToolSchemas } from '../session/request-tool-capture';
2
+ /** Model token volume, not billing cost. Output already includes thinking. */
3
+ export interface TokenUsage {
4
+ inputTokens: number;
5
+ cacheCreationTokens: number;
6
+ cacheReadTokens: number;
7
+ outputTokens: number;
8
+ totalTokens: number;
9
+ cacheCreation5mTokens?: number;
10
+ cacheCreation1hTokens?: number;
11
+ }
12
+ export interface RequestUsage {
13
+ id: string;
14
+ model?: string;
15
+ usage: TokenUsage;
16
+ toolSchemas?: RequestToolSchemas;
17
+ }
18
+ export declare function emptyUsage(): TokenUsage;
19
+ export declare function sumUsage(values: TokenUsage[]): TokenUsage;
20
+ /** Deduplicate assistant blocks and partial stream usage by the provider message ID.
21
+ * CLI result usage is a turn aggregate, never another request to add to the sum. */
22
+ export declare class TurnUsageCollector {
23
+ private readonly messages;
24
+ private currentId?;
25
+ private readonly schemas;
26
+ observeSchemas(value: RequestToolSchemas): void;
27
+ private aggregate;
28
+ loadedTools: string[] | null;
29
+ readonly usedTools: Set<string>;
30
+ model?: string;
31
+ observe(event: any): void;
32
+ private merge;
33
+ snapshot(): {
34
+ usage: TokenUsage | null;
35
+ requests: RequestUsage[];
36
+ loadedTools: string[] | null;
37
+ usedTools: string[];
38
+ contextTools: string[] | null;
39
+ schemaCoverage: {
40
+ measured: number;
41
+ total: number;
42
+ };
43
+ model?: string;
44
+ };
45
+ }
46
+ //# sourceMappingURL=token-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage.d.ts","sourceRoot":"","sources":["../../src/orchestration/token-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AACD,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAAE;AAElH,wBAAgB,UAAU,IAAI,UAAU,CAEvC;AAaD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAKzD;AACD;oFACoF;AACpF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAI/C,OAAO,CAAC,SAAS,CAA2B;IAC5C,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IACpC,QAAQ,CAAC,SAAS,cAAqB;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAiBzB,OAAO,CAAC,KAAK;IAMb,QAAQ,IAAI;QAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,cAAc,EAAE;YAAC,QAAQ,EAAC,MAAM,CAAC;YAAA,KAAK,EAAC,MAAM,CAAA;SAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CAcrN"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TurnUsageCollector = void 0;
4
+ exports.emptyUsage = emptyUsage;
5
+ exports.sumUsage = sumUsage;
6
+ const tool_name_1 = require("./tool-name");
7
+ const fields = ['inputTokens', 'cacheCreationTokens', 'cacheReadTokens', 'outputTokens', 'cacheCreation5mTokens', 'cacheCreation1hTokens'];
8
+ function emptyUsage() {
9
+ return { inputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, outputTokens: 0, totalTokens: 0 };
10
+ }
11
+ function count(value) { return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : 0; }
12
+ function normalize(value) {
13
+ const usage = emptyUsage();
14
+ usage.inputTokens = count(value.input_tokens);
15
+ usage.cacheCreationTokens = count(value.cache_creation_input_tokens);
16
+ usage.cacheReadTokens = count(value.cache_read_input_tokens);
17
+ usage.outputTokens = count(value.output_tokens);
18
+ if (typeof value.cache_creation?.ephemeral_5m_input_tokens === 'number')
19
+ usage.cacheCreation5mTokens = count(value.cache_creation.ephemeral_5m_input_tokens);
20
+ if (typeof value.cache_creation?.ephemeral_1h_input_tokens === 'number')
21
+ usage.cacheCreation1hTokens = count(value.cache_creation.ephemeral_1h_input_tokens);
22
+ usage.totalTokens = usage.inputTokens + usage.cacheCreationTokens + usage.cacheReadTokens + usage.outputTokens;
23
+ return usage;
24
+ }
25
+ function sumUsage(values) {
26
+ const sum = emptyUsage();
27
+ for (const value of values)
28
+ for (const key of fields)
29
+ if (value[key] !== undefined)
30
+ sum[key] = (sum[key] ?? 0) + value[key];
31
+ sum.totalTokens = sum.inputTokens + sum.cacheCreationTokens + sum.cacheReadTokens + sum.outputTokens;
32
+ return sum;
33
+ }
34
+ /** Deduplicate assistant blocks and partial stream usage by the provider message ID.
35
+ * CLI result usage is a turn aggregate, never another request to add to the sum. */
36
+ class TurnUsageCollector {
37
+ constructor() {
38
+ this.messages = new Map();
39
+ this.schemas = new Map();
40
+ this.aggregate = null;
41
+ this.loadedTools = null;
42
+ this.usedTools = new Set();
43
+ }
44
+ observeSchemas(value) {
45
+ this.schemas.set(value.messageId, value);
46
+ const request = this.messages.get(value.messageId);
47
+ if (request)
48
+ request.toolSchemas = value;
49
+ }
50
+ observe(event) {
51
+ if (!event || typeof event !== 'object')
52
+ return;
53
+ if (event.type === 'system' && event.subtype === 'init') {
54
+ if (Array.isArray(event.tools) && event.tools.every((name) => typeof name === 'string'))
55
+ this.loadedTools = [...new Set(event.tools)].sort();
56
+ if (typeof event.model === 'string')
57
+ this.model = event.model;
58
+ }
59
+ const stream = event.type === 'stream_event' ? event.event : undefined;
60
+ const message = event.type === 'assistant' ? event.message : stream?.type === 'message_start' ? stream.message : undefined;
61
+ if (message && typeof message.id === 'string') {
62
+ this.currentId = message.id;
63
+ if (message.usage)
64
+ this.merge(message.id, message.usage, message.model);
65
+ }
66
+ if (stream?.type === 'message_delta' && this.currentId && stream.usage)
67
+ this.merge(this.currentId, stream.usage);
68
+ if (event.type === 'result' && event.usage && typeof event.usage === 'object')
69
+ this.aggregate = normalize(event.usage);
70
+ const blocks = Array.isArray(event.message?.content) ? event.message.content : [];
71
+ for (const block of [...blocks, stream?.content_block])
72
+ if (block?.type === 'tool_use' && typeof block.name === 'string' && !(/^mcp__[a-zA-Z0-9_-]+__tool_call$/.test(block.name) && !block.input?.name))
73
+ this.usedTools.add((0, tool_name_1.executionTool)(block).name);
74
+ }
75
+ merge(id, raw, model) {
76
+ const next = normalize(raw), previous = this.messages.get(id);
77
+ if (previous)
78
+ for (const key of fields)
79
+ if (previous.usage[key] !== undefined || next[key] !== undefined)
80
+ next[key] = Math.max(previous.usage[key] ?? 0, next[key] ?? 0);
81
+ next.totalTokens = next.inputTokens + next.cacheCreationTokens + next.cacheReadTokens + next.outputTokens;
82
+ this.messages.set(id, { id, model: typeof model === 'string' ? model : previous?.model, usage: next, toolSchemas: this.schemas.get(id) });
83
+ }
84
+ snapshot() {
85
+ const requests = [...this.messages.values()];
86
+ // The CLI aggregate includes otherwise unreported subcalls. It is a fallback
87
+ // and reconciliation source, not an extra request or fabricated request ID.
88
+ let usage = requests.length ? sumUsage(requests.map(request => request.usage)) : this.aggregate;
89
+ if (usage && this.aggregate) {
90
+ usage = { ...usage };
91
+ for (const key of fields)
92
+ if (usage[key] !== undefined || this.aggregate[key] !== undefined)
93
+ usage[key] = Math.max(usage[key] ?? 0, this.aggregate[key] ?? 0);
94
+ usage.totalTokens = usage.inputTokens + usage.cacheCreationTokens + usage.cacheReadTokens + usage.outputTokens;
95
+ }
96
+ const measured = requests.filter(r => r.toolSchemas);
97
+ const contextTools = measured.length ? [...new Set(measured.flatMap(r => r.toolSchemas.loaded))].sort() : null;
98
+ return { usage, requests, contextTools, schemaCoverage: { measured: measured.length, total: requests.length }, loadedTools: this.loadedTools, usedTools: [...this.usedTools].sort(), model: this.model };
99
+ }
100
+ }
101
+ exports.TurnUsageCollector = TurnUsageCollector;
102
+ //# sourceMappingURL=token-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage.js","sourceRoot":"","sources":["../../src/orchestration/token-usage.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-activity.d.ts","sourceRoot":"","sources":["../../src/orchestration/tool-activity.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,UAAU,GAAG,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAAE;AAClJ,wBAAgB,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAuB3F"}
1
+ {"version":3,"file":"tool-activity.d.ts","sourceRoot":"","sources":["../../src/orchestration/tool-activity.ts"],"names":[],"mappings":"AACA,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,UAAU,GAAG,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAAE;AAClJ,wBAAgB,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAwB3F"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.toolActivity = toolActivity;
4
+ const tool_name_1 = require("./tool-name");
4
5
  function toolActivity(publish) {
5
6
  const calls = new Map();
6
7
  const finished = new Set();
@@ -16,9 +17,10 @@ function toolActivity(publish) {
16
17
  return;
17
18
  for (const block of event.message.content) {
18
19
  if (block.type === 'tool_use' && typeof block.id === 'string' && typeof block.name === 'string' && !calls.has(block.id) && calls.size < 2000) {
19
- calls.set(block.id, block.name);
20
+ const actual = (0, tool_name_1.executionTool)(block);
21
+ calls.set(block.id, actual.name);
20
22
  const input = {};
21
- for (const [key, value] of Object.entries(block.input ?? {}).slice(0, 16)) {
23
+ for (const [key, value] of Object.entries(actual.input).slice(0, 16)) {
22
24
  if (/token|secret|password|authorization|api.?key/i.test(key))
23
25
  continue;
24
26
  if (typeof value === 'string')
@@ -26,7 +28,7 @@ function toolActivity(publish) {
26
28
  else if (typeof value === 'number' || typeof value === 'boolean')
27
29
  input[key] = value;
28
30
  }
29
- publish({ type: 'tool_use', id: block.id, name: block.name, input });
31
+ publish({ type: 'tool_use', id: block.id, name: actual.name, input });
30
32
  }
31
33
  if (block.type === 'tool_result' && calls.has(block.tool_use_id) && !finished.has(block.tool_use_id)) {
32
34
  finished.add(block.tool_use_id);
@@ -1 +1 @@
1
- {"version":3,"file":"tool-activity.js","sourceRoot":"","sources":["../../src/orchestration/tool-activity.ts"],"names":[],"mappings":";;AAEA,oCAuBC;AAvBD,SAAgB,YAAY,CAAC,OAAsC;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,OAAO,IAAI,CAAC,EAAE;QACZ,IAAI,KAAU,CAAC;QAAC,IAAI,CAAC;YAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO;QAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;YAAE,OAAO;QACnD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;gBAC7I,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,MAAM,KAAK,GAA4B,EAAE,CAAC;gBAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC1E,IAAI,+CAA+C,CAAC,IAAI,CAAC,GAAG,CAAC;wBAAE,SAAS;oBACxE,IAAI,OAAO,KAAK,KAAK,QAAQ;wBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;yBAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;wBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACvF,CAAC;gBACD,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAChC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClI,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"tool-activity.js","sourceRoot":"","sources":["../../src/orchestration/tool-activity.ts"],"names":[],"mappings":";;AAGA,oCAwBC;AA3BD,2CAA4C;AAG5C,SAAgB,YAAY,CAAC,OAAsC;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,OAAO,IAAI,CAAC,EAAE;QACZ,IAAI,KAAU,CAAC;QAAC,IAAI,CAAC;YAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO;QAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;YAAE,OAAO;QACnD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;gBAC7I,MAAM,MAAM,GAAG,IAAA,yBAAa,EAAC,KAAK,CAAC,CAAC;gBACpC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,KAAK,GAA4B,EAAE,CAAC;gBAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACrE,IAAI,+CAA+C,CAAC,IAAI,CAAC,GAAG,CAAC;wBAAE,SAAS;oBACxE,IAAI,OAAO,KAAK,KAAK,QAAQ;wBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;yBAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;wBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACvF,CAAC;gBACD,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAChC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClI,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Display the deferred target within its original MCP namespace. Never let a
2
+ * connector claim that its call executed a native or gateway tool. */
3
+ export declare function executionTool(block: {
4
+ name?: unknown;
5
+ input?: any;
6
+ }): {
7
+ name: string;
8
+ input: Record<string, unknown>;
9
+ };
10
+ //# sourceMappingURL=tool-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-name.d.ts","sourceRoot":"","sources":["../../src/orchestration/tool-name.ts"],"names":[],"mappings":"AAAA;sEACsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAOtH"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executionTool = executionTool;
4
+ /** Display the deferred target within its original MCP namespace. Never let a
5
+ * connector claim that its call executed a native or gateway tool. */
6
+ function executionTool(block) {
7
+ const name = typeof block.name === 'string' ? block.name : 'tool';
8
+ const input = block.input && typeof block.input === 'object' && !Array.isArray(block.input) ? block.input : {};
9
+ if (/^mcp__[a-zA-Z0-9_-]+__tool_call$/.test(name) && typeof input.name === 'string' && /^[a-zA-Z0-9_-]{1,128}$/.test(input.name)) {
10
+ return { name: name.slice(0, -'tool_call'.length) + input.name, input: input.arguments && typeof input.arguments === 'object' && !Array.isArray(input.arguments) ? input.arguments : {} };
11
+ }
12
+ return { name, input };
13
+ }
14
+ //# sourceMappingURL=tool-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-name.js","sourceRoot":"","sources":["../../src/orchestration/tool-name.ts"],"names":[],"mappings":";;AAEA,sCAOC;AATD;sEACsE;AACtE,SAAgB,aAAa,CAAC,KAAsC;IAClE,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/G,IAAI,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACjI,OAAO,EAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAC,CAAC;IAC1L,CAAC;IACD,OAAO,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface TranscriptCheckpoint {
2
+ path: string;
3
+ size: number;
4
+ ino: number;
5
+ dev: number;
6
+ }
7
+ /** Only existing, private CLI transcripts are eligible. Never rewind a fresh session. */
8
+ export declare function checkpointTranscript(path: string): Promise<TranscriptCheckpoint | undefined>;
9
+ /** After confirmed CLI shutdown, remove only an unanswered attempt's appended
10
+ * input/metadata. Real assistant output, tool results, compaction boundaries and
11
+ * unknown records fail closed. Keep the discarded bytes in a private diagnostic
12
+ * archive; the user's input and task receipts remain in the orchestration DB. */
13
+ export declare function rollbackUnansweredTranscript(checkpoint: TranscriptCheckpoint): Promise<boolean>;
14
+ //# sourceMappingURL=transcript-checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-checkpoint.d.ts","sourceRoot":"","sources":["../../src/orchestration/transcript-checkpoint.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AAE/F,yFAAyF;AACzF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAalG;AAED;;;iFAGiF;AACjF,wBAAsB,4BAA4B,CAAC,UAAU,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAmCrG"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkpointTranscript = checkpointTranscript;
4
+ exports.rollbackUnansweredTranscript = rollbackUnansweredTranscript;
5
+ /** Only existing, private CLI transcripts are eligible. Never rewind a fresh session. */
6
+ async function checkpointTranscript(path) {
7
+ // Self-contained so the same implementation can run through containerNode;
8
+ // container recovery must not read/write host transcripts.
9
+ const { constants } = require('fs');
10
+ const { open } = require('fs/promises');
11
+ try {
12
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
13
+ try {
14
+ const stat = await file.stat();
15
+ if (!stat.isFile() || !stat.size)
16
+ return;
17
+ return { path, size: stat.size, ino: stat.ino, dev: stat.dev };
18
+ }
19
+ finally {
20
+ await file.close();
21
+ }
22
+ }
23
+ catch {
24
+ return;
25
+ }
26
+ }
27
+ /** After confirmed CLI shutdown, remove only an unanswered attempt's appended
28
+ * input/metadata. Real assistant output, tool results, compaction boundaries and
29
+ * unknown records fail closed. Keep the discarded bytes in a private diagnostic
30
+ * archive; the user's input and task receipts remain in the orchestration DB. */
31
+ async function rollbackUnansweredTranscript(checkpoint) {
32
+ const { constants } = require('fs');
33
+ const { open, writeFile } = require('fs/promises');
34
+ const { randomUUID } = require('crypto');
35
+ const metadata = new Set(['queue-operation', 'attachment', 'last-prompt', 'ai-title', 'mode', 'atis-latch']);
36
+ try {
37
+ const file = await open(checkpoint.path, constants.O_RDWR | constants.O_NOFOLLOW);
38
+ try {
39
+ const stat = await file.stat();
40
+ const length = stat.size - checkpoint.size;
41
+ if (stat.ino !== checkpoint.ino || stat.dev !== checkpoint.dev || length <= 0 || length > 8 * 1024 * 1024)
42
+ return false;
43
+ const tail = Buffer.alloc(length);
44
+ const { bytesRead } = await file.read(tail, 0, length, checkpoint.size);
45
+ if (bytesRead !== length || tail[length - 1] !== 10)
46
+ return false;
47
+ let hasInput = false;
48
+ for (const line of tail.toString('utf8').split('\n').filter(Boolean)) {
49
+ const row = JSON.parse(line);
50
+ if (row.type === 'user') {
51
+ const content = row.message?.content;
52
+ if (typeof content !== 'string' && (!Array.isArray(content) || content.some((b) => !['text', 'image'].includes(b.type))))
53
+ return false;
54
+ hasInput = true;
55
+ }
56
+ else if (row.type === 'assistant') {
57
+ if (!Array.isArray(row.message?.content) || row.message.content.some((b) => b.type !== 'text'))
58
+ return false;
59
+ if (row.isApiErrorMessage !== true && (row.message?.model !== '<synthetic>' ||
60
+ row.message.content.some((b) => b.text !== 'No response requested.')))
61
+ return false;
62
+ }
63
+ else if (!metadata.has(row.type))
64
+ return false;
65
+ }
66
+ if (!hasInput)
67
+ return false;
68
+ await writeFile(`${checkpoint.path}.failed-turn-${randomUUID()}`, tail, { mode: 0o600, flag: 'wx' });
69
+ const current = await file.stat();
70
+ if (current.size !== stat.size || current.mtimeMs !== stat.mtimeMs)
71
+ return false;
72
+ await file.truncate(checkpoint.size);
73
+ return true;
74
+ }
75
+ finally {
76
+ await file.close();
77
+ }
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ //# sourceMappingURL=transcript-checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-checkpoint.js","sourceRoot":"","sources":["../../src/orchestration/transcript-checkpoint.ts"],"names":[],"mappings":"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"}