@wjarka/cezarion 0.16.0-dev.1503 → 0.16.0-pr923.1504
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/README.md +15 -4
- package/dist/contract/index.js +3 -0
- package/dist/contract/runs.d.ts +30 -0
- package/dist/contract/skills.d.ts +4 -0
- package/dist/core/agent-runner.d.ts +9 -6
- package/dist/core/agent-runner.js +4 -2
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/cursor-print-capabilities.d.ts +12 -0
- package/dist/core/cursor-print-capabilities.js +77 -0
- package/dist/core/cursor-print-capabilities.js.map +1 -0
- package/dist/core/cursor-print-process.d.ts +31 -0
- package/dist/core/cursor-print-process.js +129 -0
- package/dist/core/cursor-print-process.js.map +1 -0
- package/dist/core/cursor-print-runner.d.ts +26 -0
- package/dist/core/cursor-print-runner.js +512 -0
- package/dist/core/cursor-print-runner.js.map +1 -0
- package/dist/core/cursor-print-tool-catalog.d.ts +6 -0
- package/dist/core/cursor-print-tool-catalog.js +78 -0
- package/dist/core/cursor-print-tool-catalog.js.map +1 -0
- package/dist/core/cursor-print-ui-mapper.d.ts +47 -0
- package/dist/core/cursor-print-ui-mapper.js +573 -0
- package/dist/core/cursor-print-ui-mapper.js.map +1 -0
- package/dist/core/cursor-runner.d.ts +24 -0
- package/dist/core/cursor-runner.js +146 -0
- package/dist/core/cursor-runner.js.map +1 -0
- package/dist/core/process-usage.d.ts +5 -0
- package/dist/core/process-usage.js +24 -4
- package/dist/core/process-usage.js.map +1 -1
- package/dist/core/runner-factory.d.ts +4 -1
- package/dist/core/runner-factory.js +3 -3
- package/dist/core/runner-factory.js.map +1 -1
- package/dist/delegation/transport.d.ts +13 -13
- package/dist/runs/store.d.ts +9 -0
- package/dist/runs/store.js +1 -0
- package/dist/runs/store.js.map +1 -1
- package/dist/server/server.d.ts +118 -92
- package/dist/workflows/run.js +39 -8
- package/dist/workflows/run.js.map +1 -1
- package/package.json +3 -3
- package/scripts/mock-ci-tool.mjs +12 -4
- package/scripts/mock-cursor-acp.mjs +1 -0
- package/scripts/mock-cursor-print.mjs +196 -0
- package/scripts/probe-cursor-print.mjs +616 -0
- package/web/dist/assets/{agent-accounts-CFOBMVHc.js → agent-accounts-CDhVzwnd.js} +1 -1
- package/web/dist/assets/{alert-dialog-BrpNUwMt.js → alert-dialog-A0-kEfJK.js} +1 -1
- package/web/dist/assets/{button-C_rd7CPp.js → button-Jj1Itx83.js} +1 -1
- package/web/dist/assets/{compare-variants-D6WXhvXA.js → compare-variants-aor2j4bO.js} +1 -1
- package/web/dist/assets/{diff-DrEARXTV.js → diff-CDL5SDNO.js} +2 -2
- package/web/dist/assets/{diff-controls-B1-j7nFg.js → diff-controls-BWAkxipD.js} +1 -1
- package/web/dist/assets/{diff-view-DvGLjdTk.js → diff-view-DWh9FnNY.js} +1 -1
- package/web/dist/assets/{dropdown-menu-BegOZFrj.js → dropdown-menu-Ddqp8eUw.js} +1 -1
- package/web/dist/assets/{format-DpNe3S0A.js → format-DTNjugyE.js} +1 -1
- package/web/dist/assets/{git-toolbar-Cw4ljmhB.js → git-toolbar-B4rwm9Lr.js} +1 -1
- package/web/dist/assets/{github-CfV5sqL0.js → github-DgMD1v4U.js} +1 -1
- package/web/dist/assets/{image-preview-FOEfqpZP.js → image-preview-Dy5i96RC.js} +1 -1
- package/web/dist/assets/{index-DgWWlOLy.js → index-BfAearY6.js} +4 -4
- package/web/dist/assets/{nav-row-styles-vp2JbhuJ.js → nav-row-styles-Ci-Ke7wG.js} +1 -1
- package/web/dist/assets/{popover-BohP6WTx.js → popover-BjjDOSGv.js} +1 -1
- package/web/dist/assets/{preview-pane-connected-qTA5KNoJ.js → preview-pane-connected-Nv_nhV63.js} +1 -1
- package/web/dist/assets/{preview-state-vuMviq6q.js → preview-state-D8-YBJ6m.js} +1 -1
- package/web/dist/assets/{prompt-templates-Cubdut_C.js → prompt-templates-DFeXUVOZ.js} +1 -1
- package/web/dist/assets/{repo-git-Cf4t5PD0.js → repo-git-DcWh5s_b.js} +1 -1
- package/web/dist/assets/{run-diff-BpkUW37Z.js → run-diff-1ZzFrOx1.js} +1 -1
- package/web/dist/assets/{run-header-68WHf9wV.js → run-header-CPoYzbAy.js} +1 -1
- package/web/dist/assets/{skills-DiVIgKeU.js → skills-CnLazLgF.js} +1 -1
- package/web/dist/assets/{status-dot-CqTJHSP9.js → status-dot-DwFmt_Jg.js} +1 -1
- package/web/dist/assets/{tab-link-B07Hu4QX.js → tab-link-COpvArgR.js} +1 -1
- package/web/dist/assets/{task-changes--lQF6EYf.js → task-changes-CY-mi-mC.js} +1 -1
- package/web/dist/assets/{task-commits-Cx0qy4DN.js → task-commits-EvLi8T4a.js} +1 -1
- package/web/dist/assets/{task-files-D50s-gKW.js → task-files-BR3d8X2U.js} +1 -1
- package/web/dist/assets/{task-github-item-DaqmSwYT.js → task-github-item-BVsPg9RI.js} +1 -1
- package/web/dist/assets/{task-thread-BPQ64lui.js → task-thread-DQCsu_v8.js} +1 -1
- package/web/dist/assets/{textarea-D20O4Pw0.js → textarea-BbNV5Uo2.js} +1 -1
- package/web/dist/assets/{thread-state-DWcFMrvb.js → thread-state-DTkIvHsU.js} +1 -1
- package/web/dist/assets/{use-hand-to-agent-state-Cy9eyyfL.js → use-hand-to-agent-state-DT-QBsPC.js} +1 -1
- package/web/dist/assets/{utils-JsL3ZsJf.js → utils-POVs3UKu.js} +1 -1
- package/web/dist/assets/{workflows-jwG7uxqi.js → workflows-BTE-5RwX.js} +1 -1
- package/web/dist/assets/{zoomable-image-BJJ64KGc.js → zoomable-image-cL1VgYK4.js} +1 -1
- package/web/dist/index.html +13 -13
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor Agent CLI `stream-json` → protocol v2 mapper (+ v1 helpers).
|
|
3
|
+
* Adapted from open-mercato/cezar PR #807's fresh-turn print mapper. This
|
|
4
|
+
* version retains state across exact-resume processes and maps the native
|
|
5
|
+
* question rejection observed on Cursor 2026.10.01-e373342.
|
|
6
|
+
*
|
|
7
|
+
* Wire shapes: https://cursor.com/docs/cli/reference/output-format
|
|
8
|
+
* (`system/init`, `assistant`, `tool_call` started/completed, `result`).
|
|
9
|
+
*
|
|
10
|
+
* Per the docs above, `thinking` events are suppressed in print mode and the
|
|
11
|
+
* terminal `result` frame carries no `usage`/`total_cost_usd` — reasoning and
|
|
12
|
+
* usage.updated/turn.completed-usage are therefore documented `except`
|
|
13
|
+
* exclusions in `ui-parity.test.ts` (AGENT_PROTOCOL.md §6), not capabilities
|
|
14
|
+
* this mapper produces. The `usage`/`total_cost_usd` reads below are kept as a
|
|
15
|
+
* defensive no-op against real output, per the docs' own "field additions may
|
|
16
|
+
* occur… backward-compatible" note — see `cursor-ui-mapper.test.ts`'s header
|
|
17
|
+
* for the full verified-vs-unverified provenance split.
|
|
18
|
+
*
|
|
19
|
+
* Never throws on malformed input. State is immutable — callers thread the
|
|
20
|
+
* returned `state` into the next call.
|
|
21
|
+
*/
|
|
22
|
+
import type { AgentEvent } from './agent-runner.ts';
|
|
23
|
+
import type { PlanEntry, UiEvent, UiToolItem } from './ui-events.ts';
|
|
24
|
+
export interface CursorPrintUiState {
|
|
25
|
+
readonly fallbackSessionId?: string;
|
|
26
|
+
readonly sessionStarted: boolean;
|
|
27
|
+
readonly turnSeq: number;
|
|
28
|
+
readonly currentTurnId: string | null;
|
|
29
|
+
readonly itemSeq: number;
|
|
30
|
+
readonly sawAssistantText: boolean;
|
|
31
|
+
readonly openTools: ReadonlyMap<string, UiToolItem>;
|
|
32
|
+
readonly todos: ReadonlyMap<string, PlanEntry>;
|
|
33
|
+
}
|
|
34
|
+
export interface CursorPrintUiMapping {
|
|
35
|
+
events: UiEvent[];
|
|
36
|
+
state: CursorPrintUiState;
|
|
37
|
+
}
|
|
38
|
+
export declare function createCursorPrintUiState(opts?: {
|
|
39
|
+
fallbackSessionId?: string;
|
|
40
|
+
}): CursorPrintUiState;
|
|
41
|
+
/** Fold one parsed stream-json line into v2 events. Never throws. */
|
|
42
|
+
export declare function mapCursorPrintMessage(msg: unknown, state: CursorPrintUiState): CursorPrintUiMapping;
|
|
43
|
+
/**
|
|
44
|
+
* Convert one Cursor stream-json object into zero or more v1 AgentEvents.
|
|
45
|
+
* With default (non-partial) stream-json, every assistant event is used.
|
|
46
|
+
*/
|
|
47
|
+
export declare function mapCursorPrintStreamEvent(raw: unknown): AgentEvent[];
|
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor Agent CLI `stream-json` → protocol v2 mapper (+ v1 helpers).
|
|
3
|
+
* Adapted from open-mercato/cezar PR #807's fresh-turn print mapper. This
|
|
4
|
+
* version retains state across exact-resume processes and maps the native
|
|
5
|
+
* question rejection observed on Cursor 2026.10.01-e373342.
|
|
6
|
+
*
|
|
7
|
+
* Wire shapes: https://cursor.com/docs/cli/reference/output-format
|
|
8
|
+
* (`system/init`, `assistant`, `tool_call` started/completed, `result`).
|
|
9
|
+
*
|
|
10
|
+
* Per the docs above, `thinking` events are suppressed in print mode and the
|
|
11
|
+
* terminal `result` frame carries no `usage`/`total_cost_usd` — reasoning and
|
|
12
|
+
* usage.updated/turn.completed-usage are therefore documented `except`
|
|
13
|
+
* exclusions in `ui-parity.test.ts` (AGENT_PROTOCOL.md §6), not capabilities
|
|
14
|
+
* this mapper produces. The `usage`/`total_cost_usd` reads below are kept as a
|
|
15
|
+
* defensive no-op against real output, per the docs' own "field additions may
|
|
16
|
+
* occur… backward-compatible" note — see `cursor-ui-mapper.test.ts`'s header
|
|
17
|
+
* for the full verified-vs-unverified provenance split.
|
|
18
|
+
*
|
|
19
|
+
* Never throws on malformed input. State is immutable — callers thread the
|
|
20
|
+
* returned `state` into the next call.
|
|
21
|
+
*/
|
|
22
|
+
import { toolDisplay } from './tool-display.js';
|
|
23
|
+
export function createCursorPrintUiState(opts = {}) {
|
|
24
|
+
return {
|
|
25
|
+
fallbackSessionId: opts.fallbackSessionId,
|
|
26
|
+
sessionStarted: false,
|
|
27
|
+
turnSeq: 0,
|
|
28
|
+
currentTurnId: null,
|
|
29
|
+
itemSeq: 0,
|
|
30
|
+
sawAssistantText: false,
|
|
31
|
+
openTools: new Map(),
|
|
32
|
+
todos: new Map(),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Fold one parsed stream-json line into v2 events. Never throws. */
|
|
36
|
+
export function mapCursorPrintMessage(msg, state) {
|
|
37
|
+
try {
|
|
38
|
+
if (!isRecord(msg))
|
|
39
|
+
return { events: [], state };
|
|
40
|
+
switch (msg.type) {
|
|
41
|
+
case 'system':
|
|
42
|
+
return msg.subtype === 'init' ? mapInit(msg, state) : { events: [], state };
|
|
43
|
+
case 'assistant':
|
|
44
|
+
return mapAssistant(msg, state);
|
|
45
|
+
case 'tool_call':
|
|
46
|
+
return mapToolCall(msg, state);
|
|
47
|
+
case 'result':
|
|
48
|
+
return mapResult(msg, state);
|
|
49
|
+
default:
|
|
50
|
+
return { events: [], state };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return { events: [], state };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function mapInit(msg, state) {
|
|
58
|
+
const sessionId = str(msg.session_id) ?? state.fallbackSessionId ?? '';
|
|
59
|
+
if (!sessionId || state.currentTurnId !== null)
|
|
60
|
+
return { events: [], state };
|
|
61
|
+
const event = {
|
|
62
|
+
type: 'session.started',
|
|
63
|
+
sessionId,
|
|
64
|
+
backend: 'cursor',
|
|
65
|
+
};
|
|
66
|
+
const model = str(msg.model);
|
|
67
|
+
if (model !== undefined)
|
|
68
|
+
event.model = model;
|
|
69
|
+
const cwd = str(msg.cwd);
|
|
70
|
+
if (cwd !== undefined)
|
|
71
|
+
event.cwd = cwd;
|
|
72
|
+
// Every print process starts one turn, but a resumed process belongs to the
|
|
73
|
+
// same logical session. Only its first init announces session.started.
|
|
74
|
+
const turnId = `turn_${state.turnSeq + 1}`;
|
|
75
|
+
return {
|
|
76
|
+
events: [...(state.sessionStarted ? [] : [event]), { type: 'turn.started', turnId }],
|
|
77
|
+
state: {
|
|
78
|
+
...state,
|
|
79
|
+
sessionStarted: true,
|
|
80
|
+
turnSeq: state.turnSeq + 1,
|
|
81
|
+
currentTurnId: turnId,
|
|
82
|
+
sawAssistantText: false,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function mapAssistant(msg, state) {
|
|
87
|
+
// Skip partial-stream duplicates (docs: timestamp_ms + model_call_id table).
|
|
88
|
+
if ('model_call_id' in msg)
|
|
89
|
+
return { events: [], state };
|
|
90
|
+
const content = messageContent(msg);
|
|
91
|
+
const events = [];
|
|
92
|
+
let itemSeq = state.itemSeq;
|
|
93
|
+
let sawAssistantText = state.sawAssistantText;
|
|
94
|
+
for (const raw of content) {
|
|
95
|
+
if (!isRecord(raw))
|
|
96
|
+
continue;
|
|
97
|
+
if (raw.type === 'text' && typeof raw.text === 'string' && raw.text) {
|
|
98
|
+
sawAssistantText = true;
|
|
99
|
+
const item = { kind: 'message', id: `item_${++itemSeq}`, role: 'assistant', text: raw.text };
|
|
100
|
+
events.push({ type: 'item.started', item }, { type: 'item.completed', item });
|
|
101
|
+
}
|
|
102
|
+
else if (raw.type === 'thinking' && typeof raw.thinking === 'string' && raw.thinking.trim() !== '') {
|
|
103
|
+
// Print mode suppresses dedicated thinking events; content-block thinking
|
|
104
|
+
// is the documented substitute when a model still emits it.
|
|
105
|
+
const item = { kind: 'reasoning', id: `item_${++itemSeq}`, text: raw.thinking };
|
|
106
|
+
events.push({ type: 'item.started', item }, { type: 'item.completed', item });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (events.length === 0)
|
|
110
|
+
return { events, state };
|
|
111
|
+
return { events, state: { ...state, itemSeq, sawAssistantText } };
|
|
112
|
+
}
|
|
113
|
+
function mapToolCall(msg, state) {
|
|
114
|
+
const callId = str(msg.call_id);
|
|
115
|
+
if (!callId)
|
|
116
|
+
return { events: [], state };
|
|
117
|
+
const subtype = str(msg.subtype);
|
|
118
|
+
const parsed = parseCursorToolCall(msg.tool_call);
|
|
119
|
+
if (subtype === 'started') {
|
|
120
|
+
const display = toolDisplay(parsed.name, parsed.input);
|
|
121
|
+
const item = {
|
|
122
|
+
kind: 'tool',
|
|
123
|
+
id: callId,
|
|
124
|
+
name: parsed.name,
|
|
125
|
+
toolKind: display.toolKind,
|
|
126
|
+
title: display.title,
|
|
127
|
+
status: 'running',
|
|
128
|
+
};
|
|
129
|
+
if (parsed.input !== undefined)
|
|
130
|
+
item.input = parsed.input;
|
|
131
|
+
const edit = editArtifacts(parsed.name, parsed.input);
|
|
132
|
+
if (edit) {
|
|
133
|
+
if (edit.diffs)
|
|
134
|
+
item.diffs = edit.diffs;
|
|
135
|
+
item.locations = edit.locations;
|
|
136
|
+
}
|
|
137
|
+
const events = [{ type: 'item.started', item }];
|
|
138
|
+
if (parsed.name === 'UpdateTodos') {
|
|
139
|
+
const updated = nativeTodoUpdate(parsed.input, state.todos);
|
|
140
|
+
if (updated) {
|
|
141
|
+
events.push({ type: 'plan.updated', entries: [...updated.values()] });
|
|
142
|
+
const openTools = new Map(state.openTools);
|
|
143
|
+
openTools.set(callId, item);
|
|
144
|
+
return { events, state: { ...state, openTools, todos: updated } };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else if (parsed.name === 'TodoWrite') {
|
|
148
|
+
const entries = planEntries(parsed.input);
|
|
149
|
+
if (entries)
|
|
150
|
+
events.push({ type: 'plan.updated', entries });
|
|
151
|
+
}
|
|
152
|
+
const openTools = new Map(state.openTools);
|
|
153
|
+
openTools.set(callId, item);
|
|
154
|
+
return { events, state: { ...state, openTools } };
|
|
155
|
+
}
|
|
156
|
+
if (subtype === 'completed') {
|
|
157
|
+
const open = state.openTools.get(callId);
|
|
158
|
+
if (!open)
|
|
159
|
+
return { events: [], state };
|
|
160
|
+
const failed = toolFailed(parsed);
|
|
161
|
+
const item = {
|
|
162
|
+
...open,
|
|
163
|
+
status: failed ? 'failed' : 'completed',
|
|
164
|
+
};
|
|
165
|
+
const output = toolOutput(parsed);
|
|
166
|
+
if (output !== undefined)
|
|
167
|
+
item.output = output;
|
|
168
|
+
if (failed) {
|
|
169
|
+
const err = toolErrorMessage(parsed);
|
|
170
|
+
if (err)
|
|
171
|
+
item.error = err;
|
|
172
|
+
}
|
|
173
|
+
// Prefer completed-side diffs (editToolCall.result.success.diffString).
|
|
174
|
+
const completedDiffs = completedEditDiffs(parsed);
|
|
175
|
+
if (completedDiffs) {
|
|
176
|
+
item.diffs = completedDiffs.diffs;
|
|
177
|
+
item.locations = completedDiffs.locations;
|
|
178
|
+
}
|
|
179
|
+
const openTools = new Map(state.openTools);
|
|
180
|
+
openTools.delete(callId);
|
|
181
|
+
return {
|
|
182
|
+
events: [{ type: 'item.completed', item }],
|
|
183
|
+
state: { ...state, openTools },
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return { events: [], state };
|
|
187
|
+
}
|
|
188
|
+
function mapResult(msg, state) {
|
|
189
|
+
if (state.currentTurnId === null)
|
|
190
|
+
return { events: [], state };
|
|
191
|
+
const events = [];
|
|
192
|
+
let itemSeq = state.itemSeq;
|
|
193
|
+
let sawAssistantText = state.sawAssistantText;
|
|
194
|
+
// A tool that never got a `completed` tool_call event before the turn ended
|
|
195
|
+
// (the turn was interrupted or errored) would otherwise stay "running"
|
|
196
|
+
// forever in the UI — give it a terminal snapshot now.
|
|
197
|
+
for (const open of state.openTools.values()) {
|
|
198
|
+
events.push({ type: 'item.completed', item: { ...open, status: 'failed' } });
|
|
199
|
+
}
|
|
200
|
+
// If no assistant text streamed, surface the terminal result string once.
|
|
201
|
+
if (!sawAssistantText && typeof msg.result === 'string' && msg.result.trim() !== '' && msg.is_error !== true) {
|
|
202
|
+
sawAssistantText = true;
|
|
203
|
+
const item = {
|
|
204
|
+
kind: 'message',
|
|
205
|
+
id: `item_${++itemSeq}`,
|
|
206
|
+
role: 'assistant',
|
|
207
|
+
text: msg.result,
|
|
208
|
+
};
|
|
209
|
+
events.push({ type: 'item.started', item }, { type: 'item.completed', item });
|
|
210
|
+
}
|
|
211
|
+
const turnId = state.currentTurnId ?? `turn_${Math.max(1, state.turnSeq)}`;
|
|
212
|
+
const turnEvent = {
|
|
213
|
+
type: 'turn.completed',
|
|
214
|
+
turnId,
|
|
215
|
+
stopReason: resultStopReason(msg),
|
|
216
|
+
};
|
|
217
|
+
const usage = tokenUsage(msg);
|
|
218
|
+
if (usage)
|
|
219
|
+
turnEvent.usage = usage;
|
|
220
|
+
if (typeof msg.total_cost_usd === 'number')
|
|
221
|
+
turnEvent.costUsd = msg.total_cost_usd;
|
|
222
|
+
events.push(turnEvent);
|
|
223
|
+
if (usage) {
|
|
224
|
+
const usageEvent = { type: 'usage.updated', usage };
|
|
225
|
+
if (typeof msg.total_cost_usd === 'number')
|
|
226
|
+
usageEvent.costUsd = msg.total_cost_usd;
|
|
227
|
+
events.push(usageEvent);
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
events,
|
|
231
|
+
state: {
|
|
232
|
+
...state,
|
|
233
|
+
itemSeq,
|
|
234
|
+
sawAssistantText,
|
|
235
|
+
currentTurnId: null,
|
|
236
|
+
openTools: new Map(),
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function resultStopReason(msg) {
|
|
241
|
+
if (msg.is_error === true)
|
|
242
|
+
return 'error';
|
|
243
|
+
if (msg.subtype === 'error_max_turns')
|
|
244
|
+
return 'max_tokens';
|
|
245
|
+
return 'end_turn';
|
|
246
|
+
}
|
|
247
|
+
function tokenUsage(msg) {
|
|
248
|
+
if (!isRecord(msg.usage))
|
|
249
|
+
return undefined;
|
|
250
|
+
const input = num(msg.usage.input_tokens) ?? 0;
|
|
251
|
+
const output = num(msg.usage.output_tokens) ?? 0;
|
|
252
|
+
const cacheRead = num(msg.usage.cache_read_input_tokens) ?? 0;
|
|
253
|
+
const cacheWrite = num(msg.usage.cache_creation_input_tokens) ?? 0;
|
|
254
|
+
const total = input + output + cacheRead + cacheWrite;
|
|
255
|
+
if (total <= 0)
|
|
256
|
+
return undefined;
|
|
257
|
+
const usage = { input, output, total };
|
|
258
|
+
if (cacheRead > 0)
|
|
259
|
+
usage.cacheRead = cacheRead;
|
|
260
|
+
if (cacheWrite > 0)
|
|
261
|
+
usage.cacheWrite = cacheWrite;
|
|
262
|
+
return usage;
|
|
263
|
+
}
|
|
264
|
+
function parseCursorToolCall(toolCall) {
|
|
265
|
+
if (!isRecord(toolCall))
|
|
266
|
+
return { name: 'tool', input: {} };
|
|
267
|
+
if (isRecord(toolCall.function)) {
|
|
268
|
+
const name = typeof toolCall.function.name === 'string' ? toolCall.function.name : 'function';
|
|
269
|
+
let input = toolCall.function.arguments ?? toolCall.function.args ?? {};
|
|
270
|
+
if (typeof input === 'string') {
|
|
271
|
+
try {
|
|
272
|
+
input = JSON.parse(input);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
input = { raw: input };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return { name, input, result: toolCall.function.result, rawKey: 'function' };
|
|
279
|
+
}
|
|
280
|
+
for (const [key, value] of Object.entries(toolCall)) {
|
|
281
|
+
if (!key.endsWith('ToolCall') || !isRecord(value))
|
|
282
|
+
continue;
|
|
283
|
+
const name = cursorToolKeyToName(key);
|
|
284
|
+
return {
|
|
285
|
+
name,
|
|
286
|
+
input: value.args ?? {},
|
|
287
|
+
result: value.result,
|
|
288
|
+
rawKey: key,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return { name: 'tool', input: toolCall };
|
|
292
|
+
}
|
|
293
|
+
function cursorToolKeyToName(key) {
|
|
294
|
+
const base = key.replace(/ToolCall$/, '');
|
|
295
|
+
switch (base) {
|
|
296
|
+
case 'read':
|
|
297
|
+
return 'Read';
|
|
298
|
+
case 'write':
|
|
299
|
+
return 'Write';
|
|
300
|
+
case 'edit':
|
|
301
|
+
return 'Edit';
|
|
302
|
+
case 'shell':
|
|
303
|
+
return 'Bash';
|
|
304
|
+
case 'ls':
|
|
305
|
+
return 'Ls';
|
|
306
|
+
case 'grep':
|
|
307
|
+
return 'Grep';
|
|
308
|
+
case 'task':
|
|
309
|
+
return 'Task';
|
|
310
|
+
default:
|
|
311
|
+
return base.charAt(0).toUpperCase() + base.slice(1);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function editArtifacts(name, input) {
|
|
315
|
+
const key = name.toLowerCase();
|
|
316
|
+
if (key !== 'edit' && key !== 'write')
|
|
317
|
+
return undefined;
|
|
318
|
+
if (!isRecord(input))
|
|
319
|
+
return undefined;
|
|
320
|
+
const path = (typeof input.path === 'string' && input.path) ||
|
|
321
|
+
(typeof input.file_path === 'string' && input.file_path) ||
|
|
322
|
+
(typeof input.filePath === 'string' && input.filePath) ||
|
|
323
|
+
'';
|
|
324
|
+
if (!path)
|
|
325
|
+
return undefined;
|
|
326
|
+
const locations = [{ path }];
|
|
327
|
+
if (key === 'edit') {
|
|
328
|
+
const oldText = typeof input.old_string === 'string'
|
|
329
|
+
? input.old_string
|
|
330
|
+
: typeof input.oldString === 'string'
|
|
331
|
+
? input.oldString
|
|
332
|
+
: null;
|
|
333
|
+
const newText = typeof input.new_string === 'string'
|
|
334
|
+
? input.new_string
|
|
335
|
+
: typeof input.newString === 'string'
|
|
336
|
+
? input.newString
|
|
337
|
+
: typeof input.fileText === 'string'
|
|
338
|
+
? input.fileText
|
|
339
|
+
: undefined;
|
|
340
|
+
if (oldText !== null || newText !== undefined) {
|
|
341
|
+
return { diffs: [{ path, oldText, newText }], locations };
|
|
342
|
+
}
|
|
343
|
+
return { locations };
|
|
344
|
+
}
|
|
345
|
+
const diff = { path, oldText: null };
|
|
346
|
+
if (typeof input.fileText === 'string')
|
|
347
|
+
diff.newText = input.fileText;
|
|
348
|
+
else if (typeof input.content === 'string')
|
|
349
|
+
diff.newText = input.content;
|
|
350
|
+
return { diffs: [diff], locations };
|
|
351
|
+
}
|
|
352
|
+
function completedEditDiffs(parsed) {
|
|
353
|
+
const key = parsed.name.toLowerCase();
|
|
354
|
+
if (key !== 'edit' && key !== 'write')
|
|
355
|
+
return undefined;
|
|
356
|
+
if (!isRecord(parsed.input))
|
|
357
|
+
return undefined;
|
|
358
|
+
const path = (typeof parsed.input.path === 'string' && parsed.input.path) ||
|
|
359
|
+
(typeof parsed.input.file_path === 'string' && parsed.input.file_path) ||
|
|
360
|
+
'';
|
|
361
|
+
if (!path || !isRecord(parsed.result) || !isRecord(parsed.result.success))
|
|
362
|
+
return undefined;
|
|
363
|
+
const success = parsed.result.success;
|
|
364
|
+
const oldText = key === 'edit'
|
|
365
|
+
? typeof parsed.input.old_string === 'string'
|
|
366
|
+
? parsed.input.old_string
|
|
367
|
+
: typeof parsed.input.oldString === 'string'
|
|
368
|
+
? parsed.input.oldString
|
|
369
|
+
: null
|
|
370
|
+
: null;
|
|
371
|
+
const diff = { path, oldText };
|
|
372
|
+
if (typeof success.afterFullFileContent === 'string')
|
|
373
|
+
diff.newText = success.afterFullFileContent;
|
|
374
|
+
else if (typeof success.diffString === 'string')
|
|
375
|
+
diff.unified = success.diffString;
|
|
376
|
+
else if (typeof parsed.input.fileText === 'string')
|
|
377
|
+
diff.newText = parsed.input.fileText;
|
|
378
|
+
else
|
|
379
|
+
return undefined;
|
|
380
|
+
if (typeof success.diffString === 'string')
|
|
381
|
+
diff.unified = success.diffString;
|
|
382
|
+
return { diffs: [diff], locations: [{ path }] };
|
|
383
|
+
}
|
|
384
|
+
function toolFailed(parsed) {
|
|
385
|
+
if (!isRecord(parsed.result))
|
|
386
|
+
return false;
|
|
387
|
+
if (isRecord(parsed.result.rejected))
|
|
388
|
+
return true;
|
|
389
|
+
if (isRecord(parsed.result.error))
|
|
390
|
+
return true;
|
|
391
|
+
if (isRecord(parsed.result.success) && typeof parsed.result.success.exitCode === 'number') {
|
|
392
|
+
return parsed.result.success.exitCode !== 0;
|
|
393
|
+
}
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
function toolErrorMessage(parsed) {
|
|
397
|
+
if (!isRecord(parsed.result))
|
|
398
|
+
return undefined;
|
|
399
|
+
if (isRecord(parsed.result.rejected) && typeof parsed.result.rejected.reason === 'string') {
|
|
400
|
+
if (parsed.rawKey === 'askQuestionToolCall'
|
|
401
|
+
&& /questions skipped/i.test(parsed.result.rejected.reason)) {
|
|
402
|
+
return 'Cursor skipped this native question in headless print mode';
|
|
403
|
+
}
|
|
404
|
+
return parsed.result.rejected.reason;
|
|
405
|
+
}
|
|
406
|
+
if (isRecord(parsed.result.error) && typeof parsed.result.error.errorMessage === 'string') {
|
|
407
|
+
return parsed.result.error.errorMessage;
|
|
408
|
+
}
|
|
409
|
+
if (isRecord(parsed.result.success)) {
|
|
410
|
+
const stderr = parsed.result.success.stderr;
|
|
411
|
+
if (typeof stderr === 'string' && stderr.trim())
|
|
412
|
+
return stderr.trim();
|
|
413
|
+
}
|
|
414
|
+
return undefined;
|
|
415
|
+
}
|
|
416
|
+
function toolOutput(parsed) {
|
|
417
|
+
if (!isRecord(parsed.result))
|
|
418
|
+
return undefined;
|
|
419
|
+
if (isRecord(parsed.result.success)) {
|
|
420
|
+
const s = parsed.result.success;
|
|
421
|
+
if (typeof s.stdout === 'string')
|
|
422
|
+
return s.stdout;
|
|
423
|
+
if (typeof s.content === 'string')
|
|
424
|
+
return s.content;
|
|
425
|
+
if (typeof s.resultForModel === 'string')
|
|
426
|
+
return s.resultForModel;
|
|
427
|
+
}
|
|
428
|
+
try {
|
|
429
|
+
return JSON.stringify(parsed.result);
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
return undefined;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
const PLAN_STATUSES = ['pending', 'in_progress', 'completed', 'cancelled'];
|
|
436
|
+
function nativeTodoUpdate(input, prior) {
|
|
437
|
+
if (!isRecord(input) || !Array.isArray(input.todos))
|
|
438
|
+
return undefined;
|
|
439
|
+
const todos = input.merge === true ? new Map(prior) : new Map();
|
|
440
|
+
for (const raw of input.todos) {
|
|
441
|
+
if (!isRecord(raw) || typeof raw.id !== 'string' || !raw.id ||
|
|
442
|
+
typeof raw.content !== 'string' || !PLAN_STATUSES.includes(raw.status))
|
|
443
|
+
return undefined;
|
|
444
|
+
const entry = { content: raw.content, status: raw.status };
|
|
445
|
+
if (typeof raw.priority === 'string' && ['high', 'medium', 'low'].includes(raw.priority)) {
|
|
446
|
+
entry.priority = raw.priority;
|
|
447
|
+
}
|
|
448
|
+
todos.set(raw.id, entry);
|
|
449
|
+
}
|
|
450
|
+
return todos;
|
|
451
|
+
}
|
|
452
|
+
function planEntries(input) {
|
|
453
|
+
if (!isRecord(input) || !Array.isArray(input.todos))
|
|
454
|
+
return undefined;
|
|
455
|
+
const entries = [];
|
|
456
|
+
for (const todo of input.todos) {
|
|
457
|
+
if (!isRecord(todo) || typeof todo.content !== 'string')
|
|
458
|
+
continue;
|
|
459
|
+
const status = PLAN_STATUSES.find((s) => s === todo.status) ?? 'pending';
|
|
460
|
+
const entry = { content: todo.content, status };
|
|
461
|
+
if (typeof todo.activeForm === 'string')
|
|
462
|
+
entry.activeForm = todo.activeForm;
|
|
463
|
+
entries.push(entry);
|
|
464
|
+
}
|
|
465
|
+
return entries;
|
|
466
|
+
}
|
|
467
|
+
// ---- shared helpers ---------------------------------------------------------
|
|
468
|
+
function isRecord(value) {
|
|
469
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
470
|
+
}
|
|
471
|
+
function str(value) {
|
|
472
|
+
return typeof value === 'string' && value !== '' ? value : undefined;
|
|
473
|
+
}
|
|
474
|
+
function num(value) {
|
|
475
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
476
|
+
}
|
|
477
|
+
function messageContent(msg) {
|
|
478
|
+
if (!isRecord(msg.message) || !Array.isArray(msg.message.content))
|
|
479
|
+
return [];
|
|
480
|
+
return msg.message.content;
|
|
481
|
+
}
|
|
482
|
+
// ---- v1 AgentEvent mapping (unchanged contract for runners / dry-run) -------
|
|
483
|
+
function toolNameFromCall(toolCall) {
|
|
484
|
+
return parseCursorToolCall(toolCall).name;
|
|
485
|
+
}
|
|
486
|
+
function toolInputFromCall(toolCall) {
|
|
487
|
+
return parseCursorToolCall(toolCall).input;
|
|
488
|
+
}
|
|
489
|
+
function assistantText(message) {
|
|
490
|
+
if (!isRecord(message) || !Array.isArray(message.content))
|
|
491
|
+
return '';
|
|
492
|
+
const parts = [];
|
|
493
|
+
for (const block of message.content) {
|
|
494
|
+
if (isRecord(block) && block.type === 'text' && typeof block.text === 'string' && block.text) {
|
|
495
|
+
parts.push(block.text);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
return parts.join('');
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Convert one Cursor stream-json object into zero or more v1 AgentEvents.
|
|
502
|
+
* With default (non-partial) stream-json, every assistant event is used.
|
|
503
|
+
*/
|
|
504
|
+
export function mapCursorPrintStreamEvent(raw) {
|
|
505
|
+
if (!isRecord(raw))
|
|
506
|
+
return [];
|
|
507
|
+
const type = raw.type;
|
|
508
|
+
try {
|
|
509
|
+
if (type === 'system' && raw.subtype === 'init' && typeof raw.session_id === 'string') {
|
|
510
|
+
return [{ type: 'session', sessionId: raw.session_id }];
|
|
511
|
+
}
|
|
512
|
+
if (type === 'assistant') {
|
|
513
|
+
if ('model_call_id' in raw)
|
|
514
|
+
return [];
|
|
515
|
+
const text = assistantText(raw.message);
|
|
516
|
+
return text ? [{ type: 'text', text }] : [];
|
|
517
|
+
}
|
|
518
|
+
if (type === 'tool_call') {
|
|
519
|
+
const callId = typeof raw.call_id === 'string' ? raw.call_id : `cursor-${Date.now()}`;
|
|
520
|
+
if (raw.subtype === 'started') {
|
|
521
|
+
return [
|
|
522
|
+
{
|
|
523
|
+
type: 'tool-call',
|
|
524
|
+
id: callId,
|
|
525
|
+
tool: toolNameFromCall(raw.tool_call),
|
|
526
|
+
input: toolInputFromCall(raw.tool_call),
|
|
527
|
+
},
|
|
528
|
+
];
|
|
529
|
+
}
|
|
530
|
+
if (raw.subtype === 'completed') {
|
|
531
|
+
const parsed = parseCursorToolCall(raw.tool_call);
|
|
532
|
+
return [
|
|
533
|
+
{
|
|
534
|
+
type: 'tool-result',
|
|
535
|
+
toolCallId: callId,
|
|
536
|
+
result: JSON.stringify(parsed.result ?? {}),
|
|
537
|
+
isError: toolFailed(parsed),
|
|
538
|
+
},
|
|
539
|
+
];
|
|
540
|
+
}
|
|
541
|
+
return [];
|
|
542
|
+
}
|
|
543
|
+
if (type === 'result') {
|
|
544
|
+
// `session` and `done` are owned by the runner (init emits session once; the runner's
|
|
545
|
+
// own post-loop logic emits exactly one terminal `done`) — emitting them here too
|
|
546
|
+
// produced duplicate events in the append-only run log.
|
|
547
|
+
const events = [];
|
|
548
|
+
// Cursor's documented terminal `result` shape is
|
|
549
|
+
// {type, subtype, is_error, duration_ms, duration_api_ms, result, session_id, request_id}
|
|
550
|
+
// — no `usage`/`total_cost_usd` field today. Kept defensive per the docs' own "field
|
|
551
|
+
// additions may occur… backward-compatible" note; harmless no-op against real output.
|
|
552
|
+
const usage = tokenUsage(raw);
|
|
553
|
+
if (usage)
|
|
554
|
+
events.push({ type: 'token-usage', tokensUsed: usage.total });
|
|
555
|
+
if (typeof raw.total_cost_usd === 'number' && raw.total_cost_usd > 0) {
|
|
556
|
+
events.push({ type: 'cost', usd: raw.total_cost_usd });
|
|
557
|
+
}
|
|
558
|
+
if (raw.is_error === true) {
|
|
559
|
+
const msg = typeof raw.result === 'string' && raw.result
|
|
560
|
+
? raw.result
|
|
561
|
+
: 'Cursor agent reported an error';
|
|
562
|
+
events.push({ type: 'error', message: msg });
|
|
563
|
+
}
|
|
564
|
+
events.push({ type: 'turn-end' });
|
|
565
|
+
return events;
|
|
566
|
+
}
|
|
567
|
+
return [];
|
|
568
|
+
}
|
|
569
|
+
catch {
|
|
570
|
+
return [];
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
//# sourceMappingURL=cursor-print-ui-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-print-ui-mapper.js","sourceRoot":"","sources":["../../src/core/cursor-print-ui-mapper.ts"],"names":[],"mappings":"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"}
|