@schoolai/shipyard 3.32.0 → 3.33.0-rc.20260923.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 (45) hide show
  1. package/dist/capability-detector-worker.js +8 -8
  2. package/dist/{chunk-PVN4AJAH.js → chunk-3PJULQHI.js} +2 -2
  3. package/dist/{chunk-NFVZCZPA.js → chunk-4WJOA7HF.js} +2 -2
  4. package/dist/{chunk-RBXWUYDC.js → chunk-DQQOVPVK.js} +2 -2
  5. package/dist/{chunk-ZDJEJI62.js → chunk-ELZLWLTO.js} +2 -2
  6. package/dist/{chunk-42SK2S4V.js → chunk-FYT3ETTP.js} +2 -2
  7. package/dist/{chunk-SGFCXJJJ.js → chunk-JYAI3JHY.js} +2 -2
  8. package/dist/{chunk-7IS6KGWY.js → chunk-M6XAVFHJ.js} +3 -3
  9. package/dist/{chunk-FARMJBC7.js → chunk-MV7VSD2T.js} +2 -2
  10. package/dist/{chunk-FARMJBC7.js.map → chunk-MV7VSD2T.js.map} +1 -1
  11. package/dist/{chunk-RR6V6SNM.js → chunk-VHPNDDB5.js} +100 -17
  12. package/dist/chunk-VHPNDDB5.js.map +1 -0
  13. package/dist/{chunk-5TF227G7.js → chunk-WKJAGQU7.js} +3 -3
  14. package/dist/{chunk-UIBOKFSG.js → chunk-XPOXRIHH.js} +9 -47
  15. package/dist/chunk-XPOXRIHH.js.map +1 -0
  16. package/dist/{chunk-MAA2DPW5.js → chunk-ZXYFMJAS.js} +3 -3
  17. package/dist/cursor-runner.js +3 -3
  18. package/dist/electron-utility.js +2 -2
  19. package/dist/{git-repo-M634UEX7.js → git-repo-K45YAY55.js} +3 -3
  20. package/dist/index.js +4 -4
  21. package/dist/{login-6YTDDUP4.js → login-SOAGMUHR.js} +3 -3
  22. package/dist/{mcp-servers-LTYMM2F2.js → mcp-servers-GHDSX3UE.js} +3 -3
  23. package/dist/{plan-backfill-52OBXJRO.js → plan-backfill-W4FLMVC6.js} +5 -5
  24. package/dist/{serve-JVTSDF4E.js → serve-SDRQ7JYB.js} +120 -83
  25. package/dist/{serve-JVTSDF4E.js.map → serve-SDRQ7JYB.js.map} +1 -1
  26. package/dist/{skills-BX2NZKPN.js → skills-RO2BW4XO.js} +3 -3
  27. package/dist/{start-TYBSF7PZ.js → start-DHYV7OQM.js} +6 -6
  28. package/package.json +2 -3
  29. package/dist/chunk-RR6V6SNM.js.map +0 -1
  30. package/dist/chunk-UIBOKFSG.js.map +0 -1
  31. /package/dist/{chunk-PVN4AJAH.js.map → chunk-3PJULQHI.js.map} +0 -0
  32. /package/dist/{chunk-NFVZCZPA.js.map → chunk-4WJOA7HF.js.map} +0 -0
  33. /package/dist/{chunk-RBXWUYDC.js.map → chunk-DQQOVPVK.js.map} +0 -0
  34. /package/dist/{chunk-ZDJEJI62.js.map → chunk-ELZLWLTO.js.map} +0 -0
  35. /package/dist/{chunk-42SK2S4V.js.map → chunk-FYT3ETTP.js.map} +0 -0
  36. /package/dist/{chunk-SGFCXJJJ.js.map → chunk-JYAI3JHY.js.map} +0 -0
  37. /package/dist/{chunk-7IS6KGWY.js.map → chunk-M6XAVFHJ.js.map} +0 -0
  38. /package/dist/{chunk-5TF227G7.js.map → chunk-WKJAGQU7.js.map} +0 -0
  39. /package/dist/{chunk-MAA2DPW5.js.map → chunk-ZXYFMJAS.js.map} +0 -0
  40. /package/dist/{git-repo-M634UEX7.js.map → git-repo-K45YAY55.js.map} +0 -0
  41. /package/dist/{login-6YTDDUP4.js.map → login-SOAGMUHR.js.map} +0 -0
  42. /package/dist/{mcp-servers-LTYMM2F2.js.map → mcp-servers-GHDSX3UE.js.map} +0 -0
  43. /package/dist/{plan-backfill-52OBXJRO.js.map → plan-backfill-W4FLMVC6.js.map} +0 -0
  44. /package/dist/{skills-BX2NZKPN.js.map → skills-RO2BW4XO.js.map} +0 -0
  45. /package/dist/{start-TYBSF7PZ.js.map → start-DHYV7OQM.js.map} +0 -0
@@ -18,8 +18,8 @@ function getDaemonVersion() {
18
18
  return cached;
19
19
  }
20
20
  function readDaemonVersion() {
21
- if ("3.32.0".length > 0) {
22
- return "3.32.0";
21
+ if ("3.33.0".length > 0) {
22
+ return "3.33.0";
23
23
  }
24
24
  try {
25
25
  const here = dirname(fileURLToPath(import.meta.url));
@@ -48,4 +48,4 @@ function readDaemonVersion() {
48
48
  export {
49
49
  getDaemonVersion
50
50
  };
51
- //# sourceMappingURL=chunk-MAA2DPW5.js.map
51
+ //# sourceMappingURL=chunk-ZXYFMJAS.js.map
@@ -7,12 +7,12 @@ import {
7
7
  } from "./chunk-FWL2ZIEL.js";
8
8
  import {
9
9
  buildCursorUserPrompt
10
- } from "./chunk-PVN4AJAH.js";
10
+ } from "./chunk-3PJULQHI.js";
11
11
  import {
12
12
  ContentBlockSchema,
13
13
  HARNESS_SERVER_NAME
14
- } from "./chunk-RBXWUYDC.js";
15
- import "./chunk-FARMJBC7.js";
14
+ } from "./chunk-DQQOVPVK.js";
15
+ import "./chunk-MV7VSD2T.js";
16
16
  import "./chunk-EHQITHQX.js";
17
17
  import "./chunk-FIE2FRIW.js";
18
18
  import "./chunk-FKOUB6H6.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDaemonVersion
4
- } from "./chunk-MAA2DPW5.js";
4
+ } from "./chunk-ZXYFMJAS.js";
5
5
  import {
6
6
  enableNativeCrashReports
7
7
  } from "./chunk-RYZH5KM3.js";
@@ -71,7 +71,7 @@ async function main() {
71
71
  await loadAuthFromConfig(env);
72
72
  crumb("post-auth-load");
73
73
  crumb("pre-serve-import");
74
- const { serve } = await import("./serve-JVTSDF4E.js");
74
+ const { serve } = await import("./serve-SDRQ7JYB.js");
75
75
  crumb("post-serve-import");
76
76
  const portQueue = [];
77
77
  let acceptor = null;
@@ -14,9 +14,9 @@ import {
14
14
  isGhAvailable,
15
15
  isGitRepo,
16
16
  parseOwnerRepo
17
- } from "./chunk-5TF227G7.js";
17
+ } from "./chunk-WKJAGQU7.js";
18
18
  import "./chunk-4T2OQAVL.js";
19
- import "./chunk-RR6V6SNM.js";
19
+ import "./chunk-VHPNDDB5.js";
20
20
  import "./chunk-ZFKJAYAN.js";
21
21
  import "./chunk-FIE2FRIW.js";
22
22
  import "./chunk-FKOUB6H6.js";
@@ -38,4 +38,4 @@ export {
38
38
  isGitRepo,
39
39
  parseOwnerRepo
40
40
  };
41
- //# sourceMappingURL=git-repo-M634UEX7.js.map
41
+ //# sourceMappingURL=git-repo-K45YAY55.js.map
package/dist/index.js CHANGED
@@ -126,7 +126,7 @@ async function loadAuthFromConfig(env) {
126
126
  async function handleSubcommand() {
127
127
  const subcommand = process.argv[2];
128
128
  if (subcommand === "login") {
129
- const { loginCommand } = await import("./login-6YTDDUP4.js");
129
+ const { loginCommand } = await import("./login-SOAGMUHR.js");
130
130
  const hasCheck = process.argv.includes("--check");
131
131
  await loginCommand({ check: hasCheck });
132
132
  return true;
@@ -137,7 +137,7 @@ async function handleSubcommand() {
137
137
  return true;
138
138
  }
139
139
  if (subcommand === "start") {
140
- const { startCommand } = await import("./start-TYBSF7PZ.js");
140
+ const { startCommand } = await import("./start-DHYV7OQM.js");
141
141
  await startCommand();
142
142
  return true;
143
143
  }
@@ -147,7 +147,7 @@ async function handleSubcommand() {
147
147
  return true;
148
148
  }
149
149
  if (subcommand === "plan-backfill") {
150
- const { planBackfillCommand } = await import("./plan-backfill-52OBXJRO.js");
150
+ const { planBackfillCommand } = await import("./plan-backfill-W4FLMVC6.js");
151
151
  await planBackfillCommand();
152
152
  return true;
153
153
  }
@@ -159,7 +159,7 @@ async function main() {
159
159
  const args = parseCliArgs();
160
160
  if (args.serve) {
161
161
  await loadAuthFromConfig(env);
162
- const { serve } = await import("./serve-JVTSDF4E.js");
162
+ const { serve } = await import("./serve-SDRQ7JYB.js");
163
163
  return serve({ isDev: env.SHIPYARD_DEV });
164
164
  }
165
165
  logger.error("Use `shipyard start` to run the daemon. Use --help for usage.");
@@ -3,10 +3,10 @@ import {
3
3
  ensureAuthenticated,
4
4
  getSignalingUrl,
5
5
  loginCommand
6
- } from "./chunk-SGFCXJJJ.js";
6
+ } from "./chunk-JYAI3JHY.js";
7
7
  import "./chunk-MM3M2KAC.js";
8
8
  import "./chunk-XPYW5WQS.js";
9
- import "./chunk-FARMJBC7.js";
9
+ import "./chunk-MV7VSD2T.js";
10
10
  import "./chunk-EHQITHQX.js";
11
11
  import "./chunk-FIE2FRIW.js";
12
12
  import "./chunk-FKOUB6H6.js";
@@ -17,4 +17,4 @@ export {
17
17
  getSignalingUrl,
18
18
  loginCommand
19
19
  };
20
- //# sourceMappingURL=login-6YTDDUP4.js.map
20
+ //# sourceMappingURL=login-SOAGMUHR.js.map
@@ -15,8 +15,8 @@ import {
15
15
  resolveAuthStatuses,
16
16
  resolveClaudeCodeAuthStatuses,
17
17
  shouldFetchClaudeAiIntegrations
18
- } from "./chunk-42SK2S4V.js";
19
- import "./chunk-RR6V6SNM.js";
18
+ } from "./chunk-FYT3ETTP.js";
19
+ import "./chunk-VHPNDDB5.js";
20
20
  import "./chunk-FIE2FRIW.js";
21
21
  import "./chunk-FKOUB6H6.js";
22
22
  import "./chunk-XVW6VCKW.js";
@@ -38,4 +38,4 @@ export {
38
38
  resolveClaudeCodeAuthStatuses,
39
39
  shouldFetchClaudeAiIntegrations
40
40
  };
41
- //# sourceMappingURL=mcp-servers-LTYMM2F2.js.map
41
+ //# sourceMappingURL=mcp-servers-GHDSX3UE.js.map
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  buildTaskStateStore,
4
4
  runPlanBackfill
5
- } from "./chunk-7IS6KGWY.js";
6
- import "./chunk-RR6V6SNM.js";
7
- import "./chunk-RBXWUYDC.js";
8
- import "./chunk-FARMJBC7.js";
5
+ } from "./chunk-M6XAVFHJ.js";
6
+ import "./chunk-VHPNDDB5.js";
7
+ import "./chunk-DQQOVPVK.js";
8
+ import "./chunk-MV7VSD2T.js";
9
9
  import "./chunk-EHQITHQX.js";
10
10
  import {
11
11
  logger
@@ -65,4 +65,4 @@ async function planBackfillCommand(argv = process.argv.slice(3)) {
65
65
  export {
66
66
  planBackfillCommand
67
67
  };
68
- //# sourceMappingURL=plan-backfill-52OBXJRO.js.map
68
+ //# sourceMappingURL=plan-backfill-W4FLMVC6.js.map
@@ -12,7 +12,7 @@ import {
12
12
  guardedSubscribe,
13
13
  makeInitialAttemptState,
14
14
  shutdownFileWatcherGuard
15
- } from "./chunk-NFVZCZPA.js";
15
+ } from "./chunk-4WJOA7HF.js";
16
16
  import {
17
17
  TRAILER_SCHEMA_VERSION,
18
18
  appendTrailerToMessage,
@@ -40,13 +40,13 @@ import {
40
40
  startPlanBackfillForDaemon,
41
41
  sync,
42
42
  validatePeerId
43
- } from "./chunk-7IS6KGWY.js";
43
+ } from "./chunk-M6XAVFHJ.js";
44
44
  import {
45
45
  loadAuthToken
46
46
  } from "./chunk-XPYW5WQS.js";
47
47
  import {
48
48
  getDaemonVersion
49
- } from "./chunk-MAA2DPW5.js";
49
+ } from "./chunk-ZXYFMJAS.js";
50
50
  import {
51
51
  collectPriorCrashDetail,
52
52
  getRecentWasmPanicMessages
@@ -189,12 +189,12 @@ import {
189
189
  unresolveReviewThread,
190
190
  withLabelAsync,
191
191
  writeCursorApiKeyToVault
192
- } from "./chunk-UIBOKFSG.js";
192
+ } from "./chunk-XPOXRIHH.js";
193
193
  import {
194
194
  classifySkill,
195
195
  detectSkills,
196
196
  resolveDevinConfigHome
197
- } from "./chunk-ZDJEJI62.js";
197
+ } from "./chunk-ELZLWLTO.js";
198
198
  import {
199
199
  buildNodeSpawnEnv,
200
200
  nodeSpawnEnvOverlay,
@@ -212,7 +212,7 @@ import {
212
212
  removeWorktreeFromCache,
213
213
  run,
214
214
  runWithTimeout
215
- } from "./chunk-5TF227G7.js";
215
+ } from "./chunk-WKJAGQU7.js";
216
216
  import {
217
217
  gitExecSafe
218
218
  } from "./chunk-4T2OQAVL.js";
@@ -233,15 +233,16 @@ import {
233
233
  resolveStdioEnv,
234
234
  setTelemetrySink,
235
235
  telemeter
236
- } from "./chunk-42SK2S4V.js";
236
+ } from "./chunk-FYT3ETTP.js";
237
237
  import {
238
238
  atomicWriteFile,
239
239
  findProjectRoot,
240
240
  isCorruptionError,
241
241
  isEexist,
242
242
  isEnoent,
243
+ tryAcquireHeldFileLock,
243
244
  withFileLock
244
- } from "./chunk-RR6V6SNM.js";
245
+ } from "./chunk-VHPNDDB5.js";
245
246
  import {
246
247
  createOneShotPool
247
248
  } from "./chunk-ZFKJAYAN.js";
@@ -257,7 +258,7 @@ import {
257
258
  createAssetResolver,
258
259
  toSdkContent,
259
260
  toSdkPermissionMode
260
- } from "./chunk-PVN4AJAH.js";
261
+ } from "./chunk-3PJULQHI.js";
261
262
  import {
262
263
  AGENT_IDS,
263
264
  AGENT_SYSTEM_CLAUDE_CODE,
@@ -466,7 +467,7 @@ import {
466
467
  unsafeAssertSourceId,
467
468
  vizFileExtension,
468
469
  withPreferredRuntimeAuthMethod
469
- } from "./chunk-RBXWUYDC.js";
470
+ } from "./chunk-DQQOVPVK.js";
470
471
  import {
471
472
  AuthGitHubCallbackRequestSchema,
472
473
  AuthGitHubCallbackResponseSchema,
@@ -514,7 +515,7 @@ import {
514
515
  VaultKeyPutResponseSchema,
515
516
  classifyClaudeCodeCompatibility,
516
517
  classifyCodexCompatibility
517
- } from "./chunk-FARMJBC7.js";
518
+ } from "./chunk-MV7VSD2T.js";
518
519
  import {
519
520
  external_exports as external_exports2
520
521
  } from "./chunk-EHQITHQX.js";
@@ -5118,6 +5119,42 @@ async function detectPriorAbnormalExit(deps) {
5118
5119
  };
5119
5120
  }
5120
5121
 
5122
+ // src/services/bootstrap/fatal-signal-listeners.ts
5123
+ var FATAL_SYNC_SIGNALS = [
5124
+ "SIGTRAP",
5125
+ "SIGSYS",
5126
+ "SIGILL",
5127
+ "SIGBUS",
5128
+ "SIGSEGV",
5129
+ "SIGFPE"
5130
+ ];
5131
+ function countFatalSignalListeners(host) {
5132
+ const counts = {};
5133
+ for (const signal of FATAL_SYNC_SIGNALS) counts[signal] = host.listenerCount(signal);
5134
+ return {
5135
+ SIGTRAP: counts.SIGTRAP ?? 0,
5136
+ SIGSYS: counts.SIGSYS ?? 0,
5137
+ SIGILL: counts.SIGILL ?? 0,
5138
+ SIGBUS: counts.SIGBUS ?? 0,
5139
+ SIGSEGV: counts.SIGSEGV ?? 0,
5140
+ SIGFPE: counts.SIGFPE ?? 0
5141
+ };
5142
+ }
5143
+ function sweepFatalSignalListeners(deps) {
5144
+ const counts = countFatalSignalListeners(deps.host);
5145
+ const offending = FATAL_SYNC_SIGNALS.filter((signal) => counts[signal] > 0);
5146
+ for (const signal of offending) deps.host.removeAllListeners(signal);
5147
+ const removed = offending.reduce((sum, signal) => sum + counts[signal], 0);
5148
+ if (removed > 0) {
5149
+ deps.log({
5150
+ event: "fatal_signal_listeners_removed",
5151
+ removed,
5152
+ signals: Object.fromEntries(offending.map((signal) => [signal, counts[signal]]))
5153
+ });
5154
+ }
5155
+ return removed;
5156
+ }
5157
+
5121
5158
  // src/services/bootstrap/sigusr2-stack-dump.ts
5122
5159
  import { mkdir as mkdir3, readdir as readdir5, unlink, writeFile as writeFile3 } from "fs/promises";
5123
5160
  import { Session } from "inspector/promises";
@@ -5256,8 +5293,16 @@ function startWedgeHeartbeat(deps) {
5256
5293
  }
5257
5294
 
5258
5295
  // src/services/bootstrap/wedge-wiring.ts
5296
+ var FATAL_SIGNAL_SWEEP_INTERVAL_MS = 6e4;
5259
5297
  function wireWedgeDetection(deps) {
5260
5298
  const sigusr2Handle = installSigusr2Handler({ log: deps.log, outDir: deps.outDir });
5299
+ const removedAtBoot = sweepFatalSignalListeners({ host: process, log: deps.log });
5300
+ deps.log({ event: "fatal_signal_listeners_checked", removed: removedAtBoot });
5301
+ const fatalSignalSweep = setInterval(
5302
+ () => sweepFatalSignalListeners({ host: process, log: deps.log }),
5303
+ FATAL_SIGNAL_SWEEP_INTERVAL_MS
5304
+ );
5305
+ fatalSignalSweep.unref();
5261
5306
  let heartbeatHandle = null;
5262
5307
  if (typeof process.send === "function") {
5263
5308
  const sendRef = process.send.bind(process);
@@ -5272,6 +5317,7 @@ function wireWedgeDetection(deps) {
5272
5317
  }
5273
5318
  return {
5274
5319
  stop: () => {
5320
+ clearInterval(fatalSignalSweep);
5275
5321
  heartbeatHandle?.stop();
5276
5322
  sigusr2Handle.stop();
5277
5323
  }
@@ -6068,7 +6114,7 @@ function nanoid(size = 21) {
6068
6114
  }
6069
6115
 
6070
6116
  // src/services/bootstrap/signaling.ts
6071
- var DAEMON_NPM_VERSION = true ? "3.32.0" : "unknown";
6117
+ var DAEMON_NPM_VERSION = true ? "3.33.0" : "unknown";
6072
6118
  function createDaemonSignaling(config) {
6073
6119
  const agentId = config.agentId ?? nanoid();
6074
6120
  function send(msg) {
@@ -17962,7 +18008,7 @@ async function refreshPluginCapabilities(daemon, tokenStore) {
17962
18008
  const userSettings = await daemon.userSettingsStore.getSettings();
17963
18009
  const [updatedMarketplace, updatedMcp, updatedSkills] = await Promise.all([
17964
18010
  detectMarketplacePlugins(daemon.capabilities.marketplacePlugins),
17965
- import("./mcp-servers-LTYMM2F2.js").then(
18011
+ import("./mcp-servers-GHDSX3UE.js").then(
17966
18012
  (m2) => m2.detectMCPServers(
17967
18013
  daemon.capabilities.environments,
17968
18014
  tokenStore,
@@ -17971,7 +18017,7 @@ async function refreshPluginCapabilities(daemon, tokenStore) {
17971
18017
  readPreferredClaudeAuthMethod(userSettings)
17972
18018
  )
17973
18019
  ),
17974
- import("./skills-BX2NZKPN.js").then(
18020
+ import("./skills-RO2BW4XO.js").then(
17975
18021
  (m2) => m2.detectSkills(daemon.capabilities.environments)
17976
18022
  )
17977
18023
  ]);
@@ -35353,8 +35399,10 @@ function parseQueueKey(queueKey) {
35353
35399
 
35354
35400
  // src/services/task/manager/task-manager-composer-settings.ts
35355
35401
  var DEPRECATED_COMPOSER_MODEL_FALLBACKS = {
35356
- "gpt-5.3-codex": "gpt-5.6-sol",
35357
- "gpt-5.5": "gpt-5.6-sol",
35402
+ "gpt-5.3-codex": "gpt-6-sol",
35403
+ "gpt-5.5": "gpt-6-sol",
35404
+ "gpt-5.6-sol": "gpt-6-sol",
35405
+ "gpt-5.6-luna": "gpt-6-luna",
35358
35406
  "grok-4.5": "grok-4.7",
35359
35407
  "grok-4.6": "grok-4.7",
35360
35408
  "claude-opus-5": "claude-opus-5-5",
@@ -35363,6 +35411,10 @@ var DEPRECATED_COMPOSER_MODEL_FALLBACKS = {
35363
35411
  function normalizeComposerModel(model) {
35364
35412
  return DEPRECATED_COMPOSER_MODEL_FALLBACKS[model] ?? canonicalDevinModelId(model);
35365
35413
  }
35414
+ function normalizeCachedComposerModel(model) {
35415
+ if (model == null) return null;
35416
+ return DEPRECATED_COMPOSER_MODEL_FALLBACKS[model] ?? model;
35417
+ }
35366
35418
  function normalizeComposerSettings(settings, current = {}) {
35367
35419
  const fallback = settings.model == null ? void 0 : DEPRECATED_COMPOSER_MODEL_FALLBACKS[settings.model];
35368
35420
  const remapped = fallback === void 0 ? settings : { ...settings, model: fallback };
@@ -88226,9 +88278,8 @@ async function atomicWrite4(filePath, data) {
88226
88278
  }
88227
88279
 
88228
88280
  // src/services/storage/schedule-store.ts
88229
- import { mkdir as mkdir34, readFile as readFile44, writeFile as writeFile26 } from "fs/promises";
88281
+ import { lstat as lstat6, mkdir as mkdir34, readFile as readFile44, rmdir, writeFile as writeFile26 } from "fs/promises";
88230
88282
  import { dirname as dirname34, join as join77 } from "path";
88231
- import properLockfile from "proper-lockfile";
88232
88283
  var STORE_FILE = "schedules.json";
88233
88284
  function emptyState() {
88234
88285
  return {
@@ -88268,7 +88319,32 @@ function notify(listeners, event) {
88268
88319
  }
88269
88320
  }
88270
88321
  }
88271
- function buildScheduleStore(dataDir, options = {}) {
88322
+ async function reclaimStaleLegacyLockDir(lockPath2, staleMs, log) {
88323
+ let stats;
88324
+ try {
88325
+ stats = await lstat6(lockPath2);
88326
+ } catch (error) {
88327
+ if (isEnoent(error)) return;
88328
+ throw error;
88329
+ }
88330
+ if (!stats.isDirectory() || Date.now() - stats.mtimeMs <= staleMs) return;
88331
+ try {
88332
+ await rmdir(lockPath2);
88333
+ } catch (error) {
88334
+ if (isChangedUnderneath(error)) return;
88335
+ throw error;
88336
+ }
88337
+ log({
88338
+ event: "schedule_store_legacy_lock_reclaimed",
88339
+ lockPath: lockPath2,
88340
+ ageMs: Date.now() - stats.mtimeMs
88341
+ });
88342
+ }
88343
+ function isChangedUnderneath(error) {
88344
+ const code = typeof error === "object" && error !== null ? Reflect.get(error, "code") : void 0;
88345
+ return code === "ENOENT" || code === "ENOTDIR" || code === "ENOTEMPTY" || code === "EEXIST";
88346
+ }
88347
+ function buildScheduleStore(dataDir, options) {
88272
88348
  const filePath = join77(dataDir, STORE_FILE);
88273
88349
  const lockPath2 = `${filePath}.automation-lock`;
88274
88350
  const listeners = /* @__PURE__ */ new Set();
@@ -88278,37 +88354,31 @@ function buildScheduleStore(dataDir, options = {}) {
88278
88354
  const retryCount = options.lockRetryCount ?? 100;
88279
88355
  async function withScheduleLock(operation) {
88280
88356
  await mkdir34(dirname34(filePath), { recursive: true });
88281
- let compromised = null;
88282
- const release = await properLockfile.lock(filePath, {
88283
- realpath: false,
88284
- lockfilePath: lockPath2,
88285
- stale: staleMs,
88286
- update: updateMs,
88287
- retries: {
88288
- retries: retryCount,
88289
- factor: 1,
88290
- minTimeout: retryDelayMs,
88291
- maxTimeout: retryDelayMs
88292
- },
88293
- onCompromised(error) {
88294
- compromised = error;
88295
- }
88296
- });
88297
- const assertLockHealthy = () => {
88298
- if (compromised) throw compromised;
88299
- };
88357
+ const lock = await acquireWithRetries(lockPath2);
88358
+ const assertLockHealthy = () => lock.assertHealthy();
88300
88359
  let result;
88301
88360
  try {
88302
88361
  result = await operation(assertLockHealthy);
88303
88362
  assertLockHealthy();
88304
88363
  } catch (error) {
88305
- await release().catch(() => {
88364
+ await lock.release().catch(() => {
88306
88365
  });
88307
88366
  throw error;
88308
88367
  }
88309
- await release();
88368
+ await lock.release();
88310
88369
  return result;
88311
88370
  }
88371
+ async function acquireWithRetries(path8) {
88372
+ for (let attempt = 0; attempt <= retryCount; attempt += 1) {
88373
+ await reclaimStaleLegacyLockDir(path8, staleMs, options.log);
88374
+ const lock = await tryAcquireHeldFileLock(path8, { staleMs, refreshMs: updateMs });
88375
+ if (lock) return lock;
88376
+ await new Promise((resolve15) => setTimeout(resolve15, retryDelayMs));
88377
+ }
88378
+ throw Object.assign(new Error(`Schedule store lock is held by another process: ${path8}`), {
88379
+ code: "ELOCKED"
88380
+ });
88381
+ }
88312
88382
  async function loadFromDisk() {
88313
88383
  let source;
88314
88384
  try {
@@ -88372,42 +88442,9 @@ function buildScheduleStore(dataDir, options = {}) {
88372
88442
  }
88373
88443
  async function tryAcquireRunExecutionLock(runId) {
88374
88444
  await mkdir34(dirname34(filePath), { recursive: true });
88375
- const executionPath = `${filePath}.run-${encodeURIComponent(runId)}`;
88376
- let compromised = null;
88377
- let release;
88378
- try {
88379
- release = await properLockfile.lock(executionPath, {
88380
- realpath: false,
88381
- lockfilePath: `${executionPath}.lock`,
88382
- stale: staleMs,
88383
- update: updateMs,
88384
- retries: 0,
88385
- onCompromised(error) {
88386
- compromised = error;
88387
- }
88388
- });
88389
- } catch (error) {
88390
- if (typeof error === "object" && error !== null && Reflect.get(error, "code") === "ELOCKED") {
88391
- return null;
88392
- }
88393
- throw error;
88394
- }
88395
- const assertLockHealthy = () => {
88396
- if (compromised) throw compromised;
88397
- };
88398
- let released = false;
88399
- return {
88400
- assertHealthy: assertLockHealthy,
88401
- async release() {
88402
- if (released) return;
88403
- released = true;
88404
- await release().catch((error) => {
88405
- if (typeof error !== "object" || error === null || Reflect.get(error, "code") !== "ERELEASED") {
88406
- throw error;
88407
- }
88408
- });
88409
- }
88410
- };
88445
+ const executionLockPath = `${filePath}.run-${encodeURIComponent(runId)}.lock`;
88446
+ await reclaimStaleLegacyLockDir(executionLockPath, staleMs, options.log);
88447
+ return tryAcquireHeldFileLock(executionLockPath, { staleMs, refreshMs: updateMs });
88411
88448
  }
88412
88449
  return {
88413
88450
  async create(schedule) {
@@ -112443,7 +112480,7 @@ async function createDaemon(deps) {
112443
112480
  env: process.env
112444
112481
  });
112445
112482
  const _b = await userSettingsStore.getSettings();
112446
- let cachedComposerModel = _b.composerModel ?? null;
112483
+ let cachedComposerModel = normalizeCachedComposerModel(_b.composerModel);
112447
112484
  let cachedComposerReasoning = _b.composerReasoning ?? null;
112448
112485
  let cachedComposerPermission = _b.composerPermission ?? null;
112449
112486
  const cachedCompactionByRuntime = new Map(
@@ -113368,7 +113405,7 @@ async function createDaemon(deps) {
113368
113405
  if (!cwd) return null;
113369
113406
  try {
113370
113407
  const { gitExecSafe: gitExecSafe2 } = await import("./git-pool-V73Q53NX.js");
113371
- const { getRepoDefaultBranch: getRepoDefaultBranch2 } = await import("./git-repo-M634UEX7.js");
113408
+ const { getRepoDefaultBranch: getRepoDefaultBranch2 } = await import("./git-repo-K45YAY55.js");
113372
113409
  const branch = await gitExecSafe2(cwd, ["rev-parse", "--abbrev-ref", "HEAD"]) ?? "";
113373
113410
  if (!branch || branch === "HEAD") return null;
113374
113411
  const pr = branchPrStateCache.get(taskId)?.currentBranchPR;
@@ -113758,7 +113795,7 @@ async function createDaemon(deps) {
113758
113795
  checkIsAuthenticated: () => capabilitiesRef.current?.anthropicAuth?.status !== "unauthenticated"
113759
113796
  });
113760
113797
  taskManager.setPreWarmManager(preWarmManager);
113761
- const scheduleStore = buildScheduleStore(deps.dataDir);
113798
+ const scheduleStore = buildScheduleStore(deps.dataDir, { log: deps.log });
113762
113799
  const rateLimitStore = await buildRateLimitStore(deps.dataDir, {
113763
113800
  onError: (err3, ctx) => {
113764
113801
  logger.error({ err: err3, ...ctx }, "rate-limit store write failed");
@@ -113889,7 +113926,7 @@ async function createDaemon(deps) {
113889
113926
  };
113890
113927
  const userSettingsUnsub = userSettingsStore.subscribe((settings) => {
113891
113928
  applyStayAwakeSetting(settings.stayAwake);
113892
- const newModel = settings.composerModel ?? null;
113929
+ const newModel = normalizeCachedComposerModel(settings.composerModel);
113893
113930
  const newReasoning = settings.composerReasoning ?? null;
113894
113931
  const initLockedChanged = newModel !== cachedComposerModel || newReasoning !== cachedComposerReasoning;
113895
113932
  cachedComposerModel = newModel;
@@ -116330,7 +116367,7 @@ async function saveCodexSkillsCache(path8, cache2) {
116330
116367
  }
116331
116368
 
116332
116369
  // src/services/skills-mirror/manager.ts
116333
- import { lstat as lstat6, mkdir as mkdir44, readlink, stat as stat23, symlink, unlink as unlink18 } from "fs/promises";
116370
+ import { lstat as lstat7, mkdir as mkdir44, readlink, stat as stat23, symlink, unlink as unlink18 } from "fs/promises";
116334
116371
  import { homedir as homedir16 } from "os";
116335
116372
  import { dirname as dirname43, join as join91 } from "path";
116336
116373
 
@@ -116406,7 +116443,7 @@ function isPermissionError(err3) {
116406
116443
  }
116407
116444
  async function probeLink(path8) {
116408
116445
  try {
116409
- const st = await lstat6(path8);
116446
+ const st = await lstat7(path8);
116410
116447
  if (st.isSymbolicLink()) {
116411
116448
  try {
116412
116449
  const currentTarget = await readlink(path8);
@@ -117856,4 +117893,4 @@ export {
117856
117893
  decideWorkspaceScope,
117857
117894
  serve
117858
117895
  };
117859
- //# sourceMappingURL=serve-JVTSDF4E.js.map
117896
+ //# sourceMappingURL=serve-SDRQ7JYB.js.map