@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
@@ -1,17 +1,39 @@
1
- import { homedir } from "node:os";
2
- import path from "node:path";
3
- import { executableInstallation } from "../../shared/installation.js";
1
+ const SDK_PACKAGE = "@cursor/sdk";
2
+ /** The platforms `@cursor/sdk` 1.0.35 ships a native companion package for. */
3
+ const PLATFORMS = new Set(["darwin-arm64", "darwin-x64", "linux-arm64", "linux-x64", "win32-x64"]);
4
+ async function sdkLoads() {
5
+ try {
6
+ // A string LITERAL, not SDK_PACKAGE: bundlers only compile in (and
7
+ // resolve) literal specifiers, and this fallback exists for bundles.
8
+ await import("@cursor/sdk");
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
4
15
  /**
5
- * The official installer's layout, which can be invisible to GUI-process
6
- * PATH: `~/.local/bin/cursor-agent` links into
7
- * `~/.local/share/cursor-agent/versions/<version>/` (cursor-agent 2026.09.28).
8
- * The installer also links `~/.local/bin/agent`, a name too generic to probe.
16
+ * Cursor ships inside this package as the `@cursor/sdk` dependency, the way
17
+ * pi does: there is no executable to probe and no version to report (the
18
+ * embedder pins the SDK). The SDK's agent needs its native companion package,
19
+ * which exists only for the platforms in `PLATFORMS`.
9
20
  */
10
- export function cursorInstalledExecutableCandidates(platform = process.platform, home = homedir()) {
11
- if (platform === "win32") {
12
- return [];
13
- }
14
- return [path.posix.join(home, ".local", "bin", "cursor-agent")];
21
+ export function cursorInstallationFor(platform, arch, resolvable) {
22
+ return async () => {
23
+ if (!PLATFORMS.has(`${platform}-${arch}`)) {
24
+ return { kind: "unsupported", reason: `@cursor/sdk has no native package for ${platform}-${arch}` };
25
+ }
26
+ return await resolvable() ? { kind: "available", via: "bundled" } : { kind: "not_found" };
27
+ };
15
28
  }
16
- export const cursorInstallation = executableInstallation("OAR_CURSOR_BIN", "cursor-agent", cursorInstalledExecutableCandidates, ["acp", "--help"], { readinessTimeoutMs: 30_000, versionTimeoutMs: 30_000 });
29
+ export const cursorInstallation = cursorInstallationFor(process.platform, process.arch, async () => {
30
+ try {
31
+ import.meta.resolve(SDK_PACKAGE);
32
+ return true;
33
+ }
34
+ catch {
35
+ const loads = await sdkLoads();
36
+ return loads;
37
+ }
38
+ });
17
39
  //# sourceMappingURL=installation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installation.js","sourceRoot":"","sources":["../../../src/runtimes/cursor/installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,UAAU,mCAAmC,CACjD,WAA4B,OAAO,CAAC,QAAQ,EAC5C,OAAe,OAAO,EAAE;IAExB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CACtD,gBAAgB,EAChB,cAAc,EACd,mCAAmC,EACnC,CAAC,KAAK,EAAE,QAAQ,CAAC,EACjB,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,CACzD,CAAC"}
1
+ {"version":3,"file":"installation.js","sourceRoot":"","sources":["../../../src/runtimes/cursor/installation.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,+EAA+E;AAC/E,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAExH,KAAK,UAAU,QAAQ;IACrB,IAAI,CAAC;QACH,mEAAmE;QACnE,qEAAqE;QACrE,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,IAAY,EAAE,UAAkC;IACtG,OAAO,KAAK,IAAmC,EAAE;QAC/C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,yCAAyC,QAAQ,IAAI,IAAI,EAAE,EAAE,CAAC;QACtG,CAAC;QACD,OAAO,MAAM,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC5F,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAsB,qBAAqB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;IACpH,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1,13 +1,12 @@
1
1
  import type { ModelEntry, ModelLister } from "../../contracts/list-models.js";
2
+ import { type CursorSdk, type ModelListItem } from "./sdk.js";
2
3
  /**
3
- * Project the `cursor/list_available_models` answer (cursor-agent
4
- * 2026.09.28): `{models: [{value, name, configOptions}]}`, where `value` is
5
- * the model name `session/set_config_option` accepts for `model`, `name` the
6
- * display name, and `configOptions` the model's parameters as select options
7
- * at their default values. The reasoning parameter is the `thought_level`
8
- * option a session would set for that model (`acpThoughtLevelOption`: the
9
- * `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`.
10
8
  */
11
- export declare function projectCursorModels(result: unknown): ModelEntry[];
9
+ export declare function projectCursorModels(models: readonly ModelListItem[]): ModelEntry[];
10
+ export declare function cursorListModelsWith(load: () => Promise<CursorSdk>): ModelLister;
12
11
  export declare const cursorListModels: ModelLister;
13
12
  //# sourceMappingURL=list-models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-models.d.ts","sourceRoot":"","sources":["../../../src/runtimes/cursor/list-models.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAgB9E;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,EAAE,CAqBjE;AA0CD,eAAO,MAAM,gBAAgB,EAAE,WAmB9B,CAAC"}
1
+ {"version":3,"file":"list-models.d.ts","sourceRoot":"","sources":["../../../src/runtimes/cursor/list-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAE7E;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,UAAU,EAAE,CAalF;AAYD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,WAAW,CAyBhF;AAED,eAAO,MAAM,gBAAgB,EAAE,WAAiD,CAAC"}
@@ -1,92 +1,60 @@
1
- /* oxlint-disable typescript/promise-function-async -- Deadline callbacks deliberately return the SDK's native promises. */
2
- import { client as createClient, methods, PROTOCOL_VERSION, RequestError, } from "@agentclientprotocol/sdk";
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 the `cursor/list_available_models` answer (cursor-agent
17
- * 2026.09.28): `{models: [{value, name, configOptions}]}`, where `value` is
18
- * the model name `session/set_config_option` accepts for `model`, `name` the
19
- * display name, and `configOptions` the model's parameters as select options
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(result) {
25
- const entries = [];
26
- for (const model of asRecordList(asRecord(result)?.models)) {
27
- const id = text(model.value);
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
- : asRecordList(thoughtLevel.options).flatMap((option) => text(option.value) ?? []);
36
- const defaultEffort = thoughtLevel === undefined ? undefined : text(thoughtLevel.currentValue);
37
- entries.push({
38
- id,
39
- ...(displayName === undefined || displayName === id ? {} : { displayName }),
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
- async function readModels(command, timeoutMs) {
47
- const runtime = startAcpProcess(command, cursorAcpArgs, createClient({ name: "oar" }), { env: process.env });
48
- try {
49
- const initialize = methods.agent.initialize;
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 const cursorListModels = async (installation, options = {}) => {
72
- if (installation.via !== "executable") {
73
- return { kind: "unsupported", reason: "cursor model listing requires the cursor-agent executable" };
74
- }
75
- try {
76
- const result = await readModels(installation.command, options.timeoutMs ?? 15_000);
77
- return { kind: "ok", models: projectCursorModels(result) };
78
- }
79
- catch (error) {
80
- if (error instanceof RequestError) {
81
- if (error.code === -32_601) {
82
- return { kind: "unsupported", reason: `this cursor-agent build has no ${listMethod} method` };
83
- }
84
- // cursor-agent answers `authRequired` (-32000) until `cursor-agent login` has run.
85
- if (error.code === -32_000 || /auth(?:entication)?|log(?:ged)? ?in/iu.test(error.message)) {
86
- return { kind: "unauthenticated", detail: error.message };
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
- throw new Error("Failed to list Cursor models", { cause: error });
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":"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"}
1
+ {"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../../src/runtimes/cursor/list-models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { RefusedSessionOptions } from "../../contracts/runtime.js";
2
+ import type { SessionOptions } from "../../contracts/session.js";
3
+ import type { CursorSdk, ModelListItem, ModelSelection } from "./sdk.js";
4
+ /** The catalog's "Auto" entry; a local agent needs a model, and this is the one Cursor picks for the user. */
5
+ export declare const CURSOR_DEFAULT_MODEL = "default";
6
+ export declare function cursorEffortParameter(model: ModelListItem): {
7
+ readonly id: string;
8
+ readonly levels: readonly string[];
9
+ } | null;
10
+ /** The effort a selection carries, by the same parameter preference. */
11
+ export declare function cursorSelectionEffort(selection: ModelSelection | undefined): string | null;
12
+ /**
13
+ * The selection a session opens with. A local agent always needs one, and a
14
+ * resumed agent does not restore its own, so on resume without a model the
15
+ * agent's latest recorded run says what it ran. A requested effort is
16
+ * checked against the model's own parameter menu, because the SDK passes an
17
+ * unknown value through unchecked and reports it back as given (probed
18
+ * 2026-10-03: `reasoning: "ludicrous"` ran and came back verbatim). It
19
+ * replaces only that parameter: the other parameters stay as the resumed run
20
+ * had them, or as the catalog's default variant sets them (a `thinking`
21
+ * switch stays on beside an `effort` level).
22
+ */
23
+ /**
24
+ * Options the SDK cannot honor, refused before anything opens. SDK 1.0.35
25
+ * types a `systemPrompt`, but a local agent's run fails with "unknown option
26
+ * '--system-prompt'" (probed 2026-10-03), and there is no append.
27
+ */
28
+ export declare const cursorRefusedSessionOptions: RefusedSessionOptions;
29
+ export declare function cursorModelSelection(sdk: CursorSdk, options: SessionOptions): Promise<ModelSelection>;
30
+ //# 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,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,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;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,qBAIzC,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAsB3G"}
@@ -0,0 +1,97 @@
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
+ /**
50
+ * Options the SDK cannot honor, refused before anything opens. SDK 1.0.35
51
+ * types a `systemPrompt`, but a local agent's run fails with "unknown option
52
+ * '--system-prompt'" (probed 2026-10-03), and there is no append.
53
+ */
54
+ export const cursorRefusedSessionOptions = {
55
+ systemPrompt: "Cursor's SDK runs no system prompt override for a local agent",
56
+ appendSystemPrompt: "Cursor's SDK runs no system prompt override for a local agent",
57
+ env: "Cursor runs in this process and its SDK takes no environment for the agent's tools; SessionOptions.env is unsupported",
58
+ };
59
+ export async function cursorModelSelection(sdk, options) {
60
+ const base = options.model === undefined && options.resume !== undefined
61
+ ? await latestRunModel(sdk, options.resume, options.cwd)
62
+ : undefined;
63
+ const id = options.model ?? base?.id ?? CURSOR_DEFAULT_MODEL;
64
+ if (options.effort === undefined) {
65
+ return base ?? { id };
66
+ }
67
+ const model = findModel(await sdk.Cursor.models.list(), id);
68
+ if (model === undefined) {
69
+ throw new Error(`Cursor does not list model ${id}, so effort ${options.effort} cannot be checked`);
70
+ }
71
+ const parameter = cursorEffortParameter(model);
72
+ if (parameter === null) {
73
+ throw new Error(`Cursor model ${model.id} has no effort setting; requested effort ${options.effort}`);
74
+ }
75
+ if (!parameter.levels.includes(options.effort)) {
76
+ throw new Error(`Cursor model ${model.id} does not offer effort ${options.effort}; it lists ${parameter.levels.join(", ")}`);
77
+ }
78
+ const others = base?.params ?? model.variants?.find((variant) => variant.isDefault === true)?.params ?? [];
79
+ const kept = others.filter((param) => param.id !== parameter.id);
80
+ return { id: model.id, params: [...kept, { id: parameter.id, value: options.effort }] };
81
+ }
82
+ async function latestRunModel(sdk, agentId, cwd) {
83
+ let latest = null;
84
+ let cursor = null;
85
+ do {
86
+ // oxlint-disable-next-line no-await-in-loop -- pages are sequential by construction.
87
+ const page = await sdk.Agent.listRuns(agentId, { runtime: "local", cwd, ...(cursor === null ? {} : { cursor }) });
88
+ for (const run of page.items) {
89
+ if (run.model !== undefined && (latest === null || (run.createdAt ?? 0) >= (latest.createdAt ?? 0))) {
90
+ latest = run;
91
+ }
92
+ }
93
+ cursor = page.nextCursor === undefined || page.nextCursor === "" ? null : page.nextCursor;
94
+ } while (cursor !== null);
95
+ return latest?.model;
96
+ }
97
+ //# 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"}