@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.
Files changed (79) hide show
  1. package/README.md +15 -4
  2. package/dist/contract/index.js +3 -0
  3. package/dist/contract/runs.d.ts +30 -0
  4. package/dist/contract/skills.d.ts +4 -0
  5. package/dist/core/agent-runner.d.ts +9 -6
  6. package/dist/core/agent-runner.js +4 -2
  7. package/dist/core/agent-runner.js.map +1 -1
  8. package/dist/core/cursor-print-capabilities.d.ts +12 -0
  9. package/dist/core/cursor-print-capabilities.js +77 -0
  10. package/dist/core/cursor-print-capabilities.js.map +1 -0
  11. package/dist/core/cursor-print-process.d.ts +31 -0
  12. package/dist/core/cursor-print-process.js +129 -0
  13. package/dist/core/cursor-print-process.js.map +1 -0
  14. package/dist/core/cursor-print-runner.d.ts +26 -0
  15. package/dist/core/cursor-print-runner.js +512 -0
  16. package/dist/core/cursor-print-runner.js.map +1 -0
  17. package/dist/core/cursor-print-tool-catalog.d.ts +6 -0
  18. package/dist/core/cursor-print-tool-catalog.js +78 -0
  19. package/dist/core/cursor-print-tool-catalog.js.map +1 -0
  20. package/dist/core/cursor-print-ui-mapper.d.ts +47 -0
  21. package/dist/core/cursor-print-ui-mapper.js +573 -0
  22. package/dist/core/cursor-print-ui-mapper.js.map +1 -0
  23. package/dist/core/cursor-runner.d.ts +24 -0
  24. package/dist/core/cursor-runner.js +146 -0
  25. package/dist/core/cursor-runner.js.map +1 -0
  26. package/dist/core/process-usage.d.ts +5 -0
  27. package/dist/core/process-usage.js +24 -4
  28. package/dist/core/process-usage.js.map +1 -1
  29. package/dist/core/runner-factory.d.ts +4 -1
  30. package/dist/core/runner-factory.js +3 -3
  31. package/dist/core/runner-factory.js.map +1 -1
  32. package/dist/delegation/transport.d.ts +13 -13
  33. package/dist/runs/store.d.ts +9 -0
  34. package/dist/runs/store.js +1 -0
  35. package/dist/runs/store.js.map +1 -1
  36. package/dist/server/server.d.ts +118 -92
  37. package/dist/workflows/run.js +39 -8
  38. package/dist/workflows/run.js.map +1 -1
  39. package/package.json +3 -3
  40. package/scripts/mock-ci-tool.mjs +12 -4
  41. package/scripts/mock-cursor-acp.mjs +1 -0
  42. package/scripts/mock-cursor-print.mjs +196 -0
  43. package/scripts/probe-cursor-print.mjs +616 -0
  44. package/web/dist/assets/{agent-accounts-CFOBMVHc.js → agent-accounts-CDhVzwnd.js} +1 -1
  45. package/web/dist/assets/{alert-dialog-BrpNUwMt.js → alert-dialog-A0-kEfJK.js} +1 -1
  46. package/web/dist/assets/{button-C_rd7CPp.js → button-Jj1Itx83.js} +1 -1
  47. package/web/dist/assets/{compare-variants-D6WXhvXA.js → compare-variants-aor2j4bO.js} +1 -1
  48. package/web/dist/assets/{diff-DrEARXTV.js → diff-CDL5SDNO.js} +2 -2
  49. package/web/dist/assets/{diff-controls-B1-j7nFg.js → diff-controls-BWAkxipD.js} +1 -1
  50. package/web/dist/assets/{diff-view-DvGLjdTk.js → diff-view-DWh9FnNY.js} +1 -1
  51. package/web/dist/assets/{dropdown-menu-BegOZFrj.js → dropdown-menu-Ddqp8eUw.js} +1 -1
  52. package/web/dist/assets/{format-DpNe3S0A.js → format-DTNjugyE.js} +1 -1
  53. package/web/dist/assets/{git-toolbar-Cw4ljmhB.js → git-toolbar-B4rwm9Lr.js} +1 -1
  54. package/web/dist/assets/{github-CfV5sqL0.js → github-DgMD1v4U.js} +1 -1
  55. package/web/dist/assets/{image-preview-FOEfqpZP.js → image-preview-Dy5i96RC.js} +1 -1
  56. package/web/dist/assets/{index-DgWWlOLy.js → index-BfAearY6.js} +4 -4
  57. package/web/dist/assets/{nav-row-styles-vp2JbhuJ.js → nav-row-styles-Ci-Ke7wG.js} +1 -1
  58. package/web/dist/assets/{popover-BohP6WTx.js → popover-BjjDOSGv.js} +1 -1
  59. package/web/dist/assets/{preview-pane-connected-qTA5KNoJ.js → preview-pane-connected-Nv_nhV63.js} +1 -1
  60. package/web/dist/assets/{preview-state-vuMviq6q.js → preview-state-D8-YBJ6m.js} +1 -1
  61. package/web/dist/assets/{prompt-templates-Cubdut_C.js → prompt-templates-DFeXUVOZ.js} +1 -1
  62. package/web/dist/assets/{repo-git-Cf4t5PD0.js → repo-git-DcWh5s_b.js} +1 -1
  63. package/web/dist/assets/{run-diff-BpkUW37Z.js → run-diff-1ZzFrOx1.js} +1 -1
  64. package/web/dist/assets/{run-header-68WHf9wV.js → run-header-CPoYzbAy.js} +1 -1
  65. package/web/dist/assets/{skills-DiVIgKeU.js → skills-CnLazLgF.js} +1 -1
  66. package/web/dist/assets/{status-dot-CqTJHSP9.js → status-dot-DwFmt_Jg.js} +1 -1
  67. package/web/dist/assets/{tab-link-B07Hu4QX.js → tab-link-COpvArgR.js} +1 -1
  68. package/web/dist/assets/{task-changes--lQF6EYf.js → task-changes-CY-mi-mC.js} +1 -1
  69. package/web/dist/assets/{task-commits-Cx0qy4DN.js → task-commits-EvLi8T4a.js} +1 -1
  70. package/web/dist/assets/{task-files-D50s-gKW.js → task-files-BR3d8X2U.js} +1 -1
  71. package/web/dist/assets/{task-github-item-DaqmSwYT.js → task-github-item-BVsPg9RI.js} +1 -1
  72. package/web/dist/assets/{task-thread-BPQ64lui.js → task-thread-DQCsu_v8.js} +1 -1
  73. package/web/dist/assets/{textarea-D20O4Pw0.js → textarea-BbNV5Uo2.js} +1 -1
  74. package/web/dist/assets/{thread-state-DWcFMrvb.js → thread-state-DTkIvHsU.js} +1 -1
  75. package/web/dist/assets/{use-hand-to-agent-state-Cy9eyyfL.js → use-hand-to-agent-state-DT-QBsPC.js} +1 -1
  76. package/web/dist/assets/{utils-JsL3ZsJf.js → utils-POVs3UKu.js} +1 -1
  77. package/web/dist/assets/{workflows-jwG7uxqi.js → workflows-BTE-5RwX.js} +1 -1
  78. package/web/dist/assets/{zoomable-image-BJJ64KGc.js → zoomable-image-cL1VgYK4.js} +1 -1
  79. package/web/dist/index.html +13 -13
@@ -0,0 +1,24 @@
1
+ import type { SessionTransport } from '../contract/index.js';
2
+ import type { AgentEvent, AgentRunResult, AgentRunner, AgentRunSpec, AgentSession, InputDelivery, SessionOptions } from './agent-runner.ts';
3
+ import type { CursorPrintCapabilityResult } from './cursor-print-capabilities.ts';
4
+ import type { ModelOption } from './runner-model-catalog.ts';
5
+ export interface CursorRunnerOptions {
6
+ sessionTransport?: SessionTransport;
7
+ bin?: string;
8
+ inspect?: (bin: string, spec: AgentRunSpec, signal?: AbortSignal) => Promise<CursorPrintCapabilityResult>;
9
+ makeAcp?: () => AgentRunner;
10
+ makePrint?: (models?: readonly ModelOption[]) => AgentRunner;
11
+ }
12
+ /** Selects one Cursor transport before inference; persisted identity always wins over defaults. */
13
+ export declare class CursorRunner implements AgentRunner {
14
+ private readonly options;
15
+ readonly backend: 'cursor';
16
+ readonly specSupport: Readonly<Record<keyof AgentRunSpec, import("./agent-runner.ts").SpecFieldSupport>>;
17
+ readonly systemPromptOnResume: 'in-thread';
18
+ readonly inputDelivery: InputDelivery;
19
+ private lastSession?;
20
+ constructor(options?: CursorRunnerOptions);
21
+ startSession(spec: AgentRunSpec, onEvent?: (event: AgentEvent) => void, opts?: SessionOptions): AgentSession;
22
+ run(spec: AgentRunSpec, onEvent?: (event: AgentEvent) => void): Promise<AgentRunResult>;
23
+ interrupt(): Promise<void>;
24
+ }
@@ -0,0 +1,146 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { CursorAcpRunner } from './cursor-acp-runner.js';
3
+ import { CursorPrintRunner, CURSOR_PRINT_SPEC_SUPPORT } from './cursor-print-runner.js';
4
+ import { inspectCursorPrintCapabilities } from './cursor-print-capabilities.js';
5
+ /** Selects one Cursor transport before inference; persisted identity always wins over defaults. */
6
+ export class CursorRunner {
7
+ options;
8
+ backend = 'cursor';
9
+ specSupport = CURSOR_PRINT_SPEC_SUPPORT;
10
+ systemPromptOnResume = 'in-thread';
11
+ inputDelivery = {
12
+ mode: 'boundary', consumption: 'unobservable', via: 'selected Cursor session turn boundary',
13
+ };
14
+ lastSession;
15
+ constructor(options = {}) {
16
+ this.options = options;
17
+ }
18
+ startSession(spec, onEvent, opts = {}) {
19
+ const bundledPrintMock = fileURLToPath(new URL('../../scripts/mock-cursor-print.mjs', import.meta.url));
20
+ const bin = this.options.bin ?? process.env.CEZ_CURSOR_BIN ?? (process.env.CEZ_DRY_RUN === '1'
21
+ ? bundledPrintMock : 'agent');
22
+ const isBundledMock = bin === bundledPrintMock;
23
+ const mockModels = [
24
+ { id: 'mock-default-model', label: 'Mock default', description: 'Default model' },
25
+ { id: 'mock-default-model-xhigh', label: 'Mock high effort', description: 'Mock high effort' },
26
+ ];
27
+ const select = async (signal) => {
28
+ if (this.options.sessionTransport === 'cursor-acp')
29
+ return { transport: 'cursor-acp' };
30
+ if (this.options.sessionTransport === 'cursor-print') {
31
+ if (isBundledMock) {
32
+ return { transport: 'cursor-print', models: spec.effort ? mockModels : undefined,
33
+ model: spec.effort && !spec.model ? 'mock-default-model' : undefined };
34
+ }
35
+ const capability = await (this.options.inspect ?? inspectCursorPrintCapabilities)(bin, spec, signal);
36
+ if (!capability.supported)
37
+ throw new Error(`Cursor print session cannot resume: ${capability.reason}`);
38
+ return { transport: 'cursor-print', models: capability.models, model: capability.model };
39
+ }
40
+ if (spec.resume)
41
+ return { transport: 'cursor-acp' }; // Legacy untagged Cursor ID.
42
+ if (isBundledMock) {
43
+ return { transport: 'cursor-print', models: spec.effort ? mockModels : undefined,
44
+ model: spec.effort && !spec.model ? 'mock-default-model' : undefined };
45
+ }
46
+ const capability = await (this.options.inspect ?? inspectCursorPrintCapabilities)(bin, spec, signal);
47
+ return capability.supported
48
+ ? { transport: 'cursor-print', models: capability.models, model: capability.model }
49
+ : { transport: 'cursor-acp', note: `Cursor marketplace plugins unavailable: ${capability.reason}` };
50
+ };
51
+ const makeRunner = (transport, models) => transport === 'cursor-print'
52
+ ? (this.options.makePrint?.(models) ?? new CursorPrintRunner({ bin: this.options.bin, models }))
53
+ : (this.options.makeAcp?.() ?? new CursorAcpRunner({ bin: this.options.bin }));
54
+ return this.lastSession = new SelectingCursorSession(select, makeRunner, spec, onEvent, opts);
55
+ }
56
+ run(spec, onEvent) {
57
+ return this.startSession(spec, onEvent, { autoEndAfterFirstTurn: true }).result;
58
+ }
59
+ async interrupt() { this.lastSession?.interrupt(); }
60
+ }
61
+ class SelectingCursorSession {
62
+ result;
63
+ resolveResult;
64
+ inner;
65
+ controller = new AbortController();
66
+ pendingHuman = [];
67
+ active = true;
68
+ settled = false;
69
+ constructor(select, makeRunner, spec, onEvent, opts = {}) {
70
+ this.result = new Promise(resolve => { this.resolveResult = resolve; });
71
+ void (async () => {
72
+ try {
73
+ const { transport, note, models, model } = await select(this.controller.signal);
74
+ if (!this.active)
75
+ return;
76
+ if (note)
77
+ onEvent?.({ type: 'note', message: note });
78
+ const runner = makeRunner(transport, models);
79
+ const selectedSpec = model && !spec.model ? { ...spec, model } : spec;
80
+ const inner = runner.startSession(selectedSpec, event => onEvent?.(event.type === 'session'
81
+ ? { ...event, sessionTransport: transport } : event), opts);
82
+ this.inner = inner;
83
+ if (inner.pid !== undefined)
84
+ opts.onPidChange?.(inner.pid);
85
+ for (const message of this.pendingHuman.splice(0))
86
+ inner.sendMessage(message);
87
+ const result = await inner.result;
88
+ this.settle(result);
89
+ }
90
+ catch (error) {
91
+ if (!this.active)
92
+ return;
93
+ const message = error instanceof Error ? error.message : 'Cursor transport selection failed';
94
+ onEvent?.({ type: 'error', message });
95
+ opts.onUiEvent?.({ type: 'session.error', message, fatal: true });
96
+ this.settle({ text: '', toolCalls: [], tokensUsed: 0 });
97
+ }
98
+ })();
99
+ }
100
+ settle(result) {
101
+ if (this.settled)
102
+ return;
103
+ this.settled = true;
104
+ this.active = false;
105
+ this.resolveResult(result);
106
+ }
107
+ get pid() { return this.inner?.pid; }
108
+ get open() { return this.active && (this.inner?.open ?? true); }
109
+ sendMessage(content) {
110
+ if (!this.open)
111
+ return false;
112
+ if (this.inner)
113
+ return this.inner.sendMessage(content);
114
+ this.pendingHuman.push(content);
115
+ return true;
116
+ }
117
+ sendAgentMessage(content, ids) {
118
+ return this.inner?.sendAgentMessage(content, ids) ?? false;
119
+ }
120
+ discardQueuedMessages() { this.pendingHuman = []; this.inner?.discardQueuedMessages(); }
121
+ holdsHumanInput() { return this.inner?.holdsHumanInput() ?? this.pendingHuman.length > 0; }
122
+ heldHumanInputCount() { return this.inner?.heldHumanInputCount?.() ?? this.pendingHuman.length; }
123
+ end() {
124
+ if (!this.active)
125
+ return;
126
+ if (this.inner)
127
+ this.inner.end();
128
+ else {
129
+ this.active = false;
130
+ this.controller.abort();
131
+ this.settle({ text: '', toolCalls: [], tokensUsed: 0 });
132
+ }
133
+ }
134
+ interrupt() {
135
+ if (!this.active)
136
+ return;
137
+ if (this.inner)
138
+ this.inner.interrupt();
139
+ else {
140
+ this.active = false;
141
+ this.controller.abort();
142
+ this.settle({ text: '', toolCalls: [], tokensUsed: 0 });
143
+ }
144
+ }
145
+ }
146
+ //# sourceMappingURL=cursor-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-runner.js","sourceRoot":"","sources":["../../src/core/cursor-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAMzC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAYhF,mGAAmG;AACnG,MAAM,OAAO,YAAY;IASM,OAAO;IAR3B,OAAO,GAAG,QAAiB,CAAC;IAC5B,WAAW,GAAG,yBAAyB,CAAC;IACxC,oBAAoB,GAAG,WAAoB,CAAC;IAC5C,aAAa,GAAkB;QACtC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,EAAE,uCAAuC;KAC5F,CAAC;IACM,WAAW,CAAgB;IAEnC,YAA6B,OAAO,GAAwB,EAAE;uBAAjC,OAAO;IAA6B,CAAC;IAElE,YAAY,CAAC,IAAkB,EAAE,OAAqC,EAAE,IAAI,GAAmB,EAAE;QAC/F,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,qCAAqC,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxG,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG;YAC5F,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,aAAa,GAAG,GAAG,KAAK,gBAAgB,CAAC;QAC/C,MAAM,UAAU,GAA2B;YACzC,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE;YACjF,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,EAAE;SAC/F,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,EAAE,MAAmB,EAA4G,EAAE;YACrJ,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,KAAK,YAAY;gBAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;YACvF,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,KAAK,cAAc,EAAE,CAAC;gBACrD,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;wBAC9E,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC3E,CAAC;gBACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,8BAA8B,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBACrG,IAAI,CAAC,UAAU,CAAC,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBACvG,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;YAC3F,CAAC;YACD,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,6BAA6B;YAClF,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;oBAC9E,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YAC3E,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,8BAA8B,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACrG,OAAO,UAAU,CAAC,SAAS;gBACzB,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE;gBACnF,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,2CAA2C,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QACxG,CAAC,CAAC;QACF,MAAM,UAAU,GAAG,CAAC,SAA2B,EAAE,MAA+B,EAAe,EAAE,CAAC,SAAS,KAAK,cAAc;YAC5H,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAChG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,IAAI,eAAe,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC,WAAW,GAAG,IAAI,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAChG,CAAC;IAED,GAAG,CAAC,IAAkB,EAAE,OAAqC;QAC3D,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,SAAS,KAAoB,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;CACpE;AAED,MAAM,sBAAsB;IACjB,MAAM,CAA0B;IACjC,aAAa,CAAoC;IACjD,KAAK,CAAgB;IACrB,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,YAAY,GAAqB,EAAE,CAAC;IACpC,MAAM,GAAG,IAAI,CAAC;IACd,OAAO,GAAG,KAAK,CAAC;IAExB,YACE,MAAyI,EACzI,UAAyF,EACzF,IAAkB,EAClB,OAAqC,EACrC,IAAI,GAAmB,EAAE;QAEzB,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAChF,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACzB,IAAI,IAAI;oBAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC7C,MAAM,YAAY,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;oBACzF,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC9D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBACnB,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;oBAAE,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC3D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;oBAAE,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC9E,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACzB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAC;gBAC7F,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAEO,MAAM,CAAC,MAAsB;QACnC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,GAAG,KAAyB,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,IAAI,KAAc,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACzE,WAAW,CAAC,OAAuB;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,gBAAgB,CAAC,OAAuB,EAAE,GAAuB;QAC/D,OAAO,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC;IAC7D,CAAC;IACD,qBAAqB,KAAW,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;IAC9F,eAAe,KAAc,OAAO,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACpG,mBAAmB,KAAa,OAAO,IAAI,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACzG,GAAG;QACD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;aAC5B,CAAC;YAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IACjH,CAAC;IACD,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;aAClC,CAAC;YAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IACjH,CAAC;CACF"}
@@ -47,6 +47,11 @@ type UsageListener = (usage: Record<string, ProcessUsage>) => void;
47
47
  * step) replaces the pid but keeps nothing else — peaks are per session and
48
48
  * the engine maxes them into the run record on unregister. */
49
49
  export declare function registerRunProcess(runId: string, pid: number): void;
50
+ /** Follow a replacement backend PID within the same session without losing
51
+ * peaks accumulated by its earlier processes (Cursor print starts one per turn). */
52
+ export declare function replaceRunProcess(runId: string, pid: number): void;
53
+ /** Deterministic sample injection for replacement peak regression tests. */
54
+ export declare function recordUsageSampleForTest(runId: string, usage: ProcessUsage): void;
50
55
  /** Same-process ownership proof used when rebuilding a manager/context: a
51
56
  * disposed manager may still have a live backend registered for this run. */
52
57
  export declare function hasRegisteredRunProcess(runId: string): boolean;
@@ -96,6 +96,28 @@ export function registerRunProcess(runId, pid) {
96
96
  void sample(); // first data point right away, not 2 s late
97
97
  }
98
98
  }
99
+ /** Follow a replacement backend PID within the same session without losing
100
+ * peaks accumulated by its earlier processes (Cursor print starts one per turn). */
101
+ export function replaceRunProcess(runId, pid) {
102
+ const prior = entries.get(runId);
103
+ if (!prior) {
104
+ registerRunProcess(runId, pid);
105
+ return;
106
+ }
107
+ entries.set(runId, { ...prior, pid, last: undefined });
108
+ void sample();
109
+ }
110
+ function recordUsageSample(entry, usage) {
111
+ entry.last = usage;
112
+ entry.peakRssBytes = Math.max(entry.peakRssBytes, usage.rssBytes);
113
+ entry.peakProcCount = Math.max(entry.peakProcCount, usage.procCount);
114
+ }
115
+ /** Deterministic sample injection for replacement peak regression tests. */
116
+ export function recordUsageSampleForTest(runId, usage) {
117
+ const entry = entries.get(runId);
118
+ if (entry)
119
+ recordUsageSample(entry, usage);
120
+ }
99
121
  /** Same-process ownership proof used when rebuilding a manager/context: a
100
122
  * disposed manager may still have a live backend registered for this run. */
101
123
  export function hasRegisteredRunProcess(runId) {
@@ -157,10 +179,8 @@ async function sample() {
157
179
  for (const entry of entries.values()) {
158
180
  const usage = aggregateTreeUsage(procs, entry.pid);
159
181
  entry.last = usage ?? undefined;
160
- if (usage) {
161
- entry.peakRssBytes = Math.max(entry.peakRssBytes, usage.rssBytes);
162
- entry.peakProcCount = Math.max(entry.peakProcCount, usage.procCount);
163
- }
182
+ if (usage)
183
+ recordUsageSample(entry, usage);
164
184
  }
165
185
  if (listeners.size > 0) {
166
186
  const snapshot = allUsage();
@@ -1 +1 @@
1
- {"version":3,"file":"process-usage.js","sourceRoot":"","sources":["../../src/core/process-usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process-usage.js","sourceRoot":"","sources":["../../src/core/process-usage.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  import type { AgentBackend, AgentRunner, RunnerId } from './agent-runner.ts';
2
+ import type { SessionTransport } from '../contract/index.js';
2
3
  /**
3
4
  * The single place that maps a backend id onto a concrete runner. Everything
4
5
  * that used to `new ClaudeCliRunner()` (the planner and the workflow engine)
5
6
  * goes through here so switching the agent backend is one function call.
6
7
  * `claude-cli` is the legacy id for `claude`.
7
8
  */
8
- export declare function createRunner(backend: AgentBackend | RunnerId | undefined): AgentRunner;
9
+ export declare function createRunner(backend: AgentBackend | RunnerId | undefined, options?: {
10
+ sessionTransport?: SessionTransport;
11
+ }): AgentRunner;
@@ -1,7 +1,7 @@
1
1
  import { ClaudeCliRunner } from './claude-cli-runner.js';
2
2
  import { CodexAppServerRunner } from './codex-app-server-runner.js';
3
3
  import { OpencodeServerRunner } from './opencode-server-runner.js';
4
- import { CursorAcpRunner } from './cursor-acp-runner.js';
4
+ import { CursorRunner } from './cursor-runner.js';
5
5
  import { PiRunner } from './pi-runner.js';
6
6
  import { OmpRunner } from './omp-runner.js';
7
7
  /**
@@ -10,14 +10,14 @@ import { OmpRunner } from './omp-runner.js';
10
10
  * goes through here so switching the agent backend is one function call.
11
11
  * `claude-cli` is the legacy id for `claude`.
12
12
  */
13
- export function createRunner(backend) {
13
+ export function createRunner(backend, options = {}) {
14
14
  switch (backend) {
15
15
  case 'codex':
16
16
  return new CodexAppServerRunner();
17
17
  case 'opencode':
18
18
  return new OpencodeServerRunner();
19
19
  case 'cursor':
20
- return new CursorAcpRunner();
20
+ return new CursorRunner(options);
21
21
  case 'pi':
22
22
  return new PiRunner();
23
23
  case 'omp':
@@ -1 +1 @@
1
- {"version":3,"file":"runner-factory.js","sourceRoot":"","sources":["../../src/core/runner-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4C;IACvE,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC,KAAK,UAAU;YACb,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,eAAe,EAAE,CAAC;QAC/B,KAAK,IAAI;YACP,OAAO,IAAI,QAAQ,EAAE,CAAC;QACxB,KAAK,KAAK;YACR,OAAO,IAAI,SAAS,EAAE,CAAC;QACzB,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY,CAAC;QAClB;YACE,OAAO,IAAI,eAAe,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"runner-factory.js","sourceRoot":"","sources":["../../src/core/runner-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4C,EAAE,OAAO,GAA4C,EAAE;IAC9H,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC,KAAK,UAAU;YACb,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,IAAI;YACP,OAAO,IAAI,QAAQ,EAAE,CAAC;QACxB,KAAK,KAAK;YACR,OAAO,IAAI,SAAS,EAAE,CAAC;QACzB,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY,CAAC;QAClB;YACE,OAAO,IAAI,eAAe,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -3,15 +3,6 @@ export declare function createDelegationApp(routes: DelegationRoutes): import("h
3
3
  "/discover": {
4
4
  $post: {
5
5
  output: {
6
- scope: "host-default-account";
7
- runners: {
8
- status: "connected" | "disconnected" | "not-installed" | "unknown";
9
- enabled?: boolean | undefined;
10
- hint?: string | undefined;
11
- authFailureId?: string | undefined;
12
- runner: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi";
13
- }[];
14
- } | {
15
6
  runner: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi";
16
7
  models: {
17
8
  id: string;
@@ -22,6 +13,15 @@ export declare function createDelegationApp(routes: DelegationRoutes): import("h
22
13
  source: "cache" | "live" | "unavailable";
23
14
  stale: boolean;
24
15
  reason?: string | undefined;
16
+ } | {
17
+ scope: "host-default-account";
18
+ runners: {
19
+ status: "connected" | "disconnected" | "not-installed" | "unknown";
20
+ enabled?: boolean | undefined;
21
+ hint?: string | undefined;
22
+ authFailureId?: string | undefined;
23
+ runner: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi";
24
+ }[];
25
25
  };
26
26
  outputFormat: "json";
27
27
  status: 200;
@@ -105,13 +105,13 @@ export declare function createDelegationApp(routes: DelegationRoutes): import("h
105
105
  status: 200;
106
106
  input: {
107
107
  json: {
108
- workerIds: string[];
109
- timeoutSeconds?: number | undefined;
110
- mode?: "all" | "any" | "one" | undefined;
111
- } | {
112
108
  requestIds: string[];
113
109
  mode?: "all" | "any" | "one" | undefined;
114
110
  timeoutSeconds?: number | undefined;
111
+ } | {
112
+ workerIds: string[];
113
+ timeoutSeconds?: number | undefined;
114
+ mode?: "all" | "any" | "one" | undefined;
115
115
  };
116
116
  };
117
117
  };
@@ -50,6 +50,10 @@ declare const stepStateSchema: z.ZodObject<{
50
50
  finishedAt: z.ZodOptional<z.ZodString>;
51
51
  error: z.ZodOptional<z.ZodString>;
52
52
  sessionId: z.ZodOptional<z.ZodString>;
53
+ sessionTransport: z.ZodOptional<z.ZodEnum<{
54
+ "cursor-acp": "cursor-acp";
55
+ "cursor-print": "cursor-print";
56
+ }>>;
53
57
  backend: z.ZodOptional<z.ZodPipe<z.ZodEnum<{
54
58
  claude: "claude";
55
59
  "claude-cli": "claude-cli";
@@ -764,6 +768,10 @@ export declare const runRecordSchema: z.ZodObject<{
764
768
  finishedAt: z.ZodOptional<z.ZodString>;
765
769
  error: z.ZodOptional<z.ZodString>;
766
770
  sessionId: z.ZodOptional<z.ZodString>;
771
+ sessionTransport: z.ZodOptional<z.ZodEnum<{
772
+ "cursor-acp": "cursor-acp";
773
+ "cursor-print": "cursor-print";
774
+ }>>;
767
775
  backend: z.ZodOptional<z.ZodPipe<z.ZodEnum<{
768
776
  claude: "claude";
769
777
  "claude-cli": "claude-cli";
@@ -1248,6 +1256,7 @@ export declare function parseRunRecords(raw: unknown): z.ZodSafeParseResult<{
1248
1256
  finishedAt?: string | undefined;
1249
1257
  error?: string | undefined;
1250
1258
  sessionId?: string | undefined;
1259
+ sessionTransport?: "cursor-acp" | "cursor-print" | undefined;
1251
1260
  backend?: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi" | undefined;
1252
1261
  profileId?: string | undefined;
1253
1262
  costUsd?: number | undefined;
@@ -74,6 +74,7 @@ const stepStateSchema = z.object({
74
74
  error: z.string().optional(),
75
75
  /** Latest backend-owned session id, used for same-backend Continue. */
76
76
  sessionId: z.string().optional(),
77
+ sessionTransport: z.enum(['cursor-acp', 'cursor-print']).optional(),
77
78
  /** Backend that owns `sessionId`. Optional so pre-affinity runs.json files still parse;
78
79
  * `storedRunnerSchema` so a legacy `claude-cli` folds to `claude` instead of failing (#547). */
79
80
  backend: storedRunnerSchema.optional(),