@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,197 @@
1
+ /**
2
+ * Cursor (ACP) normalizer — engine `chat-core/normalizers/cursor.js` (174
3
+ * lines) ported byte-exact. `cursorStopReason` is pure and exported at
4
+ * module level; `normalizeCursorUpdate` / `cursorPromptUsage` construct
5
+ * events, so they live behind `createCursorNormalizer(events)`.
6
+ *
7
+ * Because amalgm's event vocabulary already mirrors ACP `session/update`,
8
+ * this is a thin shim, not a per-event translation table.
9
+ */
10
+ /** Engine cursor.js:13-25. ACP tool kinds -> amalgm tool kinds (tool-shape vocabulary). */
11
+ const ACP_TOOL_KINDS = {
12
+ read: 'file_read',
13
+ edit: 'file_edit',
14
+ delete: 'file_edit',
15
+ move: 'file_write',
16
+ search: 'search',
17
+ execute: 'bash',
18
+ fetch: 'browser',
19
+ think: 'unknown',
20
+ switch_mode: 'unknown',
21
+ other: 'unknown',
22
+ };
23
+ /** Engine cursor.js:27-35. ACP PromptResponse stopReason -> amalgm done stopReason. */
24
+ export function cursorStopReason(stopReason) {
25
+ const clean = String(stopReason || '').trim();
26
+ if (!clean || clean === 'end_turn')
27
+ return 'end_turn';
28
+ if (clean === 'cancelled')
29
+ return 'cancelled';
30
+ if (clean === 'refusal')
31
+ return 'refusal';
32
+ if (clean === 'max_tokens' || clean === 'max_turn_requests')
33
+ return clean;
34
+ return 'end_turn';
35
+ }
36
+ /** Engine cursor.js:37-41. */
37
+ function contentText(content) {
38
+ if (!content || typeof content !== 'object')
39
+ return '';
40
+ if (typeof content['text'] === 'string')
41
+ return content['text'];
42
+ return '';
43
+ }
44
+ /** Engine cursor.js:43-63. ACP ToolCallContent[] -> a renderable output value. */
45
+ function toolOutput(content) {
46
+ if (!Array.isArray(content) || content.length === 0)
47
+ return undefined;
48
+ const texts = [];
49
+ const diffs = [];
50
+ for (const item of content) {
51
+ if (!item || typeof item !== 'object')
52
+ continue;
53
+ if (item['type'] === 'diff') {
54
+ diffs.push({ path: item['path'], oldText: item['oldText'] ?? null, newText: item['newText'] ?? '' });
55
+ }
56
+ else if (item['type'] === 'content') {
57
+ const text = contentText(item['content']);
58
+ if (text)
59
+ texts.push(text);
60
+ }
61
+ else if (item['type'] === 'terminal' && item['terminalId']) {
62
+ texts.push(`[terminal ${item['terminalId']}]`);
63
+ }
64
+ }
65
+ if (diffs.length && texts.length)
66
+ return { diffs, text: texts.join('\n') };
67
+ if (diffs.length)
68
+ return diffs.length === 1 ? diffs[0] : { diffs };
69
+ if (texts.length)
70
+ return texts.join('\n');
71
+ return undefined;
72
+ }
73
+ /** Engine cursor.js:65-76. Shell `{stdout, stderr, exitCode}` -> `{text?, exitCode?}`. */
74
+ function rawOutputValue(rawOutput) {
75
+ if (rawOutput === undefined || rawOutput === null)
76
+ return undefined;
77
+ if (typeof rawOutput !== 'object')
78
+ return rawOutput;
79
+ const record = rawOutput;
80
+ if (typeof record['stdout'] === 'string' || typeof record['stderr'] === 'string') {
81
+ const text = [record['stdout'], record['stderr']].filter(Boolean).join('\n').trimEnd();
82
+ return {
83
+ ...(text ? { text } : {}),
84
+ ...(record['exitCode'] !== undefined ? { exitCode: record['exitCode'] } : {}),
85
+ };
86
+ }
87
+ return rawOutput;
88
+ }
89
+ /** Engine cursor.js:78-87. Merge an update into the known tool row (title/kind/input stick). */
90
+ function toolData(state, toolCallId, update = {}) {
91
+ const known = state.tools.get(toolCallId) || {};
92
+ const next = {
93
+ toolName: update['title'] || known.toolName || 'Tool',
94
+ kind: ACP_TOOL_KINDS[update['kind']] || known.kind || undefined,
95
+ input: update['rawInput'] !== undefined ? update['rawInput'] : known.input,
96
+ };
97
+ state.tools.set(toolCallId, next);
98
+ return next;
99
+ }
100
+ /** Build the Cursor normalizer over injected event constructors. */
101
+ export function createCursorNormalizer(events) {
102
+ const { errorEvent, reasoningDelta, textDelta, toolCompleted, toolStarted, toolUpdated, usageFinal, } = events;
103
+ /**
104
+ * Engine cursor.js:89-149. One ACP session/update notification -> amalgm
105
+ * events. `state` carries providerSessionId and per-turn tool
106
+ * bookkeeping; it is created per prompt.
107
+ */
108
+ function normalizeCursorUpdate(updateInput, state) {
109
+ const update = updateInput;
110
+ const base = { providerSessionId: state.providerSessionId };
111
+ const kind = update?.['sessionUpdate'];
112
+ if (kind === 'agent_message_chunk') {
113
+ const text = contentText(update['content']);
114
+ return text ? [textDelta(text, base)] : [];
115
+ }
116
+ if (kind === 'agent_thought_chunk') {
117
+ const text = contentText(update['content']);
118
+ return text ? [reasoningDelta(text, base)] : [];
119
+ }
120
+ if (kind === 'tool_call') {
121
+ const data = toolData(state, update['toolCallId'], update);
122
+ return [toolStarted(update['toolCallId'], { ...base, ...data })];
123
+ }
124
+ if (kind === 'tool_call_update') {
125
+ const data = toolData(state, update['toolCallId'], update);
126
+ // Shell/execute results arrive as rawOutput ({exitCode, stdout, stderr});
127
+ // file edits arrive as content diff items.
128
+ const output = toolOutput(update['content']) ?? rawOutputValue(update['rawOutput']);
129
+ if (update['status'] === 'completed' || update['status'] === 'failed') {
130
+ state.tools.delete(update['toolCallId']);
131
+ return [toolCompleted(update['toolCallId'], {
132
+ ...base,
133
+ ...data,
134
+ ...(output !== undefined ? { output } : {}),
135
+ isError: update['status'] === 'failed',
136
+ ...(update['status'] === 'failed' ? { error: output || 'Tool call failed' } : {}),
137
+ })];
138
+ }
139
+ return [toolUpdated(update['toolCallId'], {
140
+ ...base,
141
+ toolName: data.toolName,
142
+ kind: data.kind,
143
+ ...(update['rawInput'] !== undefined ? { inputDelta: update['rawInput'] } : {}),
144
+ ...(output !== undefined ? { output } : {}),
145
+ })];
146
+ }
147
+ if (kind === 'usage_update') {
148
+ // Cursor does not emit these today; mapped so context tracking lights up
149
+ // the moment the agent ships the ACP session-usage extension.
150
+ return [usageFinal({
151
+ usedTokens: update['used'],
152
+ maxTokens: update['size'],
153
+ costUsd: update['cost']?.amount ?? null,
154
+ operation: 'context_snapshot',
155
+ billable: false,
156
+ exact: false,
157
+ source: 'cursor_acp_usage_update',
158
+ }, base)];
159
+ }
160
+ if (kind === 'error') {
161
+ return [errorEvent(update['message'] || 'Cursor agent error', base)];
162
+ }
163
+ // Intentionally ignored: user_message_chunk (session/load replay),
164
+ // session_info_update (amalgm owns titles), available_commands_update,
165
+ // current_mode_update, config_options_update, plan.
166
+ return [];
167
+ }
168
+ /**
169
+ * Engine cursor.js:151-168. ACP PromptResponse.usage (session-usage RFD)
170
+ * -> exact turn usage. Cursor does not populate this today; the mapping
171
+ * is here for when it does.
172
+ */
173
+ function cursorPromptUsage(usageInput, base = {}) {
174
+ const usage = usageInput;
175
+ if (!usage || typeof usage !== 'object')
176
+ return null;
177
+ const total = Number(usage['total_tokens'] ?? usage['totalTokens']);
178
+ if (!Number.isFinite(total) || total <= 0)
179
+ return null;
180
+ return usageFinal({
181
+ inputTokens: usage['input_tokens'] ?? usage['inputTokens'],
182
+ outputTokens: usage['output_tokens'] ?? usage['outputTokens'],
183
+ cacheReadTokens: usage['cached_read_tokens'] ?? usage['cacheReadTokens'],
184
+ cacheWriteTokens: usage['cached_write_tokens'] ?? usage['cacheWriteTokens'],
185
+ thoughtTokens: usage['thought_tokens'] ?? usage['thoughtTokens'],
186
+ operation: 'chat_turn',
187
+ billable: true,
188
+ exact: true,
189
+ source: 'cursor_acp_prompt_usage',
190
+ }, base);
191
+ }
192
+ return {
193
+ normalizeCursorUpdate,
194
+ cursorPromptUsage,
195
+ };
196
+ }
197
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/normalizers/cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,2FAA2F;AAC3F,MAAM,cAAc,GAA2B;IAC7C,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,SAAS;IACtB,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,UAAmB;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IACtD,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAC9C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,mBAAmB;QAAE,OAAO,KAAK,CAAC;IAC1E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,8BAA8B;AAC9B,SAAS,WAAW,CAAC,OAAgB;IACnC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,OAAQ,OAAqB,CAAC,MAAM,CAAC,KAAK,QAAQ;QAAE,OAAQ,OAAqB,CAAC,MAAM,CAAC,CAAC;IAC9F,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,kFAAkF;AAClF,SAAS,UAAU,CAAC,OAAgB;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,OAAsB,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvG,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAC1C,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3E,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IACnE,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,0FAA0F;AAC1F,SAAS,cAAc,CAAC,SAAkB;IACxC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpE,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,MAAM,GAAG,SAAsB,CAAC;IACtC,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,EAAE,CAAC;QACjF,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACvF,OAAO;YACL,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAkBD,gGAAgG;AAChG,SAAS,QAAQ,CAAC,KAA4B,EAAE,UAAkB,EAAE,SAAoB,EAAE;IACxF,MAAM,KAAK,GAA8B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC3E,MAAM,IAAI,GAAqB;QAC7B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,MAAM;QACrD,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,SAAS;QAC/D,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK;KAC3E,CAAC;IACF,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAQD,oEAAoE;AACpE,MAAM,UAAU,sBAAsB,CAAC,MAAyB;IAC9D,MAAM,EACJ,UAAU,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,GACX,GAAG,MAAM,CAAC;IAEX;;;;OAIG;IACH,SAAS,qBAAqB,CAAC,WAAoB,EAAE,KAA4B;QAC/E,MAAM,MAAM,GAAG,WAA2C,CAAC;QAC3D,MAAM,IAAI,GAAG,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,CAAC;QACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAO,CAAC,YAAY,CAAC,EAAE,MAAO,CAAC,CAAC;YAC7D,OAAO,CAAC,WAAW,CAAC,MAAO,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAO,CAAC,YAAY,CAAC,EAAE,MAAO,CAAC,CAAC;YAC7D,0EAA0E;YAC1E,2CAA2C;YAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAO,CAAC,SAAS,CAAC,CAAC,IAAI,cAAc,CAAC,MAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACtF,IAAI,MAAO,CAAC,QAAQ,CAAC,KAAK,WAAW,IAAI,MAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACxE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAO,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC1C,OAAO,CAAC,aAAa,CAAC,MAAO,CAAC,YAAY,CAAC,EAAE;wBAC3C,GAAG,IAAI;wBACP,GAAG,IAAI;wBACP,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC3C,OAAO,EAAE,MAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ;wBACvC,GAAG,CAAC,MAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnF,CAAC,CAAC,CAAC;YACN,CAAC;YACD,OAAO,CAAC,WAAW,CAAC,MAAO,CAAC,YAAY,CAAC,EAAE;oBACzC,GAAG,IAAI;oBACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,GAAG,CAAC,MAAO,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjF,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5C,CAAC,CAAC,CAAC;QACN,CAAC;QACD,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,yEAAyE;YACzE,8DAA8D;YAC9D,OAAO,CAAC,UAAU,CAAC;oBACjB,UAAU,EAAE,MAAO,CAAC,MAAM,CAAC;oBAC3B,SAAS,EAAE,MAAO,CAAC,MAAM,CAAC;oBAC1B,OAAO,EAAE,MAAO,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,IAAI;oBACxC,SAAS,EAAE,kBAAkB;oBAC7B,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,yBAAyB;iBAClC,EAAE,IAAI,CAAC,CAAC,CAAC;QACZ,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,UAAU,CAAC,MAAO,CAAC,SAAS,CAAC,IAAI,oBAAoB,EAAE,IAAI,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,mEAAmE;QACnE,uEAAuE;QACvE,oDAAoD;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;OAIG;IACH,SAAS,iBAAiB,CAAC,UAAmB,EAAE,OAAgC,EAAE;QAChF,MAAM,KAAK,GAAG,UAA0C,CAAC;QACzD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACvD,OAAO,UAAU,CAAC;YAChB,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC;YAC1D,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC;YAC7D,eAAe,EAAE,KAAK,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC;YACxE,gBAAgB,EAAE,KAAK,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC;YAC3E,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC;YAChE,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,yBAAyB;SAClC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAED,OAAO;QACL,qBAAqB;QACrB,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Native harness events → the canonical grammar. One factory per harness,
3
+ * each closed over an injected `EventConstructors` (the host supplies the
4
+ * clock). The mapping matrix lives at docs/contracts/normalizer_spec.md;
5
+ * where the spec and this code disagree, the code wins (see
6
+ * docs/contracts/spec-errata.md).
7
+ */
8
+ export * from './claude.js';
9
+ export * from './codex.js';
10
+ export * from './opencode.js';
11
+ export * from './cursor.js';
12
+ export * from './pi.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/normalizers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Native harness events → the canonical grammar. One factory per harness,
3
+ * each closed over an injected `EventConstructors` (the host supplies the
4
+ * clock). The mapping matrix lives at docs/contracts/normalizer_spec.md;
5
+ * where the spec and this code disagree, the code wins (see
6
+ * docs/contracts/spec-errata.md).
7
+ */
8
+ export * from './claude.js';
9
+ export * from './codex.js';
10
+ export * from './opencode.js';
11
+ export * from './cursor.js';
12
+ export * from './pi.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/normalizers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * OpenCode normalizer — engine `chat-core/normalizers/opencode.js` (552
3
+ * lines) ported byte-exact. The engine module calls the event constructors
4
+ * directly; here the pure helpers (`suffixPrefixOverlap`,
5
+ * `openCodeErrorMessage`, `usageFromOpenCodeTokens`) are module-level
6
+ * exports and everything that constructs events lives behind
7
+ * `createOpenCodeNormalizer(events)` (axiom 7: the host injects the clock
8
+ * via {@link EventConstructors}).
9
+ *
10
+ * Streaming laws preserved verbatim:
11
+ * - per-part delta dedup via suffix-prefix overlap (`appendOpenCodeDelta`);
12
+ * - snapshot merges keep the longer prefix-compatible text
13
+ * (`mergeOpenCodeSnapshot`);
14
+ * - cross-part assistant-text dedup with the 40/80-char thresholds and the
15
+ * 80% overlap ratio (`dedupeOpenCodeAssistantText`);
16
+ * - per-step usage from `step-finish` parts and internal
17
+ * compaction/continuation usage from `message.updated`.
18
+ */
19
+ import type { AmalgmEvent, EventConstructors } from '../events/index.js';
20
+ import { type NormalizedUsage } from '../usage/index.js';
21
+ type AnyRecord = Record<string, any>;
22
+ /** A cached part that arrived before its assistant `message.updated`. */
23
+ export interface OpenCodePendingPartEntry {
24
+ part: AnyRecord;
25
+ delta?: string | undefined;
26
+ }
27
+ /**
28
+ * Per-prompt normalizer state — created by the adapter, mutated in place
29
+ * (engine contract). Optional collections are lazily created exactly like
30
+ * the engine (`pendingParts`, `messageRoles`, `partTypes`, …).
31
+ */
32
+ export interface OpenCodeNormalizerState {
33
+ providerSessionId?: string | null | undefined;
34
+ contextLimit?: number | null | undefined;
35
+ userMessageId?: string | null | undefined;
36
+ turnStartedAt?: number | null | undefined;
37
+ assistantMessageIds: Set<string>;
38
+ partText: Map<string, string>;
39
+ toolsStarted: Set<string>;
40
+ toolsCompleted: Set<string>;
41
+ finishedAssistantIds: Set<string>;
42
+ usageEmittedForAssistant: Set<string>;
43
+ sawTurnActivity?: boolean;
44
+ sawBusy?: boolean;
45
+ doneEmitted?: boolean;
46
+ pendingStopReason?: string | null | undefined;
47
+ assistantTextAggregate?: string;
48
+ pendingParts?: Map<string, OpenCodePendingPartEntry>;
49
+ messageRoles?: Map<string, string>;
50
+ compactionContinuationMessageIds?: Set<string>;
51
+ compactionsStarted?: Set<string>;
52
+ partTypes?: Map<string, string>;
53
+ }
54
+ /**
55
+ * Engine opencode.js:11-29. OpenCode step tokens
56
+ * (`{input, output, reasoning, cache:{read, write}}`) -> normalized usage.
57
+ * `output` includes reasoning (thought tokens ride inside output), `exact`
58
+ * is always true, source `'opencode_sdk'`.
59
+ */
60
+ export declare function usageFromOpenCodeTokens(tokens: AnyRecord | null | undefined, cost: unknown, contextLimit: unknown, operation?: string): NormalizedUsage;
61
+ /** Engine opencode.js:31-44. Nested-error unwrap chain, JSON fallback. */
62
+ export declare function openCodeErrorMessage(err: unknown, fallback?: string): string;
63
+ /**
64
+ * Engine opencode.js:61-67. Longest length such that `text` ends with the
65
+ * first `length` chars of `delta` — the overlap-dedup primitive.
66
+ */
67
+ export declare function suffixPrefixOverlap(text?: string, delta?: string): number;
68
+ /** The engine `normalizers/opencode.js` export set over injected constructors. */
69
+ export interface OpenCodeNormalizer {
70
+ normalizeOpenCodeEvent: (event: unknown, state: OpenCodeNormalizerState) => AmalgmEvent[];
71
+ normalizeOpenCodePart: (part: unknown, state: OpenCodeNormalizerState, delta?: unknown) => AmalgmEvent[];
72
+ normalizeOpenCodePromptResult: (data: unknown, state: OpenCodeNormalizerState) => AmalgmEvent[];
73
+ }
74
+ /**
75
+ * Build the OpenCode normalizer over injected event constructors — the
76
+ * engine functions verbatim, closed over `events` instead of the ambient
77
+ * `require('../events')` module.
78
+ */
79
+ export declare function createOpenCodeNormalizer(events: EventConstructors): OpenCodeNormalizer;
80
+ export {};
81
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/normalizers/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAUzE,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAMrC,yEAAyE;AACzE,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,gCAAgC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EACpC,IAAI,EAAE,OAAO,EACb,YAAY,EAAE,OAAO,EACrB,SAAS,SAAc,GACtB,eAAe,CAkBjB;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,SAA2B,GAAG,MAAM,CAc9F;AAoBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,SAAK,EAAE,KAAK,SAAK,GAAG,MAAM,CAMjE;AA6KD,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,sBAAsB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,KAAK,WAAW,EAAE,CAAC;IAC1F,qBAAqB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;IACzG,6BAA6B,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,KAAK,WAAW,EAAE,CAAC;CACjG;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,CA4VtF"}