@schoolai/shipyard 3.23.0 → 3.24.0-rc.20260813.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/dist/capability-detector-worker.js +4 -4
- package/dist/{chunk-QI5ERXFK.js → chunk-BGJ6QJNS.js} +27 -2
- package/dist/chunk-BGJ6QJNS.js.map +1 -0
- package/dist/{chunk-Y4RRW6MA.js → chunk-BLGHJ3OJ.js} +2 -2
- package/dist/{chunk-OCYT65KO.js → chunk-BN54GQR3.js} +139 -20
- package/dist/chunk-BN54GQR3.js.map +1 -0
- package/dist/{chunk-W3EMVBWP.js → chunk-DDC5OQOC.js} +3 -3
- package/dist/{chunk-7E6VXTEO.js → chunk-JZTUQVHQ.js} +2 -2
- package/dist/{chunk-CKQL7TWQ.js → chunk-NG355H2L.js} +39 -14
- package/dist/chunk-NG355H2L.js.map +1 -0
- package/dist/{chunk-UESTOND6.js → chunk-RL25HGER.js} +3 -3
- package/dist/chunk-RL25HGER.js.map +1 -0
- package/dist/{chunk-HQTCVJRK.js → chunk-TU3MSY2I.js} +2 -2
- package/dist/{chunk-LRBG3X5U.js → chunk-UK3IMOSP.js} +2 -2
- package/dist/cursor-runner.js +24 -17
- package/dist/cursor-runner.js.map +1 -1
- package/dist/electron-utility.js +2 -2
- package/dist/index.js +4 -4
- package/dist/{login-WL5WEEGJ.js → login-AX7SM2SJ.js} +3 -3
- package/dist/{plan-backfill-EF6KR6BE.js → plan-backfill-XYOUK2DY.js} +4 -4
- package/dist/{serve-J3MG3WHK.js → serve-QHLWAVVY.js} +554 -231
- package/dist/{serve-J3MG3WHK.js.map → serve-QHLWAVVY.js.map} +1 -1
- package/dist/{start-TCI35UML.js → start-JJCGZ63I.js} +6 -6
- package/package.json +1 -1
- package/dist/chunk-CKQL7TWQ.js.map +0 -1
- package/dist/chunk-OCYT65KO.js.map +0 -1
- package/dist/chunk-QI5ERXFK.js.map +0 -1
- package/dist/chunk-UESTOND6.js.map +0 -1
- /package/dist/{chunk-Y4RRW6MA.js.map → chunk-BLGHJ3OJ.js.map} +0 -0
- /package/dist/{chunk-W3EMVBWP.js.map → chunk-DDC5OQOC.js.map} +0 -0
- /package/dist/{chunk-7E6VXTEO.js.map → chunk-JZTUQVHQ.js.map} +0 -0
- /package/dist/{chunk-HQTCVJRK.js.map → chunk-TU3MSY2I.js.map} +0 -0
- /package/dist/{chunk-LRBG3X5U.js.map → chunk-UK3IMOSP.js.map} +0 -0
- /package/dist/{login-WL5WEEGJ.js.map → login-AX7SM2SJ.js.map} +0 -0
- /package/dist/{plan-backfill-EF6KR6BE.js.map → plan-backfill-XYOUK2DY.js.map} +0 -0
- /package/dist/{start-TCI35UML.js.map → start-JJCGZ63I.js.map} +0 -0
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
DevicePollResponseSchema,
|
|
16
16
|
DeviceStartResponseSchema,
|
|
17
17
|
ROUTES
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-RL25HGER.js";
|
|
19
19
|
import {
|
|
20
20
|
isDevMode,
|
|
21
21
|
validateEnv
|
|
@@ -223,4 +223,4 @@ export {
|
|
|
223
223
|
ensureAuthenticated,
|
|
224
224
|
loginCommand
|
|
225
225
|
};
|
|
226
|
-
//# sourceMappingURL=chunk-
|
|
226
|
+
//# sourceMappingURL=chunk-BLGHJ3OJ.js.map
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
formatTaskFeedback,
|
|
39
39
|
toRecord,
|
|
40
40
|
toSdkContent
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-TU3MSY2I.js";
|
|
42
42
|
import {
|
|
43
43
|
AGENT_IDS,
|
|
44
44
|
AGENT_SYSTEM_CLAUDE_CODE,
|
|
@@ -50,14 +50,14 @@ import {
|
|
|
50
50
|
REASONING_EFFORTS,
|
|
51
51
|
inflateToolResultContent,
|
|
52
52
|
isImageMimeType
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-BGJ6QJNS.js";
|
|
54
54
|
import {
|
|
55
55
|
AnthropicAuthStatusSchema,
|
|
56
56
|
CodexAuthStatusSchema,
|
|
57
57
|
CursorAuthStatusSchema,
|
|
58
58
|
PermissionModeSchema,
|
|
59
59
|
TESTED_CODEX_VERSION
|
|
60
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-RL25HGER.js";
|
|
61
61
|
import {
|
|
62
62
|
logger
|
|
63
63
|
} from "./chunk-CA5PKTNJ.js";
|
|
@@ -1292,7 +1292,8 @@ var MODEL_CAPABILITY_TIERS = {
|
|
|
1292
1292
|
"gpt-5.6-terra": "strong",
|
|
1293
1293
|
"gpt-5.6-luna": "capable",
|
|
1294
1294
|
"composer-2.5": "strong",
|
|
1295
|
-
"grok-4.5": "frontier"
|
|
1295
|
+
"grok-4.5": "frontier",
|
|
1296
|
+
"grok-4.6": "frontier"
|
|
1296
1297
|
};
|
|
1297
1298
|
function capabilityTierFor(modelId) {
|
|
1298
1299
|
return MODEL_CAPABILITY_TIERS[modelId];
|
|
@@ -4939,8 +4940,15 @@ var CURSOR_MODEL_CATALOG = withCapabilityTiers([
|
|
|
4939
4940
|
* vision/webSearch). `reasoning: false` mirrors Composer pending
|
|
4940
4941
|
* verification via `Cursor.models.list()`.
|
|
4941
4942
|
*
|
|
4942
|
-
* Pricing (per 1M tokens,
|
|
4943
|
-
* Standard: $2 in / $6 out. Fast Mode: $4 in / $
|
|
4943
|
+
* Pricing (per 1M tokens, cursor.com/docs/models/grok-4-5):
|
|
4944
|
+
* Standard: $2 in / $6 out. Fast Mode: $4 in / $12 out.
|
|
4945
|
+
*
|
|
4946
|
+
* Corrected 2026-08-12: this entry previously carried Fast Mode
|
|
4947
|
+
* $18/M out, cited from cursor.com/blog/grok-4-5 — a frozen launch
|
|
4948
|
+
* announcement. The maintained docs page has since settled at $12/M
|
|
4949
|
+
* out (matching xAI's own >=200k-token output tier and Grok 4.6 Fast's
|
|
4950
|
+
* output price exactly), so the blog figure was stale and had been
|
|
4951
|
+
* over-billing every Grok 4.5 Fast Mode turn by 50% since it shipped.
|
|
4944
4952
|
*/
|
|
4945
4953
|
id: "grok-4.5",
|
|
4946
4954
|
nativeName: "grok-4.5",
|
|
@@ -4955,7 +4963,63 @@ var CURSOR_MODEL_CATALOG = withCapabilityTiers([
|
|
|
4955
4963
|
supportsFastMode: true,
|
|
4956
4964
|
fastModePricing: {
|
|
4957
4965
|
costInputUsd: 4,
|
|
4958
|
-
costOutputUsd:
|
|
4966
|
+
costOutputUsd: 12
|
|
4967
|
+
},
|
|
4968
|
+
capabilities: {
|
|
4969
|
+
reasoning: false,
|
|
4970
|
+
adaptiveThinking: false,
|
|
4971
|
+
webSearch: false,
|
|
4972
|
+
vision: false
|
|
4973
|
+
}
|
|
4974
|
+
},
|
|
4975
|
+
{
|
|
4976
|
+
/**
|
|
4977
|
+
* Grok 4.6 (xAI), served through Cursor. cursor.com/docs/models/grok-4-6
|
|
4978
|
+
* and cursor.com/docs/models-and-pricing were fetched and confirmed as
|
|
4979
|
+
* live pricing sources (see below), but neither page's prose contains a
|
|
4980
|
+
* literal API slug string, and no `Cursor.models.list()` call was
|
|
4981
|
+
* possible to confirm one live (no Cursor auth on this machine). The id
|
|
4982
|
+
* `grok-4.6` below is therefore convention-inferred, not page-verified:
|
|
4983
|
+
* grok-4.5's slug matches docs.x.ai verbatim; xAI's own
|
|
4984
|
+
* `docs.x.ai/docs/models` lists `grok-4.6` as the literal API model ID;
|
|
4985
|
+
* OpenRouter uses `x-ai/grok-4.6`. A wrong slug fails loudly at spawn
|
|
4986
|
+
* time (ModelNotFound-style error), not silently.
|
|
4987
|
+
*
|
|
4988
|
+
* `contextWindow: 0` (unknown sentinel) for the same reason as
|
|
4989
|
+
* Grok 4.5 and Composer: Cursor mediates the window and
|
|
4990
|
+
* self-summarizes server-side, so there is no fixed denominator to
|
|
4991
|
+
* report, even though xAI's own docs list a 500K nominal window.
|
|
4992
|
+
*
|
|
4993
|
+
* `supportedEfforts: []` and all `capabilities` false — same
|
|
4994
|
+
* conservative stance as Grok 4.5: cursor.com/docs/models/grok-4-6
|
|
4995
|
+
* and docs.x.ai describe xhigh/high/medium/low reasoning effort and
|
|
4996
|
+
* vision as MODEL capabilities, but whether `@cursor/sdk` exposes
|
|
4997
|
+
* per-turn effort control or lets Shipyard pass image blocks through
|
|
4998
|
+
* to this model is unverified. This is an SDK-surface gap, not a
|
|
4999
|
+
* model-capability gap — the model itself supports both.
|
|
5000
|
+
*
|
|
5001
|
+
* Pricing (per 1M tokens, cursor.com/docs/models/grok-4-6, corroborated
|
|
5002
|
+
* by cursor.com/docs/models-and-pricing and docs.x.ai's <200k tier):
|
|
5003
|
+
* Standard: $2 in / $6 out. Fast Mode: $4 in / $12 out.
|
|
5004
|
+
*
|
|
5005
|
+
* Cursor ran a 50%-off launch-week promo on Grok 4.6 (Aug 12-19,
|
|
5006
|
+
* 2026, per cursor.com/docs/models-and-pricing) — the prices above
|
|
5007
|
+
* are the steady-state rate, not the promo rate.
|
|
5008
|
+
*/
|
|
5009
|
+
id: "grok-4.6",
|
|
5010
|
+
nativeName: "grok-4.6",
|
|
5011
|
+
displayName: "Grok 4.6",
|
|
5012
|
+
description: "xAI's frontier model, served through Cursor",
|
|
5013
|
+
contextWindow: 0,
|
|
5014
|
+
supportedEfforts: [],
|
|
5015
|
+
tagline: "xAI's frontier reasoning model \u2014 served through Cursor",
|
|
5016
|
+
speedTier: "standard",
|
|
5017
|
+
costInputUsd: 2,
|
|
5018
|
+
costOutputUsd: 6,
|
|
5019
|
+
supportsFastMode: true,
|
|
5020
|
+
fastModePricing: {
|
|
5021
|
+
costInputUsd: 4,
|
|
5022
|
+
costOutputUsd: 12
|
|
4959
5023
|
},
|
|
4960
5024
|
capabilities: {
|
|
4961
5025
|
reasoning: false,
|
|
@@ -6436,7 +6500,28 @@ function logMcpDetectionEntry(entry) {
|
|
|
6436
6500
|
logger[classifyMcpDetectionLevel(entry)](entry, entry.event);
|
|
6437
6501
|
}
|
|
6438
6502
|
|
|
6503
|
+
// src/services/session/profiles/cursor-supports-fast-mode.ts
|
|
6504
|
+
function reconcileCursorSupportsFastMode(models, lookup) {
|
|
6505
|
+
if (lookup === null || !lookup.isReady()) {
|
|
6506
|
+
return [...models];
|
|
6507
|
+
}
|
|
6508
|
+
return models.map((model) => {
|
|
6509
|
+
if (model.provider !== "cursor") return model;
|
|
6510
|
+
const supports = lookup.supportsFastMode(model.id);
|
|
6511
|
+
if (supports) {
|
|
6512
|
+
return model.supportsFastMode === true ? model : { ...model, supportsFastMode: true };
|
|
6513
|
+
}
|
|
6514
|
+
if (model.supportsFastMode === void 0) return model;
|
|
6515
|
+
const { supportsFastMode: _dropped, ...rest } = model;
|
|
6516
|
+
return rest;
|
|
6517
|
+
});
|
|
6518
|
+
}
|
|
6519
|
+
|
|
6439
6520
|
// src/shared/capabilities/models.ts
|
|
6521
|
+
var cursorFastModeLookup = null;
|
|
6522
|
+
function setCursorFastModeSupportLookup(lookup) {
|
|
6523
|
+
cursorFastModeLookup = lookup;
|
|
6524
|
+
}
|
|
6440
6525
|
async function detectModels(lastKnown) {
|
|
6441
6526
|
const results = await Promise.allSettled(
|
|
6442
6527
|
profileRegistry.list().map((profile) => collectProfileModels(profile))
|
|
@@ -6452,9 +6537,9 @@ async function detectModels(lastKnown) {
|
|
|
6452
6537
|
{ lastKnownCount: lastKnown.length },
|
|
6453
6538
|
"detectModels: all profiles failed \u2014 preserving lastKnown"
|
|
6454
6539
|
);
|
|
6455
|
-
return lastKnown;
|
|
6540
|
+
return reconcileCursorSupportsFastMode(lastKnown, cursorFastModeLookup);
|
|
6456
6541
|
}
|
|
6457
|
-
return models;
|
|
6542
|
+
return reconcileCursorSupportsFastMode(models, cursorFastModeLookup);
|
|
6458
6543
|
}
|
|
6459
6544
|
var INTENSITY_ORDER = [
|
|
6460
6545
|
"low",
|
|
@@ -6494,7 +6579,8 @@ function toModelInfo(profile, model, efforts = model.supportedEfforts) {
|
|
|
6494
6579
|
};
|
|
6495
6580
|
}
|
|
6496
6581
|
function buildCatalogModelInfos() {
|
|
6497
|
-
|
|
6582
|
+
const models = profileRegistry.list().flatMap((profile) => profile.models.map((model) => toModelInfo(profile, model)));
|
|
6583
|
+
return reconcileCursorSupportsFastMode(models, cursorFastModeLookup);
|
|
6498
6584
|
}
|
|
6499
6585
|
async function collectProfileModels(profile) {
|
|
6500
6586
|
let binaryPath = null;
|
|
@@ -6820,6 +6906,8 @@ async function findRenames(cwd, oldRef, newRef) {
|
|
|
6820
6906
|
var DAEMON_PR_POLL_INTERVAL_MS = 6e4;
|
|
6821
6907
|
var DAEMON_PR_POLL_MAX_CONCURRENT = 4;
|
|
6822
6908
|
var DAEMON_PR_POLL_RATE_LIMIT_BACKOFF_MS = 5 * 6e4;
|
|
6909
|
+
var DAEMON_PR_COLD_DISCOVERY_INTERVAL_MS = 5 * 6e4;
|
|
6910
|
+
var DAEMON_PR_COLD_DISCOVERY_MAX_CONCURRENT = 3;
|
|
6823
6911
|
function isDaemonPrPollEligible(task) {
|
|
6824
6912
|
if (!task.cwd) return false;
|
|
6825
6913
|
if (task.archivedAt !== null) return false;
|
|
@@ -6829,21 +6917,48 @@ function isDaemonPrPollEligible(task) {
|
|
|
6829
6917
|
if (task.prState === "open" || task.prState === "draft") return true;
|
|
6830
6918
|
return task.prUrl !== null;
|
|
6831
6919
|
}
|
|
6832
|
-
function
|
|
6920
|
+
function isDaemonPrColdDiscoveryEligible(task) {
|
|
6921
|
+
if (!task.cwd) return false;
|
|
6922
|
+
if (task.archivedAt !== null) return false;
|
|
6923
|
+
if (task.status === "completed" || task.status === "canceled") return false;
|
|
6924
|
+
if (task.mergedAt !== null) return false;
|
|
6925
|
+
return task.prUrl === null && task.prState === null;
|
|
6926
|
+
}
|
|
6927
|
+
function selectStalestEligibleTaskIds(tasks, now, lastActionAt, rateLimitState, isEligible, intervalMs, maxConcurrent) {
|
|
6833
6928
|
if (rateLimitState.backoffUntil !== null && now < rateLimitState.backoffUntil) return [];
|
|
6834
|
-
|
|
6835
|
-
const maxConcurrentPolls = options.maxConcurrentPolls ?? DAEMON_PR_POLL_MAX_CONCURRENT;
|
|
6836
|
-
if (maxConcurrentPolls <= 0) return [];
|
|
6929
|
+
if (maxConcurrent <= 0) return [];
|
|
6837
6930
|
return tasks.filter((task) => {
|
|
6838
|
-
if (!
|
|
6839
|
-
const last =
|
|
6931
|
+
if (!isEligible(task)) return false;
|
|
6932
|
+
const last = lastActionAt.get(task.taskId);
|
|
6840
6933
|
return last === void 0 || now - last >= intervalMs;
|
|
6841
6934
|
}).sort((a, b) => {
|
|
6842
|
-
const aLast =
|
|
6843
|
-
const bLast =
|
|
6935
|
+
const aLast = lastActionAt.get(a.taskId) ?? Number.NEGATIVE_INFINITY;
|
|
6936
|
+
const bLast = lastActionAt.get(b.taskId) ?? Number.NEGATIVE_INFINITY;
|
|
6844
6937
|
if (aLast !== bLast) return aLast - bLast;
|
|
6845
6938
|
return a.taskId.localeCompare(b.taskId);
|
|
6846
|
-
}).slice(0,
|
|
6939
|
+
}).slice(0, maxConcurrent).map((task) => task.taskId);
|
|
6940
|
+
}
|
|
6941
|
+
function decidePrPollPlan(tasks, now, lastPolledAt, rateLimitState, options = {}) {
|
|
6942
|
+
return selectStalestEligibleTaskIds(
|
|
6943
|
+
tasks,
|
|
6944
|
+
now,
|
|
6945
|
+
lastPolledAt,
|
|
6946
|
+
rateLimitState,
|
|
6947
|
+
isDaemonPrPollEligible,
|
|
6948
|
+
options.intervalMs ?? DAEMON_PR_POLL_INTERVAL_MS,
|
|
6949
|
+
options.maxConcurrentPolls ?? DAEMON_PR_POLL_MAX_CONCURRENT
|
|
6950
|
+
);
|
|
6951
|
+
}
|
|
6952
|
+
function decidePrColdDiscoveryPlan(tasks, now, lastCheckedAt, rateLimitState, options = {}) {
|
|
6953
|
+
return selectStalestEligibleTaskIds(
|
|
6954
|
+
tasks,
|
|
6955
|
+
now,
|
|
6956
|
+
lastCheckedAt,
|
|
6957
|
+
rateLimitState,
|
|
6958
|
+
isDaemonPrColdDiscoveryEligible,
|
|
6959
|
+
options.intervalMs ?? DAEMON_PR_COLD_DISCOVERY_INTERVAL_MS,
|
|
6960
|
+
options.maxConcurrentPolls ?? DAEMON_PR_COLD_DISCOVERY_MAX_CONCURRENT
|
|
6961
|
+
);
|
|
6847
6962
|
}
|
|
6848
6963
|
|
|
6849
6964
|
// src/shared/capabilities/github-read-backoff.ts
|
|
@@ -8238,6 +8353,8 @@ export {
|
|
|
8238
8353
|
detectAgentProviders,
|
|
8239
8354
|
detectMarketplacePlugins,
|
|
8240
8355
|
logMcpDetectionEntry,
|
|
8356
|
+
reconcileCursorSupportsFastMode,
|
|
8357
|
+
setCursorFastModeSupportLookup,
|
|
8241
8358
|
buildCatalogModelInfos,
|
|
8242
8359
|
narrowAnthropicAuth,
|
|
8243
8360
|
narrowCodexAuth,
|
|
@@ -8257,8 +8374,10 @@ export {
|
|
|
8257
8374
|
getFileAtRef,
|
|
8258
8375
|
findRenames,
|
|
8259
8376
|
DAEMON_PR_POLL_INTERVAL_MS,
|
|
8377
|
+
DAEMON_PR_COLD_DISCOVERY_INTERVAL_MS,
|
|
8260
8378
|
isDaemonPrPollEligible,
|
|
8261
8379
|
decidePrPollPlan,
|
|
8380
|
+
decidePrColdDiscoveryPlan,
|
|
8262
8381
|
recordGithubReadFailure,
|
|
8263
8382
|
getGithubReadBackoffState,
|
|
8264
8383
|
searchPrs,
|
|
@@ -8295,4 +8414,4 @@ export {
|
|
|
8295
8414
|
refreshInstalledAgents,
|
|
8296
8415
|
refreshCodexAuthSlice
|
|
8297
8416
|
};
|
|
8298
|
-
//# sourceMappingURL=chunk-
|
|
8417
|
+
//# sourceMappingURL=chunk-BN54GQR3.js.map
|