@amalgm/chat 0.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 (183) hide show
  1. package/PURPOSE.md +107 -0
  2. package/README.md +41 -0
  3. package/dist/contract/chat-input.d.ts +144 -0
  4. package/dist/contract/chat-input.d.ts.map +1 -0
  5. package/dist/contract/chat-input.js +261 -0
  6. package/dist/contract/chat-input.js.map +1 -0
  7. package/dist/contract/create.d.ts +191 -0
  8. package/dist/contract/create.d.ts.map +1 -0
  9. package/dist/contract/create.js +249 -0
  10. package/dist/contract/create.js.map +1 -0
  11. package/dist/contract/freeze.d.ts +85 -0
  12. package/dist/contract/freeze.d.ts.map +1 -0
  13. package/dist/contract/freeze.js +151 -0
  14. package/dist/contract/freeze.js.map +1 -0
  15. package/dist/contract/harnesses.d.ts +21 -0
  16. package/dist/contract/harnesses.d.ts.map +1 -0
  17. package/dist/contract/harnesses.js +39 -0
  18. package/dist/contract/harnesses.js.map +1 -0
  19. package/dist/contract/index.d.ts +17 -0
  20. package/dist/contract/index.d.ts.map +1 -0
  21. package/dist/contract/index.js +17 -0
  22. package/dist/contract/index.js.map +1 -0
  23. package/dist/contract/input.d.ts +45 -0
  24. package/dist/contract/input.d.ts.map +1 -0
  25. package/dist/contract/input.js +78 -0
  26. package/dist/contract/input.js.map +1 -0
  27. package/dist/contract/models.d.ts +57 -0
  28. package/dist/contract/models.d.ts.map +1 -0
  29. package/dist/contract/models.js +380 -0
  30. package/dist/contract/models.js.map +1 -0
  31. package/dist/contract/payload-merge.d.ts +76 -0
  32. package/dist/contract/payload-merge.d.ts.map +1 -0
  33. package/dist/contract/payload-merge.js +215 -0
  34. package/dist/contract/payload-merge.js.map +1 -0
  35. package/dist/events/constructors.d.ts +53 -0
  36. package/dist/events/constructors.d.ts.map +1 -0
  37. package/dist/events/constructors.js +217 -0
  38. package/dist/events/constructors.js.map +1 -0
  39. package/dist/events/index.d.ts +12 -0
  40. package/dist/events/index.d.ts.map +1 -0
  41. package/dist/events/index.js +12 -0
  42. package/dist/events/index.js.map +1 -0
  43. package/dist/events/schema.d.ts +455 -0
  44. package/dist/events/schema.d.ts.map +1 -0
  45. package/dist/events/schema.js +228 -0
  46. package/dist/events/schema.js.map +1 -0
  47. package/dist/events/tool-display.d.ts +22 -0
  48. package/dist/events/tool-display.d.ts.map +1 -0
  49. package/dist/events/tool-display.js +60 -0
  50. package/dist/events/tool-display.js.map +1 -0
  51. package/dist/events/tool-shape.d.ts +48 -0
  52. package/dist/events/tool-shape.d.ts.map +1 -0
  53. package/dist/events/tool-shape.js +225 -0
  54. package/dist/events/tool-shape.js.map +1 -0
  55. package/dist/index.d.ts +27 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +26 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/normalizers/claude.d.ts +628 -0
  60. package/dist/normalizers/claude.d.ts.map +1 -0
  61. package/dist/normalizers/claude.js +603 -0
  62. package/dist/normalizers/claude.js.map +1 -0
  63. package/dist/normalizers/codex.d.ts +352 -0
  64. package/dist/normalizers/codex.d.ts.map +1 -0
  65. package/dist/normalizers/codex.js +485 -0
  66. package/dist/normalizers/codex.js.map +1 -0
  67. package/dist/normalizers/cursor.d.ts +34 -0
  68. package/dist/normalizers/cursor.d.ts.map +1 -0
  69. package/dist/normalizers/cursor.js +197 -0
  70. package/dist/normalizers/cursor.js.map +1 -0
  71. package/dist/normalizers/index.d.ts +13 -0
  72. package/dist/normalizers/index.d.ts.map +1 -0
  73. package/dist/normalizers/index.js +13 -0
  74. package/dist/normalizers/index.js.map +1 -0
  75. package/dist/normalizers/opencode.d.ts +81 -0
  76. package/dist/normalizers/opencode.d.ts.map +1 -0
  77. package/dist/normalizers/opencode.js +640 -0
  78. package/dist/normalizers/opencode.js.map +1 -0
  79. package/dist/normalizers/pi.d.ts +28 -0
  80. package/dist/normalizers/pi.d.ts.map +1 -0
  81. package/dist/normalizers/pi.js +160 -0
  82. package/dist/normalizers/pi.js.map +1 -0
  83. package/dist/ports.d.ts +14 -0
  84. package/dist/ports.d.ts.map +1 -0
  85. package/dist/ports.js +7 -0
  86. package/dist/ports.js.map +1 -0
  87. package/dist/transcript/index.d.ts +14 -0
  88. package/dist/transcript/index.d.ts.map +1 -0
  89. package/dist/transcript/index.js +12 -0
  90. package/dist/transcript/index.js.map +1 -0
  91. package/dist/transcript/message-reducer.d.ts +167 -0
  92. package/dist/transcript/message-reducer.d.ts.map +1 -0
  93. package/dist/transcript/message-reducer.js +400 -0
  94. package/dist/transcript/message-reducer.js.map +1 -0
  95. package/dist/transcript/part-accumulator.d.ts +24 -0
  96. package/dist/transcript/part-accumulator.d.ts.map +1 -0
  97. package/dist/transcript/part-accumulator.js +30 -0
  98. package/dist/transcript/part-accumulator.js.map +1 -0
  99. package/dist/transcript/tool-display.d.ts +14 -0
  100. package/dist/transcript/tool-display.d.ts.map +1 -0
  101. package/dist/transcript/tool-display.js +125 -0
  102. package/dist/transcript/tool-display.js.map +1 -0
  103. package/dist/transcript/tool-shape.d.ts +34 -0
  104. package/dist/transcript/tool-shape.d.ts.map +1 -0
  105. package/dist/transcript/tool-shape.js +216 -0
  106. package/dist/transcript/tool-shape.js.map +1 -0
  107. package/dist/turns/index.d.ts +11 -0
  108. package/dist/turns/index.d.ts.map +1 -0
  109. package/dist/turns/index.js +11 -0
  110. package/dist/turns/index.js.map +1 -0
  111. package/dist/turns/queries.d.ts +36 -0
  112. package/dist/turns/queries.d.ts.map +1 -0
  113. package/dist/turns/queries.js +37 -0
  114. package/dist/turns/queries.js.map +1 -0
  115. package/dist/turns/replay.d.ts +105 -0
  116. package/dist/turns/replay.d.ts.map +1 -0
  117. package/dist/turns/replay.js +163 -0
  118. package/dist/turns/replay.js.map +1 -0
  119. package/dist/turns/status.d.ts +49 -0
  120. package/dist/turns/status.d.ts.map +1 -0
  121. package/dist/turns/status.js +56 -0
  122. package/dist/turns/status.js.map +1 -0
  123. package/dist/turns/turn-store.d.ts +109 -0
  124. package/dist/turns/turn-store.d.ts.map +1 -0
  125. package/dist/turns/turn-store.js +169 -0
  126. package/dist/turns/turn-store.js.map +1 -0
  127. package/dist/usage/finalize.d.ts +57 -0
  128. package/dist/usage/finalize.d.ts.map +1 -0
  129. package/dist/usage/finalize.js +139 -0
  130. package/dist/usage/finalize.js.map +1 -0
  131. package/dist/usage/index.d.ts +11 -0
  132. package/dist/usage/index.d.ts.map +1 -0
  133. package/dist/usage/index.js +11 -0
  134. package/dist/usage/index.js.map +1 -0
  135. package/dist/usage/model-catalog.d.ts +50 -0
  136. package/dist/usage/model-catalog.d.ts.map +1 -0
  137. package/dist/usage/model-catalog.js +344 -0
  138. package/dist/usage/model-catalog.js.map +1 -0
  139. package/dist/usage/normalize.d.ts +103 -0
  140. package/dist/usage/normalize.d.ts.map +1 -0
  141. package/dist/usage/normalize.js +71 -0
  142. package/dist/usage/normalize.js.map +1 -0
  143. package/dist/usage/ports.d.ts +141 -0
  144. package/dist/usage/ports.d.ts.map +1 -0
  145. package/dist/usage/ports.js +113 -0
  146. package/dist/usage/ports.js.map +1 -0
  147. package/dist/usage/tokens.d.ts +79 -0
  148. package/dist/usage/tokens.d.ts.map +1 -0
  149. package/dist/usage/tokens.js +98 -0
  150. package/dist/usage/tokens.js.map +1 -0
  151. package/dist/warm/client-cache.d.ts +47 -0
  152. package/dist/warm/client-cache.d.ts.map +1 -0
  153. package/dist/warm/client-cache.js +48 -0
  154. package/dist/warm/client-cache.js.map +1 -0
  155. package/dist/warm/envelope-cache.d.ts +79 -0
  156. package/dist/warm/envelope-cache.d.ts.map +1 -0
  157. package/dist/warm/envelope-cache.js +85 -0
  158. package/dist/warm/envelope-cache.js.map +1 -0
  159. package/dist/warm/index.d.ts +16 -0
  160. package/dist/warm/index.d.ts.map +1 -0
  161. package/dist/warm/index.js +11 -0
  162. package/dist/warm/index.js.map +1 -0
  163. package/dist/warm/payload.d.ts +137 -0
  164. package/dist/warm/payload.d.ts.map +1 -0
  165. package/dist/warm/payload.js +112 -0
  166. package/dist/warm/payload.js.map +1 -0
  167. package/dist/warm/revision.d.ts +70 -0
  168. package/dist/warm/revision.d.ts.map +1 -0
  169. package/dist/warm/revision.js +63 -0
  170. package/dist/warm/revision.js.map +1 -0
  171. package/dist/warm/store-policy.d.ts +57 -0
  172. package/dist/warm/store-policy.d.ts.map +1 -0
  173. package/dist/warm/store-policy.js +89 -0
  174. package/dist/warm/store-policy.js.map +1 -0
  175. package/dist/wire/frames.d.ts +208 -0
  176. package/dist/wire/frames.d.ts.map +1 -0
  177. package/dist/wire/frames.js +245 -0
  178. package/dist/wire/frames.js.map +1 -0
  179. package/dist/wire/index.d.ts +7 -0
  180. package/dist/wire/index.d.ts.map +1 -0
  181. package/dist/wire/index.js +7 -0
  182. package/dist/wire/index.js.map +1 -0
  183. package/package.json +72 -0
@@ -0,0 +1,400 @@
1
+ /**
2
+ * Port of amalgm-engine `runtime/scripts/chat-core/message-reducer.js` —
3
+ * the transcript-truth reducer. Streams of canonical message events fold
4
+ * into an ordered parts array; published parts are never mutated in place
5
+ * (each change replaces the part object), so snapshots stay stable.
6
+ *
7
+ * Purity: the engine falls back to `Date.now()` when an event carries no
8
+ * finite `ts`. Here that fallback is an injected {@link ClockMsPort}
9
+ * (`clock` parameter). When the host passes a real clock (`() => Date.now()`)
10
+ * behavior is byte-identical to the engine; when no clock is injected and an
11
+ * event needs the fallback, the reducer throws instead of reading ambient
12
+ * time. Events that carry finite timestamps never touch the clock.
13
+ */
14
+ function toIso(ts, clock) {
15
+ if (Number.isFinite(ts))
16
+ return new Date(ts).toISOString();
17
+ // engineParity: false — the engine falls back to Date.now() here; src/
18
+ // purity requires an injected ClockMsPort, and with none injected the
19
+ // reducer throws rather than reading ambient time.
20
+ if (!clock)
21
+ throw new Error('message-reducer: event has no finite ts and no clock was injected');
22
+ return new Date(clock()).toISOString();
23
+ }
24
+ function suffix(name) {
25
+ return String(name || 'unknown').trim().replace(/[^A-Za-z0-9]+/g, '-').replace(/^-+|-+$/g, '').toLowerCase() || 'unknown';
26
+ }
27
+ export function toToolPartType(name) {
28
+ const clean = suffix(name);
29
+ const aliases = {
30
+ bash: 'bash',
31
+ commandexecution: 'bash',
32
+ read: 'fileRead',
33
+ write: 'fileWrite',
34
+ edit: 'fileEdit',
35
+ filechange: 'fileEdit',
36
+ grep: 'codeSearch',
37
+ glob: 'fileSearch',
38
+ websearch: 'webSearch',
39
+ webfetch: 'webFetch',
40
+ agent: 'task',
41
+ task: 'task',
42
+ askuserquestion: 'question',
43
+ toolsearch: 'toolSearch',
44
+ toolsearchtool: 'toolSearch',
45
+ };
46
+ return `tool-${aliases[clean] || clean}`;
47
+ }
48
+ export function createMessageState(parts = []) {
49
+ const state = {
50
+ parts: parts.map(clonePart),
51
+ openTextPartIndex: null,
52
+ reasoningBuffer: '',
53
+ toolPartIndexById: new Map(),
54
+ };
55
+ rebuildToolIndex(state);
56
+ return state;
57
+ }
58
+ export function applyMessageEvent(state, event, clock) {
59
+ if (!event)
60
+ return { changed: false, finalizedReasoning: false };
61
+ if (event.type === 'text.delta') {
62
+ const finalizedReasoning = finishReasoning(state, event.ts, clock);
63
+ const text = event.text || '';
64
+ const index = state.openTextPartIndex;
65
+ if (index !== null && state.parts[index]?.type === 'text') {
66
+ const previous = state.parts[index];
67
+ state.parts[index] = { ...previous, text: `${previous.text}${text}` };
68
+ }
69
+ else {
70
+ state.openTextPartIndex = state.parts.push({ type: 'text', text }) - 1;
71
+ }
72
+ return { changed: true, finalizedReasoning };
73
+ }
74
+ if (event.type === 'text.boundary') {
75
+ const finalizedReasoning = finishReasoning(state, event.ts, clock);
76
+ state.openTextPartIndex = null;
77
+ return { changed: finalizedReasoning, finalizedReasoning };
78
+ }
79
+ if (event.type === 'reasoning.delta') {
80
+ state.openTextPartIndex = null;
81
+ state.reasoningBuffer += event.text || '';
82
+ const lastIndex = state.parts.length - 1;
83
+ const last = state.parts[lastIndex];
84
+ if (last?.type === 'reasoning' && last.state === 'streaming') {
85
+ state.parts[lastIndex] = ensureTiming({ ...last, text: state.reasoningBuffer }, event.ts, 'thinking', clock);
86
+ }
87
+ else {
88
+ state.parts.push(ensureTiming({ type: 'reasoning', text: state.reasoningBuffer, state: 'streaming' }, event.ts, 'thinking', clock));
89
+ }
90
+ return { changed: true, finalizedReasoning: false };
91
+ }
92
+ if (event.type === 'image') {
93
+ const finalizedReasoning = finishReasoning(state, event.ts, clock);
94
+ state.openTextPartIndex = null;
95
+ state.parts.push({ type: 'image', data: event.data, mimeType: event.mimeType });
96
+ return { changed: true, finalizedReasoning };
97
+ }
98
+ if (event.type === 'tool.started') {
99
+ const finalizedReasoning = finishReasoning(state, event.ts, clock);
100
+ state.openTextPartIndex = null;
101
+ upsertToolStart(state, event, clock);
102
+ return { changed: true, finalizedReasoning };
103
+ }
104
+ if (event.type === 'tool.updated') {
105
+ const finalizedReasoning = finishReasoning(state, event.ts, clock);
106
+ state.openTextPartIndex = null;
107
+ const changed = updateTool(state, event, clock);
108
+ return { changed: changed || finalizedReasoning, finalizedReasoning };
109
+ }
110
+ if (event.type === 'tool.completed') {
111
+ const finalizedReasoning = finishReasoning(state, event.ts, clock);
112
+ state.openTextPartIndex = null;
113
+ completeTool(state, event, clock);
114
+ return { changed: true, finalizedReasoning };
115
+ }
116
+ if (event.type === 'compaction.started') {
117
+ const finalizedReasoning = finishReasoning(state, event.ts, clock);
118
+ state.openTextPartIndex = null;
119
+ state.parts.push({
120
+ type: 'compaction',
121
+ phase: 'started',
122
+ trigger: event.trigger || 'auto',
123
+ preTokens: Number.isFinite(event.preTokens) ? event.preTokens : null,
124
+ postTokens: Number.isFinite(event.postTokens) ? event.postTokens : null,
125
+ summary: event.summary || undefined,
126
+ startedAt: toIso(event.ts, clock),
127
+ finishedAt: undefined,
128
+ durationMs: null,
129
+ providerDurationMs: Number.isFinite(event.durationMs) ? event.durationMs : null,
130
+ });
131
+ return { changed: true, finalizedReasoning };
132
+ }
133
+ if (event.type === 'compaction.finished') {
134
+ const finalizedReasoning = finishReasoning(state, event.ts, clock);
135
+ state.openTextPartIndex = null;
136
+ finishCompaction(state, event, clock);
137
+ return { changed: true, finalizedReasoning };
138
+ }
139
+ if (event.type === 'error.message') {
140
+ const prefix = state.openTextPartIndex === null ? '' : '\n\n';
141
+ return applyMessageEvent(state, { type: 'text.delta', text: `${prefix}⚠️ ${event.message}`, ts: event.ts }, clock);
142
+ }
143
+ if (event.type === 'done') {
144
+ return finalizeMessageState(state, event.ts, clock);
145
+ }
146
+ return { changed: false, finalizedReasoning: false };
147
+ }
148
+ export function finalizeMessageState(state, ts, clock) {
149
+ let changed = false;
150
+ const reasoning = finishReasoning(state, ts, clock);
151
+ changed = changed || reasoning;
152
+ state.parts = state.parts.map((part) => {
153
+ if (typeof part?.type === 'string' && part.type.startsWith('tool-') && part.state === 'calling') {
154
+ const next = ensureTiming({ ...part, state: 'output-available' }, ts, 'tool', clock);
155
+ next.providerMetadata = {
156
+ ...(next.providerMetadata || {}),
157
+ processTiming: {
158
+ ...(next.providerMetadata?.processTiming || {}),
159
+ inferredCompletion: true,
160
+ },
161
+ };
162
+ changed = true;
163
+ return next;
164
+ }
165
+ if (part?.type === 'compaction' && part.phase === 'started') {
166
+ const compaction = part;
167
+ const startMs = compaction.startedAt ? Date.parse(compaction.startedAt) : NaN;
168
+ changed = true;
169
+ return {
170
+ ...compaction,
171
+ phase: 'finished',
172
+ finishedAt: toIso(ts, clock),
173
+ durationMs: Number.isFinite(startMs) && Number.isFinite(ts) ? Math.max(0, ts - startMs) : null,
174
+ };
175
+ }
176
+ return part;
177
+ });
178
+ rebuildToolIndex(state);
179
+ return { changed, finalizedReasoning: reasoning };
180
+ }
181
+ export function messageParts(state) {
182
+ return state.parts;
183
+ }
184
+ export function snapshotMessageParts(state) {
185
+ return state.parts.map(clonePart);
186
+ }
187
+ function upsertToolStart(state, event, clock) {
188
+ const existingIndex = state.toolPartIndexById.get(event.toolCallId);
189
+ const input = event.input || {};
190
+ if (existingIndex !== undefined) {
191
+ const existing = state.parts[existingIndex];
192
+ state.parts[existingIndex] = ensureTiming(mergeToolFields({
193
+ ...existing,
194
+ input: Object.keys(input).length > 0 ? { ...existing.input, ...input } : existing.input,
195
+ }, event), event.ts, 'tool', clock);
196
+ return;
197
+ }
198
+ const part = ensureTiming(mergeToolFields({
199
+ type: toToolPartType(event.toolName),
200
+ toolCallId: event.toolCallId,
201
+ toolName: event.toolName,
202
+ kind: event.kind,
203
+ input,
204
+ title: event.title || event.toolName,
205
+ metadata: event.metadata,
206
+ timing: event.timing,
207
+ error: event.error,
208
+ state: 'calling',
209
+ }, event), event.ts, 'tool', clock);
210
+ state.toolPartIndexById.set(event.toolCallId, state.parts.push(part) - 1);
211
+ }
212
+ function updateTool(state, event, clock) {
213
+ const index = state.toolPartIndexById.get(event.toolCallId);
214
+ if (index === undefined)
215
+ return false;
216
+ const existing = state.parts[index];
217
+ let next = mergeToolFields({
218
+ ...existing,
219
+ input: event.inputDelta && typeof event.inputDelta === 'object'
220
+ ? { ...existing.input, ...event.inputDelta }
221
+ : existing.input,
222
+ }, event);
223
+ if (event.status === 'output-available' || event.status === 'output-error') {
224
+ next = finishToolPart(next, {
225
+ isError: event.status === 'output-error',
226
+ result: event.result,
227
+ output: event.output,
228
+ ts: event.ts,
229
+ }, clock);
230
+ }
231
+ else if (event.status === 'calling' || event.status === 'in_progress' || event.status === 'pending') {
232
+ next.state = 'calling';
233
+ if (event.outputDelta !== undefined && event.outputDelta !== null) {
234
+ const delta = typeof event.outputDelta === 'string' ? event.outputDelta : JSON.stringify(event.outputDelta);
235
+ const previous = typeof next.output?.result === 'string' ? next.output.result : '';
236
+ next.output = {
237
+ status: 'running',
238
+ result: `${previous}${delta}`,
239
+ output: `${previous}${delta}`,
240
+ };
241
+ }
242
+ next = ensureTiming(next, event.ts, 'tool', clock);
243
+ }
244
+ else if (event.outputDelta !== undefined && event.outputDelta !== null) {
245
+ const delta = typeof event.outputDelta === 'string' ? event.outputDelta : JSON.stringify(event.outputDelta);
246
+ const previous = typeof next.output?.result === 'string' ? next.output.result : '';
247
+ next.output = {
248
+ status: 'running',
249
+ result: `${previous}${delta}`,
250
+ output: `${previous}${delta}`,
251
+ };
252
+ next = ensureTiming(next, event.ts, 'tool', clock);
253
+ }
254
+ else {
255
+ next = ensureTiming(next, event.ts, 'tool', clock);
256
+ }
257
+ state.parts[index] = next;
258
+ return true;
259
+ }
260
+ function completeTool(state, event, clock) {
261
+ const index = state.toolPartIndexById.get(event.toolCallId);
262
+ if (index === undefined) {
263
+ const toolName = event.toolName || 'unknown';
264
+ const part = ensureTiming(mergeToolFields({
265
+ type: toToolPartType(toolName),
266
+ toolCallId: event.toolCallId,
267
+ toolName,
268
+ kind: event.kind,
269
+ input: event.input || {},
270
+ title: event.title || toolName,
271
+ metadata: event.metadata,
272
+ timing: event.timing,
273
+ error: event.error,
274
+ state: 'calling',
275
+ }, event), event.ts, 'tool', clock);
276
+ state.toolPartIndexById.set(event.toolCallId, state.parts.push(part) - 1);
277
+ }
278
+ const nextIndex = state.toolPartIndexById.get(event.toolCallId);
279
+ const existing = state.parts[nextIndex];
280
+ state.parts[nextIndex] = finishToolPart(mergeToolFields(existing, event), {
281
+ isError: !!event.isError,
282
+ result: event.result,
283
+ output: event.output,
284
+ ts: event.ts,
285
+ }, clock);
286
+ }
287
+ function finishToolPart(part, options, clock) {
288
+ return finishTiming({
289
+ ...part,
290
+ state: options.isError ? 'output-error' : 'output-available',
291
+ output: {
292
+ status: options.isError ? 'error' : 'success',
293
+ result: typeof options.result === 'string' ? options.result : String(options.output ?? ''),
294
+ output: options.output ?? options.result ?? '',
295
+ },
296
+ }, options.ts, 'executionSeconds', 'tool', clock);
297
+ }
298
+ function finishCompaction(state, event, clock) {
299
+ const existingIndex = findOpenCompactionIndex(state);
300
+ const existing = existingIndex >= 0 ? state.parts[existingIndex] : null;
301
+ const finishedAt = toIso(event.ts, clock);
302
+ const startedAt = existing?.startedAt || undefined;
303
+ const startMs = startedAt ? Date.parse(startedAt) : NaN;
304
+ const elapsedMs = Number.isFinite(startMs) && Number.isFinite(event.ts) ? Math.max(0, event.ts - startMs) : null;
305
+ const providerDurationMs = Number.isFinite(event.durationMs) ? event.durationMs : null;
306
+ const next = {
307
+ ...(existing || { type: 'compaction', startedAt }),
308
+ phase: 'finished',
309
+ trigger: event.trigger || existing?.trigger || 'auto',
310
+ preTokens: Number.isFinite(event.preTokens) ? event.preTokens : (Number.isFinite(existing?.preTokens) ? existing.preTokens : null),
311
+ postTokens: Number.isFinite(event.postTokens) ? event.postTokens : (Number.isFinite(existing?.postTokens) ? existing.postTokens : null),
312
+ summary: event.summary || existing?.summary || undefined,
313
+ finishedAt,
314
+ durationMs: elapsedMs ?? providerDurationMs ?? null,
315
+ providerDurationMs,
316
+ };
317
+ if (existingIndex >= 0)
318
+ state.parts[existingIndex] = next;
319
+ else
320
+ state.parts.push(next);
321
+ }
322
+ function findOpenCompactionIndex(state) {
323
+ for (let index = state.parts.length - 1; index >= 0; index -= 1) {
324
+ const part = state.parts[index];
325
+ if (part?.type === 'compaction' && part.phase === 'started')
326
+ return index;
327
+ }
328
+ return -1;
329
+ }
330
+ function finishReasoning(state, ts, clock) {
331
+ const lastIndex = state.parts.length - 1;
332
+ const last = state.parts[lastIndex];
333
+ if (last?.type === 'reasoning' && last.state === 'streaming') {
334
+ state.parts[lastIndex] = finishTiming({ ...last, state: 'done' }, ts, 'thinkingSeconds', 'thinking', clock);
335
+ state.reasoningBuffer = '';
336
+ return true;
337
+ }
338
+ state.reasoningBuffer = '';
339
+ return false;
340
+ }
341
+ function mergeToolFields(part, event) {
342
+ return {
343
+ ...part,
344
+ ...(event.toolName ? { toolName: event.toolName } : {}),
345
+ ...(event.kind ? { kind: event.kind } : {}),
346
+ ...(event.title ? { title: event.title } : {}),
347
+ ...(event.metadata && typeof event.metadata === 'object' ? { metadata: { ...(part.metadata || {}), ...event.metadata } } : {}),
348
+ ...(event.timing && typeof event.timing === 'object' ? { timing: { ...(part.timing || {}), ...event.timing } } : {}),
349
+ ...(event.error ? { error: event.error } : {}),
350
+ };
351
+ }
352
+ function ensureTiming(part, ts, kind, clock) {
353
+ const providerMetadata = part.providerMetadata && typeof part.providerMetadata === 'object' ? { ...part.providerMetadata } : {};
354
+ const processTiming = providerMetadata.processTiming && typeof providerMetadata.processTiming === 'object'
355
+ ? { ...providerMetadata.processTiming }
356
+ : {};
357
+ if (!processTiming.startedAt)
358
+ processTiming.startedAt = toIso(ts, clock);
359
+ if (kind && !processTiming.kind)
360
+ processTiming.kind = kind;
361
+ providerMetadata.processTiming = processTiming;
362
+ return { ...part, providerMetadata };
363
+ }
364
+ function finishTiming(part, ts, secondsKey, kind, clock) {
365
+ const endMs = Number.isFinite(ts) ? ts : nowMs(clock);
366
+ const next = ensureTiming(part, endMs, kind, clock);
367
+ const providerMetadata = { ...(next.providerMetadata || {}) };
368
+ const timing = providerMetadata.processTiming && typeof providerMetadata.processTiming === 'object'
369
+ ? { ...providerMetadata.processTiming }
370
+ : {};
371
+ timing.completedAt = toIso(endMs, clock);
372
+ const startMs = timing.startedAt ? Date.parse(timing.startedAt) : NaN;
373
+ const elapsedMs = Number.isFinite(startMs) ? Math.max(0, endMs - startMs) : 0;
374
+ timing.elapsedMs = elapsedMs;
375
+ providerMetadata.processTiming = timing;
376
+ providerMetadata[secondsKey] = Math.max(1, Math.round((elapsedMs || 1000) / 1000));
377
+ return { ...next, providerMetadata };
378
+ }
379
+ function nowMs(clock) {
380
+ // engineParity: false — the engine reads Date.now() here; src/ purity
381
+ // requires an injected ClockMsPort.
382
+ if (!clock)
383
+ throw new Error('message-reducer: event has no finite ts and no clock was injected');
384
+ return clock();
385
+ }
386
+ function rebuildToolIndex(state) {
387
+ state.toolPartIndexById.clear();
388
+ state.parts.forEach((part, index) => {
389
+ const candidate = part;
390
+ if (typeof candidate?.type === 'string' && candidate.type.startsWith('tool-') && candidate.toolCallId) {
391
+ state.toolPartIndexById.set(candidate.toolCallId, index);
392
+ }
393
+ });
394
+ }
395
+ function clonePart(part) {
396
+ if (typeof structuredClone === 'function')
397
+ return structuredClone(part);
398
+ return JSON.parse(JSON.stringify(part));
399
+ }
400
+ //# sourceMappingURL=message-reducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-reducer.js","sourceRoot":"","sources":["../../src/transcript/message-reducer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Port of amalgm-engine `runtime/scripts/chat-core/parts.js` — the small
3
+ * stateful wrapper over the message reducer used by replay paths.
4
+ *
5
+ * The engine version has no constructor arguments; here an optional
6
+ * ClockMsPort is accepted so events without a finite `ts` (and `finalize()`,
7
+ * which the engine calls with no timestamp) can resolve the engine's
8
+ * `Date.now()` fallback without ambient reads. Streams whose events all
9
+ * carry finite timestamps never touch the clock — except `finalize()`, which
10
+ * needs it only when a reasoning part is still streaming or a compaction is
11
+ * still open.
12
+ */
13
+ import type { ClockMsPort } from '../ports.js';
14
+ import { toToolPartType } from './message-reducer.js';
15
+ import type { MessagePart, MessageReducerEvent, MessageState } from './message-reducer.js';
16
+ export declare class PartAccumulator {
17
+ state: MessageState;
18
+ private readonly clock;
19
+ constructor(clock?: ClockMsPort);
20
+ apply(event: MessageReducerEvent | null | undefined): void;
21
+ finalize(): MessagePart[];
22
+ }
23
+ export { toToolPartType };
24
+ //# sourceMappingURL=part-accumulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"part-accumulator.d.ts","sourceRoot":"","sources":["../../src/transcript/part-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAKL,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE3F,qBAAa,eAAe;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;gBAEpC,KAAK,CAAC,EAAE,WAAW;IAK/B,KAAK,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAI1D,QAAQ,IAAI,WAAW,EAAE;CAI1B;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Port of amalgm-engine `runtime/scripts/chat-core/parts.js` — the small
3
+ * stateful wrapper over the message reducer used by replay paths.
4
+ *
5
+ * The engine version has no constructor arguments; here an optional
6
+ * ClockMsPort is accepted so events without a finite `ts` (and `finalize()`,
7
+ * which the engine calls with no timestamp) can resolve the engine's
8
+ * `Date.now()` fallback without ambient reads. Streams whose events all
9
+ * carry finite timestamps never touch the clock — except `finalize()`, which
10
+ * needs it only when a reasoning part is still streaming or a compaction is
11
+ * still open.
12
+ */
13
+ import { applyMessageEvent, createMessageState, finalizeMessageState, messageParts, toToolPartType, } from './message-reducer.js';
14
+ export class PartAccumulator {
15
+ state;
16
+ clock;
17
+ constructor(clock) {
18
+ this.state = createMessageState();
19
+ this.clock = clock;
20
+ }
21
+ apply(event) {
22
+ applyMessageEvent(this.state, event, this.clock);
23
+ }
24
+ finalize() {
25
+ finalizeMessageState(this.state, undefined, this.clock);
26
+ return messageParts(this.state);
27
+ }
28
+ }
29
+ export { toToolPartType };
30
+ //# sourceMappingURL=part-accumulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"part-accumulator.js","sourceRoot":"","sources":["../../src/transcript/part-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,cAAc,GACf,MAAM,sBAAsB,CAAC;AAG9B,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAe;IACH,KAAK,CAA0B;IAEhD,YAAY,KAAmB;QAC7B,IAAI,CAAC,KAAK,GAAG,kBAAkB,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAA6C;QACjD,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,QAAQ;QACN,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;CACF;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Port of amalgm-engine `runtime/scripts/chat-core/tool-display.js`.
3
+ *
4
+ * Compact human-readable summaries of tool requests and outputs. Pure:
5
+ * every function is a deterministic mapping from its inputs.
6
+ */
7
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
8
+ export declare function compactText(value: unknown, max?: number): string;
9
+ export declare function withActionDescriptor(input: unknown, detail: unknown): Record<string, unknown>;
10
+ export declare function withOutputDescriptor<T>(output: T, detail: unknown): T;
11
+ export declare function summarizeToolRequest(toolName: unknown, input?: unknown, fallback?: unknown): string;
12
+ export declare function summarizeToolOutput(output: unknown): string;
13
+ export declare function stringifyResult(value: unknown): string;
14
+ //# sourceMappingURL=tool-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-display.d.ts","sourceRoot":"","sources":["../../src/transcript/tool-display.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAeD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,SAAM,GAAG,MAAM,CAI7D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO7F;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,CAKrE;AAOD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,GAAE,OAAY,EAAE,QAAQ,GAAE,OAAY,GAAG,MAAM,CAiD3G;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAsB3D;AAWD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQtD"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Port of amalgm-engine `runtime/scripts/chat-core/tool-display.js`.
3
+ *
4
+ * Compact human-readable summaries of tool requests and outputs. Pure:
5
+ * every function is a deterministic mapping from its inputs.
6
+ */
7
+ export function isRecord(value) {
8
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value));
9
+ }
10
+ function trimText(value) {
11
+ if (typeof value !== 'string')
12
+ return '';
13
+ return value.trim();
14
+ }
15
+ function firstString(...values) {
16
+ for (const value of values) {
17
+ const text = trimText(value);
18
+ if (text)
19
+ return text;
20
+ }
21
+ return '';
22
+ }
23
+ export function compactText(value, max = 160) {
24
+ const text = trimText(String(value ?? '').replace(/\s+/g, ' '));
25
+ if (!text)
26
+ return '';
27
+ return text.length > max ? `${text.slice(0, Math.max(0, max - 1)).trimEnd()}...` : text;
28
+ }
29
+ export function withActionDescriptor(input, detail) {
30
+ const next = isRecord(input) ? { ...input } : {};
31
+ const cleanDetail = compactText(detail);
32
+ if (cleanDetail && typeof next['actionDescriptor'] !== 'string') {
33
+ next['actionDescriptor'] = cleanDetail;
34
+ }
35
+ return next;
36
+ }
37
+ export function withOutputDescriptor(output, detail) {
38
+ if (!isRecord(output))
39
+ return output;
40
+ const cleanDetail = compactText(detail);
41
+ if (!cleanDetail || typeof output['actionDescriptor'] === 'string')
42
+ return output;
43
+ return { ...output, actionDescriptor: cleanDetail };
44
+ }
45
+ function commandText(value) {
46
+ if (Array.isArray(value))
47
+ return value.map((part) => String(part)).join(' ').trim();
48
+ return trimText(value);
49
+ }
50
+ export function summarizeToolRequest(toolName, input = {}, fallback = '') {
51
+ const args = isRecord(input) ? input : {};
52
+ const normalized = String(toolName || '').toLowerCase();
53
+ const explicit = firstString(args['actionDescriptor'], args['description'], args['summary'], args['title']);
54
+ if (explicit)
55
+ return compactText(explicit);
56
+ if (normalized.includes('bash') || normalized.includes('command')) {
57
+ const command = commandText(args['command'] || args['rawCommand']);
58
+ return command ? `$ ${command}` : compactText(fallback);
59
+ }
60
+ if (normalized.includes('read') ||
61
+ normalized.includes('write') ||
62
+ normalized.includes('edit') ||
63
+ normalized.includes('file') ||
64
+ normalized.includes('path')) {
65
+ return compactText(firstString(args['path'], args['filePath'], args['file_path'], args['file'], fallback));
66
+ }
67
+ if (normalized.includes('grep') || normalized.includes('glob') || normalized.includes('search')) {
68
+ return compactText(firstString(args['query'], args['pattern'], args['url'], args['path'], fallback));
69
+ }
70
+ if (normalized.includes('fetch') || normalized.includes('web')) {
71
+ return compactText(firstString(args['url'], args['query'], fallback));
72
+ }
73
+ if (normalized.includes('mcp')) {
74
+ return compactText(firstString(args['toolName'], args['name'], args['serverName'], fallback));
75
+ }
76
+ return compactText(firstString(args['query'], args['prompt'], args['input'], args['url'], args['path'], args['filePath'], args['file_path'], args['pattern'], fallback));
77
+ }
78
+ export function summarizeToolOutput(output) {
79
+ if (output == null)
80
+ return '';
81
+ if (typeof output === 'string')
82
+ return summarizeTextOutput(output);
83
+ if (Array.isArray(output))
84
+ return output.length ? `${output.length} item${output.length === 1 ? '' : 's'}` : '';
85
+ if (!isRecord(output))
86
+ return compactText(output);
87
+ const explicit = firstString(output['actionDescriptor'], output['summary'], output['title'], output['message'], output['error']);
88
+ if (explicit)
89
+ return compactText(explicit);
90
+ const content = firstString(output['output'], output['stdout'], output['content'], output['result'], output['text']);
91
+ if (content)
92
+ return summarizeTextOutput(content);
93
+ if (Array.isArray(output['files'])) {
94
+ return `${output['files'].length} file${output['files'].length === 1 ? '' : 's'}`;
95
+ }
96
+ if (Array.isArray(output['results'])) {
97
+ return `${output['results'].length} result${output['results'].length === 1 ? '' : 's'}`;
98
+ }
99
+ if (Array.isArray(output['links'])) {
100
+ return `${output['links'].length} link${output['links'].length === 1 ? '' : 's'}`;
101
+ }
102
+ return '';
103
+ }
104
+ function summarizeTextOutput(value) {
105
+ const lines = String(value || '')
106
+ .split(/\r?\n/)
107
+ .map((line) => compactText(line, 160))
108
+ .filter(Boolean);
109
+ if (lines[0])
110
+ return lines[0];
111
+ return '';
112
+ }
113
+ export function stringifyResult(value) {
114
+ if (value == null)
115
+ return '';
116
+ if (typeof value === 'string')
117
+ return value;
118
+ try {
119
+ return JSON.stringify(value);
120
+ }
121
+ catch {
122
+ return String(value);
123
+ }
124
+ }
125
+ //# sourceMappingURL=tool-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-display.js","sourceRoot":"","sources":["../../src/transcript/tool-display.ts"],"names":[],"mappings":"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"}