@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.
Files changed (36) hide show
  1. package/dist/capability-detector-worker.js +4 -4
  2. package/dist/{chunk-QI5ERXFK.js → chunk-BGJ6QJNS.js} +27 -2
  3. package/dist/chunk-BGJ6QJNS.js.map +1 -0
  4. package/dist/{chunk-Y4RRW6MA.js → chunk-BLGHJ3OJ.js} +2 -2
  5. package/dist/{chunk-OCYT65KO.js → chunk-BN54GQR3.js} +139 -20
  6. package/dist/chunk-BN54GQR3.js.map +1 -0
  7. package/dist/{chunk-W3EMVBWP.js → chunk-DDC5OQOC.js} +3 -3
  8. package/dist/{chunk-7E6VXTEO.js → chunk-JZTUQVHQ.js} +2 -2
  9. package/dist/{chunk-CKQL7TWQ.js → chunk-NG355H2L.js} +39 -14
  10. package/dist/chunk-NG355H2L.js.map +1 -0
  11. package/dist/{chunk-UESTOND6.js → chunk-RL25HGER.js} +3 -3
  12. package/dist/chunk-RL25HGER.js.map +1 -0
  13. package/dist/{chunk-HQTCVJRK.js → chunk-TU3MSY2I.js} +2 -2
  14. package/dist/{chunk-LRBG3X5U.js → chunk-UK3IMOSP.js} +2 -2
  15. package/dist/cursor-runner.js +24 -17
  16. package/dist/cursor-runner.js.map +1 -1
  17. package/dist/electron-utility.js +2 -2
  18. package/dist/index.js +4 -4
  19. package/dist/{login-WL5WEEGJ.js → login-AX7SM2SJ.js} +3 -3
  20. package/dist/{plan-backfill-EF6KR6BE.js → plan-backfill-XYOUK2DY.js} +4 -4
  21. package/dist/{serve-J3MG3WHK.js → serve-QHLWAVVY.js} +554 -231
  22. package/dist/{serve-J3MG3WHK.js.map → serve-QHLWAVVY.js.map} +1 -1
  23. package/dist/{start-TCI35UML.js → start-JJCGZ63I.js} +6 -6
  24. package/package.json +1 -1
  25. package/dist/chunk-CKQL7TWQ.js.map +0 -1
  26. package/dist/chunk-OCYT65KO.js.map +0 -1
  27. package/dist/chunk-QI5ERXFK.js.map +0 -1
  28. package/dist/chunk-UESTOND6.js.map +0 -1
  29. /package/dist/{chunk-Y4RRW6MA.js.map → chunk-BLGHJ3OJ.js.map} +0 -0
  30. /package/dist/{chunk-W3EMVBWP.js.map → chunk-DDC5OQOC.js.map} +0 -0
  31. /package/dist/{chunk-7E6VXTEO.js.map → chunk-JZTUQVHQ.js.map} +0 -0
  32. /package/dist/{chunk-HQTCVJRK.js.map → chunk-TU3MSY2I.js.map} +0 -0
  33. /package/dist/{chunk-LRBG3X5U.js.map → chunk-UK3IMOSP.js.map} +0 -0
  34. /package/dist/{login-WL5WEEGJ.js.map → login-AX7SM2SJ.js.map} +0 -0
  35. /package/dist/{plan-backfill-EF6KR6BE.js.map → plan-backfill-XYOUK2DY.js.map} +0 -0
  36. /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-UESTOND6.js";
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-Y4RRW6MA.js.map
226
+ //# sourceMappingURL=chunk-BLGHJ3OJ.js.map
@@ -38,7 +38,7 @@ import {
38
38
  formatTaskFeedback,
39
39
  toRecord,
40
40
  toSdkContent
41
- } from "./chunk-HQTCVJRK.js";
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-QI5ERXFK.js";
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-UESTOND6.js";
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, docs.x.ai + cursor.com/blog/grok-4-5):
4943
- * Standard: $2 in / $6 out. Fast Mode: $4 in / $18 out.
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: 18
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
- return profileRegistry.list().flatMap((profile) => profile.models.map((model) => toModelInfo(profile, model)));
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 decidePrPollPlan(tasks, now, lastPolledAt, rateLimitState, options = {}) {
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
- const intervalMs = options.intervalMs ?? DAEMON_PR_POLL_INTERVAL_MS;
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 (!isDaemonPrPollEligible(task)) return false;
6839
- const last = lastPolledAt.get(task.taskId);
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 = lastPolledAt.get(a.taskId) ?? Number.NEGATIVE_INFINITY;
6843
- const bLast = lastPolledAt.get(b.taskId) ?? Number.NEGATIVE_INFINITY;
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, maxConcurrentPolls).map((task) => task.taskId);
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-OCYT65KO.js.map
8417
+ //# sourceMappingURL=chunk-BN54GQR3.js.map