@claudexor/daemon 3.3.15 → 3.4.0
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/command-store.d.ts +3 -0
- package/dist/command-store.d.ts.map +1 -1
- package/dist/command-store.js +4 -0
- package/dist/command-store.js.map +1 -1
- package/dist/daemon-listen.d.ts +10 -0
- package/dist/daemon-listen.d.ts.map +1 -0
- package/dist/daemon-listen.js +36 -0
- package/dist/daemon-listen.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/interactions.d.ts +3 -0
- package/dist/interactions.d.ts.map +1 -1
- package/dist/interactions.js +4 -0
- package/dist/interactions.js.map +1 -1
- package/dist/journal-manager-lifecycle.d.ts +8 -0
- package/dist/journal-manager-lifecycle.d.ts.map +1 -0
- package/dist/journal-manager-lifecycle.js +2 -0
- package/dist/journal-manager-lifecycle.js.map +1 -0
- package/dist/journal-manager.d.ts +21 -11
- package/dist/journal-manager.d.ts.map +1 -1
- package/dist/journal-manager.js +234 -198
- package/dist/journal-manager.js.map +1 -1
- package/dist/journal-prepared-operation.d.ts +53 -0
- package/dist/journal-prepared-operation.d.ts.map +1 -0
- package/dist/journal-prepared-operation.js +158 -0
- package/dist/journal-prepared-operation.js.map +1 -0
- package/dist/journal-projection-slot.d.ts +28 -0
- package/dist/journal-projection-slot.d.ts.map +1 -0
- package/dist/journal-projection-slot.js +71 -0
- package/dist/journal-projection-slot.js.map +1 -0
- package/dist/journal-projection.d.ts +2 -0
- package/dist/journal-projection.d.ts.map +1 -1
- package/dist/journal-recovery-files.d.ts +19 -1
- package/dist/journal-recovery-files.d.ts.map +1 -1
- package/dist/journal-recovery-files.js +271 -26
- package/dist/journal-recovery-files.js.map +1 -1
- package/dist/journal-recovery-operation.d.ts +27 -0
- package/dist/journal-recovery-operation.d.ts.map +1 -0
- package/dist/journal-recovery-operation.js +68 -0
- package/dist/journal-recovery-operation.js.map +1 -0
- package/dist/project-partition-preparation.d.ts +75 -0
- package/dist/project-partition-preparation.d.ts.map +1 -0
- package/dist/project-partition-preparation.js +233 -0
- package/dist/project-partition-preparation.js.map +1 -0
- package/dist/project-partitions.d.ts +18 -16
- package/dist/project-partitions.d.ts.map +1 -1
- package/dist/project-partitions.js +98 -99
- package/dist/project-partitions.js.map +1 -1
- package/dist/project-thread-listing.d.ts +14 -0
- package/dist/project-thread-listing.d.ts.map +1 -0
- package/dist/project-thread-listing.js +37 -0
- package/dist/project-thread-listing.js.map +1 -0
- package/dist/quota-projection.d.ts +9 -0
- package/dist/quota-projection.d.ts.map +1 -0
- package/dist/quota-projection.js +10 -0
- package/dist/quota-projection.js.map +1 -0
- package/dist/quota-registry.d.ts +3 -5
- package/dist/quota-registry.d.ts.map +1 -1
- package/dist/quota-registry.js +9 -10
- package/dist/quota-registry.js.map +1 -1
- package/dist/root-authority.d.ts +68 -0
- package/dist/root-authority.d.ts.map +1 -0
- package/dist/root-authority.js +380 -0
- package/dist/root-authority.js.map +1 -0
- package/dist/rpc-followers.d.ts +17 -0
- package/dist/rpc-followers.d.ts.map +1 -0
- package/dist/rpc-followers.js +46 -0
- package/dist/rpc-followers.js.map +1 -0
- package/dist/server.d.ts +4 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +42 -62
- package/dist/server.js.map +1 -1
- package/dist/serving-admission.d.ts +21 -0
- package/dist/serving-admission.d.ts.map +1 -0
- package/dist/serving-admission.js +17 -0
- package/dist/serving-admission.js.map +1 -0
- package/dist/terminate.d.ts +18 -7
- package/dist/terminate.d.ts.map +1 -1
- package/dist/terminate.js +213 -69
- package/dist/terminate.js.map +1 -1
- package/dist/token.d.ts +6 -0
- package/dist/token.d.ts.map +1 -1
- package/dist/token.js +8 -0
- package/dist/token.js.map +1 -1
- package/dist/writer-lease.d.ts +76 -4
- package/dist/writer-lease.d.ts.map +1 -1
- package/dist/writer-lease.js +346 -56
- package/dist/writer-lease.js.map +1 -1
- package/package.json +5 -5
package/dist/writer-lease.js
CHANGED
|
@@ -1,61 +1,372 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { lstatSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import { defaultProcessIdentityService, isKnownProcessIdentity, } from "@claudexor/core";
|
|
4
|
+
import { compareProcessIdentity, defaultProcessIdentityService, defaultProcessObservationReader, isKnownProcessIdentity, observeProcess, } from "@claudexor/core";
|
|
5
5
|
import { daemonDir, isWindowsPipePath } from "./token.js";
|
|
6
|
+
/** Marker file whose presence turns a lease directory into the permanent
|
|
7
|
+
* root-authority barrier (issue #165 D1). The barrier directory deliberately
|
|
8
|
+
* carries NO top-level owner.json: a pre-fix claimant's lease parse fails
|
|
9
|
+
* closed on it forever, so it can never quarantine the barrier and take over
|
|
10
|
+
* a data root last served by a fixed runtime. */
|
|
11
|
+
export const ROOT_AUTHORITY_MARKER_FILE = "root-authority-v2.json";
|
|
12
|
+
/** Nested slot the fixed daemon's ACTIVE writer claim occupies under a barrier. */
|
|
13
|
+
const ROOT_AUTHORITY_ACTIVE_SLOT = "active";
|
|
6
14
|
/**
|
|
7
|
-
* Filesystem
|
|
15
|
+
* Filesystem anchor of the single-writer lease for a control endpoint. A Unix
|
|
8
16
|
* socket FILE anchors its lease right next to itself; a named pipe is not a
|
|
9
17
|
* filesystem entry (nothing can be created in `\\.\pipe\`), so its lease lives
|
|
10
18
|
* in the daemon dir under the pipe's own final segment — which already carries
|
|
11
19
|
* the config-dir digest, keeping concurrent daemons' leases distinct.
|
|
12
20
|
*/
|
|
13
|
-
export function
|
|
21
|
+
export function writerLeaseAnchorPath(socketPath) {
|
|
14
22
|
if (isWindowsPipePath(socketPath)) {
|
|
15
23
|
const pipeName = socketPath.split(/[\\/]/).pop() || "claudexord-pipe";
|
|
16
24
|
return join(daemonDir(), `${pipeName}.writer`);
|
|
17
25
|
}
|
|
18
26
|
return `${socketPath}.writer`;
|
|
19
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Effective single-writer lease address. Once the anchor directory carries the
|
|
30
|
+
* permanent root-authority barrier marker (issue #165 D1/D4), the live claim
|
|
31
|
+
* for every FIXED runtime moves to the nested `active.writer` slot inside the
|
|
32
|
+
* barrier, so inspection, acquisition, termination and operator stop all keep
|
|
33
|
+
* following one canonical address. Pre-fix runtimes never resolve the nested
|
|
34
|
+
* slot — they contend on the anchor itself, where the opaque barrier refuses
|
|
35
|
+
* them. Without a marker the anchor stays the (legacy-compatible) address.
|
|
36
|
+
*/
|
|
37
|
+
export function writerLeasePath(socketPath) {
|
|
38
|
+
const anchor = writerLeaseAnchorPath(socketPath);
|
|
39
|
+
try {
|
|
40
|
+
if (lstatSync(join(anchor, ROOT_AUTHORITY_MARKER_FILE)).isFile()) {
|
|
41
|
+
return join(anchor, `${ROOT_AUTHORITY_ACTIVE_SLOT}.writer`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* no readable barrier marker -> the anchor is the lease address */
|
|
46
|
+
}
|
|
47
|
+
return anchor;
|
|
48
|
+
}
|
|
49
|
+
const DEFAULT_FILESYSTEM = {
|
|
50
|
+
lstat: (path) => lstatSync(path),
|
|
51
|
+
readText: (path) => readFileSync(path, "utf8"),
|
|
52
|
+
createLeaseDirectory: (path) => mkdirSync(path, { mode: 0o700 }),
|
|
53
|
+
writeOwner: (path, data) => writeFileSync(path, data, {
|
|
54
|
+
mode: 0o600,
|
|
55
|
+
flag: "wx",
|
|
56
|
+
}),
|
|
57
|
+
rename: (from, to) => renameSync(from, to),
|
|
58
|
+
remove: (path) => rmSync(path, { recursive: true, force: true }),
|
|
59
|
+
};
|
|
60
|
+
function filesystem(deps) {
|
|
61
|
+
return { ...DEFAULT_FILESYSTEM, ...deps.filesystem };
|
|
62
|
+
}
|
|
63
|
+
/** Resolved filesystem seam. The root-authority in-place migration (C4)
|
|
64
|
+
* shares it so its atomic steps stay deterministically observable in tests. */
|
|
65
|
+
export function resolveWriterLeaseFilesystem(deps) {
|
|
66
|
+
return filesystem(deps);
|
|
67
|
+
}
|
|
68
|
+
function errorCode(error) {
|
|
69
|
+
return error?.code;
|
|
70
|
+
}
|
|
71
|
+
function validPositiveInteger(value) {
|
|
72
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
73
|
+
}
|
|
74
|
+
function sameOwner(left, right) {
|
|
75
|
+
return left.pid === right.pid && left.token === right.token;
|
|
76
|
+
}
|
|
77
|
+
function isLinuxZombieObservation(observation, pid) {
|
|
78
|
+
return (observation.linuxState === "Z" &&
|
|
79
|
+
observation.identity.status === "known" &&
|
|
80
|
+
observation.identity.pid === pid &&
|
|
81
|
+
observation.identity.platform === "linux" &&
|
|
82
|
+
observation.identity.source === "procfs_stat");
|
|
83
|
+
}
|
|
84
|
+
function parseLeaseOwner(raw) {
|
|
85
|
+
let value;
|
|
86
|
+
try {
|
|
87
|
+
value = JSON.parse(raw);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
93
|
+
return null;
|
|
94
|
+
const record = value;
|
|
95
|
+
if (!validPositiveInteger(record.pid) || typeof record.token !== "string" || !record.token) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
if (!Object.prototype.hasOwnProperty.call(record, "identity")) {
|
|
99
|
+
return { pid: record.pid, token: record.token };
|
|
100
|
+
}
|
|
101
|
+
if (!isKnownProcessIdentity(record.identity) || record.identity.pid !== record.pid)
|
|
102
|
+
return null;
|
|
103
|
+
return { pid: record.pid, token: record.token, identity: record.identity };
|
|
104
|
+
}
|
|
105
|
+
/** Preserve the pre-strict public projection exactly; never use for authority. */
|
|
106
|
+
function parseLegacyLeaseOwner(raw) {
|
|
107
|
+
let value;
|
|
108
|
+
try {
|
|
109
|
+
value = JSON.parse(raw);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
115
|
+
return null;
|
|
116
|
+
const record = value;
|
|
117
|
+
if (!validPositiveInteger(record.pid) || typeof record.token !== "string")
|
|
118
|
+
return null;
|
|
119
|
+
return {
|
|
120
|
+
pid: record.pid,
|
|
121
|
+
token: record.token,
|
|
122
|
+
...(isKnownProcessIdentity(record.identity) ? { identity: record.identity } : {}),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function readLegacyLeaseOwner(path) {
|
|
126
|
+
try {
|
|
127
|
+
return parseLegacyLeaseOwner(readFileSync(path, "utf8"));
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function inspectLeaseAfterOwnerMissing(path, fs) {
|
|
134
|
+
try {
|
|
135
|
+
const lease = fs.lstat(path);
|
|
136
|
+
if (lease.isSymbolicLink() || !lease.isDirectory()) {
|
|
137
|
+
return { status: "unknown", path, reason: "invalid_lease_path" };
|
|
138
|
+
}
|
|
139
|
+
return { status: "unknown", path, reason: "owner_missing" };
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
if (errorCode(error) === "ENOENT")
|
|
143
|
+
return { status: "absent", path };
|
|
144
|
+
return { status: "unknown", path, reason: "lease_unreadable" };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function inspectWriterLeasePath(path, fs) {
|
|
148
|
+
let lease;
|
|
149
|
+
try {
|
|
150
|
+
lease = fs.lstat(path);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
if (errorCode(error) === "ENOENT")
|
|
154
|
+
return { status: "absent", path };
|
|
155
|
+
return { status: "unknown", path, reason: "lease_unreadable" };
|
|
156
|
+
}
|
|
157
|
+
if (lease.isSymbolicLink() || !lease.isDirectory()) {
|
|
158
|
+
return { status: "unknown", path, reason: "invalid_lease_path" };
|
|
159
|
+
}
|
|
160
|
+
const ownerPath = join(path, "owner.json");
|
|
161
|
+
let ownerStat;
|
|
162
|
+
try {
|
|
163
|
+
ownerStat = fs.lstat(ownerPath);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (errorCode(error) === "ENOENT")
|
|
167
|
+
return inspectLeaseAfterOwnerMissing(path, fs);
|
|
168
|
+
return { status: "unknown", path, reason: "owner_unreadable" };
|
|
169
|
+
}
|
|
170
|
+
if (ownerStat.isSymbolicLink() || !ownerStat.isFile()) {
|
|
171
|
+
return { status: "unknown", path, reason: "owner_malformed" };
|
|
172
|
+
}
|
|
173
|
+
let raw;
|
|
174
|
+
try {
|
|
175
|
+
raw = fs.readText(ownerPath);
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
if (errorCode(error) === "ENOENT")
|
|
179
|
+
return inspectLeaseAfterOwnerMissing(path, fs);
|
|
180
|
+
return { status: "unknown", path, reason: "owner_unreadable" };
|
|
181
|
+
}
|
|
182
|
+
const owner = parseLeaseOwner(raw);
|
|
183
|
+
return owner
|
|
184
|
+
? { status: "owned", path, owner }
|
|
185
|
+
: { status: "unknown", path, reason: "owner_malformed" };
|
|
186
|
+
}
|
|
187
|
+
function probeProcessPresence(pid, probe) {
|
|
188
|
+
try {
|
|
189
|
+
probe(pid);
|
|
190
|
+
return "present";
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
const code = errorCode(error);
|
|
194
|
+
if (code === "ESRCH")
|
|
195
|
+
return "missing";
|
|
196
|
+
if (code === "EPERM")
|
|
197
|
+
return "permission_denied";
|
|
198
|
+
return "unknown";
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export function classifyDaemonLeaseOwner(owner, deps = {}) {
|
|
202
|
+
const identity = deps.identity ?? defaultProcessIdentityService;
|
|
203
|
+
const observationReader = deps.observation ??
|
|
204
|
+
(identity === defaultProcessIdentityService ? defaultProcessObservationReader : undefined);
|
|
205
|
+
const observation = observeProcess(identity, owner.pid, observationReader);
|
|
206
|
+
const probe = deps.probeProcess ?? ((pid) => process.kill(pid, 0));
|
|
207
|
+
if (observation.identity.status === "missing") {
|
|
208
|
+
return { status: "proven_stale", reason: "process_missing", observation };
|
|
209
|
+
}
|
|
210
|
+
if (owner.identity && observation.identity.status === "known") {
|
|
211
|
+
if (compareProcessIdentity(owner.identity, observation.identity) !== "same") {
|
|
212
|
+
return { status: "proven_stale", reason: "identity_mismatch", observation };
|
|
213
|
+
}
|
|
214
|
+
if (isLinuxZombieObservation(observation, owner.pid)) {
|
|
215
|
+
return { status: "proven_stale", reason: "linux_zombie", observation };
|
|
216
|
+
}
|
|
217
|
+
return { status: "capable", reason: "identity_match", observation };
|
|
218
|
+
}
|
|
219
|
+
if (!owner.identity && observation.identity.status === "known") {
|
|
220
|
+
if (isLinuxZombieObservation(observation, owner.pid)) {
|
|
221
|
+
return { status: "proven_stale", reason: "linux_zombie", observation };
|
|
222
|
+
}
|
|
223
|
+
return { status: "capable", reason: "legacy_process_present", observation };
|
|
224
|
+
}
|
|
225
|
+
const presence = probeProcessPresence(owner.pid, probe);
|
|
226
|
+
if (presence === "missing") {
|
|
227
|
+
return { status: "proven_stale", reason: "process_missing", observation };
|
|
228
|
+
}
|
|
229
|
+
if (!owner.identity && (presence === "present" || presence === "permission_denied")) {
|
|
230
|
+
return { status: "capable", reason: "legacy_process_present", observation };
|
|
231
|
+
}
|
|
232
|
+
if (presence === "present" || presence === "permission_denied") {
|
|
233
|
+
return { status: "unknown", reason: "identity_unavailable", observation };
|
|
234
|
+
}
|
|
235
|
+
return { status: "unknown", reason: "presence_unknown", observation };
|
|
236
|
+
}
|
|
237
|
+
/** Strict authority read: only a physically missing lease path is `absent`. */
|
|
238
|
+
export function inspectDaemonWriterLease(socketPath, deps = {}) {
|
|
239
|
+
const path = writerLeasePath(socketPath);
|
|
240
|
+
const fs = filesystem(deps);
|
|
241
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
242
|
+
const raw = inspectWriterLeasePath(path, fs);
|
|
243
|
+
if (raw.status !== "owned")
|
|
244
|
+
return raw;
|
|
245
|
+
const capability = classifyDaemonLeaseOwner(raw.owner, deps);
|
|
246
|
+
const confirmed = inspectWriterLeasePath(path, fs);
|
|
247
|
+
if (confirmed.status === "owned" && sameOwner(confirmed.owner, raw.owner)) {
|
|
248
|
+
return { ...confirmed, capability };
|
|
249
|
+
}
|
|
250
|
+
if (attempt === 1) {
|
|
251
|
+
return confirmed.status === "owned"
|
|
252
|
+
? { status: "unknown", path, reason: "lease_unstable" }
|
|
253
|
+
: confirmed;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return { status: "unknown", path, reason: "lease_unstable" };
|
|
257
|
+
}
|
|
258
|
+
export function writerLeaseTombstonePath(leasePath, owner) {
|
|
259
|
+
const digest = createHash("sha256")
|
|
260
|
+
.update(String(owner.pid))
|
|
261
|
+
.update("\0")
|
|
262
|
+
.update(owner.token)
|
|
263
|
+
.digest("hex");
|
|
264
|
+
return `${leasePath}.stale-${owner.pid}-${digest}`;
|
|
265
|
+
}
|
|
266
|
+
/** Move exactly one observed generation; the nonempty tombstone is preserved. */
|
|
267
|
+
function quarantineDaemonWriterLeaseGeneration(lease, deps = {}) {
|
|
268
|
+
const fs = filesystem(deps);
|
|
269
|
+
const tombstone = writerLeaseTombstonePath(lease.path, lease.owner);
|
|
270
|
+
try {
|
|
271
|
+
fs.rename(lease.path, tombstone);
|
|
272
|
+
return { status: "quarantined", path: tombstone };
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
const code = errorCode(error);
|
|
276
|
+
if (code === "ENOENT" || code === "EEXIST" || code === "ENOTEMPTY") {
|
|
277
|
+
return { status: "contended", path: tombstone };
|
|
278
|
+
}
|
|
279
|
+
if (code === "EPERM") {
|
|
280
|
+
const occupied = inspectWriterLeasePath(tombstone, fs);
|
|
281
|
+
if (occupied.status === "owned" && sameOwner(occupied.owner, lease.owner)) {
|
|
282
|
+
return { status: "contended", path: tombstone };
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function writerBusy(path) {
|
|
289
|
+
return Object.assign(new Error(`another claudexor daemon owns ${path}`), {
|
|
290
|
+
code: "daemon_writer_busy",
|
|
291
|
+
status: 409,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
function staleReplacementFailed(path) {
|
|
295
|
+
return new Error(`could not replace stale daemon writer lease ${path}`);
|
|
296
|
+
}
|
|
20
297
|
/** Claim single-writer authority before any daemon journal is opened. */
|
|
21
|
-
export function acquireDaemonWriterLease(socketPath, deps = {}) {
|
|
298
|
+
export function acquireDaemonWriterLease(socketPath, deps = {}, acquisitionDeps = {}) {
|
|
299
|
+
// The second argument is a published compatibility boundary. Read only its
|
|
300
|
+
// original `identity` field: downstream objects may already use any newer
|
|
301
|
+
// dependency name for unrelated private/runtime state.
|
|
302
|
+
const identity = deps.identity;
|
|
303
|
+
const effectiveDeps = {
|
|
304
|
+
identity,
|
|
305
|
+
observation: acquisitionDeps.observation,
|
|
306
|
+
probeProcess: acquisitionDeps.probeProcess,
|
|
307
|
+
filesystem: acquisitionDeps.filesystem,
|
|
308
|
+
};
|
|
22
309
|
const path = writerLeasePath(socketPath);
|
|
23
310
|
const token = randomUUID();
|
|
24
|
-
const ownerPath =
|
|
25
|
-
const
|
|
311
|
+
const ownerPath = join(path, "owner.json");
|
|
312
|
+
const fs = filesystem(effectiveDeps);
|
|
313
|
+
const self = (identity ?? defaultProcessIdentityService).self();
|
|
26
314
|
const owner = {
|
|
27
315
|
pid: process.pid,
|
|
28
316
|
token,
|
|
29
317
|
...(self.status === "known" ? { identity: self } : {}),
|
|
30
318
|
};
|
|
319
|
+
let acquired = false;
|
|
31
320
|
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
32
321
|
try {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
flag: "wx",
|
|
37
|
-
});
|
|
322
|
+
fs.createLeaseDirectory(path);
|
|
323
|
+
fs.writeOwner(ownerPath, `${JSON.stringify(owner)}\n`);
|
|
324
|
+
acquired = true;
|
|
38
325
|
break;
|
|
39
326
|
}
|
|
40
327
|
catch (error) {
|
|
41
|
-
if (error
|
|
328
|
+
if (errorCode(error) !== "EEXIST")
|
|
42
329
|
throw error;
|
|
43
|
-
const existing =
|
|
44
|
-
if (
|
|
330
|
+
const existing = inspectWriterLeasePath(path, fs);
|
|
331
|
+
if (existing.status === "absent")
|
|
332
|
+
continue;
|
|
333
|
+
if (existing.status === "unknown")
|
|
45
334
|
throw writerBusy(path);
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
335
|
+
const capability = classifyDaemonLeaseOwner(existing.owner, effectiveDeps);
|
|
336
|
+
if (capability.status !== "proven_stale")
|
|
337
|
+
throw writerBusy(path);
|
|
338
|
+
// Classification may have spanned an orderly release. Re-read the main
|
|
339
|
+
// generation before mutation: once the observed owner is positively
|
|
340
|
+
// missing/recycled/Z it cannot itself release after this point, while a
|
|
341
|
+
// concurrent stale takeover leaves the occupied tombstone below as the
|
|
342
|
+
// generation fence.
|
|
343
|
+
const confirmed = inspectWriterLeasePath(path, fs);
|
|
344
|
+
if (confirmed.status === "absent")
|
|
345
|
+
continue;
|
|
346
|
+
if (confirmed.status === "unknown")
|
|
347
|
+
throw writerBusy(path);
|
|
348
|
+
if (!sameOwner(confirmed.owner, existing.owner)) {
|
|
349
|
+
if (attempt === 1)
|
|
350
|
+
throw writerBusy(path);
|
|
351
|
+
continue;
|
|
54
352
|
}
|
|
55
353
|
if (attempt === 1)
|
|
56
|
-
throw
|
|
354
|
+
throw staleReplacementFailed(path);
|
|
355
|
+
const quarantine = quarantineDaemonWriterLeaseGeneration(confirmed, effectiveDeps);
|
|
356
|
+
if (quarantine.status === "quarantined")
|
|
357
|
+
continue;
|
|
358
|
+
const current = inspectWriterLeasePath(path, fs);
|
|
359
|
+
if (current.status === "unknown")
|
|
360
|
+
throw writerBusy(path);
|
|
361
|
+
if (current.status === "owned" && sameOwner(current.owner, existing.owner)) {
|
|
362
|
+
throw staleReplacementFailed(path);
|
|
363
|
+
}
|
|
364
|
+
// Another contender changed or removed the main generation. The single
|
|
365
|
+
// remaining creation attempt re-observes it without another quarantine.
|
|
57
366
|
}
|
|
58
367
|
}
|
|
368
|
+
if (!acquired)
|
|
369
|
+
throw staleReplacementFailed(path);
|
|
59
370
|
let released = false;
|
|
60
371
|
return {
|
|
61
372
|
path,
|
|
@@ -64,48 +375,27 @@ export function acquireDaemonWriterLease(socketPath, deps = {}) {
|
|
|
64
375
|
if (released)
|
|
65
376
|
return;
|
|
66
377
|
released = true;
|
|
67
|
-
const current =
|
|
68
|
-
if (current
|
|
69
|
-
|
|
70
|
-
}
|
|
378
|
+
const current = inspectWriterLeasePath(path, fs);
|
|
379
|
+
if (current.status === "owned" && sameOwner(current.owner, owner))
|
|
380
|
+
fs.remove(path);
|
|
71
381
|
},
|
|
72
382
|
};
|
|
73
383
|
}
|
|
74
|
-
/**
|
|
384
|
+
/**
|
|
385
|
+
* Lossy patch-compatible projection. `null` does not prove the lease path is
|
|
386
|
+
* physically absent; authority-sensitive callers must use strict inspection.
|
|
387
|
+
*/
|
|
75
388
|
export function daemonLeaseOwner(socketPath) {
|
|
76
|
-
return
|
|
77
|
-
}
|
|
78
|
-
function writerBusy(path) {
|
|
79
|
-
return Object.assign(new Error(`another claudexor daemon owns ${path}`), {
|
|
80
|
-
code: "daemon_writer_busy",
|
|
81
|
-
status: 409,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
function readLeaseOwner(path) {
|
|
85
|
-
try {
|
|
86
|
-
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
87
|
-
if (!Number.isSafeInteger(value.pid) ||
|
|
88
|
-
Number(value.pid) <= 0 ||
|
|
89
|
-
typeof value.token !== "string") {
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
return {
|
|
93
|
-
pid: Number(value.pid),
|
|
94
|
-
token: value.token,
|
|
95
|
-
...(isKnownProcessIdentity(value.identity) ? { identity: value.identity } : {}),
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
389
|
+
return readLegacyLeaseOwner(join(writerLeasePath(socketPath), "owner.json"));
|
|
101
390
|
}
|
|
391
|
+
/** Raw signal-zero presence helper; daemon serviceability uses the classifier. */
|
|
102
392
|
export function processIsAlive(pid) {
|
|
103
393
|
try {
|
|
104
394
|
process.kill(pid, 0);
|
|
105
395
|
return true;
|
|
106
396
|
}
|
|
107
397
|
catch (error) {
|
|
108
|
-
return error
|
|
398
|
+
return errorCode(error) === "EPERM";
|
|
109
399
|
}
|
|
110
400
|
}
|
|
111
401
|
//# sourceMappingURL=writer-lease.js.map
|
package/dist/writer-lease.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer-lease.js","sourceRoot":"","sources":["../src/writer-lease.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"writer-lease.js","sourceRoot":"","sources":["../src/writer-lease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,MAAM,EACN,aAAa,GAEd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,+BAA+B,EAC/B,sBAAsB,EACtB,cAAc,GAKf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;iDAIiD;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AACnE,mFAAmF;AACnF,MAAM,0BAA0B,GAAG,QAAQ,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,iBAAiB,CAAC;QACtE,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,QAAQ,SAAS,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,UAAU,SAAS,CAAC;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,0BAA0B,SAAS,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AA+ED,MAAM,kBAAkB,GAAgC;IACtD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;IAC9C,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAChE,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CACzB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE;QACxB,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,IAAI;KACX,CAAC;IACJ,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;IAC1C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;CACjE,CAAC;AAEF,SAAS,UAAU,CAAC,IAAmC;IACrD,OAAO,EAAE,GAAG,kBAAkB,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACvD,CAAC;AAED;+EAC+E;AAC/E,MAAM,UAAU,4BAA4B,CAC1C,IAAmC;IAEnC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAQ,KAA+B,EAAE,IAAI,CAAC;AAChD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,SAAS,CAAC,IAAsB,EAAE,KAAuB;IAChE,OAAO,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;AAC9D,CAAC;AAED,SAAS,wBAAwB,CAAC,WAA+B,EAAE,GAAW;IAC5E,OAAO,CACL,WAAW,CAAC,UAAU,KAAK,GAAG;QAC9B,WAAW,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO;QACvC,WAAW,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG;QAChC,WAAW,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO;QACzC,WAAW,CAAC,QAAQ,CAAC,MAAM,KAAK,aAAa,CAC9C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAChG,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC7E,CAAC;AAED,kFAAkF;AAClF,SAAS,qBAAqB,CAAC,GAAW;IACxC,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvF,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,OAAO,qBAAqB,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CACpC,IAAY,EACZ,EAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACnD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACrE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAY,EACZ,EAA+B;IAE/B,IAAI,KAAY,CAAC;IACjB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACrE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACnD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3C,IAAI,SAAgB,CAAC;IACrB,IAAI,CAAC;QACH,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,6BAA6B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QACtD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAChE,CAAC;IAED,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,6BAA6B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,KAAK;QACV,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;QAClC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AAC7D,CAAC;AAID,SAAS,oBAAoB,CAAC,GAAW,EAAE,KAA4B;IACrE,IAAI,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACvC,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,mBAAmB,CAAC;QACjD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAuB,EACvB,IAAI,GAAkC,EAAE;IAExC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,6BAA6B,CAAC;IAChE,MAAM,iBAAiB,GACrB,IAAI,CAAC,WAAW;QAChB,CAAC,QAAQ,KAAK,6BAA6B,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7F,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3E,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC;IAC5E,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9D,IAAI,sBAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,MAAM,EAAE,CAAC;YAC5E,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,wBAAwB,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;QACzE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC/D,IAAI,wBAAwB,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;QACzE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,wBAAwB,EAAE,WAAW,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,mBAAmB,CAAC,EAAE,CAAC;QACpF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,wBAAwB,EAAE,WAAW,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QAC/D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,CAAC;AACxE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,wBAAwB,CACtC,UAAkB,EAClB,IAAI,GAAkC,EAAE;IAExC,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,GAAG,CAAC;QACvC,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1E,OAAO,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC,MAAM,KAAK,OAAO;gBACjC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE;gBACvD,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,SAAiB,EAAE,KAAuB;IACjF,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC;SAChC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACzB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;SACnB,MAAM,CAAC,KAAK,CAAC,CAAC;IACjB,OAAO,GAAG,SAAS,UAAU,KAAK,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;AACrD,CAAC;AAKD,iFAAiF;AACjF,SAAS,qCAAqC,CAC5C,KAAgD,EAChD,IAAI,GAAkC,EAAE;IAExC,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACnE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAClD,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACvD,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAClD,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,EAAE;QACvE,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,OAAO,IAAI,KAAK,CAAC,+CAA+C,IAAI,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,wBAAwB,CACtC,UAAkB,EAClB,IAAI,GAAyC,EAAE,EAC/C,eAAe,GAAoD,EAAE;IAErE,2EAA2E;IAC3E,0EAA0E;IAC1E,uDAAuD;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,MAAM,aAAa,GAAkC;QACnD,QAAQ;QACR,WAAW,EAAE,eAAe,CAAC,WAAW;QACxC,YAAY,EAAE,eAAe,CAAC,YAAY;QAC1C,UAAU,EAAE,eAAe,CAAC,UAAU;KACvC,CAAC;IACF,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,6BAA6B,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,MAAM,KAAK,GAAqB;QAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK;QACL,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC;IACF,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC9B,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvD,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YAC/C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAS;YAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAE1D,MAAM,UAAU,GAAG,wBAAwB,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAC3E,IAAI,UAAU,CAAC,MAAM,KAAK,cAAc;gBAAE,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAEjE,uEAAuE;YACvE,oEAAoE;YACpE,wEAAwE;YACxE,uEAAuE;YACvE,oBAAoB;YACpB,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAS;YAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,IAAI,OAAO,KAAK,CAAC;oBAAE,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC1C,SAAS;YACX,CAAC;YACD,IAAI,OAAO,KAAK,CAAC;gBAAE,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAEtD,MAAM,UAAU,GAAG,qCAAqC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACnF,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa;gBAAE,SAAS;YAElD,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3E,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YACD,uEAAuE;YACvE,wEAAwE;QAC1E,CAAC;IACH,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAElD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO;QACL,IAAI;QACJ,KAAK;QACL,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;gBAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrF,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,OAAO,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC;IACtC,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claudexor/daemon",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Managed local daemon: Unix-socket JSON-RPC, token auth, task queue. Runner injected (no second scheduler).",
|
|
6
6
|
"type": "module",
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"yaml": "^2.8.2",
|
|
20
|
-
"@claudexor/
|
|
21
|
-
"@claudexor/
|
|
22
|
-
"@claudexor/
|
|
23
|
-
"@claudexor/
|
|
20
|
+
"@claudexor/core": "3.4.0",
|
|
21
|
+
"@claudexor/schema": "3.4.0",
|
|
22
|
+
"@claudexor/util": "3.4.0",
|
|
23
|
+
"@claudexor/journal": "3.4.0"
|
|
24
24
|
},
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|