frizz 0.12.10 → 0.12.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/claude-agent-broker.js +56 -17
- package/dist/codex-app-server-daemon.js +49 -10
- package/dist/dev-child.js +630 -286
- package/dist/frizz.js +118 -21
- package/package.json +1 -1
- package/runtime/cc-worker/bin/frizz-mcp.mjs +58 -5
- package/web-dist/assets/{TerminalPane-BLyRh8S1.js → TerminalPane-DHvHCziB.js} +1 -1
- package/web-dist/assets/{abnfDiagram-VRR7QNED-B0n1m57h.js → abnfDiagram-VRR7QNED-DIzM_IN8.js} +1 -1
- package/web-dist/assets/architecture-TIHT7OUA-DBvKOf0j.js +1 -0
- package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-CW78Jo4Q.js → architectureDiagram-ZJ3FMSHR-Bm_8vd5v.js} +1 -1
- package/web-dist/assets/{blockDiagram-677ZJIJ3-DasDnytT.js → blockDiagram-677ZJIJ3-BXUW_N2o.js} +1 -1
- package/web-dist/assets/{c4Diagram-LMCZKHZV-B7cCJxqg.js → c4Diagram-LMCZKHZV-C7rfqxUO.js} +1 -1
- package/web-dist/assets/channel-CbdXYswc.js +1 -0
- package/web-dist/assets/{chunk-32BRIVSS-BBBSn1aq.js → chunk-32BRIVSS-DbfUERLa.js} +1 -1
- package/web-dist/assets/{chunk-52WLFC77-B5lATDKz.js → chunk-52WLFC77-BT_3wKSP.js} +1 -1
- package/web-dist/assets/{chunk-C7G6YPKG-B86e9JiF.js → chunk-C7G6YPKG-JqApnOVt.js} +1 -1
- package/web-dist/assets/{chunk-EX3LRPZG-CpKL4dGX.js → chunk-EX3LRPZG-Cj6hlA4t.js} +1 -1
- package/web-dist/assets/{chunk-FWX5IMBZ-Dp3AvQlT.js → chunk-FWX5IMBZ-BGthhuW_.js} +2 -2
- package/web-dist/assets/{chunk-HOUHSVGY-i9yVPrLo.js → chunk-HOUHSVGY-uyLpm_YS.js} +1 -1
- package/web-dist/assets/{chunk-ICXQ74PX--Y7uMkOf.js → chunk-ICXQ74PX-BlwUMZAk.js} +1 -1
- package/web-dist/assets/{chunk-MOJQB5TN-DyMHpsmW.js → chunk-MOJQB5TN-MXbNNk-P.js} +1 -1
- package/web-dist/assets/{chunk-OGEWGWER-1mtDKLBA.js → chunk-OGEWGWER-Da4My1Rf.js} +1 -1
- package/web-dist/assets/{chunk-PUDLZKDR-CFgSrqyc.js → chunk-PUDLZKDR-C-PgvO__.js} +1 -1
- package/web-dist/assets/{chunk-Q4XR5HBZ-BPhNENQ8.js → chunk-Q4XR5HBZ-BxZFe7gr.js} +1 -1
- package/web-dist/assets/{chunk-V7JOEXUC-CMrXD-em.js → chunk-V7JOEXUC-DgERuXm_.js} +1 -1
- package/web-dist/assets/{chunk-VAUOI2AC-B6lbggln.js → chunk-VAUOI2AC-T5OoQE-_.js} +1 -1
- package/web-dist/assets/{chunk-VR4S4FIN-B9qypAjb.js → chunk-VR4S4FIN--HFvJUG1.js} +1 -1
- package/web-dist/assets/{chunk-WYO6CB5R-CI9tkIhS.js → chunk-WYO6CB5R-DlAvy41i.js} +1 -1
- package/web-dist/assets/{chunk-ZGVPDNZ5-DFJPi6M6.js → chunk-ZGVPDNZ5-BdDg7X_H.js} +1 -1
- package/web-dist/assets/classDiagram-OUVF2IWQ-BVXwECjS.js +1 -0
- package/web-dist/assets/classDiagram-v2-EOCWNBFH-BVXwECjS.js +1 -0
- package/web-dist/assets/{cynefin-VYW2F7L2-g28vb2Hf.js → cynefin-VYW2F7L2-BhjNO28R.js} +1 -1
- package/web-dist/assets/{cynefinDiagram-TSTJHNR4-bBtOt0pp.js → cynefinDiagram-TSTJHNR4-B6VA5gCd.js} +1 -1
- package/web-dist/assets/{dagre-VKFMJZFB-DuIcY2-t.js → dagre-VKFMJZFB-6MXoEc6K.js} +1 -1
- package/web-dist/assets/{diagram-FQU43EPY-CsYoD3ve.js → diagram-FQU43EPY-D2RSPoK4.js} +1 -1
- package/web-dist/assets/{diagram-G47NLZAW-H3NxrIKS.js → diagram-G47NLZAW-BOSbtzOf.js} +1 -1
- package/web-dist/assets/{diagram-NH7WQ7WH-DIojGMfZ.js → diagram-NH7WQ7WH-Dt_u21nP.js} +1 -1
- package/web-dist/assets/{diagram-OA4YK3LP-D0L444Xe.js → diagram-OA4YK3LP-CjuWW-7r.js} +1 -1
- package/web-dist/assets/{diagram-WEI45ONY-C3PEfMxp.js → diagram-WEI45ONY-rANIKJ8N.js} +1 -1
- package/web-dist/assets/{ebnfDiagram-CCIWWBDH-Dknugppg.js → ebnfDiagram-CCIWWBDH-Bf3kfaKZ.js} +1 -1
- package/web-dist/assets/{erDiagram-Q63AITRT-Ds5u_SEw.js → erDiagram-Q63AITRT-6vBp0ITn.js} +1 -1
- package/web-dist/assets/eventmodeling-45OFAUF4-STTT-geQ.js +1 -0
- package/web-dist/assets/flowDiagram-23GEKE2U-CC7DF1Fz.js +1 -0
- package/web-dist/assets/{ganttDiagram-NO4QXBWP-KFFdgLKc.js → ganttDiagram-NO4QXBWP-C2qN2PMS.js} +1 -1
- package/web-dist/assets/{gitGraph-TEB2WS4Q-B62DXBoO.js → gitGraph-TEB2WS4Q-CRASqc9n.js} +1 -1
- package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-BPtTY3Ld.js → gitGraphDiagram-IHSO6WYX-gsXSPrH2.js} +1 -1
- package/web-dist/assets/{index-B-zUKqGI.js → index-DimQCLe8.js} +93 -93
- package/web-dist/assets/index-XhfdAXcw.css +1 -0
- package/web-dist/assets/{info-DKCQHKI2-Ct-TkGHr.js → info-DKCQHKI2-rDkFlFOd.js} +1 -1
- package/web-dist/assets/{infoDiagram-FWYZ7A6U-j0jFbDdJ.js → infoDiagram-FWYZ7A6U-03ql8Tqr.js} +1 -1
- package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-DgfNQn9k.js → ishikawaDiagram-FXEZZL3T-CfDSAVNp.js} +1 -1
- package/web-dist/assets/{journeyDiagram-5HDEW3XC-BfykOv3I.js → journeyDiagram-5HDEW3XC-RWaA6AvH.js} +1 -1
- package/web-dist/assets/{kanban-definition-HUTT4EX6-BvhHHrMj.js → kanban-definition-HUTT4EX6-C89qresM.js} +1 -1
- package/web-dist/assets/{line-DZ-APW6S.js → line-CZtSsvHu.js} +1 -1
- package/web-dist/assets/{mermaid-parser.core-BWisef3-.js → mermaid-parser.core-DKNnvxt0.js} +3 -3
- package/web-dist/assets/{mermaid.core-DnlDGPhM.js → mermaid.core-DX8cFeBF.js} +3 -3
- package/web-dist/assets/{mindmap-definition-LN4V7U3C-BoTGWSEy.js → mindmap-definition-LN4V7U3C-DW8ClyAX.js} +1 -1
- package/web-dist/assets/{packet-7NZHBO7P-DaifVkPE.js → packet-7NZHBO7P-CUOv3apI.js} +1 -1
- package/web-dist/assets/{pegDiagram-2B236MQR-DpLfBJwm.js → pegDiagram-2B236MQR-CFyxKEBL.js} +1 -1
- package/web-dist/assets/{pie-RZYD4A2V-BvB0Jxcm.js → pie-RZYD4A2V-DyXXRie2.js} +1 -1
- package/web-dist/assets/{pieDiagram-ENE6RG2P-CSdBcMSK.js → pieDiagram-ENE6RG2P-yUw7HA8l.js} +1 -1
- package/web-dist/assets/{quadrantDiagram-ABIIQ3AL-i7k-hoMS.js → quadrantDiagram-ABIIQ3AL-Mc7aea_i.js} +1 -1
- package/web-dist/assets/{radar-I7S5WNFK-DpnvOCzG.js → radar-I7S5WNFK-BKj0BsQy.js} +1 -1
- package/web-dist/assets/{railroad-3IZDKUUU-Bj4Lhzob.js → railroad-3IZDKUUU-DUK_kJIY.js} +1 -1
- package/web-dist/assets/railroad-abnf-AHOZXSZD-BDImJcFw.js +1 -0
- package/web-dist/assets/railroad-ebnf-EBAXGLYW-BR2XIYqq.js +1 -0
- package/web-dist/assets/railroad-peg-LSFZ7HO6-DRCwBbJY.js +1 -0
- package/web-dist/assets/{railroadDiagram-RFXS5EU6-3HJeC9YI.js → railroadDiagram-RFXS5EU6-By0Xgb_U.js} +1 -1
- package/web-dist/assets/{requirementDiagram-TGXJPOKE-CeBCsZVw.js → requirementDiagram-TGXJPOKE-CgTycsRY.js} +1 -1
- package/web-dist/assets/{sankeyDiagram-HTMAVEWB-BPhonqDa.js → sankeyDiagram-HTMAVEWB-mJ_-Grkn.js} +1 -1
- package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-C5nocNwQ.js → sequenceDiagram-DBY2YBRQ-Dn6YyeNv.js} +1 -1
- package/web-dist/assets/{stateDiagram-2N3HPSRC-CzAZsCPb.js → stateDiagram-2N3HPSRC-BBws1E-e.js} +1 -1
- package/web-dist/assets/stateDiagram-v2-6OUMAXLB-B2jOFVGG.js +1 -0
- package/web-dist/assets/{swimlanes-5IMT3BWC-DRn8Vs4e.js → swimlanes-5IMT3BWC-Jab-07o9.js} +1 -1
- package/web-dist/assets/swimlanesDiagram-G3AALYLV-DhYK_6fH.js +8 -0
- package/web-dist/assets/{timeline-definition-FHXFAJF6-Bc99eShR.js → timeline-definition-FHXFAJF6-Cq6RznHz.js} +1 -1
- package/web-dist/assets/{treeView-QDETBFTQ--Hn_52w1.js → treeView-QDETBFTQ-KSelJnyL.js} +1 -1
- package/web-dist/assets/{treemap-6X3UGDF4-BCI_8eXP.js → treemap-6X3UGDF4-B-iiUurZ.js} +1 -1
- package/web-dist/assets/{vennDiagram-L72KCM5P-BR-5GJF6.js → vennDiagram-L72KCM5P-B8t4NeQy.js} +1 -1
- package/web-dist/assets/{wardley-OPB4EBWU-4HuUekM-.js → wardley-OPB4EBWU-CtkAPZLQ.js} +1 -1
- package/web-dist/assets/{wardleyDiagram-EHGQE667-BI9w8zpX.js → wardleyDiagram-EHGQE667-DC-ms_sD.js} +1 -1
- package/web-dist/assets/{xychartDiagram-FW5EYKEG-BZ72575j.js → xychartDiagram-FW5EYKEG-DW6fcgjF.js} +1 -1
- package/web-dist/index.html +2 -2
- package/web-dist/assets/architecture-TIHT7OUA-BOgxi8qb.js +0 -1
- package/web-dist/assets/channel-cwFXt8Vr.js +0 -1
- package/web-dist/assets/classDiagram-OUVF2IWQ-BLP_ClYo.js +0 -1
- package/web-dist/assets/classDiagram-v2-EOCWNBFH-BLP_ClYo.js +0 -1
- package/web-dist/assets/eventmodeling-45OFAUF4-DgF-cIkx.js +0 -1
- package/web-dist/assets/flowDiagram-23GEKE2U-CB3C8FCr.js +0 -1
- package/web-dist/assets/index-BIGkwpMf.css +0 -1
- package/web-dist/assets/railroad-abnf-AHOZXSZD-scsBBZv_.js +0 -1
- package/web-dist/assets/railroad-ebnf-EBAXGLYW-z2-UIe31.js +0 -1
- package/web-dist/assets/railroad-peg-LSFZ7HO6-Dm1rBPEF.js +0 -1
- package/web-dist/assets/stateDiagram-v2-6OUMAXLB-DEGF_nZS.js +0 -1
- package/web-dist/assets/swimlanesDiagram-G3AALYLV-CBLKdauI.js +0 -8
|
@@ -2,7 +2,7 @@ import { createRequire as __frizzCreateRequire } from "node:module"; const requi
|
|
|
2
2
|
|
|
3
3
|
// packages/server/src/backend/claude-agent-broker.ts
|
|
4
4
|
import net2 from "node:net";
|
|
5
|
-
import { readFileSync as
|
|
5
|
+
import { readFileSync as readFileSync5, realpathSync as realpathSync2, unlinkSync as unlinkSync3, writeFileSync as writeFileSync2 } from "node:fs";
|
|
6
6
|
import { randomUUID as randomUUID2 } from "node:crypto";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
|
|
@@ -35355,13 +35355,50 @@ function objectValue(value, label) {
|
|
|
35355
35355
|
return value;
|
|
35356
35356
|
}
|
|
35357
35357
|
|
|
35358
|
+
// packages/server/src/runtime-lease.ts
|
|
35359
|
+
import { existsSync as existsSync2, mkdirSync as mkdirSync2, readdirSync as readdirSync2, readFileSync as readFileSync2, unlinkSync as unlinkSync2, writeFileSync } from "node:fs";
|
|
35360
|
+
import { dirname as dirname4, join as join5 } from "node:path";
|
|
35361
|
+
var PROVISIONED_MARKER = "provisioned.json";
|
|
35362
|
+
var LEASES_DIR = ".leases";
|
|
35363
|
+
var MAX_ASCENT = 6;
|
|
35364
|
+
function runtimeVersionDir(bin) {
|
|
35365
|
+
let dir = dirname4(bin);
|
|
35366
|
+
for (let step = 0; step < MAX_ASCENT; step++) {
|
|
35367
|
+
if (existsSync2(join5(dir, PROVISIONED_MARKER))) return dir;
|
|
35368
|
+
const parent = dirname4(dir);
|
|
35369
|
+
if (parent === dir) return void 0;
|
|
35370
|
+
dir = parent;
|
|
35371
|
+
}
|
|
35372
|
+
return void 0;
|
|
35373
|
+
}
|
|
35374
|
+
function leaseRuntime(bin, role) {
|
|
35375
|
+
const versionDir = runtimeVersionDir(bin);
|
|
35376
|
+
if (!versionDir) return () => {
|
|
35377
|
+
};
|
|
35378
|
+
const path = join5(versionDir, LEASES_DIR, `${process.pid}.json`);
|
|
35379
|
+
try {
|
|
35380
|
+
mkdirSync2(dirname4(path), { recursive: true });
|
|
35381
|
+
const lease = { pid: process.pid, role, bin, at: (/* @__PURE__ */ new Date()).toISOString() };
|
|
35382
|
+
writeFileSync(path, JSON.stringify(lease));
|
|
35383
|
+
} catch {
|
|
35384
|
+
return () => {
|
|
35385
|
+
};
|
|
35386
|
+
}
|
|
35387
|
+
return () => {
|
|
35388
|
+
try {
|
|
35389
|
+
unlinkSync2(path);
|
|
35390
|
+
} catch {
|
|
35391
|
+
}
|
|
35392
|
+
};
|
|
35393
|
+
}
|
|
35394
|
+
|
|
35358
35395
|
// packages/server/src/backend/project-mcp-servers.ts
|
|
35359
|
-
import { readFileSync as
|
|
35396
|
+
import { readFileSync as readFileSync3 } from "node:fs";
|
|
35360
35397
|
import { homedir } from "node:os";
|
|
35361
|
-
import { join as
|
|
35398
|
+
import { join as join6 } from "node:path";
|
|
35362
35399
|
function readJsonObject(path) {
|
|
35363
35400
|
try {
|
|
35364
|
-
const parsed = JSON.parse(
|
|
35401
|
+
const parsed = JSON.parse(readFileSync3(path, "utf8"));
|
|
35365
35402
|
return parsed !== null && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : void 0;
|
|
35366
35403
|
} catch {
|
|
35367
35404
|
return void 0;
|
|
@@ -35455,15 +35492,15 @@ function projectMcpServers(cwd, options = {}) {
|
|
|
35455
35492
|
const env = options.env ?? process.env;
|
|
35456
35493
|
const home = options.home ?? homedir();
|
|
35457
35494
|
const configOverride = options.claudeConfigDir ?? (env.CLAUDE_CONFIG_DIR?.trim() ? env.CLAUDE_CONFIG_DIR.trim() : void 0);
|
|
35458
|
-
const accountFile = configOverride ?
|
|
35459
|
-
const userSettingsFile =
|
|
35495
|
+
const accountFile = configOverride ? join6(configOverride, ".claude.json") : join6(home, ".claude.json");
|
|
35496
|
+
const userSettingsFile = join6(configOverride ?? join6(home, ".claude"), "settings.json");
|
|
35460
35497
|
const account = readJsonObject(accountFile);
|
|
35461
35498
|
const out = userScopeRemoteServers(account, cwd, env);
|
|
35462
|
-
const declared = objectField(readJsonObject(
|
|
35499
|
+
const declared = objectField(readJsonObject(join6(cwd, ".mcp.json")), "mcpServers");
|
|
35463
35500
|
if (!declared) return out;
|
|
35464
35501
|
const approval = collectApproval([
|
|
35465
|
-
readJsonObject(
|
|
35466
|
-
readJsonObject(
|
|
35502
|
+
readJsonObject(join6(cwd, ".claude", "settings.json")),
|
|
35503
|
+
readJsonObject(join6(cwd, ".claude", "settings.local.json")),
|
|
35467
35504
|
readJsonObject(userSettingsFile),
|
|
35468
35505
|
objectField(objectField(account, "projects"), cwd)
|
|
35469
35506
|
]);
|
|
@@ -35494,12 +35531,12 @@ function claudeCompactionWindowOf(env) {
|
|
|
35494
35531
|
}
|
|
35495
35532
|
|
|
35496
35533
|
// packages/server/src/backend/claude-broker-diagnostics.ts
|
|
35497
|
-
import { appendFileSync as appendFileSync2, mkdirSync as
|
|
35498
|
-
import { join as
|
|
35534
|
+
import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, statSync as statSync2 } from "node:fs";
|
|
35535
|
+
import { join as join7 } from "node:path";
|
|
35499
35536
|
var MAX_BYTES = 4 * 1024 * 1024;
|
|
35500
35537
|
function appendRecord(path, record) {
|
|
35501
35538
|
try {
|
|
35502
|
-
|
|
35539
|
+
mkdirSync3(join7(path, ".."), { recursive: true });
|
|
35503
35540
|
try {
|
|
35504
35541
|
if (statSync2(path).size > MAX_BYTES) renameSync2(path, `${path}.1`);
|
|
35505
35542
|
} catch {
|
|
@@ -35560,6 +35597,7 @@ function runClaudeBroker(config) {
|
|
|
35560
35597
|
};
|
|
35561
35598
|
const writeDiagnostic = config.diagnosticLogPath ? createClaudeBrokerDiagnosticWriter(config.diagnosticLogPath, { daemonPid: process.pid, generation }) : void 0;
|
|
35562
35599
|
const writeExit = config.diagnosticLogPath ? createClaudeBrokerExitWriter(config.diagnosticLogPath, { daemonPid: process.pid, generation }) : void 0;
|
|
35600
|
+
const releaseRuntimeLease = leaseRuntime(config.executablePath, "claude-broker");
|
|
35563
35601
|
const factory = createClaudeQueryFactory({ enabled: true, executablePath: config.executablePath });
|
|
35564
35602
|
const env = { ...inheritWorkerEnvironment(config.env), ...config.workerEnv ?? {} };
|
|
35565
35603
|
const handle = factory.start({
|
|
@@ -35740,7 +35778,7 @@ function runClaudeBroker(config) {
|
|
|
35740
35778
|
const recordOwner = () => {
|
|
35741
35779
|
if (!config.recordPath) return null;
|
|
35742
35780
|
try {
|
|
35743
|
-
return JSON.parse(
|
|
35781
|
+
return JSON.parse(readFileSync5(config.recordPath, "utf8")).daemonPid;
|
|
35744
35782
|
} catch {
|
|
35745
35783
|
return null;
|
|
35746
35784
|
}
|
|
@@ -35750,18 +35788,19 @@ function runClaudeBroker(config) {
|
|
|
35750
35788
|
if (closed) return;
|
|
35751
35789
|
closed = true;
|
|
35752
35790
|
writeExit?.(reason, detail);
|
|
35791
|
+
releaseRuntimeLease();
|
|
35753
35792
|
clearTimeout(idleTimer);
|
|
35754
35793
|
clearInterval(reach);
|
|
35755
35794
|
const owner = recordOwner();
|
|
35756
35795
|
if (config.recordPath && owner === process.pid) {
|
|
35757
35796
|
try {
|
|
35758
|
-
|
|
35797
|
+
unlinkSync3(config.recordPath);
|
|
35759
35798
|
} catch {
|
|
35760
35799
|
}
|
|
35761
35800
|
}
|
|
35762
35801
|
if (!(published && owner !== null && owner !== process.pid) && published && process.platform !== "win32") {
|
|
35763
35802
|
try {
|
|
35764
|
-
|
|
35803
|
+
unlinkSync3(config.socketPath);
|
|
35765
35804
|
} catch {
|
|
35766
35805
|
}
|
|
35767
35806
|
}
|
|
@@ -35800,7 +35839,7 @@ function runClaudeBroker(config) {
|
|
|
35800
35839
|
void shutdown(1, "socket-listen-failed", message);
|
|
35801
35840
|
});
|
|
35802
35841
|
try {
|
|
35803
|
-
|
|
35842
|
+
unlinkSync3(config.socketPath);
|
|
35804
35843
|
} catch {
|
|
35805
35844
|
}
|
|
35806
35845
|
server.listen(config.socketPath, () => {
|
|
@@ -35808,7 +35847,7 @@ function runClaudeBroker(config) {
|
|
|
35808
35847
|
if (config.recordPath) {
|
|
35809
35848
|
const record = { daemonPid: process.pid, socketPath: config.socketPath, sessionId: config.sessionId, generation, createdAt: (/* @__PURE__ */ new Date()).toISOString(), capabilities: BROKER_CAPABILITIES, compactionWindow: claudeCompactionWindowOf(config.workerEnv) };
|
|
35810
35849
|
try {
|
|
35811
|
-
|
|
35850
|
+
writeFileSync2(config.recordPath, JSON.stringify(record), { mode: 384 });
|
|
35812
35851
|
} catch {
|
|
35813
35852
|
}
|
|
35814
35853
|
}
|
|
@@ -3,8 +3,8 @@ import { createRequire as __frizzCreateRequire } from "node:module"; const requi
|
|
|
3
3
|
// packages/server/src/backend/codex-app-server-daemon.ts
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
5
|
import { createServer } from "node:net";
|
|
6
|
-
import { existsSync, readFileSync, unlinkSync as
|
|
7
|
-
import { dirname } from "node:path";
|
|
6
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2, unlinkSync as unlinkSync3, writeFileSync as writeFileSync2 } from "node:fs";
|
|
7
|
+
import { dirname as dirname2 } from "node:path";
|
|
8
8
|
import { StringDecoder } from "node:string_decoder";
|
|
9
9
|
|
|
10
10
|
// packages/server/src/backend/stale-socket-sweep.ts
|
|
@@ -70,6 +70,43 @@ function sweepStaleSockets(options, deps = {}) {
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
// packages/server/src/runtime-lease.ts
|
|
74
|
+
import { existsSync, mkdirSync, readdirSync as readdirSync2, readFileSync, unlinkSync as unlinkSync2, writeFileSync } from "node:fs";
|
|
75
|
+
import { dirname, join as join2 } from "node:path";
|
|
76
|
+
var PROVISIONED_MARKER = "provisioned.json";
|
|
77
|
+
var LEASES_DIR = ".leases";
|
|
78
|
+
var MAX_ASCENT = 6;
|
|
79
|
+
function runtimeVersionDir(bin) {
|
|
80
|
+
let dir = dirname(bin);
|
|
81
|
+
for (let step = 0; step < MAX_ASCENT; step++) {
|
|
82
|
+
if (existsSync(join2(dir, PROVISIONED_MARKER))) return dir;
|
|
83
|
+
const parent = dirname(dir);
|
|
84
|
+
if (parent === dir) return void 0;
|
|
85
|
+
dir = parent;
|
|
86
|
+
}
|
|
87
|
+
return void 0;
|
|
88
|
+
}
|
|
89
|
+
function leaseRuntime(bin, role) {
|
|
90
|
+
const versionDir = runtimeVersionDir(bin);
|
|
91
|
+
if (!versionDir) return () => {
|
|
92
|
+
};
|
|
93
|
+
const path = join2(versionDir, LEASES_DIR, `${process.pid}.json`);
|
|
94
|
+
try {
|
|
95
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
96
|
+
const lease = { pid: process.pid, role, bin, at: (/* @__PURE__ */ new Date()).toISOString() };
|
|
97
|
+
writeFileSync(path, JSON.stringify(lease));
|
|
98
|
+
} catch {
|
|
99
|
+
return () => {
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return () => {
|
|
103
|
+
try {
|
|
104
|
+
unlinkSync2(path);
|
|
105
|
+
} catch {
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
73
110
|
// packages/server/src/backend/codex-app-server-daemon.ts
|
|
74
111
|
var MAX_QUEUED_LINES = 2e4;
|
|
75
112
|
var MAX_QUEUED_BYTES = 64 * 1024 * 1024;
|
|
@@ -118,6 +155,7 @@ function lineReader(onLine, onOverflow) {
|
|
|
118
155
|
}
|
|
119
156
|
function main() {
|
|
120
157
|
const config = readConfig();
|
|
158
|
+
const releaseRuntimeLease = leaseRuntime(config.codexBin, "codex-app-server");
|
|
121
159
|
const child = spawn(config.codexBin, config.appServerArgs ?? ["app-server", "--stdio"], {
|
|
122
160
|
cwd: config.cwd,
|
|
123
161
|
env: config.env,
|
|
@@ -131,7 +169,7 @@ function main() {
|
|
|
131
169
|
let published = false;
|
|
132
170
|
const recordOwner = () => {
|
|
133
171
|
try {
|
|
134
|
-
const value = JSON.parse(
|
|
172
|
+
const value = JSON.parse(readFileSync2(config.recordPath, "utf8"));
|
|
135
173
|
return typeof value.daemonPid === "number" ? value.daemonPid : null;
|
|
136
174
|
} catch {
|
|
137
175
|
return null;
|
|
@@ -145,21 +183,21 @@ function main() {
|
|
|
145
183
|
const owner = recordOwner();
|
|
146
184
|
if (owner === process.pid) {
|
|
147
185
|
try {
|
|
148
|
-
|
|
186
|
+
unlinkSync3(config.recordPath);
|
|
149
187
|
} catch {
|
|
150
188
|
}
|
|
151
189
|
}
|
|
152
190
|
if (published && owner !== null && owner !== process.pid) return;
|
|
153
191
|
if (published && process.platform !== "win32") {
|
|
154
192
|
try {
|
|
155
|
-
|
|
193
|
+
unlinkSync3(config.socketPath);
|
|
156
194
|
} catch {
|
|
157
195
|
}
|
|
158
196
|
}
|
|
159
197
|
};
|
|
160
198
|
const writeExitBreadcrumb = (reason) => {
|
|
161
199
|
try {
|
|
162
|
-
|
|
200
|
+
writeFileSync2(`${config.recordPath}.exit`, JSON.stringify({
|
|
163
201
|
projectId: config.projectId,
|
|
164
202
|
generation: config.generation,
|
|
165
203
|
daemonPid: process.pid,
|
|
@@ -172,6 +210,7 @@ function main() {
|
|
|
172
210
|
};
|
|
173
211
|
const die = (code, reason) => {
|
|
174
212
|
writeExitBreadcrumb(reason);
|
|
213
|
+
releaseRuntimeLease();
|
|
175
214
|
cleanup();
|
|
176
215
|
process.exit(code);
|
|
177
216
|
};
|
|
@@ -279,7 +318,7 @@ function main() {
|
|
|
279
318
|
toServer(message);
|
|
280
319
|
};
|
|
281
320
|
const writeRecord = () => {
|
|
282
|
-
|
|
321
|
+
writeFileSync2(config.recordPath, JSON.stringify({
|
|
283
322
|
projectId: config.projectId,
|
|
284
323
|
generation: config.generation,
|
|
285
324
|
daemonPid: process.pid,
|
|
@@ -323,11 +362,11 @@ function main() {
|
|
|
323
362
|
sock.on("close", drop);
|
|
324
363
|
sock.on("error", drop);
|
|
325
364
|
});
|
|
326
|
-
const sweepOwnFamily = () => sweepStaleSockets({ dir:
|
|
365
|
+
const sweepOwnFamily = () => sweepStaleSockets({ dir: dirname2(config.socketPath), prefix: "frizz-codex-", keep: [config.socketPath] });
|
|
327
366
|
const startListening = () => {
|
|
328
|
-
if (process.platform !== "win32" &&
|
|
367
|
+
if (process.platform !== "win32" && existsSync2(config.socketPath)) {
|
|
329
368
|
try {
|
|
330
|
-
|
|
369
|
+
unlinkSync3(config.socketPath);
|
|
331
370
|
} catch {
|
|
332
371
|
}
|
|
333
372
|
}
|