@botiverse/oar 0.15.2 → 0.16.1

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 (108) hide show
  1. package/README.md +9 -3
  2. package/dist/agents/crew.d.ts.map +1 -1
  3. package/dist/agents/crew.js +7 -1
  4. package/dist/agents/crew.js.map +1 -1
  5. package/dist/contracts/runtime.d.ts +14 -0
  6. package/dist/contracts/runtime.d.ts.map +1 -1
  7. package/dist/contracts/runtime.js.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/observe/tool-activity.d.ts +9 -2
  11. package/dist/observe/tool-activity.d.ts.map +1 -1
  12. package/dist/observe/tool-activity.js +34 -9
  13. package/dist/observe/tool-activity.js.map +1 -1
  14. package/dist/observe/tool-groups.d.ts.map +1 -1
  15. package/dist/observe/tool-groups.js +1 -0
  16. package/dist/observe/tool-groups.js.map +1 -1
  17. package/dist/runtimes/antigravity/index.d.ts +1 -0
  18. package/dist/runtimes/antigravity/index.d.ts.map +1 -1
  19. package/dist/runtimes/antigravity/index.js +2 -1
  20. package/dist/runtimes/antigravity/index.js.map +1 -1
  21. package/dist/runtimes/antigravity/session.d.ts +3 -1
  22. package/dist/runtimes/antigravity/session.d.ts.map +1 -1
  23. package/dist/runtimes/antigravity/session.js +8 -6
  24. package/dist/runtimes/antigravity/session.js.map +1 -1
  25. package/dist/runtimes/cursor/index.d.ts +7 -3
  26. package/dist/runtimes/cursor/index.d.ts.map +1 -1
  27. package/dist/runtimes/cursor/index.js +8 -3
  28. package/dist/runtimes/cursor/index.js.map +1 -1
  29. package/dist/runtimes/cursor/installation.d.ts +7 -6
  30. package/dist/runtimes/cursor/installation.d.ts.map +1 -1
  31. package/dist/runtimes/cursor/installation.js +35 -13
  32. package/dist/runtimes/cursor/installation.js.map +1 -1
  33. package/dist/runtimes/cursor/list-models.d.ts +7 -8
  34. package/dist/runtimes/cursor/list-models.d.ts.map +1 -1
  35. package/dist/runtimes/cursor/list-models.js +50 -82
  36. package/dist/runtimes/cursor/list-models.js.map +1 -1
  37. package/dist/runtimes/cursor/model.d.ts +30 -0
  38. package/dist/runtimes/cursor/model.d.ts.map +1 -0
  39. package/dist/runtimes/cursor/model.js +97 -0
  40. package/dist/runtimes/cursor/model.js.map +1 -0
  41. package/dist/runtimes/cursor/projection.d.ts +40 -0
  42. package/dist/runtimes/cursor/projection.d.ts.map +1 -0
  43. package/dist/runtimes/cursor/projection.js +205 -0
  44. package/dist/runtimes/cursor/projection.js.map +1 -0
  45. package/dist/runtimes/cursor/run.d.ts +33 -0
  46. package/dist/runtimes/cursor/run.d.ts.map +1 -0
  47. package/dist/runtimes/cursor/run.js +68 -0
  48. package/dist/runtimes/cursor/run.js.map +1 -0
  49. package/dist/runtimes/cursor/sdk.d.ts +64 -0
  50. package/dist/runtimes/cursor/sdk.d.ts.map +1 -0
  51. package/dist/runtimes/cursor/sdk.js +50 -0
  52. package/dist/runtimes/cursor/sdk.js.map +1 -0
  53. package/dist/runtimes/cursor/session.d.ts +4 -37
  54. package/dist/runtimes/cursor/session.d.ts.map +1 -1
  55. package/dist/runtimes/cursor/session.js +266 -71
  56. package/dist/runtimes/cursor/session.js.map +1 -1
  57. package/dist/runtimes/kimi/index.d.ts +1 -0
  58. package/dist/runtimes/kimi/index.d.ts.map +1 -1
  59. package/dist/runtimes/kimi/index.js +2 -1
  60. package/dist/runtimes/kimi/index.js.map +1 -1
  61. package/dist/runtimes/kimi/session.d.ts +3 -1
  62. package/dist/runtimes/kimi/session.d.ts.map +1 -1
  63. package/dist/runtimes/kimi/session.js +8 -6
  64. package/dist/runtimes/kimi/session.js.map +1 -1
  65. package/dist/shared/acp/client-app.d.ts +0 -2
  66. package/dist/shared/acp/client-app.d.ts.map +1 -1
  67. package/dist/shared/acp/client-app.js +1 -8
  68. package/dist/shared/acp/client-app.js.map +1 -1
  69. package/dist/shared/acp/effort.d.ts +1 -1
  70. package/dist/shared/acp/effort.js +1 -1
  71. package/dist/shared/acp/model.d.ts +5 -8
  72. package/dist/shared/acp/model.d.ts.map +1 -1
  73. package/dist/shared/acp/model.js +6 -14
  74. package/dist/shared/acp/model.js.map +1 -1
  75. package/dist/shared/acp/process.d.ts +0 -2
  76. package/dist/shared/acp/process.d.ts.map +1 -1
  77. package/dist/shared/acp/process.js +2 -7
  78. package/dist/shared/acp/process.js.map +1 -1
  79. package/dist/shared/acp/profile.d.ts +2 -17
  80. package/dist/shared/acp/profile.d.ts.map +1 -1
  81. package/dist/shared/acp/profile.js +1 -5
  82. package/dist/shared/acp/profile.js.map +1 -1
  83. package/dist/shared/acp/records.d.ts +1 -3
  84. package/dist/shared/acp/records.d.ts.map +1 -1
  85. package/dist/shared/acp/records.js +6 -14
  86. package/dist/shared/acp/records.js.map +1 -1
  87. package/dist/shared/acp/session.d.ts.map +1 -1
  88. package/dist/shared/acp/session.js +1 -6
  89. package/dist/shared/acp/session.js.map +1 -1
  90. package/dist/shared/failure-class.js +1 -1
  91. package/dist/shared/failure-class.js.map +1 -1
  92. package/dist/shared/session-options.d.ts +7 -0
  93. package/dist/shared/session-options.d.ts.map +1 -0
  94. package/dist/shared/session-options.js +17 -0
  95. package/dist/shared/session-options.js.map +1 -0
  96. package/dist/shared/update.d.ts +1 -1
  97. package/dist/shared/update.d.ts.map +1 -1
  98. package/dist/shared/update.js +3 -4
  99. package/dist/shared/update.js.map +1 -1
  100. package/package.json +6 -5
  101. package/dist/runtimes/cursor/update.d.ts +0 -19
  102. package/dist/runtimes/cursor/update.d.ts.map +0 -1
  103. package/dist/runtimes/cursor/update.js +0 -88
  104. package/dist/runtimes/cursor/update.js.map +0 -1
  105. package/dist/shared/acp/vendor-updates.d.ts +0 -7
  106. package/dist/shared/acp/vendor-updates.d.ts.map +0 -1
  107. package/dist/shared/acp/vendor-updates.js +0 -46
  108. package/dist/shared/acp/vendor-updates.js.map +0 -1
@@ -0,0 +1,205 @@
1
+ import { classifyFailure } from "../../shared/failure-class.js";
2
+ import { asNumber, asRecord } from "../../shared/json.js";
3
+ import { toolContent } from "../../shared/tool-output.js";
4
+ import { cursorSelectionEffort } from "./model.js";
5
+ export const initialCursorProjection = { tokens: new Map() };
6
+ /**
7
+ * A subagent speaks through its `task` call: `tool-call-delta` carries the
8
+ * child's own update under `taskUpdate`, keyed by the call id (probed
9
+ * 2026-10-03: the child's thinking, tool calls and text all arrive this way).
10
+ * SDK 1.0.35's schema allows no `tool-call-delta` inside a `taskUpdate`; if
11
+ * one ever came, it is unwrapped the same way, one call id deeper.
12
+ */
13
+ function innermost(update, path) {
14
+ const nested = asRecord(update.taskUpdate);
15
+ if (update.type === "tool-call-delta" && typeof update.callId === "string" && nested !== null) {
16
+ return innermost(nested, [...path, update.callId]);
17
+ }
18
+ return { update, path };
19
+ }
20
+ const pathKey = (path) => path.join("/");
21
+ const text = (value) => (typeof value === "string" && value.length > 0 ? value : undefined);
22
+ /**
23
+ * A tool result as content parts. Shell output is its stdout and stderr, a
24
+ * read is the file text, an edit is its diff, a failure is its message;
25
+ * every other result is kept whole as one `other` part.
26
+ */
27
+ export function cursorToolContent(tool, result) {
28
+ if (result === null) {
29
+ return undefined;
30
+ }
31
+ if (result.status === "error") {
32
+ const message = text(asRecord(result.error)?.message) ?? text(result.error);
33
+ return message === undefined ? toolContent(result.error) : [{ type: "text", text: message }];
34
+ }
35
+ const value = asRecord(result.value);
36
+ const parts = [];
37
+ const add = (part) => {
38
+ const found = text(part);
39
+ if (found !== undefined) {
40
+ parts.push({ type: "text", text: found });
41
+ }
42
+ };
43
+ switch (tool) {
44
+ case "shell":
45
+ add(value?.stdout);
46
+ add(value?.stderr);
47
+ // The command ran and printed nothing: a result, with empty text.
48
+ return parts.length === 0 ? [{ type: "text", text: "" }] : parts;
49
+ case "read":
50
+ add(value?.content);
51
+ break;
52
+ case "edit":
53
+ case "write":
54
+ add(value?.diffString);
55
+ break;
56
+ default:
57
+ break;
58
+ }
59
+ return parts.length > 0 ? parts : toolContent(result.value);
60
+ }
61
+ function toolOutcome(status) {
62
+ if (status === "success") {
63
+ return "ok";
64
+ }
65
+ return status === "error" ? "failed" : undefined;
66
+ }
67
+ /** A shell's exit code, or `null` when cursor names the signal that ended it. */
68
+ function shellExit(tool, result) {
69
+ const value = tool === "shell" && result?.status === "success" ? asRecord(result.value) : null;
70
+ if (value === null) {
71
+ return {};
72
+ }
73
+ if (typeof value.signal === "string" && value.signal !== "") {
74
+ return { exitCode: null };
75
+ }
76
+ const exitCode = asNumber(value.exitCode);
77
+ return exitCode === null ? {} : { exitCode };
78
+ }
79
+ function toolEnded(update) {
80
+ const callId = text(update.callId);
81
+ if (callId === undefined) {
82
+ return null;
83
+ }
84
+ const call = asRecord(update.toolCall);
85
+ const tool = text(call?.type) ?? "unknown";
86
+ const result = asRecord(call?.result);
87
+ const content = cursorToolContent(tool, result);
88
+ const outcome = toolOutcome(result?.status);
89
+ return {
90
+ kind: "tool_call_ended",
91
+ callId,
92
+ ...(content === undefined ? {} : { content }),
93
+ ...(outcome === undefined ? {} : { result: outcome }),
94
+ ...shellExit(tool, result),
95
+ };
96
+ }
97
+ function eventsOf(state, update, path) {
98
+ switch (update.type) {
99
+ case "text-delta": {
100
+ const delta = text(update.text);
101
+ return { state, events: delta === undefined ? [] : [{ kind: "text_delta", text: delta }] };
102
+ }
103
+ case "thinking-delta": {
104
+ const delta = text(update.text);
105
+ return { state, events: delta === undefined ? [] : [{ kind: "reasoning", content: { kind: "text", text: delta } }] };
106
+ }
107
+ case "tool-call-started": {
108
+ const callId = text(update.callId);
109
+ const call = asRecord(update.toolCall);
110
+ if (callId === undefined) {
111
+ return { state, events: [] };
112
+ }
113
+ const started = { kind: "tool_call_started", callId, tool: text(call?.type) ?? "unknown" };
114
+ return { state, events: [call?.args === undefined ? started : { ...started, input: JSON.stringify(call.args) }] };
115
+ }
116
+ case "tool-call-completed": {
117
+ const ended = toolEnded(update);
118
+ return { state, events: ended === null ? [] : [ended] };
119
+ }
120
+ case "user-message-appended": {
121
+ // A user message entered the conversation (a delivered steer, probed):
122
+ // text only, so no input id is claimed (docs/spec/conversation.md).
123
+ const input = asRecord(update.userMessage)?.text;
124
+ return { state, events: typeof input === "string" ? [{ kind: "user_message", input, evidence: "conversation" }] : [] };
125
+ }
126
+ case "turn-ended": {
127
+ const usage = asRecord(update.usage);
128
+ if (usage === null) {
129
+ return { state, events: [] };
130
+ }
131
+ const previous = state.tokens.get(pathKey(path)) ?? { input: 0, output: 0 };
132
+ // `inputTokens` excludes cache reads and writes (totalTokens is the sum
133
+ // of all four), so input counts them back in, as claude's and pi's do.
134
+ const tokens = {
135
+ input: previous.input + (asNumber(usage.inputTokens) ?? 0) + (asNumber(usage.cacheReadTokens) ?? 0) + (asNumber(usage.cacheWriteTokens) ?? 0),
136
+ output: previous.output + (asNumber(usage.outputTokens) ?? 0),
137
+ };
138
+ return { state: { tokens: new Map([...state.tokens, [pathKey(path), tokens]]) }, events: [{ kind: "usage", usage: { tokens } }] };
139
+ }
140
+ default:
141
+ return { state, events: [] };
142
+ }
143
+ }
144
+ /** One `onDelta` update as one frame, attributed to the subagent it came from. */
145
+ export function foldCursorDelta(state, native) {
146
+ const outer = asRecord(native) ?? {};
147
+ const { update, path } = innermost(outer, []);
148
+ const read = eventsOf(state, update, path);
149
+ return { state: read.state, frame: { type: text(outer.type) ?? "unknown", native, events: read.events, agentPath: path } };
150
+ }
151
+ function selectionEvents(selection) {
152
+ if (selection === undefined) {
153
+ return [];
154
+ }
155
+ const effort = cursorSelectionEffort(selection);
156
+ return [{ kind: "model", model: selection.id }, ...(effort === null ? [] : [{ kind: "effort", effort }])];
157
+ }
158
+ /**
159
+ * The agent as the SDK holds it after open: its id and model selection (the
160
+ * SDK has resolved an alias to the catalog id, `composer` → `composer-2.5`).
161
+ */
162
+ export function cursorOpenedFrame(agentId, model) {
163
+ return { type: "cursor/agent_opened", native: { agentId, model }, events: selectionEvents(model), agentPath: [] };
164
+ }
165
+ /**
166
+ * `run.wait()`'s answer: the run's status is the turn's outcome (`finished`,
167
+ * `cancelled`, `error` with the SDK's message), and its `model` is what the
168
+ * SDK records the run ran with.
169
+ */
170
+ export function cursorRunResultFrame(result) {
171
+ const record = asRecord(result) ?? {};
172
+ const model = asRecord(record.model);
173
+ const selection = typeof model?.id === "string"
174
+ ? {
175
+ id: model.id,
176
+ params: (Array.isArray(model.params) ? model.params : []).flatMap((param) => {
177
+ const entry = asRecord(param);
178
+ return typeof entry?.id === "string" && typeof entry.value === "string" ? [{ id: entry.id, value: entry.value }] : [];
179
+ }),
180
+ }
181
+ : undefined;
182
+ return { type: "cursor/run_result", native: result, events: [...selectionEvents(selection), { kind: "turn_ended", outcome: runOutcome(record) }], agentPath: [] };
183
+ }
184
+ function runOutcome(result) {
185
+ switch (result.status) {
186
+ case "finished":
187
+ return { kind: "completed" };
188
+ case "cancelled":
189
+ return { kind: "aborted" };
190
+ default: {
191
+ const reason = text(asRecord(result.error)?.message) ?? `cursor run ended with status ${String(result.status)}`;
192
+ return { kind: "failed", reason, failure: classifyFailure(reason) };
193
+ }
194
+ }
195
+ }
196
+ /** `run.wait()` rejected instead of answering: the SDK's own message ends the turn. */
197
+ export function cursorRunFailedFrame(message) {
198
+ return {
199
+ type: "cursor/run_failed",
200
+ native: { message },
201
+ events: [{ kind: "turn_ended", outcome: { kind: "failed", reason: message, failure: classifyFailure(message) } }],
202
+ agentPath: [],
203
+ };
204
+ }
205
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/runtimes/cursor/projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { ResponseBody } from "../../contracts/session.js";
2
+ import { type CursorFrame } from "./projection.js";
3
+ import type { CursorRun } from "./sdk.js";
4
+ export interface ActiveRun {
5
+ readonly run: CursorRun;
6
+ /** Settles once the run's end is in the stream. */
7
+ readonly ended: Promise<void>;
8
+ }
9
+ /**
10
+ * One `send` on its way to a run. The prompt's answer waits on `decided`;
11
+ * an abort that arrives first is held in `abortRequested`; a dispose or the
12
+ * send deadline gives the launch up, and a run the SDK returns after that is
13
+ * stopped rather than adopted. Each launch is its own object, so a later one
14
+ * never reads or clears an earlier one's state.
15
+ */
16
+ export interface Launch {
17
+ state: "sending" | "sent" | "failed" | "given_up";
18
+ abortRequested: boolean;
19
+ current: ActiveRun | null;
20
+ /** Why it was not sent: the SDK's error, or the reason it was given up. */
21
+ reason: string;
22
+ readonly decided: Promise<void>;
23
+ readonly decide: () => void;
24
+ }
25
+ export declare function newLaunch(): Launch;
26
+ export declare function giveUp(launch: Launch, reason: string): void;
27
+ /**
28
+ * A run the SDK returned after its launch was given up: it did start, so it
29
+ * is stopped, and its end still enters the stream.
30
+ */
31
+ export declare function stopOrphan(run: CursorRun, record: (frame: CursorFrame) => void): void;
32
+ export declare function steerRun(current: ActiveRun, input: string): Promise<ResponseBody>;
33
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/runtimes/cursor/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAA8C,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,UAAU,CAAC;AAE3D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM3D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAarF;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAiCvF"}
@@ -0,0 +1,68 @@
1
+ import { cursorRunFailedFrame, cursorRunResultFrame } from "./projection.js";
2
+ export function newLaunch() {
3
+ const { promise, resolve } = Promise.withResolvers();
4
+ return { state: "sending", abortRequested: false, current: null, reason: "", decided: promise, decide: resolve };
5
+ }
6
+ export function giveUp(launch, reason) {
7
+ if (launch.state === "sending") {
8
+ launch.state = "given_up";
9
+ launch.reason = reason;
10
+ launch.decide();
11
+ }
12
+ }
13
+ /**
14
+ * A run the SDK returned after its launch was given up: it did start, so it
15
+ * is stopped, and its end still enters the stream.
16
+ */
17
+ export function stopOrphan(run, record) {
18
+ void (async () => {
19
+ try {
20
+ await run.cancel();
21
+ }
22
+ catch {
23
+ // It may have ended on its own.
24
+ }
25
+ try {
26
+ record(cursorRunResultFrame(await run.wait()));
27
+ }
28
+ catch (error) {
29
+ record(cursorRunFailedFrame(error instanceof Error ? error.message : String(error)));
30
+ }
31
+ })();
32
+ }
33
+ export async function steerRun(current, input) {
34
+ const steer = current.run.steer?.bind(current.run);
35
+ if (steer === undefined) {
36
+ return { kind: "rejected", code: "unsupported", reason: "not_steerable: this cursor run takes no mid-run input" };
37
+ }
38
+ // `run.steer` settles once the agent took the text ("complete_delivered")
39
+ // or handed it back ("revert_to_followup"); a run that ends first must
40
+ // not leave the request unanswered, and a steer it outran must not reject
41
+ // unobserved.
42
+ const delivery = (async () => {
43
+ try {
44
+ return await steer(input);
45
+ }
46
+ catch (error) {
47
+ return error instanceof Error ? error : new Error(String(error));
48
+ }
49
+ })();
50
+ const runEnded = (async () => {
51
+ await current.ended;
52
+ return null;
53
+ })();
54
+ const ack = await Promise.race([delivery, runEnded]);
55
+ if (ack instanceof Error) {
56
+ throw ack;
57
+ }
58
+ if (ack === "complete_delivered") {
59
+ return { kind: "accepted", native: { ack } };
60
+ }
61
+ return {
62
+ kind: "rejected",
63
+ code: "runtime_refused",
64
+ reason: ack === null ? "not_steerable: the run ended before cursor took the input" : `not_steerable: cursor handed the input back (${ack})`,
65
+ ...(ack === null ? {} : { native: { ack } }),
66
+ };
67
+ }
68
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/runtimes/cursor/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { ModelListItem, ModelSelection, RunResult, SDKUserMessage, SteerAckOutcome } from "@cursor/sdk";
2
+ export type { ModelListItem, ModelSelection, RunResult, SteerAckOutcome } from "@cursor/sdk";
3
+ export type CursorDeltaListener = (args: {
4
+ readonly update: unknown;
5
+ }) => void;
6
+ /** One send: a run of the agent loop until the agent ends it. */
7
+ export interface CursorRun {
8
+ readonly id: string;
9
+ /** Settles with the run's status once it ends (finished, error or cancelled). */
10
+ wait(): Promise<RunResult>;
11
+ cancel(): Promise<void>;
12
+ /** Present on runs that take mid-run input; settles once the agent took the text or handed it back. */
13
+ steer?(text: string): Promise<SteerAckOutcome>;
14
+ }
15
+ export interface CursorAgent {
16
+ readonly agentId: string;
17
+ readonly model: ModelSelection | undefined;
18
+ /** `local.force` takes the agent over from a run its store still holds as active. */
19
+ send(message: string | SDKUserMessage, options: {
20
+ readonly onDelta: CursorDeltaListener;
21
+ readonly local?: {
22
+ readonly force: boolean;
23
+ };
24
+ }): Promise<CursorRun>;
25
+ close(): void;
26
+ }
27
+ export interface CursorAgentOptions {
28
+ readonly model: ModelSelection;
29
+ readonly local: {
30
+ readonly cwd: string;
31
+ readonly sandboxOptions: {
32
+ readonly enabled: boolean;
33
+ };
34
+ };
35
+ }
36
+ export interface CursorSdk {
37
+ readonly Agent: {
38
+ create(options: CursorAgentOptions): Promise<CursorAgent>;
39
+ resume(agentId: string, options: CursorAgentOptions): Promise<CursorAgent>;
40
+ listRuns(agentId: string, options: {
41
+ readonly runtime: "local";
42
+ readonly cwd: string;
43
+ readonly cursor?: string;
44
+ }): Promise<{
45
+ readonly items: readonly {
46
+ readonly model?: ModelSelection;
47
+ readonly createdAt?: number;
48
+ }[];
49
+ readonly nextCursor?: string;
50
+ }>;
51
+ };
52
+ readonly Cursor: {
53
+ readonly models: {
54
+ list(): Promise<readonly ModelListItem[]>;
55
+ };
56
+ };
57
+ }
58
+ /**
59
+ * The SDK is loaded on first use, not with OAR: it is a large bundle with a
60
+ * native companion package per platform, and a host that never opens cursor
61
+ * should not pay for it.
62
+ */
63
+ export declare function loadCursorSdk(): Promise<CursorSdk>;
64
+ //# sourceMappingURL=sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/runtimes/cursor/sdk.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7G,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAS7F,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,KAAK,IAAI,CAAC;AAE/E,iEAAiE;AACjE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,uGAAuG;IACvG,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,qFAAqF;IACrF,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7J,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,cAAc,EAAE;YAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;CAClG;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE;QACd,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;YAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC;YACzH,QAAQ,CAAC,KAAK,EAAE,SAAS;gBAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;gBAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;aAAE,EAAE,CAAC;YAC5F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;SAC9B,CAAC,CAAC;KACJ,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,MAAM,EAAE;YAAE,IAAI,IAAI,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAAA;SAAE,CAAC;KAChE,CAAC;CACH;AAyCD;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,CAIxD"}
@@ -0,0 +1,50 @@
1
+ import { createRequire } from "node:module";
2
+ import path from "node:path";
3
+ let loading = null;
4
+ /**
5
+ * The SDK's native companion (`@cursor/sdk-<platform>-<arch>`: ripgrep and
6
+ * the tree-sitter shell parser) is found by walking up from the host's entry
7
+ * script for `node_modules/<package>`, which misses it in any layout that
8
+ * does not hoist it (pnpm's, a bundled host): the agent then warns "tree-sitter
9
+ * natives are unavailable" and searches without its own ripgrep. Resolved
10
+ * from the SDK itself, the package is found wherever it was installed, and
11
+ * the SDK's own variables point at it, unless the host set them.
12
+ */
13
+ function nativePackageRoot() {
14
+ try {
15
+ const fromSdk = createRequire(import.meta.resolve("@cursor/sdk"));
16
+ return path.dirname(fromSdk.resolve(`@cursor/sdk-${process.platform}-${process.arch}/package.json`));
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function pointSdkAtNativePackage() {
23
+ const root = nativePackageRoot();
24
+ if (root === null) {
25
+ return;
26
+ }
27
+ process.env.CURSOR_TREE_SITTER_VENDOR_DIR ??= path.join(root, "vendor");
28
+ process.env.CURSOR_RIPGREP_PATH ??= path.join(root, "bin", process.platform === "win32" ? "rg.exe" : "rg");
29
+ }
30
+ async function importSdk() {
31
+ try {
32
+ pointSdkAtNativePackage();
33
+ return await import("@cursor/sdk");
34
+ }
35
+ catch (error) {
36
+ loading = null;
37
+ throw error;
38
+ }
39
+ }
40
+ /**
41
+ * The SDK is loaded on first use, not with OAR: it is a large bundle with a
42
+ * native companion package per platform, and a host that never opens cursor
43
+ * should not pay for it.
44
+ */
45
+ export async function loadCursorSdk() {
46
+ loading ??= importSdk();
47
+ const sdk = await loading;
48
+ return sdk;
49
+ }
50
+ //# sourceMappingURL=sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../../src/runtimes/cursor/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAmD7B,IAAI,OAAO,GAA8B,IAAI,CAAC;AAE9C;;;;;;;;GAQG;AACH,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;IACvG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB;IAC9B,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7G,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,IAAI,CAAC;QACH,uBAAuB,EAAE,CAAC;QAC1B,OAAO,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,KAAK,SAAS,EAAE,CAAC;IACxB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;IAC1B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,38 +1,5 @@
1
- import { type AcpSessionProfile } from "../../shared/acp/session.js";
2
- import { type JsonRecord } from "../../shared/json.js";
3
- export declare function selectCursorAuthMethod(initialized: JsonRecord): string | undefined;
4
- /**
5
- * Without `parameterizedModelPicker` cursor-agent 2026.09.28 answers in its
6
- * "variants" picker mode: every model and effort pair is one flat `model`
7
- * value and no `thought_level` option exists. With it, `model` lists plain
8
- * model names and each model parameter is its own select option, the
9
- * reasoning one under category `thought_level`. Without `subagents` a child
10
- * is visible only as the parent's `task` tool call.
11
- */
12
- export declare function cursorClientCapabilitiesMeta(): JsonRecord;
13
- /**
14
- * With the `subagents` opt-in cursor-agent 2026.09.28 announces each child on
15
- * the parent's own `session/update` (`subagent_spawned`, then
16
- * `subagent_state_update` with completed, failed, cancelled or disconnected),
17
- * and the child's standard updates arrive under its own session id.
18
- */
19
- export declare const CURSOR_VENDOR_SESSION_UPDATES: readonly string[];
20
- /**
21
- * `--force` (alias `--yolo`) is a root option, so it precedes the hidden
22
- * `acp` subcommand. It runs commands without asking; a team whose admin
23
- * controls auto run can still switch it off, and then the agent asks
24
- * through `session/request_permission`.
25
- */
26
- export declare const cursorAcpArgs: readonly string[];
27
- /**
28
- * Requests cursor-agent 2026.09.28 sends its client beyond standard ACP. oar
29
- * implements none: each is recorded and refused with `-32601`, as an
30
- * unregistered method would be. On that refusal `cursor/ask_question` asks
31
- * one `session/request_permission` per single select question (oar picks its
32
- * first option), `cursor/create_plan` writes the plan to a local file, and
33
- * the rest were notices the agent does not wait on.
34
- */
35
- export declare const CURSOR_EXTENSION_REQUESTS: readonly string[];
36
- export declare const cursorAcpProfile: AcpSessionProfile;
37
- export declare const cursorSession: import("../../contracts/session.js").StartSession;
1
+ import type { StartSession } from "../../contracts/session.js";
2
+ import { type CursorSdk } from "./sdk.js";
3
+ export declare function cursorSessionWith(load: () => Promise<CursorSdk>): StartSession;
4
+ export declare const cursorSession: StartSession;
38
5
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtimes/cursor/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjE,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOlF;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,IAAI,UAAU,CAEzD;AAED;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAAkD,CAAC;AAQ9G;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,MAAM,EAAuB,CAAC;AAEnE;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAMtD,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,iBAgB9B,CAAC;AAEF,eAAO,MAAM,aAAa,mDAA+B,CAAC"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtimes/cursor/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMV,YAAY,EACb,MAAM,4BAA4B,CAAC;AAgBpC,OAAO,EAA2D,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAuBnG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,YAAY,CAuP9E;AAED,eAAO,MAAM,aAAa,EAAE,YAA+C,CAAC"}