@botiverse/oar 0.15.1 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/observe/session-view-events.d.ts.map +1 -1
- package/dist/observe/session-view-events.js +2 -0
- package/dist/observe/session-view-events.js.map +1 -1
- package/dist/observe/session-view-fold.js +1 -1
- package/dist/observe/session-view-fold.js.map +1 -1
- package/dist/observe/session-view.d.ts +12 -0
- package/dist/observe/session-view.d.ts.map +1 -1
- package/dist/observe/session-view.js.map +1 -1
- package/dist/observe/tool-activity.d.ts +9 -2
- package/dist/observe/tool-activity.d.ts.map +1 -1
- package/dist/observe/tool-activity.js +34 -9
- package/dist/observe/tool-activity.js.map +1 -1
- package/dist/observe/tool-groups.d.ts.map +1 -1
- package/dist/observe/tool-groups.js +1 -0
- package/dist/observe/tool-groups.js.map +1 -1
- package/dist/runtimes/cursor/index.d.ts +6 -3
- package/dist/runtimes/cursor/index.d.ts.map +1 -1
- package/dist/runtimes/cursor/index.js +6 -3
- package/dist/runtimes/cursor/index.js.map +1 -1
- package/dist/runtimes/cursor/installation.d.ts +7 -6
- package/dist/runtimes/cursor/installation.d.ts.map +1 -1
- package/dist/runtimes/cursor/installation.js +35 -13
- package/dist/runtimes/cursor/installation.js.map +1 -1
- package/dist/runtimes/cursor/list-models.d.ts +7 -8
- package/dist/runtimes/cursor/list-models.d.ts.map +1 -1
- package/dist/runtimes/cursor/list-models.js +50 -82
- package/dist/runtimes/cursor/list-models.js.map +1 -1
- package/dist/runtimes/cursor/model.d.ts +25 -0
- package/dist/runtimes/cursor/model.d.ts.map +1 -0
- package/dist/runtimes/cursor/model.js +98 -0
- package/dist/runtimes/cursor/model.js.map +1 -0
- package/dist/runtimes/cursor/projection.d.ts +40 -0
- package/dist/runtimes/cursor/projection.d.ts.map +1 -0
- package/dist/runtimes/cursor/projection.js +205 -0
- package/dist/runtimes/cursor/projection.js.map +1 -0
- package/dist/runtimes/cursor/run.d.ts +33 -0
- package/dist/runtimes/cursor/run.d.ts.map +1 -0
- package/dist/runtimes/cursor/run.js +68 -0
- package/dist/runtimes/cursor/run.js.map +1 -0
- package/dist/runtimes/cursor/sdk.d.ts +64 -0
- package/dist/runtimes/cursor/sdk.d.ts.map +1 -0
- package/dist/runtimes/cursor/sdk.js +50 -0
- package/dist/runtimes/cursor/sdk.js.map +1 -0
- package/dist/runtimes/cursor/session.d.ts +4 -37
- package/dist/runtimes/cursor/session.d.ts.map +1 -1
- package/dist/runtimes/cursor/session.js +265 -71
- package/dist/runtimes/cursor/session.js.map +1 -1
- package/dist/shared/acp/client-app.d.ts +0 -2
- package/dist/shared/acp/client-app.d.ts.map +1 -1
- package/dist/shared/acp/client-app.js +1 -8
- package/dist/shared/acp/client-app.js.map +1 -1
- package/dist/shared/acp/effort.d.ts +1 -1
- package/dist/shared/acp/effort.js +1 -1
- package/dist/shared/acp/model.d.ts +5 -8
- package/dist/shared/acp/model.d.ts.map +1 -1
- package/dist/shared/acp/model.js +6 -14
- package/dist/shared/acp/model.js.map +1 -1
- package/dist/shared/acp/process.d.ts +0 -2
- package/dist/shared/acp/process.d.ts.map +1 -1
- package/dist/shared/acp/process.js +2 -7
- package/dist/shared/acp/process.js.map +1 -1
- package/dist/shared/acp/profile.d.ts +2 -17
- package/dist/shared/acp/profile.d.ts.map +1 -1
- package/dist/shared/acp/profile.js +1 -5
- package/dist/shared/acp/profile.js.map +1 -1
- package/dist/shared/acp/records.d.ts +1 -3
- package/dist/shared/acp/records.d.ts.map +1 -1
- package/dist/shared/acp/records.js +6 -14
- package/dist/shared/acp/records.js.map +1 -1
- package/dist/shared/acp/session.d.ts.map +1 -1
- package/dist/shared/acp/session.js +1 -6
- package/dist/shared/acp/session.js.map +1 -1
- package/dist/shared/failure-class.js +1 -1
- package/dist/shared/failure-class.js.map +1 -1
- package/dist/shared/update.d.ts +1 -1
- package/dist/shared/update.d.ts.map +1 -1
- package/dist/shared/update.js +3 -4
- package/dist/shared/update.js.map +1 -1
- package/package.json +6 -5
- package/dist/runtimes/cursor/update.d.ts +0 -19
- package/dist/runtimes/cursor/update.d.ts.map +0 -1
- package/dist/runtimes/cursor/update.js +0 -88
- package/dist/runtimes/cursor/update.js.map +0 -1
- package/dist/shared/acp/vendor-updates.d.ts +0 -7
- package/dist/shared/acp/vendor-updates.d.ts.map +0 -1
- package/dist/shared/acp/vendor-updates.js +0 -46
- package/dist/shared/acp/vendor-updates.js.map +0 -1
|
@@ -1,92 +1,60 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import { acpThoughtLevelOption } from "../../shared/acp/model.js";
|
|
4
|
-
import { startAcpProcess, withAcpDeadline } from "../../shared/acp/process.js";
|
|
5
|
-
import { asRecord, asRecordList } from "../../shared/json.js";
|
|
6
|
-
import { cursorAcpArgs, cursorClientCapabilitiesMeta, selectCursorAuthMethod } from "./session.js";
|
|
7
|
-
const listMethod = "cursor/list_available_models";
|
|
8
|
-
function text(value) {
|
|
9
|
-
if (typeof value !== "string") {
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
const trimmed = value.trim();
|
|
13
|
-
return trimmed.length > 0 ? trimmed : undefined;
|
|
14
|
-
}
|
|
1
|
+
import { cursorEffortParameter } from "./model.js";
|
|
2
|
+
import { loadCursorSdk } from "./sdk.js";
|
|
15
3
|
/**
|
|
16
|
-
* Project
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* at their default values. The reasoning parameter is the `thought_level`
|
|
21
|
-
* option a session would set for that model (`acpThoughtLevelOption`: the
|
|
22
|
-
* `effort` menu over the `thinking` switch when a Claude model has both).
|
|
4
|
+
* Project `Cursor.models.list()` (SDK 1.0.35): `id` is the selector the SDK
|
|
5
|
+
* accepts, the effort menu is the model's reasoning parameter
|
|
6
|
+
* (`cursorEffortParameter`), and the default effort is that parameter's
|
|
7
|
+
* value in the variant the catalog marks `isDefault`.
|
|
23
8
|
*/
|
|
24
|
-
export function projectCursorModels(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
if (id === undefined) {
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
const displayName = text(model.name);
|
|
32
|
-
const thoughtLevel = acpThoughtLevelOption({ configOptions: model.configOptions }) ?? undefined;
|
|
33
|
-
const effortLevels = thoughtLevel === undefined
|
|
9
|
+
export function projectCursorModels(models) {
|
|
10
|
+
return models.map((model) => {
|
|
11
|
+
const parameter = cursorEffortParameter(model);
|
|
12
|
+
const defaultEffort = parameter === null
|
|
34
13
|
? undefined
|
|
35
|
-
:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
id,
|
|
39
|
-
...(
|
|
40
|
-
...(effortLevels === undefined || effortLevels.length === 0 ? {} : { effortLevels }),
|
|
14
|
+
: model.variants?.find((variant) => variant.isDefault === true)?.params.find((param) => param.id === parameter.id)?.value;
|
|
15
|
+
return {
|
|
16
|
+
id: model.id,
|
|
17
|
+
...(model.displayName === "" || model.displayName === model.id ? {} : { displayName: model.displayName }),
|
|
18
|
+
...(parameter === null || parameter.levels.length === 0 ? {} : { effortLevels: parameter.levels }),
|
|
41
19
|
...(defaultEffort === undefined ? {} : { defaultEffort }),
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return entries;
|
|
20
|
+
};
|
|
21
|
+
});
|
|
45
22
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const response = await withAcpDeadline(runtime, initialize, timeoutMs, (requestOptions) => runtime.connection.agent.request(initialize, {
|
|
51
|
-
protocolVersion: PROTOCOL_VERSION,
|
|
52
|
-
clientCapabilities: {
|
|
53
|
-
fs: { readTextFile: false, writeTextFile: false },
|
|
54
|
-
terminal: false,
|
|
55
|
-
_meta: cursorClientCapabilitiesMeta(),
|
|
56
|
-
},
|
|
57
|
-
clientInfo: { name: "oar", version: "0.0.0" },
|
|
58
|
-
}, requestOptions));
|
|
59
|
-
const method = selectCursorAuthMethod(asRecord(response) ?? {});
|
|
60
|
-
if (method !== undefined) {
|
|
61
|
-
const authenticate = methods.agent.authenticate;
|
|
62
|
-
await withAcpDeadline(runtime, authenticate, timeoutMs, (requestOptions) => runtime.connection.agent.request(authenticate, { methodId: method }, requestOptions));
|
|
63
|
-
}
|
|
64
|
-
return await withAcpDeadline(runtime, listMethod, timeoutMs, (requestOptions) => runtime.connection.agent.request(listMethod, {}, requestOptions));
|
|
65
|
-
}
|
|
66
|
-
finally {
|
|
67
|
-
runtime.kill();
|
|
68
|
-
await runtime.exited;
|
|
23
|
+
/** Without a credential the SDK refuses before asking (`ConfigurationError`: "API key is required …"). */
|
|
24
|
+
function unauthenticated(error) {
|
|
25
|
+
if (!(error instanceof Error)) {
|
|
26
|
+
return null;
|
|
69
27
|
}
|
|
28
|
+
return error.name === "AuthenticationError" || /api key is required|invalid (?:user )?api key/iu.test(error.message)
|
|
29
|
+
? error.message
|
|
30
|
+
: null;
|
|
70
31
|
}
|
|
71
|
-
export
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
32
|
+
export function cursorListModelsWith(load) {
|
|
33
|
+
return async (installation, options = {}) => {
|
|
34
|
+
if (installation.via !== "bundled") {
|
|
35
|
+
return { kind: "unsupported", reason: "cursor model listing needs the bundled @cursor/sdk" };
|
|
36
|
+
}
|
|
37
|
+
const timeoutMs = options.timeoutMs ?? 15_000;
|
|
38
|
+
try {
|
|
39
|
+
const sdk = await load();
|
|
40
|
+
const models = await Promise.race([
|
|
41
|
+
sdk.Cursor.models.list(),
|
|
42
|
+
new Promise((_resolve, reject) => {
|
|
43
|
+
setTimeout(() => {
|
|
44
|
+
reject(new Error(`Cursor.models.list() did not answer within ${String(timeoutMs)} ms`));
|
|
45
|
+
}, timeoutMs).unref();
|
|
46
|
+
}),
|
|
47
|
+
]);
|
|
48
|
+
return { kind: "ok", models: projectCursorModels(models) };
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const detail = unauthenticated(error);
|
|
52
|
+
if (detail !== null) {
|
|
53
|
+
return { kind: "unauthenticated", detail };
|
|
87
54
|
}
|
|
55
|
+
throw new Error("Failed to list Cursor models", { cause: error });
|
|
88
56
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export const cursorListModels = cursorListModelsWith(loadCursorSdk);
|
|
92
60
|
//# sourceMappingURL=list-models.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../../src/runtimes/cursor/list-models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../../src/runtimes/cursor/list-models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SessionOptions } from "../../contracts/session.js";
|
|
2
|
+
import type { CursorSdk, ModelListItem, ModelSelection } from "./sdk.js";
|
|
3
|
+
/** The catalog's "Auto" entry; a local agent needs a model, and this is the one Cursor picks for the user. */
|
|
4
|
+
export declare const CURSOR_DEFAULT_MODEL = "default";
|
|
5
|
+
export declare function cursorEffortParameter(model: ModelListItem): {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly levels: readonly string[];
|
|
8
|
+
} | null;
|
|
9
|
+
/** The effort a selection carries, by the same parameter preference. */
|
|
10
|
+
export declare function cursorSelectionEffort(selection: ModelSelection | undefined): string | null;
|
|
11
|
+
/**
|
|
12
|
+
* The selection a session opens with. A local agent always needs one, and a
|
|
13
|
+
* resumed agent does not restore its own, so on resume without a model the
|
|
14
|
+
* agent's latest recorded run says what it ran. A requested effort is
|
|
15
|
+
* checked against the model's own parameter menu, because the SDK passes an
|
|
16
|
+
* unknown value through unchecked and reports it back as given (probed
|
|
17
|
+
* 2026-10-03: `reasoning: "ludicrous"` ran and came back verbatim). It
|
|
18
|
+
* replaces only that parameter: the other parameters stay as the resumed run
|
|
19
|
+
* had them, or as the catalog's default variant sets them (a `thinking`
|
|
20
|
+
* switch stays on beside an `effort` level).
|
|
21
|
+
*/
|
|
22
|
+
/** Options the SDK cannot honor, refused before anything opens. */
|
|
23
|
+
export declare function validateCursorOptions(options: SessionOptions): void;
|
|
24
|
+
export declare function cursorModelSelection(sdk: CursorSdk, options: SessionOptions): Promise<ModelSelection>;
|
|
25
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/runtimes/cursor/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAczE,8GAA8G;AAC9G,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAS9H;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAS1F;AAMD;;;;;;;;;;GAUG;AACH,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CASnE;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAsB3G"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor's catalog (`Cursor.models.list()`, SDK 1.0.35) gives each model its
|
|
3
|
+
* own parameters, and the reasoning one has a different id per family:
|
|
4
|
+
* `effort` (Claude 5, Grok 4.6), `reasoning` (GPT), `reasoning_effort`
|
|
5
|
+
* (Grok 4.7, Gemini 3.8, Claude Sonnet 5.5). Several Claude models also have
|
|
6
|
+
* a `thinking` on/off switch; the level menu wins over it, and a model whose
|
|
7
|
+
* only reasoning parameter is the switch (claude-haiku-4-5) keeps it.
|
|
8
|
+
*/
|
|
9
|
+
const LEVEL_PARAMETERS = ["effort", "reasoning", "reasoning_effort"];
|
|
10
|
+
const SWITCH_PARAMETER = "thinking";
|
|
11
|
+
const EFFORT_PARAMETERS = [...LEVEL_PARAMETERS, SWITCH_PARAMETER];
|
|
12
|
+
/** The catalog's "Auto" entry; a local agent needs a model, and this is the one Cursor picks for the user. */
|
|
13
|
+
export const CURSOR_DEFAULT_MODEL = "default";
|
|
14
|
+
export function cursorEffortParameter(model) {
|
|
15
|
+
const parameters = model.parameters ?? [];
|
|
16
|
+
for (const id of EFFORT_PARAMETERS) {
|
|
17
|
+
const parameter = parameters.find((entry) => entry.id === id);
|
|
18
|
+
if (parameter !== undefined) {
|
|
19
|
+
return { id, levels: parameter.values.map((value) => value.value) };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/** The effort a selection carries, by the same parameter preference. */
|
|
25
|
+
export function cursorSelectionEffort(selection) {
|
|
26
|
+
const params = selection?.params ?? [];
|
|
27
|
+
for (const id of EFFORT_PARAMETERS) {
|
|
28
|
+
const param = params.find((entry) => entry.id === id);
|
|
29
|
+
if (param !== undefined) {
|
|
30
|
+
return param.value;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
function findModel(models, id) {
|
|
36
|
+
return models.find((model) => model.id === id || model.aliases?.includes(id) === true);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The selection a session opens with. A local agent always needs one, and a
|
|
40
|
+
* resumed agent does not restore its own, so on resume without a model the
|
|
41
|
+
* agent's latest recorded run says what it ran. A requested effort is
|
|
42
|
+
* checked against the model's own parameter menu, because the SDK passes an
|
|
43
|
+
* unknown value through unchecked and reports it back as given (probed
|
|
44
|
+
* 2026-10-03: `reasoning: "ludicrous"` ran and came back verbatim). It
|
|
45
|
+
* replaces only that parameter: the other parameters stay as the resumed run
|
|
46
|
+
* had them, or as the catalog's default variant sets them (a `thinking`
|
|
47
|
+
* switch stays on beside an `effort` level).
|
|
48
|
+
*/
|
|
49
|
+
/** Options the SDK cannot honor, refused before anything opens. */
|
|
50
|
+
export function validateCursorOptions(options) {
|
|
51
|
+
if (options.systemPrompt !== undefined || options.appendSystemPrompt !== undefined) {
|
|
52
|
+
// SDK 1.0.35 types a `systemPrompt`, but a local agent's run fails with
|
|
53
|
+
// "unknown option '--system-prompt'" (probed 2026-10-03), and there is no append.
|
|
54
|
+
throw new Error("Cursor's SDK runs no system prompt override for a local agent");
|
|
55
|
+
}
|
|
56
|
+
if (options.env !== undefined && Object.keys(options.env).length > 0) {
|
|
57
|
+
throw new Error("Cursor runs in this process and its SDK takes no environment for the agent's tools; SessionOptions.env is unsupported");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export async function cursorModelSelection(sdk, options) {
|
|
61
|
+
const base = options.model === undefined && options.resume !== undefined
|
|
62
|
+
? await latestRunModel(sdk, options.resume, options.cwd)
|
|
63
|
+
: undefined;
|
|
64
|
+
const id = options.model ?? base?.id ?? CURSOR_DEFAULT_MODEL;
|
|
65
|
+
if (options.effort === undefined) {
|
|
66
|
+
return base ?? { id };
|
|
67
|
+
}
|
|
68
|
+
const model = findModel(await sdk.Cursor.models.list(), id);
|
|
69
|
+
if (model === undefined) {
|
|
70
|
+
throw new Error(`Cursor does not list model ${id}, so effort ${options.effort} cannot be checked`);
|
|
71
|
+
}
|
|
72
|
+
const parameter = cursorEffortParameter(model);
|
|
73
|
+
if (parameter === null) {
|
|
74
|
+
throw new Error(`Cursor model ${model.id} has no effort setting; requested effort ${options.effort}`);
|
|
75
|
+
}
|
|
76
|
+
if (!parameter.levels.includes(options.effort)) {
|
|
77
|
+
throw new Error(`Cursor model ${model.id} does not offer effort ${options.effort}; it lists ${parameter.levels.join(", ")}`);
|
|
78
|
+
}
|
|
79
|
+
const others = base?.params ?? model.variants?.find((variant) => variant.isDefault === true)?.params ?? [];
|
|
80
|
+
const kept = others.filter((param) => param.id !== parameter.id);
|
|
81
|
+
return { id: model.id, params: [...kept, { id: parameter.id, value: options.effort }] };
|
|
82
|
+
}
|
|
83
|
+
async function latestRunModel(sdk, agentId, cwd) {
|
|
84
|
+
let latest = null;
|
|
85
|
+
let cursor = null;
|
|
86
|
+
do {
|
|
87
|
+
// oxlint-disable-next-line no-await-in-loop -- pages are sequential by construction.
|
|
88
|
+
const page = await sdk.Agent.listRuns(agentId, { runtime: "local", cwd, ...(cursor === null ? {} : { cursor }) });
|
|
89
|
+
for (const run of page.items) {
|
|
90
|
+
if (run.model !== undefined && (latest === null || (run.createdAt ?? 0) >= (latest.createdAt ?? 0))) {
|
|
91
|
+
latest = run;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
cursor = page.nextCursor === undefined || page.nextCursor === "" ? null : page.nextCursor;
|
|
95
|
+
} while (cursor !== null);
|
|
96
|
+
return latest?.model;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/runtimes/cursor/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { RuntimeEventBody, TokenTotals, ToolOutputPart } from "../../contracts/session.js";
|
|
2
|
+
import { type JsonRecord } from "../../shared/json.js";
|
|
3
|
+
import type { ModelSelection } from "./sdk.js";
|
|
4
|
+
/** `tokens`: cumulative per agent path, so usage events stay summable. */
|
|
5
|
+
export interface CursorProjectionState {
|
|
6
|
+
readonly tokens: ReadonlyMap<string, TokenTotals>;
|
|
7
|
+
}
|
|
8
|
+
export declare const initialCursorProjection: CursorProjectionState;
|
|
9
|
+
export interface CursorFrame {
|
|
10
|
+
readonly type: string;
|
|
11
|
+
readonly native: unknown;
|
|
12
|
+
readonly events: readonly RuntimeEventBody[];
|
|
13
|
+
/** The sub-agent a subagent's update came from: the `task` call ids, outermost first. */
|
|
14
|
+
readonly agentPath: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A tool result as content parts. Shell output is its stdout and stderr, a
|
|
18
|
+
* read is the file text, an edit is its diff, a failure is its message;
|
|
19
|
+
* every other result is kept whole as one `other` part.
|
|
20
|
+
*/
|
|
21
|
+
export declare function cursorToolContent(tool: string, result: JsonRecord | null): readonly ToolOutputPart[] | undefined;
|
|
22
|
+
/** One `onDelta` update as one frame, attributed to the subagent it came from. */
|
|
23
|
+
export declare function foldCursorDelta(state: CursorProjectionState, native: unknown): {
|
|
24
|
+
readonly state: CursorProjectionState;
|
|
25
|
+
readonly frame: CursorFrame;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* The agent as the SDK holds it after open: its id and model selection (the
|
|
29
|
+
* SDK has resolved an alias to the catalog id, `composer` → `composer-2.5`).
|
|
30
|
+
*/
|
|
31
|
+
export declare function cursorOpenedFrame(agentId: string, model: ModelSelection | undefined): CursorFrame;
|
|
32
|
+
/**
|
|
33
|
+
* `run.wait()`'s answer: the run's status is the turn's outcome (`finished`,
|
|
34
|
+
* `cancelled`, `error` with the SDK's message), and its `model` is what the
|
|
35
|
+
* SDK records the run ran with.
|
|
36
|
+
*/
|
|
37
|
+
export declare function cursorRunResultFrame(result: unknown): CursorFrame;
|
|
38
|
+
/** `run.wait()` rejected instead of answering: the SDK's own message ends the turn. */
|
|
39
|
+
export declare function cursorRunFailedFrame(message: string): CursorFrame;
|
|
40
|
+
//# sourceMappingURL=projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../../src/runtimes/cursor/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAe,MAAM,4BAA4B,CAAC;AAE7G,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAe/C,0EAA0E;AAC1E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACnD;AAED,eAAO,MAAM,uBAAuB,EAAE,qBAA6C,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC7C,yFAAyF;IACzF,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAqBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,cAAc,EAAE,GAAG,SAAS,CAiChH;AA6FD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,OAAO,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAKrJ;AAUD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,SAAS,GAAG,WAAW,CAEjG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,CAajE;AAeD,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAOjE"}
|
|
@@ -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"}
|