frizz-server 0.15.7 → 0.15.8
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/acp-daemon.js +27 -3
- package/dist/claude-agent-broker.js +27 -21
- package/dist/codex-app-server-daemon.js +27 -3
- package/dist/dev-child.js +421 -155
- package/package.json +1 -1
- package/runtime/cc-worker/bin/frizz-mcp.mjs +21 -17
- package/runtime/cc-worker/hooks/session-seed.mjs +1 -1
- package/web-dist/assets/{abnfDiagram-VRR7QNED-DwSF6UVy.js → abnfDiagram-VRR7QNED-5ei_4zAM.js} +1 -1
- package/web-dist/assets/{arc-BO1i7GWM.js → arc-IM-a48Qs.js} +1 -1
- package/web-dist/assets/architecture-TIHT7OUA-bSjZeCDP.js +1 -0
- package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-msNhjgsP.js → architectureDiagram-ZJ3FMSHR-2XGTphLh.js} +1 -1
- package/web-dist/assets/{blockDiagram-677ZJIJ3-JCCwJqsE.js → blockDiagram-677ZJIJ3-DZM9KutE.js} +1 -1
- package/web-dist/assets/{c4Diagram-LMCZKHZV-B5vS6rLH.js → c4Diagram-LMCZKHZV-CKa_m4-S.js} +1 -1
- package/web-dist/assets/channel-CZsSDpaO.js +1 -0
- package/web-dist/assets/{chunk-32BRIVSS-BeH_kPjp.js → chunk-32BRIVSS-BLSMcIRY.js} +1 -1
- package/web-dist/assets/{chunk-52WLFC77-D0OtliIj.js → chunk-52WLFC77-DevWfx8Y.js} +1 -1
- package/web-dist/assets/{chunk-C7G6YPKG-wbaKYBGi.js → chunk-C7G6YPKG-CsLDw_Vc.js} +1 -1
- package/web-dist/assets/{chunk-EX3LRPZG-JrdwUCV4.js → chunk-EX3LRPZG-CAVfNVN8.js} +1 -1
- package/web-dist/assets/{chunk-FWX5IMBZ-dk5peTlq.js → chunk-FWX5IMBZ-ba3X5gAQ.js} +2 -2
- package/web-dist/assets/{chunk-HOUHSVGY-DEVMSmR0.js → chunk-HOUHSVGY-Bm5rhDGu.js} +1 -1
- package/web-dist/assets/{chunk-ICXQ74PX-Q4B4QfXk.js → chunk-ICXQ74PX-DKF-sXIi.js} +1 -1
- package/web-dist/assets/{chunk-MOJQB5TN-CFljAhrA.js → chunk-MOJQB5TN-19qz3xL4.js} +1 -1
- package/web-dist/assets/{chunk-OGEWGWER-uDxaNMkK.js → chunk-OGEWGWER-DLdOho5W.js} +1 -1
- package/web-dist/assets/{chunk-PUDLZKDR-B1_PcfSW.js → chunk-PUDLZKDR-C1Nj5k8G.js} +1 -1
- package/web-dist/assets/{chunk-Q4XR5HBZ-CTG5ESkU.js → chunk-Q4XR5HBZ-CPx-9pEy.js} +1 -1
- package/web-dist/assets/{chunk-RYQCIY6F-C4Xbw0h0.js → chunk-RYQCIY6F-BVfqVyNV.js} +1 -1
- package/web-dist/assets/{chunk-V7JOEXUC-DzX7WzjT.js → chunk-V7JOEXUC-Bq5EG6OC.js} +1 -1
- package/web-dist/assets/{chunk-VAUOI2AC-C5BV4_RN.js → chunk-VAUOI2AC-CyfJDqu-.js} +1 -1
- package/web-dist/assets/{chunk-VR4S4FIN-WYsy9hUs.js → chunk-VR4S4FIN-DMki15_r.js} +1 -1
- package/web-dist/assets/{chunk-WYO6CB5R-D-1-l4MF.js → chunk-WYO6CB5R-C30gZnnl.js} +1 -1
- package/web-dist/assets/{chunk-XXDRQBXY-C9lzowcJ.js → chunk-XXDRQBXY-CP4D_ETY.js} +1 -1
- package/web-dist/assets/{chunk-ZGVPDNZ5-7KVpod10.js → chunk-ZGVPDNZ5-k3kNBN88.js} +1 -1
- package/web-dist/assets/classDiagram-OUVF2IWQ-he8mN_1d.js +1 -0
- package/web-dist/assets/classDiagram-v2-EOCWNBFH-he8mN_1d.js +1 -0
- package/web-dist/assets/{cose-bilkent-JH36ORCC-Cjxk1BZr.js → cose-bilkent-JH36ORCC-wO3EsovI.js} +1 -1
- package/web-dist/assets/{cynefin-VYW2F7L2-wOe2bHzn.js → cynefin-VYW2F7L2-C3EU9o4N.js} +1 -1
- package/web-dist/assets/{cynefinDiagram-TSTJHNR4-aC9cGB5C.js → cynefinDiagram-TSTJHNR4-CGG-zKEM.js} +1 -1
- package/web-dist/assets/{dagre-VKFMJZFB-C8WIcb6F.js → dagre-VKFMJZFB-DyC8Hqa9.js} +1 -1
- package/web-dist/assets/{diagram-FQU43EPY-C3aPYv7S.js → diagram-FQU43EPY-B0kKGxoR.js} +1 -1
- package/web-dist/assets/{diagram-G47NLZAW-B4wmfzMx.js → diagram-G47NLZAW-B0HF-C4G.js} +1 -1
- package/web-dist/assets/{diagram-NH7WQ7WH-DVeUa_5D.js → diagram-NH7WQ7WH-ZnEvLrYH.js} +1 -1
- package/web-dist/assets/{diagram-OA4YK3LP-BaQwQu_F.js → diagram-OA4YK3LP-ynOqxQd4.js} +1 -1
- package/web-dist/assets/{diagram-WEI45ONY-DqprB85c.js → diagram-WEI45ONY-DeweEbe9.js} +1 -1
- package/web-dist/assets/{dist-rtzL4gLm.js → dist-DjR2jyYf.js} +1 -1
- package/web-dist/assets/{ebnfDiagram-CCIWWBDH-Mm1irNb1.js → ebnfDiagram-CCIWWBDH-PvzgPvcs.js} +1 -1
- package/web-dist/assets/{erDiagram-Q63AITRT-MKBulWN5.js → erDiagram-Q63AITRT-DXj9ksQt.js} +1 -1
- package/web-dist/assets/eventmodeling-45OFAUF4-sgc1I6jd.js +1 -0
- package/web-dist/assets/flowDiagram-23GEKE2U-CgBJXm5_.js +1 -0
- package/web-dist/assets/{ganttDiagram-NO4QXBWP-D2y3Bf3l.js → ganttDiagram-NO4QXBWP-jO6JaqFN.js} +1 -1
- package/web-dist/assets/{gitGraph-TEB2WS4Q-O-LVx0X5.js → gitGraph-TEB2WS4Q-CwIqpSfV.js} +1 -1
- package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-DcQEaYcT.js → gitGraphDiagram-IHSO6WYX-CX-kdWUp.js} +1 -1
- package/web-dist/assets/{index-DpPWC0ta.js → index-BSuA-nmx.js} +90 -90
- package/web-dist/assets/index-WdL7ce5m.css +2 -0
- package/web-dist/assets/{info-DKCQHKI2-CY6fWeew.js → info-DKCQHKI2-CvH1I_qF.js} +1 -1
- package/web-dist/assets/{infoDiagram-FWYZ7A6U-BVfQV-3W.js → infoDiagram-FWYZ7A6U-C9NZZW2e.js} +1 -1
- package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-dwjcM4Ez.js → ishikawaDiagram-FXEZZL3T-uLWFep7Q.js} +1 -1
- package/web-dist/assets/{journeyDiagram-5HDEW3XC-CUaZBvLp.js → journeyDiagram-5HDEW3XC-CsXFiBiD.js} +1 -1
- package/web-dist/assets/{kanban-definition-HUTT4EX6-DE8wReP0.js → kanban-definition-HUTT4EX6-DK9QRwpc.js} +1 -1
- package/web-dist/assets/{line-zArFI85C.js → line-Cwz0rEtC.js} +1 -1
- package/web-dist/assets/{linear-BSG56Yjb.js → linear-BENsfGox.js} +1 -1
- package/web-dist/assets/{mermaid-parser.core-BxbE62as.js → mermaid-parser.core-DhmoiWF3.js} +3 -3
- package/web-dist/assets/{mermaid.core-C9Bw1zsy.js → mermaid.core-BDr_Kn5Z.js} +3 -3
- package/web-dist/assets/{mindmap-definition-LN4V7U3C-BhguO5c0.js → mindmap-definition-LN4V7U3C-CjIFm3K2.js} +1 -1
- package/web-dist/assets/{packet-7NZHBO7P-C9Him4Jg.js → packet-7NZHBO7P-CzCyao17.js} +1 -1
- package/web-dist/assets/{pegDiagram-2B236MQR-D4wv-hVO.js → pegDiagram-2B236MQR-BmDMeRcD.js} +1 -1
- package/web-dist/assets/{pie-RZYD4A2V-CXMTL6pQ.js → pie-RZYD4A2V-DMM2IkHs.js} +1 -1
- package/web-dist/assets/{pieDiagram-ENE6RG2P-CHBrF8Gr.js → pieDiagram-ENE6RG2P-CbwVr3qW.js} +1 -1
- package/web-dist/assets/{quadrantDiagram-ABIIQ3AL-yT8E8mdN.js → quadrantDiagram-ABIIQ3AL-De32pmiP.js} +1 -1
- package/web-dist/assets/{radar-I7S5WNFK-DTFJXgLK.js → radar-I7S5WNFK-CbsD9oXO.js} +1 -1
- package/web-dist/assets/{railroad-3IZDKUUU-9El5FU8p.js → railroad-3IZDKUUU-DBxDhaRB.js} +1 -1
- package/web-dist/assets/railroad-abnf-AHOZXSZD-CHHGvNsw.js +1 -0
- package/web-dist/assets/railroad-ebnf-EBAXGLYW-CNbn6hsV.js +1 -0
- package/web-dist/assets/railroad-peg-LSFZ7HO6-BsBO5cGs.js +1 -0
- package/web-dist/assets/{railroadDiagram-RFXS5EU6-DHRB37mq.js → railroadDiagram-RFXS5EU6-Cc2vK3CJ.js} +1 -1
- package/web-dist/assets/{requirementDiagram-TGXJPOKE-Cj41jOCz.js → requirementDiagram-TGXJPOKE-BindEO0A.js} +1 -1
- package/web-dist/assets/{sankeyDiagram-HTMAVEWB-Czb26Wy-.js → sankeyDiagram-HTMAVEWB-4Y4Mv2hM.js} +1 -1
- package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-C_WGyZ5J.js → sequenceDiagram-DBY2YBRQ-BjN0lvxQ.js} +1 -1
- package/web-dist/assets/{src-BH3865Hl.js → src-COVUvSFq.js} +1 -1
- package/web-dist/assets/{stateDiagram-2N3HPSRC-DwKIv4VY.js → stateDiagram-2N3HPSRC-CW38CSkC.js} +1 -1
- package/web-dist/assets/stateDiagram-v2-6OUMAXLB-gZiZetc1.js +1 -0
- package/web-dist/assets/{swimlanes-5IMT3BWC-Bf3tF-DM.js → swimlanes-5IMT3BWC-TQBpYgBC.js} +1 -1
- package/web-dist/assets/swimlanesDiagram-G3AALYLV-DWpWeiSt.js +8 -0
- package/web-dist/assets/{timeline-definition-FHXFAJF6-X_Wo2yjO.js → timeline-definition-FHXFAJF6-BET2st28.js} +1 -1
- package/web-dist/assets/{treeView-QDETBFTQ-Cdlwh2BX.js → treeView-QDETBFTQ-C8KMnMpR.js} +1 -1
- package/web-dist/assets/{treemap-6X3UGDF4-ByVScQ5B.js → treemap-6X3UGDF4-T0GBmSXN.js} +1 -1
- package/web-dist/assets/{vennDiagram-L72KCM5P-B7dNcpqz.js → vennDiagram-L72KCM5P-U1-fDVAv.js} +1 -1
- package/web-dist/assets/{wardley-OPB4EBWU-CEiXyYvs.js → wardley-OPB4EBWU-8e8yAPGj.js} +1 -1
- package/web-dist/assets/{wardleyDiagram-EHGQE667-CehzwZ8g.js → wardleyDiagram-EHGQE667-CWHLRs2-.js} +1 -1
- package/web-dist/assets/{xychartDiagram-FW5EYKEG-BmuVKE3h.js → xychartDiagram-FW5EYKEG-BNqGD1uM.js} +1 -1
- package/web-dist/index.html +2 -2
- package/web-dist/assets/architecture-TIHT7OUA-BbpJdZVL.js +0 -1
- package/web-dist/assets/channel-D0yqk-I_.js +0 -1
- package/web-dist/assets/classDiagram-OUVF2IWQ-BrNNI0PJ.js +0 -1
- package/web-dist/assets/classDiagram-v2-EOCWNBFH-BrNNI0PJ.js +0 -1
- package/web-dist/assets/eventmodeling-45OFAUF4-JhoriiTk.js +0 -1
- package/web-dist/assets/flowDiagram-23GEKE2U-BY5NuqLK.js +0 -1
- package/web-dist/assets/index-BSpdKQMe.css +0 -2
- package/web-dist/assets/railroad-abnf-AHOZXSZD-DfSVqPIB.js +0 -1
- package/web-dist/assets/railroad-ebnf-EBAXGLYW-vIxB5rhr.js +0 -1
- package/web-dist/assets/railroad-peg-LSFZ7HO6-7hKGS43v.js +0 -1
- package/web-dist/assets/stateDiagram-v2-6OUMAXLB-e_B-QQch.js +0 -1
- package/web-dist/assets/swimlanesDiagram-G3AALYLV-CrDVZVa-.js +0 -8
package/dist/acp-daemon.js
CHANGED
|
@@ -70,6 +70,27 @@ function sweepStaleSockets(options, deps = {}) {
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
// packages/server/src/backend/socket-ownership.ts
|
|
74
|
+
import { statSync } from "node:fs";
|
|
75
|
+
function socketPathOwnership(socketPath) {
|
|
76
|
+
if (process.platform === "win32") return () => true;
|
|
77
|
+
let bound;
|
|
78
|
+
try {
|
|
79
|
+
const stat = statSync(socketPath);
|
|
80
|
+
bound = { dev: stat.dev, ino: stat.ino };
|
|
81
|
+
} catch {
|
|
82
|
+
return () => true;
|
|
83
|
+
}
|
|
84
|
+
return () => {
|
|
85
|
+
try {
|
|
86
|
+
const now = statSync(socketPath);
|
|
87
|
+
return now.dev === bound.dev && now.ino === bound.ino;
|
|
88
|
+
} catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
73
94
|
// packages/server/src/backend/acp-daemon.ts
|
|
74
95
|
var MAX_QUEUED_LINES = 2e4;
|
|
75
96
|
var MAX_QUEUED_BYTES = 64 * 1024 * 1024;
|
|
@@ -131,6 +152,7 @@ function main() {
|
|
|
131
152
|
let dropped = 0;
|
|
132
153
|
let idleTimer = null;
|
|
133
154
|
let published = false;
|
|
155
|
+
let socketPathIsOurs = () => true;
|
|
134
156
|
const recordOwner = () => {
|
|
135
157
|
try {
|
|
136
158
|
const value = JSON.parse(readFileSync(config.recordPath, "utf8"));
|
|
@@ -152,7 +174,7 @@ function main() {
|
|
|
152
174
|
}
|
|
153
175
|
}
|
|
154
176
|
if (published && owner !== null && owner !== process.pid) return;
|
|
155
|
-
if (published && process.platform !== "win32") {
|
|
177
|
+
if (published && process.platform !== "win32" && socketPathIsOurs()) {
|
|
156
178
|
try {
|
|
157
179
|
unlinkSync2(config.socketPath);
|
|
158
180
|
} catch {
|
|
@@ -196,7 +218,8 @@ function main() {
|
|
|
196
218
|
unreachableStrikes = 0;
|
|
197
219
|
return;
|
|
198
220
|
}
|
|
199
|
-
|
|
221
|
+
const recorded = recordOwner() === process.pid;
|
|
222
|
+
if (recorded && socketPathIsOurs()) {
|
|
200
223
|
unreachableStrikes = 0;
|
|
201
224
|
return;
|
|
202
225
|
}
|
|
@@ -205,7 +228,7 @@ function main() {
|
|
|
205
228
|
child.kill("SIGTERM");
|
|
206
229
|
} catch {
|
|
207
230
|
}
|
|
208
|
-
die(0, "self-collected-record-reassigned");
|
|
231
|
+
die(0, recorded ? "self-collected-socket-lost" : "self-collected-record-reassigned");
|
|
209
232
|
};
|
|
210
233
|
const toClient = (line) => {
|
|
211
234
|
if (client) {
|
|
@@ -365,6 +388,7 @@ function main() {
|
|
|
365
388
|
server.on("error", () => die(6, "socket-listen-error"));
|
|
366
389
|
server.listen(config.socketPath, () => {
|
|
367
390
|
published = true;
|
|
391
|
+
socketPathIsOurs = socketPathOwnership(config.socketPath);
|
|
368
392
|
writeRecord();
|
|
369
393
|
armIdleExit();
|
|
370
394
|
const reachability = setInterval(checkReachable, config.reachabilityCheckMs ?? REACHABILITY_CHECK_MS);
|
|
@@ -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 net from "node:net";
|
|
5
|
-
import { readFileSync as readFileSync5, realpathSync as realpathSync2,
|
|
5
|
+
import { readFileSync as readFileSync5, realpathSync as realpathSync2, unlinkSync as unlinkSync3, writeFileSync as writeFileSync3 } from "node:fs";
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
|
|
@@ -27488,15 +27488,36 @@ function claudeCompactionWindowOf(env) {
|
|
|
27488
27488
|
return Number.isInteger(window) && window > 0 ? window : void 0;
|
|
27489
27489
|
}
|
|
27490
27490
|
|
|
27491
|
+
// packages/server/src/backend/socket-ownership.ts
|
|
27492
|
+
import { statSync as statSync2 } from "node:fs";
|
|
27493
|
+
function socketPathOwnership(socketPath) {
|
|
27494
|
+
if (process.platform === "win32") return () => true;
|
|
27495
|
+
let bound;
|
|
27496
|
+
try {
|
|
27497
|
+
const stat = statSync2(socketPath);
|
|
27498
|
+
bound = { dev: stat.dev, ino: stat.ino };
|
|
27499
|
+
} catch {
|
|
27500
|
+
return () => true;
|
|
27501
|
+
}
|
|
27502
|
+
return () => {
|
|
27503
|
+
try {
|
|
27504
|
+
const now = statSync2(socketPath);
|
|
27505
|
+
return now.dev === bound.dev && now.ino === bound.ino;
|
|
27506
|
+
} catch {
|
|
27507
|
+
return false;
|
|
27508
|
+
}
|
|
27509
|
+
};
|
|
27510
|
+
}
|
|
27511
|
+
|
|
27491
27512
|
// packages/server/src/backend/claude-broker-diagnostics.ts
|
|
27492
|
-
import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync4, readFileSync as readFileSync4, renameSync as renameSync2, statSync as
|
|
27513
|
+
import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync4, readFileSync as readFileSync4, renameSync as renameSync2, statSync as statSync3 } from "node:fs";
|
|
27493
27514
|
import { join as join6 } from "node:path";
|
|
27494
27515
|
var MAX_BYTES = 4 * 1024 * 1024;
|
|
27495
27516
|
function appendRecord(path, record) {
|
|
27496
27517
|
try {
|
|
27497
27518
|
mkdirSync4(join6(path, ".."), { recursive: true });
|
|
27498
27519
|
try {
|
|
27499
|
-
if (
|
|
27520
|
+
if (statSync3(path).size > MAX_BYTES) renameSync2(path, `${path}.1`);
|
|
27500
27521
|
} catch {
|
|
27501
27522
|
}
|
|
27502
27523
|
appendFileSync2(path, `${JSON.stringify(record)}
|
|
@@ -27640,7 +27661,7 @@ function runClaudeBroker(config) {
|
|
|
27640
27661
|
(error) => shutdown(0, "event-pump-failed", error instanceof Error ? error.message : String(error))
|
|
27641
27662
|
);
|
|
27642
27663
|
const armIdle = () => {
|
|
27643
|
-
if (client) return;
|
|
27664
|
+
if (client || closed) return;
|
|
27644
27665
|
clearTimeout(idleTimer);
|
|
27645
27666
|
idleTimer = setTimeout(() => shutdown(0, "idle-timeout"), IDLE_EXIT_MS);
|
|
27646
27667
|
};
|
|
@@ -27737,16 +27758,7 @@ function runClaudeBroker(config) {
|
|
|
27737
27758
|
sock.on("error", () => {
|
|
27738
27759
|
});
|
|
27739
27760
|
});
|
|
27740
|
-
let
|
|
27741
|
-
const socketPathIsOurs = () => {
|
|
27742
|
-
if (!socketIdentity) return true;
|
|
27743
|
-
try {
|
|
27744
|
-
const now = statSync3(config.socketPath);
|
|
27745
|
-
return now.dev === socketIdentity.dev && now.ino === socketIdentity.ino;
|
|
27746
|
-
} catch {
|
|
27747
|
-
return false;
|
|
27748
|
-
}
|
|
27749
|
-
};
|
|
27761
|
+
let socketPathIsOurs = () => true;
|
|
27750
27762
|
const recordOwner = () => {
|
|
27751
27763
|
if (!config.recordPath) return null;
|
|
27752
27764
|
try {
|
|
@@ -27825,13 +27837,7 @@ function runClaudeBroker(config) {
|
|
|
27825
27837
|
}
|
|
27826
27838
|
server.listen(config.socketPath, () => {
|
|
27827
27839
|
published = true;
|
|
27828
|
-
|
|
27829
|
-
try {
|
|
27830
|
-
const bound = statSync3(config.socketPath);
|
|
27831
|
-
socketIdentity = { dev: bound.dev, ino: bound.ino };
|
|
27832
|
-
} catch {
|
|
27833
|
-
}
|
|
27834
|
-
}
|
|
27840
|
+
socketPathIsOurs = socketPathOwnership(config.socketPath);
|
|
27835
27841
|
if (config.recordPath) {
|
|
27836
27842
|
const record = { daemonPid: process.pid, socketPath: config.socketPath, sessionId: config.sessionId, generation, createdAt: (/* @__PURE__ */ new Date()).toISOString(), capabilities: BROKER_CAPABILITIES, compactionWindow: claudeCompactionWindowOf(config.workerEnv) };
|
|
27837
27843
|
try {
|
|
@@ -70,6 +70,27 @@ function sweepStaleSockets(options, deps = {}) {
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
// packages/server/src/backend/socket-ownership.ts
|
|
74
|
+
import { statSync } from "node:fs";
|
|
75
|
+
function socketPathOwnership(socketPath) {
|
|
76
|
+
if (process.platform === "win32") return () => true;
|
|
77
|
+
let bound;
|
|
78
|
+
try {
|
|
79
|
+
const stat = statSync(socketPath);
|
|
80
|
+
bound = { dev: stat.dev, ino: stat.ino };
|
|
81
|
+
} catch {
|
|
82
|
+
return () => true;
|
|
83
|
+
}
|
|
84
|
+
return () => {
|
|
85
|
+
try {
|
|
86
|
+
const now = statSync(socketPath);
|
|
87
|
+
return now.dev === bound.dev && now.ino === bound.ino;
|
|
88
|
+
} catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
73
94
|
// packages/server/src/runtime-lease.ts
|
|
74
95
|
import { existsSync, mkdirSync, readdirSync as readdirSync2, readFileSync, unlinkSync as unlinkSync2, writeFileSync } from "node:fs";
|
|
75
96
|
import { dirname, join as join2 } from "node:path";
|
|
@@ -174,6 +195,7 @@ function main() {
|
|
|
174
195
|
let dropped = 0;
|
|
175
196
|
let idleTimer = null;
|
|
176
197
|
let published = false;
|
|
198
|
+
let socketPathIsOurs = () => true;
|
|
177
199
|
const recordOwner = () => {
|
|
178
200
|
try {
|
|
179
201
|
const value = JSON.parse(readFileSync2(config.recordPath, "utf8"));
|
|
@@ -195,7 +217,7 @@ function main() {
|
|
|
195
217
|
}
|
|
196
218
|
}
|
|
197
219
|
if (published && owner !== null && owner !== process.pid) return;
|
|
198
|
-
if (published && process.platform !== "win32") {
|
|
220
|
+
if (published && process.platform !== "win32" && socketPathIsOurs()) {
|
|
199
221
|
try {
|
|
200
222
|
unlinkSync3(config.socketPath);
|
|
201
223
|
} catch {
|
|
@@ -239,7 +261,8 @@ function main() {
|
|
|
239
261
|
unreachableStrikes = 0;
|
|
240
262
|
return;
|
|
241
263
|
}
|
|
242
|
-
|
|
264
|
+
const recorded = recordOwner() === process.pid;
|
|
265
|
+
if (recorded && socketPathIsOurs()) {
|
|
243
266
|
unreachableStrikes = 0;
|
|
244
267
|
return;
|
|
245
268
|
}
|
|
@@ -248,7 +271,7 @@ function main() {
|
|
|
248
271
|
child.kill("SIGTERM");
|
|
249
272
|
} catch {
|
|
250
273
|
}
|
|
251
|
-
die(0, "self-collected-record-reassigned");
|
|
274
|
+
die(0, recorded ? "self-collected-socket-lost" : "self-collected-record-reassigned");
|
|
252
275
|
};
|
|
253
276
|
const toClient = (line) => {
|
|
254
277
|
if (client) {
|
|
@@ -380,6 +403,7 @@ function main() {
|
|
|
380
403
|
server.on("error", () => die(6, "socket-listen-error"));
|
|
381
404
|
server.listen(config.socketPath, () => {
|
|
382
405
|
published = true;
|
|
406
|
+
socketPathIsOurs = socketPathOwnership(config.socketPath);
|
|
383
407
|
writeRecord();
|
|
384
408
|
armIdleExit();
|
|
385
409
|
const reachability = setInterval(checkReachable, config.reachabilityCheckMs ?? REACHABILITY_CHECK_MS);
|