@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.
- package/PURPOSE.md +107 -0
- package/README.md +41 -0
- package/dist/contract/chat-input.d.ts +144 -0
- package/dist/contract/chat-input.d.ts.map +1 -0
- package/dist/contract/chat-input.js +261 -0
- package/dist/contract/chat-input.js.map +1 -0
- package/dist/contract/create.d.ts +191 -0
- package/dist/contract/create.d.ts.map +1 -0
- package/dist/contract/create.js +249 -0
- package/dist/contract/create.js.map +1 -0
- package/dist/contract/freeze.d.ts +85 -0
- package/dist/contract/freeze.d.ts.map +1 -0
- package/dist/contract/freeze.js +151 -0
- package/dist/contract/freeze.js.map +1 -0
- package/dist/contract/harnesses.d.ts +21 -0
- package/dist/contract/harnesses.d.ts.map +1 -0
- package/dist/contract/harnesses.js +39 -0
- package/dist/contract/harnesses.js.map +1 -0
- package/dist/contract/index.d.ts +17 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +17 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/input.d.ts +45 -0
- package/dist/contract/input.d.ts.map +1 -0
- package/dist/contract/input.js +78 -0
- package/dist/contract/input.js.map +1 -0
- package/dist/contract/models.d.ts +57 -0
- package/dist/contract/models.d.ts.map +1 -0
- package/dist/contract/models.js +380 -0
- package/dist/contract/models.js.map +1 -0
- package/dist/contract/payload-merge.d.ts +76 -0
- package/dist/contract/payload-merge.d.ts.map +1 -0
- package/dist/contract/payload-merge.js +215 -0
- package/dist/contract/payload-merge.js.map +1 -0
- package/dist/events/constructors.d.ts +53 -0
- package/dist/events/constructors.d.ts.map +1 -0
- package/dist/events/constructors.js +217 -0
- package/dist/events/constructors.js.map +1 -0
- package/dist/events/index.d.ts +12 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +12 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/schema.d.ts +455 -0
- package/dist/events/schema.d.ts.map +1 -0
- package/dist/events/schema.js +228 -0
- package/dist/events/schema.js.map +1 -0
- package/dist/events/tool-display.d.ts +22 -0
- package/dist/events/tool-display.d.ts.map +1 -0
- package/dist/events/tool-display.js +60 -0
- package/dist/events/tool-display.js.map +1 -0
- package/dist/events/tool-shape.d.ts +48 -0
- package/dist/events/tool-shape.d.ts.map +1 -0
- package/dist/events/tool-shape.js +225 -0
- package/dist/events/tool-shape.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/normalizers/claude.d.ts +628 -0
- package/dist/normalizers/claude.d.ts.map +1 -0
- package/dist/normalizers/claude.js +603 -0
- package/dist/normalizers/claude.js.map +1 -0
- package/dist/normalizers/codex.d.ts +352 -0
- package/dist/normalizers/codex.d.ts.map +1 -0
- package/dist/normalizers/codex.js +485 -0
- package/dist/normalizers/codex.js.map +1 -0
- package/dist/normalizers/cursor.d.ts +34 -0
- package/dist/normalizers/cursor.d.ts.map +1 -0
- package/dist/normalizers/cursor.js +197 -0
- package/dist/normalizers/cursor.js.map +1 -0
- package/dist/normalizers/index.d.ts +13 -0
- package/dist/normalizers/index.d.ts.map +1 -0
- package/dist/normalizers/index.js +13 -0
- package/dist/normalizers/index.js.map +1 -0
- package/dist/normalizers/opencode.d.ts +81 -0
- package/dist/normalizers/opencode.d.ts.map +1 -0
- package/dist/normalizers/opencode.js +640 -0
- package/dist/normalizers/opencode.js.map +1 -0
- package/dist/normalizers/pi.d.ts +28 -0
- package/dist/normalizers/pi.d.ts.map +1 -0
- package/dist/normalizers/pi.js +160 -0
- package/dist/normalizers/pi.js.map +1 -0
- package/dist/ports.d.ts +14 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +7 -0
- package/dist/ports.js.map +1 -0
- package/dist/transcript/index.d.ts +14 -0
- package/dist/transcript/index.d.ts.map +1 -0
- package/dist/transcript/index.js +12 -0
- package/dist/transcript/index.js.map +1 -0
- package/dist/transcript/message-reducer.d.ts +167 -0
- package/dist/transcript/message-reducer.d.ts.map +1 -0
- package/dist/transcript/message-reducer.js +400 -0
- package/dist/transcript/message-reducer.js.map +1 -0
- package/dist/transcript/part-accumulator.d.ts +24 -0
- package/dist/transcript/part-accumulator.d.ts.map +1 -0
- package/dist/transcript/part-accumulator.js +30 -0
- package/dist/transcript/part-accumulator.js.map +1 -0
- package/dist/transcript/tool-display.d.ts +14 -0
- package/dist/transcript/tool-display.d.ts.map +1 -0
- package/dist/transcript/tool-display.js +125 -0
- package/dist/transcript/tool-display.js.map +1 -0
- package/dist/transcript/tool-shape.d.ts +34 -0
- package/dist/transcript/tool-shape.d.ts.map +1 -0
- package/dist/transcript/tool-shape.js +216 -0
- package/dist/transcript/tool-shape.js.map +1 -0
- package/dist/turns/index.d.ts +11 -0
- package/dist/turns/index.d.ts.map +1 -0
- package/dist/turns/index.js +11 -0
- package/dist/turns/index.js.map +1 -0
- package/dist/turns/queries.d.ts +36 -0
- package/dist/turns/queries.d.ts.map +1 -0
- package/dist/turns/queries.js +37 -0
- package/dist/turns/queries.js.map +1 -0
- package/dist/turns/replay.d.ts +105 -0
- package/dist/turns/replay.d.ts.map +1 -0
- package/dist/turns/replay.js +163 -0
- package/dist/turns/replay.js.map +1 -0
- package/dist/turns/status.d.ts +49 -0
- package/dist/turns/status.d.ts.map +1 -0
- package/dist/turns/status.js +56 -0
- package/dist/turns/status.js.map +1 -0
- package/dist/turns/turn-store.d.ts +109 -0
- package/dist/turns/turn-store.d.ts.map +1 -0
- package/dist/turns/turn-store.js +169 -0
- package/dist/turns/turn-store.js.map +1 -0
- package/dist/usage/finalize.d.ts +57 -0
- package/dist/usage/finalize.d.ts.map +1 -0
- package/dist/usage/finalize.js +139 -0
- package/dist/usage/finalize.js.map +1 -0
- package/dist/usage/index.d.ts +11 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +11 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/usage/model-catalog.d.ts +50 -0
- package/dist/usage/model-catalog.d.ts.map +1 -0
- package/dist/usage/model-catalog.js +344 -0
- package/dist/usage/model-catalog.js.map +1 -0
- package/dist/usage/normalize.d.ts +103 -0
- package/dist/usage/normalize.d.ts.map +1 -0
- package/dist/usage/normalize.js +71 -0
- package/dist/usage/normalize.js.map +1 -0
- package/dist/usage/ports.d.ts +141 -0
- package/dist/usage/ports.d.ts.map +1 -0
- package/dist/usage/ports.js +113 -0
- package/dist/usage/ports.js.map +1 -0
- package/dist/usage/tokens.d.ts +79 -0
- package/dist/usage/tokens.d.ts.map +1 -0
- package/dist/usage/tokens.js +98 -0
- package/dist/usage/tokens.js.map +1 -0
- package/dist/warm/client-cache.d.ts +47 -0
- package/dist/warm/client-cache.d.ts.map +1 -0
- package/dist/warm/client-cache.js +48 -0
- package/dist/warm/client-cache.js.map +1 -0
- package/dist/warm/envelope-cache.d.ts +79 -0
- package/dist/warm/envelope-cache.d.ts.map +1 -0
- package/dist/warm/envelope-cache.js +85 -0
- package/dist/warm/envelope-cache.js.map +1 -0
- package/dist/warm/index.d.ts +16 -0
- package/dist/warm/index.d.ts.map +1 -0
- package/dist/warm/index.js +11 -0
- package/dist/warm/index.js.map +1 -0
- package/dist/warm/payload.d.ts +137 -0
- package/dist/warm/payload.d.ts.map +1 -0
- package/dist/warm/payload.js +112 -0
- package/dist/warm/payload.js.map +1 -0
- package/dist/warm/revision.d.ts +70 -0
- package/dist/warm/revision.d.ts.map +1 -0
- package/dist/warm/revision.js +63 -0
- package/dist/warm/revision.js.map +1 -0
- package/dist/warm/store-policy.d.ts +57 -0
- package/dist/warm/store-policy.d.ts.map +1 -0
- package/dist/warm/store-policy.js +89 -0
- package/dist/warm/store-policy.js.map +1 -0
- package/dist/wire/frames.d.ts +208 -0
- package/dist/wire/frames.d.ts.map +1 -0
- package/dist/wire/frames.js +245 -0
- package/dist/wire/frames.js.map +1 -0
- package/dist/wire/index.d.ts +7 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +7 -0
- package/dist/wire/index.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|