@runeya/runeya 2.0.121 → 2.0.122

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.
@@ -31,8 +31,9 @@ import {
31
31
  runCompanionNow,
32
32
  syncConversationFromClaudeTranscript,
33
33
  verifyJwt
34
- } from "./chunk-OVV52N5F.js";
34
+ } from "./chunk-VNLIA5PV.js";
35
35
  import {
36
+ StoreDiskCoordinator,
36
37
  agentManager,
37
38
  agentStore,
38
39
  decryptValue,
@@ -48,16 +49,20 @@ import {
48
49
  isEncryptedValue,
49
50
  refsOfProjectId,
50
51
  serviceStore
51
- } from "./chunk-CNTL6NVU.js";
52
+ } from "./chunk-XTLQOYLT.js";
52
53
  import {
53
54
  settingsManager
54
- } from "./chunk-3N55WR7F.js";
55
+ } from "./chunk-NIU3CN5A.js";
55
56
  import {
57
+ atomicWriteJsonSecure,
58
+ atomicWriteSecure,
56
59
  fingerprintFiles,
57
60
  hasChangedSinceRead,
61
+ readJsonFileSafe,
58
62
  rememberFile,
63
+ resolveConversationRunDir,
59
64
  wasRead
60
- } from "./chunk-YZU5FNXR.js";
65
+ } from "./chunk-GL7WA5K3.js";
61
66
  import {
62
67
  AGENT_STOP_FETCH_TIMEOUT,
63
68
  ApiKeysFileSchema,
@@ -208,8 +213,8 @@ import { initTRPC, TRPCError } from "@trpc/server";
208
213
 
209
214
  // ../server/src/services/api-key-store.ts
210
215
  import { randomBytes, randomUUID, timingSafeEqual } from "crypto";
211
- import { readFile, writeFile, rename, mkdir, chmod } from "fs/promises";
212
- import { dirname, join as join2 } from "path";
216
+ import { readFile } from "fs/promises";
217
+ import { join as join2 } from "path";
213
218
  function maskApiKey(apiKey) {
214
219
  const { key, ...rest } = apiKey;
215
220
  return { ...rest, keyPreview: key.slice(-4) };
@@ -242,6 +247,7 @@ var ApiKeyStore = class {
242
247
  * cette racine machine efface la clé que la première vient de créer.
243
248
  */
244
249
  fingerprint = "";
250
+ disk = new StoreDiskCoordinator();
245
251
  /**
246
252
  * Encrypted at rest, so the file sits beside the key that opens it — read
247
253
  * under a different key it would decrypt to blanks, then be saved back blank.
@@ -263,15 +269,11 @@ var ApiKeyStore = class {
263
269
  );
264
270
  return;
265
271
  }
266
- await mkdir(dirname(path), { recursive: true });
267
272
  const keys = Array.from(this.keys.values()).filter((k) => k.isPublic === isPublic && (this.owners.get(k.id) ?? null) === owner).map((k) => ({ ...k, key: encryptValue(k.key, owner ?? void 0) }));
268
273
  for (const raw of this.unreadable.get(owner)?.values() ?? []) {
269
274
  if (raw.isPublic === isPublic) keys.push(raw);
270
275
  }
271
- const tmp = path + ".tmp";
272
- await writeFile(tmp, JSON.stringify({ keys }, null, 2), "utf-8");
273
- await rename(tmp, path);
274
- await chmod(path, 384);
276
+ await atomicWriteSecure(path, JSON.stringify({ keys }, null, 2));
275
277
  await rememberFile(path);
276
278
  this.fingerprint = await this.diskFingerprint();
277
279
  }
@@ -281,10 +283,12 @@ var ApiKeyStore = class {
281
283
  * Y compris ceux qui n'ont plus de clé : sinon une clé supprimée — ou dont le
282
284
  * propriétaire a changé — survivrait dans son ancien coffre.
283
285
  */
284
- async persist(isPublic) {
285
- for (const owner of this.knownOwners) await this.persistFile(isPublic, owner);
286
+ persist(isPublic) {
287
+ return this.disk.save(async () => {
288
+ for (const owner of this.knownOwners) await this.persistFile(isPublic, owner);
289
+ });
286
290
  }
287
- async loadFile(path, owner) {
291
+ async loadFile(path, owner, into) {
288
292
  try {
289
293
  const raw = await readFile(path, "utf-8");
290
294
  await rememberFile(path);
@@ -294,13 +298,13 @@ var ApiKeyStore = class {
294
298
  for (const k of parsed.data.keys) {
295
299
  try {
296
300
  const key = isEncryptedValue(k.key) ? decryptValue(k.key, owner ?? void 0) : k.key;
297
- this.keys.set(k.id, { ...k, key });
298
- this.owners.set(k.id, owner);
301
+ into.keys.set(k.id, { ...k, key });
302
+ into.owners.set(k.id, owner);
299
303
  } catch {
300
304
  console.error(`[api-key-store] Cl\xE9 d'API ${k.id} illisible sous la cl\xE9 de ce coffre \u2014 conserv\xE9e telle quelle sur le disque`);
301
- const bucket = this.unreadable.get(owner) ?? /* @__PURE__ */ new Map();
305
+ const bucket = into.unreadable.get(owner) ?? /* @__PURE__ */ new Map();
302
306
  bucket.set(k.id, k);
303
- this.unreadable.set(owner, bucket);
307
+ into.unreadable.set(owner, bucket);
304
308
  }
305
309
  }
306
310
  }
@@ -321,18 +325,22 @@ var ApiKeyStore = class {
321
325
  }
322
326
  /** La machine, puis chaque organisation dont un coffre existe sur ce disque. */
323
327
  async load() {
324
- const fingerprint = await this.diskFingerprint();
325
- if (this.loaded && fingerprint === this.fingerprint) return;
326
- this.loaded = true;
327
- this.fingerprint = fingerprint;
328
- const owners = [null, ...await listOrgVaults()];
329
- this.keys.clear();
330
- this.owners.clear();
331
- this.unreadable.clear();
332
- for (const owner of owners) {
333
- await this.loadFile(await this.filePath(true, owner), owner);
334
- await this.loadFile(await this.filePath(false, owner), owner);
335
- }
328
+ await this.disk.load(async () => {
329
+ const fingerprint = await this.diskFingerprint();
330
+ if (this.loaded && fingerprint === this.fingerprint) return null;
331
+ const next = { keys: /* @__PURE__ */ new Map(), owners: /* @__PURE__ */ new Map(), unreadable: /* @__PURE__ */ new Map() };
332
+ for (const owner of [null, ...await listOrgVaults()]) {
333
+ await this.loadFile(await this.filePath(true, owner), owner, next);
334
+ await this.loadFile(await this.filePath(false, owner), owner, next);
335
+ }
336
+ return () => {
337
+ this.keys = next.keys;
338
+ this.owners = next.owners;
339
+ this.unreadable = next.unreadable;
340
+ this.fingerprint = fingerprint;
341
+ this.loaded = true;
342
+ };
343
+ });
336
344
  }
337
345
  /**
338
346
  * Oublier ce qui a été lu, pour tout relire sous la clé courante.
@@ -567,7 +575,7 @@ var DescriptionSchema = z2.string().max(2e3);
567
575
  var OptionalProviderIdSchema = Id128Schema.optional();
568
576
 
569
577
  // ../server/src/services/workspace-cwd.ts
570
- import { isAbsolute, join as join3, dirname as dirname2 } from "path";
578
+ import { isAbsolute, join as join3, dirname } from "path";
571
579
  async function projectRoot(ref) {
572
580
  const project = await projectStore.get(ref);
573
581
  if (!project?.orgId) return null;
@@ -598,7 +606,7 @@ function anchor(base, raw) {
598
606
  return join3(base, raw);
599
607
  }
600
608
  function localVaultRootParent() {
601
- return dirname2(localVaultRoot());
609
+ return dirname(localVaultRoot());
602
610
  }
603
611
  async function resolveAgentCwd(target) {
604
612
  if (target.serviceId) {
@@ -626,8 +634,8 @@ async function resolveConversationCwd(conversationId) {
626
634
  }
627
635
 
628
636
  // ../server/src/services/environment-overrides-store.ts
629
- import { readFile as readFile2, writeFile as writeFile2, rename as rename2, mkdir as mkdir2, chmod as chmod2 } from "fs/promises";
630
- import { dirname as dirname3, join as join4 } from "path";
637
+ import { readFile as readFile2, writeFile, rename, mkdir, chmod } from "fs/promises";
638
+ import { dirname as dirname2, join as join4 } from "path";
631
639
  var FILENAME = "environment-overrides.json";
632
640
  var EnvironmentOverridesStore = class {
633
641
  data = {};
@@ -660,7 +668,7 @@ var EnvironmentOverridesStore = class {
660
668
  async rootFor(variableId) {
661
669
  const root = await environmentStore.rootOfVariable(variableId);
662
670
  if (root) return root;
663
- return this.roots.get(variableId) ?? dirname3(await keyedFilePath(FILENAME));
671
+ return this.roots.get(variableId) ?? dirname2(await keyedFilePath(FILENAME));
664
672
  }
665
673
  /** Where earlier versions kept them: read once, rewritten to their vaults. */
666
674
  getLegacyFilePath() {
@@ -698,11 +706,11 @@ var EnvironmentOverridesStore = class {
698
706
  parsed,
699
707
  "environment-overrides",
700
708
  (variableId) => this.unreadableSecrets.add(variableId),
701
- vaultIdOfRoot(dirname3(path))
709
+ vaultIdOfRoot(dirname2(path))
702
710
  );
703
711
  for (const [id, override] of Object.entries(decrypted)) {
704
712
  this.data[id] = { value: override.value };
705
- this.roots.set(id, dirname3(path));
713
+ this.roots.set(id, dirname2(path));
706
714
  }
707
715
  }
708
716
  }
@@ -737,12 +745,12 @@ var EnvironmentOverridesStore = class {
737
745
  this.diskEncryptedSlots,
738
746
  extractEncryptedVariableSlots(encrypted)
739
747
  );
740
- await mkdir2(root, { recursive: true });
748
+ await mkdir(root, { recursive: true });
741
749
  const path = join4(root, FILENAME);
742
750
  const tmpPath = path + ".tmp";
743
- await writeFile2(tmpPath, JSON.stringify(encrypted, null, 2), "utf-8");
744
- await rename2(tmpPath, path);
745
- await chmod2(path, 384);
751
+ await writeFile(tmpPath, JSON.stringify(encrypted, null, 2), "utf-8");
752
+ await rename(tmpPath, path);
753
+ await chmod(path, 384);
746
754
  }
747
755
  }
748
756
  /**
@@ -2239,7 +2247,7 @@ import { z as z3 } from "zod";
2239
2247
  import { TRPCError as TRPCError2 } from "@trpc/server";
2240
2248
 
2241
2249
  // ../server/src/services/audit-service.ts
2242
- import { appendFile, readFile as readFile3, stat, rename as rename3, unlink, readdir as readdir2, mkdir as mkdir3 } from "fs/promises";
2250
+ import { appendFile, readFile as readFile3, stat, rename as rename2, unlink, readdir as readdir2, mkdir as mkdir2 } from "fs/promises";
2243
2251
  var AUDIT_FILENAME = "audit.log";
2244
2252
  var MAX_FILE_SIZE = 10 * 1024 * 1024;
2245
2253
  var MAX_AGE_DAYS = 30;
@@ -2259,7 +2267,7 @@ var AuditService = class {
2259
2267
  const line = JSON.stringify(record) + "\n";
2260
2268
  const filepath = this.getFilePath();
2261
2269
  try {
2262
- await mkdir3(machineRoot(), { recursive: true });
2270
+ await mkdir2(machineRoot(), { recursive: true });
2263
2271
  await appendFile(filepath, line, "utf-8");
2264
2272
  await this.rotateIfNeeded();
2265
2273
  } catch (err) {
@@ -2305,7 +2313,7 @@ var AuditService = class {
2305
2313
  try {
2306
2314
  const stats = await stat(filepath);
2307
2315
  if (stats.size > MAX_FILE_SIZE) {
2308
- await rename3(filepath, this.getRotatedPath());
2316
+ await rename2(filepath, this.getRotatedPath());
2309
2317
  }
2310
2318
  } catch {
2311
2319
  }
@@ -3004,7 +3012,7 @@ function parse(text) {
3004
3012
  return result;
3005
3013
  }
3006
3014
  function getClaudeUsage() {
3007
- return new Promise((resolve3, reject) => {
3015
+ return new Promise((resolve2, reject) => {
3008
3016
  const env2 = { ...process.env };
3009
3017
  delete env2["CLAUDECODE"];
3010
3018
  let claudeBin = "claude";
@@ -3037,7 +3045,7 @@ function getClaudeUsage() {
3037
3045
  clearTimeout(hardTimeout);
3038
3046
  term?.kill();
3039
3047
  const clean = buffer.replaceAll(/\x1b\[[0-9;]*X/g, "\n").replaceAll(/\x1b\[[0-9;]*[mGKHFABCDJsu]/g, "").replaceAll(/\x1b[^a-zA-Z]*[a-zA-Z]/g, "").replaceAll("\r", "");
3040
- resolve3(parse(clean));
3048
+ resolve2(parse(clean));
3041
3049
  }
3042
3050
  const hardTimeout = setTimeout(() => {
3043
3051
  if (!done) finish();
@@ -3171,7 +3179,7 @@ function parseCodexStatusText(text) {
3171
3179
  return entries;
3172
3180
  }
3173
3181
  function getCodexUsageEntries() {
3174
- return new Promise((resolve3, reject) => {
3182
+ return new Promise((resolve2, reject) => {
3175
3183
  let term = null;
3176
3184
  try {
3177
3185
  const invocation = resolveCliInvocation("codex", []);
@@ -3202,7 +3210,7 @@ function getCodexUsageEntries() {
3202
3210
  const debugClean = stripAnsi(buffer).slice(-6e3);
3203
3211
  process.stdout.write("[codex-usage] raw tail:\n" + debugClean + "\n");
3204
3212
  }
3205
- resolve3(parseCodexStatusText(buffer));
3213
+ resolve2(parseCodexStatusText(buffer));
3206
3214
  };
3207
3215
  const hardTimeout = setTimeout(() => {
3208
3216
  finish();
@@ -3405,44 +3413,8 @@ var ScenarioStore = class {
3405
3413
  var scenarioStore = new ScenarioStore();
3406
3414
 
3407
3415
  // ../server/src/services/scenario-run-store.ts
3408
- import { mkdir as mkdir5, rm, readFile as readFile5 } from "fs/promises";
3416
+ import { mkdir as mkdir3, rm, readFile as readFile4 } from "fs/promises";
3409
3417
  import { join as join5 } from "path";
3410
-
3411
- // ../server/src/services/run-store-utils.ts
3412
- import { chmod as chmod3, mkdir as mkdir4, rename as rename4, writeFile as writeFile3, readFile as readFile4 } from "fs/promises";
3413
- import { dirname as dirname4, resolve, sep } from "path";
3414
- var SAFE_PATH_SEGMENT_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/;
3415
- function resolveConversationRunDir(rootDirName, conversationId) {
3416
- if (!SAFE_PATH_SEGMENT_RE.test(conversationId)) {
3417
- throw new Error("Invalid conversationId");
3418
- }
3419
- const base = resolve(machineRoot(), rootDirName);
3420
- const dir = resolve(base, conversationId);
3421
- if (!dir.startsWith(base + sep)) {
3422
- throw new Error("Invalid conversationId");
3423
- }
3424
- return dir;
3425
- }
3426
- async function atomicWriteSecure(filePath, content) {
3427
- await mkdir4(dirname4(filePath), { recursive: true });
3428
- const tmpPath = `${filePath}.tmp`;
3429
- await writeFile3(tmpPath, content, "utf-8");
3430
- await rename4(tmpPath, filePath);
3431
- await chmod3(filePath, 384);
3432
- }
3433
- async function atomicWriteJsonSecure(filePath, data, pretty = false) {
3434
- await atomicWriteSecure(filePath, JSON.stringify(data, null, pretty ? 2 : 0));
3435
- }
3436
- async function readJsonFileSafe(filePath) {
3437
- try {
3438
- const raw = await readFile4(filePath, "utf-8");
3439
- return JSON.parse(raw);
3440
- } catch {
3441
- return null;
3442
- }
3443
- }
3444
-
3445
- // ../server/src/services/scenario-run-store.ts
3446
3418
  function sanitizeSlug(value) {
3447
3419
  return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60) || "member";
3448
3420
  }
@@ -3458,7 +3430,7 @@ var ScenarioRunStore = class _ScenarioRunStore {
3458
3430
  }
3459
3431
  async initializeConversationWorkspace(conversationId, scenario, userInput) {
3460
3432
  const dir = this.getRunDir(conversationId);
3461
- await mkdir5(dir, { recursive: true });
3433
+ await mkdir3(dir, { recursive: true });
3462
3434
  await this.saveScenarioSnapshot(conversationId, scenario);
3463
3435
  const nodesById = new Map(scenario.nodes.map((p) => [p.id, p]));
3464
3436
  const teamMap = new Map(scenario.groups.map((t2) => [t2.id, t2.name]));
@@ -3570,7 +3542,7 @@ ${userInput.trim() || "(empty)"}
3570
3542
  if (!runState) return;
3571
3543
  try {
3572
3544
  const dir = this.getRunDir(conversationId);
3573
- await mkdir5(dir, { recursive: true });
3545
+ await mkdir3(dir, { recursive: true });
3574
3546
  const data = {
3575
3547
  nodeStates: { ...runState.nodeStates },
3576
3548
  nodeOutputs: { ...runState.nodeOutputs },
@@ -3589,7 +3561,7 @@ ${userInput.trim() || "(empty)"}
3589
3561
  async readUserRequest(conversationId) {
3590
3562
  try {
3591
3563
  const dir = this.getRunDir(conversationId);
3592
- const content = await readFile5(join5(dir, "USER_REQUEST.md"), "utf-8");
3564
+ const content = await readFile4(join5(dir, "USER_REQUEST.md"), "utf-8");
3593
3565
  return content.replace(/^#\s*User request\s*\n+/, "").trim() || null;
3594
3566
  } catch {
3595
3567
  return null;
@@ -3598,14 +3570,14 @@ ${userInput.trim() || "(empty)"}
3598
3570
  async readReadme(conversationId) {
3599
3571
  try {
3600
3572
  const dir = this.getRunDir(conversationId);
3601
- return await readFile5(join5(dir, "README.md"), "utf-8");
3573
+ return await readFile4(join5(dir, "README.md"), "utf-8");
3602
3574
  } catch {
3603
3575
  return null;
3604
3576
  }
3605
3577
  }
3606
3578
  async saveScenarioSnapshot(conversationId, scenario) {
3607
3579
  const dir = this.getRunDir(conversationId);
3608
- await mkdir5(dir, { recursive: true });
3580
+ await mkdir3(dir, { recursive: true });
3609
3581
  await atomicWriteJsonSecure(
3610
3582
  join5(dir, _ScenarioRunStore.SCENARIO_SNAPSHOT_FILE),
3611
3583
  scenario,
@@ -3669,9 +3641,9 @@ async function vaultOfProject(projectId) {
3669
3641
 
3670
3642
  // ../server/src/services/image-storage.service.ts
3671
3643
  import { randomUUID as randomUUID3 } from "crypto";
3672
- import { mkdir as mkdir6, writeFile as writeFile4, readFile as readFile6, unlink as unlink2, readdir as readdir3 } from "fs/promises";
3644
+ import { mkdir as mkdir4, writeFile as writeFile2, readFile as readFile5, unlink as unlink2, readdir as readdir3 } from "fs/promises";
3673
3645
  import { existsSync as existsSync2 } from "fs";
3674
- import { join as join6, extname, resolve as resolve2, sep as sep2 } from "path";
3646
+ import { join as join6, extname, resolve, sep } from "path";
3675
3647
  var ALLOWED_MIME_TYPES = /* @__PURE__ */ new Set([
3676
3648
  "image/png",
3677
3649
  "image/jpeg",
@@ -3688,7 +3660,7 @@ var ImageStorageService = class {
3688
3660
  this.dir = dir;
3689
3661
  }
3690
3662
  async ensureTmpDir() {
3691
- await mkdir6(this.dir, { recursive: true, mode: 448 });
3663
+ await mkdir4(this.dir, { recursive: true, mode: 448 });
3692
3664
  }
3693
3665
  async saveImage(buffer, originalName, mimeType, contextId) {
3694
3666
  if (!ALLOWED_MIME_TYPES.has(mimeType)) {
@@ -3709,14 +3681,14 @@ var ImageStorageService = class {
3709
3681
  const safeExt = ext.replace(/[^a-z.]/g, "");
3710
3682
  const fileName = `${imageId}${safeExt}`;
3711
3683
  const filePath = join6(this.dir, fileName);
3712
- const resolvedPath = resolve2(filePath);
3713
- const resolvedDir = resolve2(this.dir);
3714
- if (resolvedPath !== resolvedDir && !resolvedPath.startsWith(resolvedDir + sep2)) {
3684
+ const resolvedPath = resolve(filePath);
3685
+ const resolvedDir = resolve(this.dir);
3686
+ if (resolvedPath !== resolvedDir && !resolvedPath.startsWith(resolvedDir + sep)) {
3715
3687
  throw new Error("Invalid file path");
3716
3688
  }
3717
- await writeFile4(filePath, buffer, { mode: 384 });
3689
+ await writeFile2(filePath, buffer, { mode: 384 });
3718
3690
  const meta = { imageId, filePath, mimeType, originalName, createdAt: Date.now(), contextId };
3719
- await writeFile4(`${filePath}.meta.json`, JSON.stringify(meta), { encoding: "utf-8", mode: 384 });
3691
+ await writeFile2(`${filePath}.meta.json`, JSON.stringify(meta), { encoding: "utf-8", mode: 384 });
3720
3692
  return meta;
3721
3693
  }
3722
3694
  /**
@@ -3734,7 +3706,7 @@ var ImageStorageService = class {
3734
3706
  const files = await readdir3(this.dir);
3735
3707
  const metaFile = files.find((f) => f.startsWith(imageId) && f.endsWith(".meta.json"));
3736
3708
  if (!metaFile) return null;
3737
- const raw = JSON.parse(await readFile6(join6(this.dir, metaFile), "utf-8"));
3709
+ const raw = JSON.parse(await readFile5(join6(this.dir, metaFile), "utf-8"));
3738
3710
  if (expectedContextId !== void 0 && raw.contextId !== expectedContextId) return null;
3739
3711
  if (!existsSync2(raw.filePath)) return null;
3740
3712
  return { filePath: raw.filePath, mimeType: raw.mimeType, contextId: raw.contextId };
@@ -3760,7 +3732,7 @@ var ImageStorageService = class {
3760
3732
  await Promise.all(
3761
3733
  files.filter((f) => f.endsWith(".meta.json")).map(async (file) => {
3762
3734
  try {
3763
- const raw = JSON.parse(await readFile6(join6(this.dir, file), "utf-8"));
3735
+ const raw = JSON.parse(await readFile5(join6(this.dir, file), "utf-8"));
3764
3736
  if (raw.contextId === contextId) {
3765
3737
  await unlink2(raw.filePath).catch(() => {
3766
3738
  });
@@ -3775,7 +3747,7 @@ var ImageStorageService = class {
3775
3747
  async readImageAsBase64(imageId, expectedContextId) {
3776
3748
  const result = await this.getImagePath(imageId, expectedContextId);
3777
3749
  if (!result) return null;
3778
- const buffer = await readFile6(result.filePath);
3750
+ const buffer = await readFile5(result.filePath);
3779
3751
  return { base64: buffer.toString("base64"), mimeType: result.mimeType };
3780
3752
  }
3781
3753
  async listExpiredImages(ttlMs = IMAGE_TTL_MS) {
@@ -3790,7 +3762,7 @@ var ImageStorageService = class {
3790
3762
  for (const file of files) {
3791
3763
  if (!file.endsWith(".meta.json")) continue;
3792
3764
  try {
3793
- const raw = JSON.parse(await readFile6(join6(this.dir, file), "utf-8"));
3765
+ const raw = JSON.parse(await readFile5(join6(this.dir, file), "utf-8"));
3794
3766
  if (now - raw.createdAt > ttlMs) expired.push(raw);
3795
3767
  } catch {
3796
3768
  }
@@ -3801,7 +3773,7 @@ var ImageStorageService = class {
3801
3773
  var _singleton;
3802
3774
  function getSingleton() {
3803
3775
  if (!_singleton) {
3804
- _singleton = new ImageStorageService(resolve2(machineRoot(), "images"));
3776
+ _singleton = new ImageStorageService(resolve(machineRoot(), "images"));
3805
3777
  }
3806
3778
  return _singleton;
3807
3779
  }
@@ -3859,8 +3831,8 @@ import { basename } from "path";
3859
3831
  import { TRPCError as TRPCError3 } from "@trpc/server";
3860
3832
 
3861
3833
  // ../server/src/services/cloud-session-store.ts
3862
- import { readFile as readFile7, writeFile as writeFile5, rename as rename5, mkdir as mkdir7, chmod as chmod4, unlink as unlink3 } from "fs/promises";
3863
- import { dirname as dirname5 } from "path";
3834
+ import { readFile as readFile6, writeFile as writeFile3, rename as rename3, mkdir as mkdir5, chmod as chmod2, unlink as unlink3 } from "fs/promises";
3835
+ import { dirname as dirname3 } from "path";
3864
3836
  import { randomBytes as randomBytes2, createHash, timingSafeEqual as timingSafeEqual2 } from "crypto";
3865
3837
  var FILENAME2 = "cloud-session.json";
3866
3838
  var STATE_TTL_MS = 5 * 60 * 1e3;
@@ -3891,9 +3863,9 @@ var CloudSessionStore = class {
3891
3863
  */
3892
3864
  async readFromDisk() {
3893
3865
  try {
3894
- return await readFile7(await this.getFilePath(), "utf-8");
3866
+ return await readFile6(await this.getFilePath(), "utf-8");
3895
3867
  } catch {
3896
- return readFile7(this.getLegacyFilePath(), "utf-8");
3868
+ return readFile6(this.getLegacyFilePath(), "utf-8");
3897
3869
  }
3898
3870
  }
3899
3871
  /**
@@ -3967,12 +3939,12 @@ var CloudSessionStore = class {
3967
3939
  }
3968
3940
  async save() {
3969
3941
  const filePath = await this.getFilePath();
3970
- await mkdir7(dirname5(filePath), { recursive: true });
3942
+ await mkdir5(dirname3(filePath), { recursive: true });
3971
3943
  const payload = { version: 2, accounts: this.accounts };
3972
3944
  const tmpPath = filePath + ".tmp";
3973
- await writeFile5(tmpPath, JSON.stringify(payload, null, 2), "utf-8");
3974
- await rename5(tmpPath, filePath);
3975
- await chmod4(filePath, 384);
3945
+ await writeFile3(tmpPath, JSON.stringify(payload, null, 2), "utf-8");
3946
+ await rename3(tmpPath, filePath);
3947
+ await chmod2(filePath, 384);
3976
3948
  }
3977
3949
  /**
3978
3950
  * Ranger le token obtenu par l'échange de jeton à usage unique.
@@ -4108,7 +4080,7 @@ var cloudSessionStore = new CloudSessionStore();
4108
4080
 
4109
4081
  // ../server/src/services/lan-mode.ts
4110
4082
  import { networkInterfaces } from "os";
4111
- import { readFile as readFile8, writeFile as writeFile6, rename as rename6, mkdir as mkdir8 } from "fs/promises";
4083
+ import { readFile as readFile7, writeFile as writeFile4, rename as rename4, mkdir as mkdir6 } from "fs/promises";
4112
4084
  import { join as join7 } from "path";
4113
4085
  import { z as z4 } from "zod";
4114
4086
  var LOOPBACK2 = "127.0.0.1";
@@ -4126,7 +4098,7 @@ function networkFilePath() {
4126
4098
  }
4127
4099
  async function readFileState() {
4128
4100
  try {
4129
- return NetworkFileSchema.parse(JSON.parse(await readFile8(networkFilePath(), "utf-8")));
4101
+ return NetworkFileSchema.parse(JSON.parse(await readFile7(networkFilePath(), "utf-8")));
4130
4102
  } catch {
4131
4103
  return { instances: {} };
4132
4104
  }
@@ -4137,13 +4109,13 @@ async function readPersisted() {
4137
4109
  }
4138
4110
  async function writePersisted(lanEnabled) {
4139
4111
  const root = machineRoot();
4140
- await mkdir8(root, { recursive: true });
4112
+ await mkdir6(root, { recursive: true });
4141
4113
  const state = await readFileState();
4142
4114
  state.instances[instanceKey()] = { lanEnabled };
4143
4115
  const filePath = networkFilePath();
4144
4116
  const tmpPath = filePath + ".tmp";
4145
- await writeFile6(tmpPath, JSON.stringify(state, null, 2), "utf-8");
4146
- await rename6(tmpPath, filePath);
4117
+ await writeFile4(tmpPath, JSON.stringify(state, null, 2), "utf-8");
4118
+ await rename4(tmpPath, filePath);
4147
4119
  }
4148
4120
  function registerHttpServer(server) {
4149
4121
  httpServer = server;
@@ -4181,14 +4153,14 @@ async function rebind(host, previousHost) {
4181
4153
  const server = httpServer;
4182
4154
  if (!server?.listening) return;
4183
4155
  const port = currentPort();
4184
- const listenOn = (target) => new Promise((resolve3, reject) => {
4156
+ const listenOn = (target) => new Promise((resolve2, reject) => {
4185
4157
  const onError = (err) => {
4186
4158
  server.removeListener("listening", onListening);
4187
4159
  reject(err);
4188
4160
  };
4189
4161
  const onListening = () => {
4190
4162
  server.removeListener("error", onError);
4191
- resolve3();
4163
+ resolve2();
4192
4164
  };
4193
4165
  server.once("error", onError);
4194
4166
  server.once("listening", onListening);
@@ -5276,12 +5248,12 @@ function tailTranscript(opts) {
5276
5248
  const poll = setInterval(() => {
5277
5249
  void readMore();
5278
5250
  }, 500);
5279
- await new Promise((resolve3) => {
5251
+ await new Promise((resolve2) => {
5280
5252
  const tick = setInterval(() => {
5281
5253
  if (stopped) {
5282
5254
  clearInterval(tick);
5283
5255
  clearInterval(poll);
5284
- resolve3();
5256
+ resolve2();
5285
5257
  }
5286
5258
  }, 100);
5287
5259
  });
@@ -5300,7 +5272,7 @@ function tailTranscript(opts) {
5300
5272
 
5301
5273
  // ../server/src/services/ai-runners/claude-pty-runner.ts
5302
5274
  async function getAgentManager() {
5303
- const { agentManager: agentManager2 } = await import("./agent-manager-4HBMLHXU.js");
5275
+ const { agentManager: agentManager2 } = await import("./agent-manager-BSPEFZKZ.js");
5304
5276
  return agentManager2;
5305
5277
  }
5306
5278
  function buildPtyArgs(params, sessionId, opts) {
@@ -5375,7 +5347,7 @@ async function runClaudeViaPty(params) {
5375
5347
  return a;
5376
5348
  });
5377
5349
  params.onCommand?.(`claude ${displayArgs.join(" ")}`);
5378
- return new Promise((resolve3, reject) => {
5350
+ return new Promise((resolve2, reject) => {
5379
5351
  let settled = false;
5380
5352
  let spawnId = null;
5381
5353
  const state = { assistantText: "", tools: /* @__PURE__ */ new Map() };
@@ -5398,7 +5370,7 @@ async function runClaudeViaPty(params) {
5398
5370
  settled = true;
5399
5371
  cleanup();
5400
5372
  void killSpawn();
5401
- resolve3(result);
5373
+ resolve2(result);
5402
5374
  };
5403
5375
  const fail = (err) => {
5404
5376
  if (settled) return;
@@ -5722,7 +5694,7 @@ var ClaudeCodeRunner = class {
5722
5694
  runLocal(params) {
5723
5695
  const { signal, skipTokenInstructions } = params;
5724
5696
  const { args, env: env2, stdinData, sessionArg, hasImages: _hasImages } = buildClaudeSpawnConfig(params);
5725
- return new Promise((resolve3, reject) => {
5697
+ return new Promise((resolve2, reject) => {
5726
5698
  const totalArgSize = args.reduce((s, a) => s + a.length + 1, 0);
5727
5699
  console.log(`[claude-code-runner] arg size: ${totalArgSize} bytes (${(totalArgSize / 1024 / 1024).toFixed(2)} MB), session: ${sessionArg.join(" ")}, images: ${params.images?.length ?? 0}`);
5728
5700
  const displayArgs = args.map((a) => {
@@ -5766,7 +5738,7 @@ var ClaudeCodeRunner = class {
5766
5738
  });
5767
5739
  proc.on("close", (code) => {
5768
5740
  if (ctx.earlyResult) {
5769
- resolve3({ ...ctx.earlyResult, actualSessionId: streamState.actualSessionId });
5741
+ resolve2({ ...ctx.earlyResult, actualSessionId: streamState.actualSessionId });
5770
5742
  return;
5771
5743
  }
5772
5744
  signal.removeEventListener("abort", onAbort);
@@ -5783,7 +5755,7 @@ var ClaudeCodeRunner = class {
5783
5755
  return;
5784
5756
  }
5785
5757
  const { status, message, branchChoice } = skipTokenInstructions ? { status: "none", message: "", branchChoice: void 0 } : parseEndToken(streamState.fullContent);
5786
- resolve3({ output: streamState.fullContent, tokenStatus: status, tokenMessage: message, branchChoice, actualSessionId: streamState.actualSessionId });
5758
+ resolve2({ output: streamState.fullContent, tokenStatus: status, tokenMessage: message, branchChoice, actualSessionId: streamState.actualSessionId });
5787
5759
  });
5788
5760
  proc.on("error", (err) => {
5789
5761
  if (ctx.settled) return;
@@ -5860,12 +5832,12 @@ var CodexAppServerClient = class extends EventEmitter {
5860
5832
  if (forceId !== void 0 && forceId >= this.nextId) {
5861
5833
  this.nextId = forceId + 1;
5862
5834
  }
5863
- return new Promise((resolve3, reject) => {
5835
+ return new Promise((resolve2, reject) => {
5864
5836
  const timer = setTimeout(() => {
5865
5837
  this.pending.delete(id);
5866
5838
  reject(new Error(`Request ${method} (id=${id}) timed out after ${this.requestTimeoutMs}ms`));
5867
5839
  }, this.requestTimeoutMs);
5868
- this.pending.set(id, { resolve: resolve3, reject, timer });
5840
+ this.pending.set(id, { resolve: resolve2, reject, timer });
5869
5841
  this.writeLine({ jsonrpc: "2.0", method, id, params: params ?? {} });
5870
5842
  });
5871
5843
  }
@@ -5897,8 +5869,8 @@ var CodexAppServerClient = class extends EventEmitter {
5897
5869
  this.rl = null;
5898
5870
  const proc = this.proc;
5899
5871
  this.proc = null;
5900
- return new Promise((resolve3) => {
5901
- proc.on("exit", () => resolve3());
5872
+ return new Promise((resolve2) => {
5873
+ proc.on("exit", () => resolve2());
5902
5874
  proc.kill("SIGTERM");
5903
5875
  const forceTimer = setTimeout(() => {
5904
5876
  proc.kill("SIGKILL");
@@ -5992,7 +5964,7 @@ async function shutdownCodexAppServer() {
5992
5964
  }
5993
5965
  }
5994
5966
  async function getAgentManager2() {
5995
- const { agentManager: agentManager2 } = await import("./agent-manager-4HBMLHXU.js");
5967
+ const { agentManager: agentManager2 } = await import("./agent-manager-BSPEFZKZ.js");
5996
5968
  return agentManager2;
5997
5969
  }
5998
5970
  function parseRuneyaCurlCommand(command) {
@@ -6110,7 +6082,7 @@ ${prompt}`;
6110
6082
  }
6111
6083
  input.push({ type: "text", text: fullPrompt });
6112
6084
  const turnRef = { id: null };
6113
- return new Promise((resolve3, reject) => {
6085
+ return new Promise((resolve2, reject) => {
6114
6086
  let settled = false;
6115
6087
  let fullContent = "";
6116
6088
  let thinkingEmitted = false;
@@ -6159,7 +6131,7 @@ ${prompt}`;
6159
6131
  params.onDelta(delta);
6160
6132
  const { status, message, branchChoice } = parseEndToken(fullContent);
6161
6133
  if (status !== "none") {
6162
- settle(() => resolve3({ output: fullContent, tokenStatus: status, tokenMessage: message, branchChoice }));
6134
+ settle(() => resolve2({ output: fullContent, tokenStatus: status, tokenMessage: message, branchChoice }));
6163
6135
  }
6164
6136
  }
6165
6137
  } else if (method === "item/reasoning/summaryTextDelta" || method === "item/reasoning/textDelta") {
@@ -6233,7 +6205,7 @@ ${prompt}`;
6233
6205
  return;
6234
6206
  }
6235
6207
  const { status, message, branchChoice } = parseEndToken(fullContent);
6236
- settle(() => resolve3({ output: fullContent, tokenStatus: status, tokenMessage: message, branchChoice }));
6208
+ settle(() => resolve2({ output: fullContent, tokenStatus: status, tokenMessage: message, branchChoice }));
6237
6209
  } else if (method === "turn/errored") {
6238
6210
  const error = p["error"];
6239
6211
  const msg = typeof error?.["message"] === "string" ? error["message"] : "Codex turn errored";
@@ -6310,7 +6282,7 @@ ${prompt}`;
6310
6282
  sandboxPolicy: { type: "dangerFullAccess" }
6311
6283
  });
6312
6284
  const turnId = turnRes.turn.id;
6313
- return new Promise((resolve3, reject) => {
6285
+ return new Promise((resolve2, reject) => {
6314
6286
  let settled = false;
6315
6287
  let fullContent = "";
6316
6288
  let thinkingEmitted = false;
@@ -6336,7 +6308,7 @@ ${prompt}`;
6336
6308
  params.onDelta(delta);
6337
6309
  const { status, message, branchChoice } = parseEndToken(fullContent);
6338
6310
  if (status !== "none") {
6339
- settle(() => resolve3({ output: fullContent, tokenStatus: status, tokenMessage: message, branchChoice }));
6311
+ settle(() => resolve2({ output: fullContent, tokenStatus: status, tokenMessage: message, branchChoice }));
6340
6312
  }
6341
6313
  }
6342
6314
  } else if (method === "item/reasoning/summaryTextDelta" || method === "item/reasoning/textDelta") {
@@ -6410,7 +6382,7 @@ ${prompt}`;
6410
6382
  return;
6411
6383
  }
6412
6384
  const { status, message, branchChoice } = parseEndToken(fullContent);
6413
- settle(() => resolve3({ output: fullContent, tokenStatus: status, tokenMessage: message, branchChoice }));
6385
+ settle(() => resolve2({ output: fullContent, tokenStatus: status, tokenMessage: message, branchChoice }));
6414
6386
  } else if (method === "turn/errored") {
6415
6387
  const error = p["error"];
6416
6388
  const msg = typeof error?.["message"] === "string" ? error["message"] : "Codex turn errored";
@@ -6871,14 +6843,14 @@ var chatRouter = router({
6871
6843
  const initial = (await conversationStore.list()).filter(belongs);
6872
6844
  yield { type: "initial", conversations: initial };
6873
6845
  const queue = [];
6874
- let resolve3 = null;
6846
+ let resolve2 = null;
6875
6847
  const handler = (event) => {
6876
6848
  if (event.type !== "deleted" && event.type !== "reloaded" && !belongs(event.conversation)) return;
6877
6849
  if (queue.length >= 500) queue.shift();
6878
6850
  queue.push(event);
6879
- if (resolve3) {
6880
- resolve3();
6881
- resolve3 = null;
6851
+ if (resolve2) {
6852
+ resolve2();
6853
+ resolve2 = null;
6882
6854
  }
6883
6855
  };
6884
6856
  conversationStore.onChanged(handler);
@@ -6893,7 +6865,7 @@ var chatRouter = router({
6893
6865
  yield event;
6894
6866
  } else {
6895
6867
  await new Promise((r) => {
6896
- resolve3 = r;
6868
+ resolve2 = r;
6897
6869
  });
6898
6870
  }
6899
6871
  }
@@ -7036,13 +7008,13 @@ var chatRouter = router({
7036
7008
  onCompanionThinking: protectedProcedure.subscription(async function* () {
7037
7009
  const snapshot = () => ({ thinking: companionThinkingIds(), skipped: companionSkips() });
7038
7010
  const queue = [snapshot()];
7039
- let resolve3 = null;
7011
+ let resolve2 = null;
7040
7012
  const handler = () => {
7041
7013
  if (queue.length >= 50) queue.shift();
7042
7014
  queue.push(snapshot());
7043
- if (resolve3) {
7044
- resolve3();
7045
- resolve3 = null;
7015
+ if (resolve2) {
7016
+ resolve2();
7017
+ resolve2 = null;
7046
7018
  }
7047
7019
  };
7048
7020
  const unsubscribe = onCompanionThinkingChanged(handler);
@@ -7050,7 +7022,7 @@ var chatRouter = router({
7050
7022
  while (true) {
7051
7023
  if (queue.length > 0) yield queue.shift();
7052
7024
  else await new Promise((r) => {
7053
- resolve3 = r;
7025
+ resolve2 = r;
7054
7026
  });
7055
7027
  }
7056
7028
  } finally {
@@ -7747,7 +7719,7 @@ Context:
7747
7719
  const tSub = Date.now();
7748
7720
  let firstChunk = true;
7749
7721
  const queue = [];
7750
- let resolve3 = null;
7722
+ let resolve2 = null;
7751
7723
  let stopped = false;
7752
7724
  const unsub = agentManager.agentSubscribe(
7753
7725
  agentId,
@@ -7761,16 +7733,16 @@ Context:
7761
7733
  const item = data;
7762
7734
  if (typeof item.chunk?.data === "string") observePtyChunk(input.spawnId, item.chunk.data);
7763
7735
  queue.push(item);
7764
- if (resolve3) {
7765
- resolve3();
7766
- resolve3 = null;
7736
+ if (resolve2) {
7737
+ resolve2();
7738
+ resolve2 = null;
7767
7739
  }
7768
7740
  },
7769
7741
  () => {
7770
7742
  stopped = true;
7771
- if (resolve3) {
7772
- resolve3();
7773
- resolve3 = null;
7743
+ if (resolve2) {
7744
+ resolve2();
7745
+ resolve2 = null;
7774
7746
  }
7775
7747
  }
7776
7748
  );
@@ -7787,7 +7759,7 @@ Context:
7787
7759
  }
7788
7760
  if (stopped) break;
7789
7761
  await new Promise((r) => {
7790
- resolve3 = r;
7762
+ resolve2 = r;
7791
7763
  });
7792
7764
  }
7793
7765
  } finally {
@@ -8011,8 +7983,6 @@ export {
8011
7983
  OptionalProviderIdSchema,
8012
7984
  generateLlmsTxt,
8013
7985
  scenarioStore,
8014
- resolveConversationRunDir,
8015
- atomicWriteSecure,
8016
7986
  scenarioRunStore,
8017
7987
  OPENAI_COMPAT_BASE_URLS,
8018
7988
  DEFAULT_MODELS,
@@ -8036,4 +8006,4 @@ export {
8036
8006
  startCliSession,
8037
8007
  chatRouter
8038
8008
  };
8039
- //# sourceMappingURL=chunk-HJUFIZ7H.js.map
8009
+ //# sourceMappingURL=chunk-BVBK2WII.js.map