@detergent-software/conductor 0.0.0-stage → 1.0.0-dev.1
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/CHANGELOG.md +20 -0
- package/README.md +129 -2
- package/build/claude.js +102 -0
- package/build/claude.js.map +1 -0
- package/build/cli.js +383 -0
- package/build/cli.js.map +1 -0
- package/build/client.js +64 -0
- package/build/client.js.map +1 -0
- package/build/conditions.js +198 -0
- package/build/conditions.js.map +1 -0
- package/build/config.js +74 -0
- package/build/config.js.map +1 -0
- package/build/daemon.js +127 -0
- package/build/daemon.js.map +1 -0
- package/build/errors.js +17 -0
- package/build/errors.js.map +1 -0
- package/build/jsonc.js +24 -0
- package/build/jsonc.js.map +1 -0
- package/build/lock.js +64 -0
- package/build/lock.js.map +1 -0
- package/build/log.js +43 -0
- package/build/log.js.map +1 -0
- package/build/manager.js +614 -0
- package/build/manager.js.map +1 -0
- package/build/paths.js +16 -0
- package/build/paths.js.map +1 -0
- package/build/profile.js +74 -0
- package/build/profile.js.map +1 -0
- package/build/registry.js +33 -0
- package/build/registry.js.map +1 -0
- package/build/resolve.js +28 -0
- package/build/resolve.js.map +1 -0
- package/build/run.js +52 -0
- package/build/run.js.map +1 -0
- package/build/server.js +227 -0
- package/build/server.js.map +1 -0
- package/build/spend.js +134 -0
- package/build/spend.js.map +1 -0
- package/build/startup.js +48 -0
- package/build/startup.js.map +1 -0
- package/build/store.js +528 -0
- package/build/store.js.map +1 -0
- package/build/tab.js +26 -0
- package/build/tab.js.map +1 -0
- package/build/token.js +58 -0
- package/build/token.js.map +1 -0
- package/build/wait.js +149 -0
- package/build/wait.js.map +1 -0
- package/build/watchers/ado.js +167 -0
- package/build/watchers/ado.js.map +1 -0
- package/build/watchers/github.js +82 -0
- package/build/watchers/github.js.map +1 -0
- package/build/watchers/health.js +42 -0
- package/build/watchers/health.js.map +1 -0
- package/build/watchers/index.js +226 -0
- package/build/watchers/index.js.map +1 -0
- package/build/watchers/linear-key.js +56 -0
- package/build/watchers/linear-key.js.map +1 -0
- package/build/watchers/linear.js +218 -0
- package/build/watchers/linear.js.map +1 -0
- package/build/watchers/npm.js +35 -0
- package/build/watchers/npm.js.map +1 -0
- package/build/watchers/source.js +94 -0
- package/build/watchers/source.js.map +1 -0
- package/build/worktrees.js +143 -0
- package/build/worktrees.js.map +1 -0
- package/package.json +56 -5
package/build/lock.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { readFileSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { hasCode, isMissing } from "./errors.js";
|
|
3
|
+
// The single-instance lock: a pid file created exclusively. An existing file blocks the start
|
|
4
|
+
// while its holder runs; a stale one (holder gone, for example after a crash or a reboot) is
|
|
5
|
+
// replaced. The exclusive create settles two starts that race for a stale file.
|
|
6
|
+
export async function acquirePidLock(file, isRunning, pid = process.pid) {
|
|
7
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
8
|
+
try {
|
|
9
|
+
writeFileSync(file, `${pid}\n`, { flag: 'wx' });
|
|
10
|
+
return { acquired: true, release: () => releasePidLock(file, pid) };
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (!hasCode(error, 'EEXIST'))
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
const holder = readHolder(file);
|
|
17
|
+
if (holder && holder.pid > 0 && (await isRunning(holder)))
|
|
18
|
+
return { acquired: false, pid: holder.pid };
|
|
19
|
+
removeIfUnchanged(file, holder?.pid ?? null);
|
|
20
|
+
}
|
|
21
|
+
const holder = readHolder(file);
|
|
22
|
+
return { acquired: false, pid: holder?.pid ?? 0 };
|
|
23
|
+
}
|
|
24
|
+
export function processAlive(pid) {
|
|
25
|
+
try {
|
|
26
|
+
process.kill(pid, 0);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
// EPERM: it exists but belongs to someone else.
|
|
31
|
+
return hasCode(error, 'EPERM');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function readPid(file) {
|
|
35
|
+
return readHolder(file)?.pid ?? null;
|
|
36
|
+
}
|
|
37
|
+
function readHolder(file) {
|
|
38
|
+
try {
|
|
39
|
+
const pid = Number.parseInt(readFileSync(file, 'utf8').trim(), 10);
|
|
40
|
+
const ageMs = Date.now() - statSync(file).mtimeMs;
|
|
41
|
+
return Number.isInteger(pid) && pid > 0 ? { ageMs, pid } : { ageMs, pid: 0 };
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (isMissing(error))
|
|
45
|
+
return null;
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function releasePidLock(file, pid) {
|
|
50
|
+
if (readPid(file) === pid)
|
|
51
|
+
removeIfUnchanged(file, pid);
|
|
52
|
+
}
|
|
53
|
+
function removeIfUnchanged(file, pid) {
|
|
54
|
+
if ((readHolder(file)?.pid ?? null) !== pid)
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
unlinkSync(file);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (!isMissing(error))
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"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"}
|
package/build/log.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { appendFileSync, renameSync, rmSync, statSync } from 'node:fs';
|
|
2
|
+
import { isMissing } from "./errors.js";
|
|
3
|
+
// A size-rotated log: conductor.log, then conductor.log.1 (newest) … conductor.log.<keep>. One line
|
|
4
|
+
// per entry: time, level, message, then the data as JSON.
|
|
5
|
+
export function rotatingLog(file, { keep, maxBytes }) {
|
|
6
|
+
let size = currentSize(file);
|
|
7
|
+
return {
|
|
8
|
+
log(level, message, data) {
|
|
9
|
+
const line = `${new Date().toISOString()} ${level} ${message}${data ? ` ${JSON.stringify(data)}` : ''}\n`;
|
|
10
|
+
const bytes = Buffer.byteLength(line);
|
|
11
|
+
if (size > 0 && size + bytes > maxBytes) {
|
|
12
|
+
rotate(file, keep);
|
|
13
|
+
size = 0;
|
|
14
|
+
}
|
|
15
|
+
appendFileSync(file, line);
|
|
16
|
+
size += bytes;
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function currentSize(file) {
|
|
21
|
+
try {
|
|
22
|
+
return statSync(file).size;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (isMissing(error))
|
|
26
|
+
return 0;
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function rotate(file, keep) {
|
|
31
|
+
rmSync(`${file}.${keep}`, { force: true });
|
|
32
|
+
for (let n = keep - 1; n >= 1; n--) {
|
|
33
|
+
try {
|
|
34
|
+
renameSync(`${file}.${n}`, `${file}.${n + 1}`);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (!isMissing(error))
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
renameSync(file, `${file}.1`);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=log.js.map
|
package/build/log.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQxC,oGAAoG;AACpG,0DAA0D;AAC1D,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAsC;IAC9F,IAAI,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO;QACL,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI;YACtB,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAC1G,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,GAAG,QAAQ,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACnB,IAAI,GAAG,CAAC,CAAC;YACX,CAAC;YACD,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,IAAY;IACxC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;QACrC,CAAC;IACH,CAAC;IACD,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;AAChC,CAAC"}
|