@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.
- package/{agent-manager-4HBMLHXU.js → agent-manager-BSPEFZKZ.js} +3 -3
- package/{chat-VL6BIVO5.js → chat-SE5GIT4B.js} +6 -6
- package/{chunk-HJUFIZ7H.js → chunk-BVBK2WII.js} +128 -158
- package/chunk-BVBK2WII.js.map +1 -0
- package/chunk-GL7WA5K3.js +92 -0
- package/chunk-GL7WA5K3.js.map +1 -0
- package/{chunk-3N55WR7F.js → chunk-NIU3CN5A.js} +7 -16
- package/chunk-NIU3CN5A.js.map +1 -0
- package/{chunk-OVV52N5F.js → chunk-VNLIA5PV.js} +78 -74
- package/chunk-VNLIA5PV.js.map +1 -0
- package/{chunk-CNTL6NVU.js → chunk-XTLQOYLT.js} +118 -58
- package/chunk-XTLQOYLT.js.map +1 -0
- package/{companion-AUMA6RGX.js → companion-HEJHC3UR.js} +4 -4
- package/index.js +3 -3
- package/package.json +1 -1
- package/{settings-manager-ROWQ5GC2.js → settings-manager-4GAINSJO.js} +3 -3
- package/{src-JIS3X4OU.js → src-YUVA6WCM.js} +253 -110
- package/src-YUVA6WCM.js.map +1 -0
- package/chunk-3N55WR7F.js.map +0 -1
- package/chunk-CNTL6NVU.js.map +0 -1
- package/chunk-HJUFIZ7H.js.map +0 -1
- package/chunk-OVV52N5F.js.map +0 -1
- package/chunk-YZU5FNXR.js +0 -43
- package/chunk-YZU5FNXR.js.map +0 -1
- package/src-JIS3X4OU.js.map +0 -1
- /package/{agent-manager-4HBMLHXU.js.map → agent-manager-BSPEFZKZ.js.map} +0 -0
- /package/{chat-VL6BIVO5.js.map → chat-SE5GIT4B.js.map} +0 -0
- /package/{companion-AUMA6RGX.js.map → companion-HEJHC3UR.js.map} +0 -0
- /package/{settings-manager-ROWQ5GC2.js.map → settings-manager-4GAINSJO.js.map} +0 -0
|
@@ -31,8 +31,9 @@ import {
|
|
|
31
31
|
runCompanionNow,
|
|
32
32
|
syncConversationFromClaudeTranscript,
|
|
33
33
|
verifyJwt
|
|
34
|
-
} from "./chunk-
|
|
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-
|
|
52
|
+
} from "./chunk-XTLQOYLT.js";
|
|
52
53
|
import {
|
|
53
54
|
settingsManager
|
|
54
|
-
} from "./chunk-
|
|
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-
|
|
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
|
|
212
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
285
|
-
|
|
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
|
-
|
|
298
|
-
|
|
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 =
|
|
305
|
+
const bucket = into.unreadable.get(owner) ?? /* @__PURE__ */ new Map();
|
|
302
306
|
bucket.set(k.id, k);
|
|
303
|
-
|
|
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
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
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
|
|
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
|
|
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
|
|
630
|
-
import { dirname as
|
|
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) ??
|
|
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(
|
|
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,
|
|
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
|
|
748
|
+
await mkdir(root, { recursive: true });
|
|
741
749
|
const path = join4(root, FILENAME);
|
|
742
750
|
const tmpPath = path + ".tmp";
|
|
743
|
-
await
|
|
744
|
-
await
|
|
745
|
-
await
|
|
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
|
|
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
|
|
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
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
3713
|
-
const resolvedDir =
|
|
3714
|
-
if (resolvedPath !== resolvedDir && !resolvedPath.startsWith(resolvedDir +
|
|
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
|
|
3689
|
+
await writeFile2(filePath, buffer, { mode: 384 });
|
|
3718
3690
|
const meta = { imageId, filePath, mimeType, originalName, createdAt: Date.now(), contextId };
|
|
3719
|
-
await
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
3863
|
-
import { dirname as
|
|
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
|
|
3866
|
+
return await readFile6(await this.getFilePath(), "utf-8");
|
|
3895
3867
|
} catch {
|
|
3896
|
-
return
|
|
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
|
|
3942
|
+
await mkdir5(dirname3(filePath), { recursive: true });
|
|
3971
3943
|
const payload = { version: 2, accounts: this.accounts };
|
|
3972
3944
|
const tmpPath = filePath + ".tmp";
|
|
3973
|
-
await
|
|
3974
|
-
await
|
|
3975
|
-
await
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4146
|
-
await
|
|
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((
|
|
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
|
-
|
|
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((
|
|
5251
|
+
await new Promise((resolve2) => {
|
|
5280
5252
|
const tick = setInterval(() => {
|
|
5281
5253
|
if (stopped) {
|
|
5282
5254
|
clearInterval(tick);
|
|
5283
5255
|
clearInterval(poll);
|
|
5284
|
-
|
|
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-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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
|
-
|
|
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((
|
|
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:
|
|
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((
|
|
5901
|
-
proc.on("exit", () =>
|
|
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-
|
|
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((
|
|
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(() =>
|
|
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(() =>
|
|
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((
|
|
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(() =>
|
|
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(() =>
|
|
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
|
|
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 (
|
|
6880
|
-
|
|
6881
|
-
|
|
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
|
-
|
|
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
|
|
7011
|
+
let resolve2 = null;
|
|
7040
7012
|
const handler = () => {
|
|
7041
7013
|
if (queue.length >= 50) queue.shift();
|
|
7042
7014
|
queue.push(snapshot());
|
|
7043
|
-
if (
|
|
7044
|
-
|
|
7045
|
-
|
|
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
|
-
|
|
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
|
|
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 (
|
|
7765
|
-
|
|
7766
|
-
|
|
7736
|
+
if (resolve2) {
|
|
7737
|
+
resolve2();
|
|
7738
|
+
resolve2 = null;
|
|
7767
7739
|
}
|
|
7768
7740
|
},
|
|
7769
7741
|
() => {
|
|
7770
7742
|
stopped = true;
|
|
7771
|
-
if (
|
|
7772
|
-
|
|
7773
|
-
|
|
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
|
-
|
|
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-
|
|
8009
|
+
//# sourceMappingURL=chunk-BVBK2WII.js.map
|