@detergent-software/conductor 3.0.0-dev.2 → 3.0.0-dev.21
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 +169 -0
- package/README.md +158 -45
- package/build/brief-cli.js +1 -1
- package/build/brief-cli.js.map +1 -1
- package/build/broker-cli.js +24 -25
- package/build/broker-cli.js.map +1 -1
- package/build/broker.js +66 -92
- package/build/broker.js.map +1 -1
- package/build/claude.js +50 -7
- package/build/claude.js.map +1 -1
- package/build/cli.js +119 -54
- package/build/cli.js.map +1 -1
- package/build/clones.js +92 -0
- package/build/clones.js.map +1 -0
- package/build/code-host-cli.js +101 -26
- package/build/code-host-cli.js.map +1 -1
- package/build/code-host.js +13 -8
- package/build/code-host.js.map +1 -1
- package/build/config.js +31 -12
- package/build/config.js.map +1 -1
- package/build/console.js +40 -24
- package/build/console.js.map +1 -1
- package/build/credentials.js +26 -24
- package/build/credentials.js.map +1 -1
- package/build/daemon.js +35 -21
- package/build/daemon.js.map +1 -1
- package/build/help.js +141 -30
- package/build/help.js.map +1 -1
- package/build/host/credential-manager.js +109 -0
- package/build/host/credential-manager.js.map +1 -0
- package/build/host/keychain.js +44 -0
- package/build/host/keychain.js.map +1 -0
- package/build/host/libsecret.js +40 -0
- package/build/host/libsecret.js.map +1 -0
- package/build/host/macos-terminal.js +63 -0
- package/build/host/macos-terminal.js.map +1 -0
- package/build/host/platform.js +4 -0
- package/build/host/platform.js.map +1 -0
- package/build/host/secrets.js +46 -0
- package/build/host/secrets.js.map +1 -0
- package/build/host/shell.js +26 -0
- package/build/host/shell.js.map +1 -0
- package/build/host/terminal.js +46 -0
- package/build/host/terminal.js.map +1 -0
- package/build/host/tmux.js +39 -0
- package/build/host/tmux.js.map +1 -0
- package/build/host/windows-terminal.js +46 -0
- package/build/host/windows-terminal.js.map +1 -0
- package/build/in-process.js +6 -5
- package/build/in-process.js.map +1 -1
- package/build/inbox.js +50 -5
- package/build/inbox.js.map +1 -1
- package/build/init.js +508 -0
- package/build/init.js.map +1 -0
- package/build/lib/providers/ado/pipelines.js +102 -17
- package/build/lib/providers/ado/pipelines.js.map +1 -1
- package/build/lib/providers/ado/trigger.js +5 -0
- package/build/lib/providers/ado/trigger.js.map +1 -1
- package/build/lib/providers/github/actions.js +85 -2
- package/build/lib/providers/github/actions.js.map +1 -1
- package/build/lib/providers/index.js +3 -2
- package/build/lib/providers/index.js.map +1 -1
- package/build/lib/providers/npm/stage.js +14 -4
- package/build/lib/providers/npm/stage.js.map +1 -1
- package/build/lib/providers/timing.js +10 -0
- package/build/lib/providers/timing.js.map +1 -0
- package/build/lib/providers/verdicts/runs.js +12 -2
- package/build/lib/providers/verdicts/runs.js.map +1 -1
- package/build/local-files.js +95 -0
- package/build/local-files.js.map +1 -0
- package/build/manager.js +171 -47
- package/build/manager.js.map +1 -1
- package/build/note.js +1 -1
- package/build/note.js.map +1 -1
- package/build/npm-reads.js +323 -0
- package/build/npm-reads.js.map +1 -0
- package/build/paths.js +44 -1
- package/build/paths.js.map +1 -1
- package/build/plugin.js +10 -0
- package/build/plugin.js.map +1 -1
- package/build/profile-fields.js +149 -0
- package/build/profile-fields.js.map +1 -0
- package/build/profile-layers.js +264 -0
- package/build/profile-layers.js.map +1 -0
- package/build/profile.js +60 -38
- package/build/profile.js.map +1 -1
- package/build/project-check-cli.js +18 -10
- package/build/project-check-cli.js.map +1 -1
- package/build/project-check.js +179 -97
- package/build/project-check.js.map +1 -1
- package/build/pushover.js +5 -5
- package/build/pushover.js.map +1 -1
- package/build/registry.js +195 -36
- package/build/registry.js.map +1 -1
- package/build/rule-actions.js +3 -1
- package/build/rule-actions.js.map +1 -1
- package/build/rules-service.js +101 -44
- package/build/rules-service.js.map +1 -1
- package/build/rules.js +11 -2
- package/build/rules.js.map +1 -1
- package/build/runs.js +88 -14
- package/build/runs.js.map +1 -1
- package/build/scheduler.js +11 -1
- package/build/scheduler.js.map +1 -1
- package/build/server.js +4 -25
- package/build/server.js.map +1 -1
- package/build/spend.js +4 -0
- package/build/spend.js.map +1 -1
- package/build/store.js +82 -25
- package/build/store.js.map +1 -1
- package/build/timeline.js +104 -0
- package/build/timeline.js.map +1 -0
- package/build/tracker-reads-cli.js +4 -5
- package/build/tracker-reads-cli.js.map +1 -1
- package/build/train-cli.js +6 -5
- package/build/train-cli.js.map +1 -1
- package/build/upgrade.js +16 -1
- package/build/upgrade.js.map +1 -1
- package/build/wait.js +6 -6
- package/build/wait.js.map +1 -1
- package/build/watchers/ado.js +3 -2
- package/build/watchers/ado.js.map +1 -1
- package/build/watchers/github.js +3 -2
- package/build/watchers/github.js.map +1 -1
- package/build/watchers/npm.js +6 -4
- package/build/watchers/npm.js.map +1 -1
- package/build/worktrees.js +199 -92
- package/build/worktrees.js.map +1 -1
- package/package.json +61 -61
- package/plugin/skills/conductor-console/SKILL.md +3 -3
- package/plugin/skills/work-item/SKILL.md +8 -6
- package/build/checkout-sync.js +0 -249
- package/build/checkout-sync.js.map +0 -1
- package/build/credential.js +0 -66
- package/build/credential.js.map +0 -1
- package/build/tab.js +0 -32
- package/build/tab.js.map +0 -1
package/build/broker-cli.js
CHANGED
|
@@ -7,7 +7,9 @@ import { itemFor } from "./code-host-cli.js";
|
|
|
7
7
|
import { ConductorError } from "./errors.js";
|
|
8
8
|
import { fileLock } from "./file-lock.js";
|
|
9
9
|
import { usageError } from "./help.js";
|
|
10
|
-
import {
|
|
10
|
+
import { samePath } from "./paths.js";
|
|
11
|
+
import { profileHere } from "./profile-layers.js";
|
|
12
|
+
import { profileProblem } from "./profile.js";
|
|
11
13
|
import { lockSchema, portAssignmentSchema } from "./store.js";
|
|
12
14
|
import { daemonWorker, gitToplevel } from "./wait.js";
|
|
13
15
|
// How often `conduct lock acquire --wait` asks again, as the work-issue helper's lock does.
|
|
@@ -40,7 +42,7 @@ export async function lockCommand(paths, action, name, options, io) {
|
|
|
40
42
|
if (owner === null) {
|
|
41
43
|
const worker = await daemonWorker(paths, await gitToplevel(io.cwd), undefined);
|
|
42
44
|
if (worker === 'no-daemon')
|
|
43
|
-
return lockHere(action, name, options, io, 'the conductor is not running');
|
|
45
|
+
return lockHere(paths, action, name, options, io, 'the conductor is not running');
|
|
44
46
|
if (worker === 'unreachable')
|
|
45
47
|
throw new ConductorError("the conductor didn't answer");
|
|
46
48
|
owner = worker?.item ?? null;
|
|
@@ -56,7 +58,7 @@ export async function lockCommand(paths, action, name, options, io) {
|
|
|
56
58
|
path: `/locks/${name}`,
|
|
57
59
|
});
|
|
58
60
|
if (!answer.ok)
|
|
59
|
-
return lockHere(action, name, options, io, answer.why);
|
|
61
|
+
return lockHere(paths, action, name, options, io, answer.why);
|
|
60
62
|
const body = lockAnswer.parse(answer.body);
|
|
61
63
|
if (action !== 'acquire' || body.acquired !== false || Date.now() >= until) {
|
|
62
64
|
io.out(JSON.stringify(body, null, 2));
|
|
@@ -69,13 +71,14 @@ export async function lockCommand(paths, action, name, options, io) {
|
|
|
69
71
|
export function lockLine(lock) {
|
|
70
72
|
return ` ${lock.name} ${lock.holder} since ${new Date(lock.since).toLocaleString()}${lock.verdict === 'stale' ? ' (stale: free to take over)' : ''}`;
|
|
71
73
|
}
|
|
72
|
-
// `conduct ports [<
|
|
74
|
+
// `conduct ports [<checkout>]`: every worktree's dev ports from the broker, or one worktree's. Only a
|
|
75
|
+
// launch assigns them, so this only reads.
|
|
73
76
|
export async function portsCommand(paths, path, options, io) {
|
|
77
|
+
const answer = await ask(paths, { method: 'GET', path: '/ports' });
|
|
78
|
+
if (!answer.ok)
|
|
79
|
+
return notBrokered(answer.why);
|
|
80
|
+
const assignments = z.object({ assignments: z.array(portAssignmentSchema) }).parse(answer.body).assignments;
|
|
74
81
|
if (path === undefined) {
|
|
75
|
-
const answer = await ask(paths, { method: 'GET', path: '/ports' });
|
|
76
|
-
if (!answer.ok)
|
|
77
|
-
return notBrokered(answer.why);
|
|
78
|
-
const assignments = z.object({ assignments: z.array(portAssignmentSchema) }).parse(answer.body).assignments;
|
|
79
82
|
if (options.json)
|
|
80
83
|
io.out(JSON.stringify(assignments, null, 2));
|
|
81
84
|
else if (assignments.length === 0)
|
|
@@ -84,23 +87,21 @@ export async function portsCommand(paths, path, options, io) {
|
|
|
84
87
|
assignments.forEach((a) => io.out(portsLine(a)));
|
|
85
88
|
return 0;
|
|
86
89
|
}
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
return notBrokered(answer.why);
|
|
94
|
-
const { assignment } = z.object({ assignment: portAssignmentSchema }).parse(answer.body);
|
|
90
|
+
const worktree = resolve(io.cwd, path);
|
|
91
|
+
const assignment = assignments.find((a) => samePath(a.worktree, worktree));
|
|
92
|
+
if (!assignment)
|
|
93
|
+
throw new ConductorError(`${worktree} has no ports from the conductor`, [
|
|
94
|
+
'a conducted worktree gets them when its worker launches; `conduct ports` lists them all',
|
|
95
|
+
]);
|
|
95
96
|
io.out(options.json ? JSON.stringify(assignment, null, 2) : portsLine(assignment));
|
|
96
97
|
return 0;
|
|
97
98
|
}
|
|
98
|
-
// One line per
|
|
99
|
+
// One line per worktree: project, each port, then where.
|
|
99
100
|
export function portsLine(a) {
|
|
100
101
|
const ports = Object.entries(a.ports)
|
|
101
102
|
.map(([name, port]) => `${name} ${port}`)
|
|
102
103
|
.join(' · ');
|
|
103
|
-
return `${a.project}
|
|
104
|
+
return `${a.project} ${ports} ${a.worktree}`;
|
|
104
105
|
}
|
|
105
106
|
// The body of a 200 answer, or why nothing was brokered.
|
|
106
107
|
async function ask(paths, request) {
|
|
@@ -126,16 +127,16 @@ async function ask(paths, request) {
|
|
|
126
127
|
// The lock with no conductor to broker it: the file lock every worktree of this checkout's repo
|
|
127
128
|
// shares (file-lock.ts). The owner is --owner, else the item key in the worktree's name or branch.
|
|
128
129
|
// Refuses only outside a project checkout.
|
|
129
|
-
async function lockHere(action, name, options, io, why) {
|
|
130
|
+
async function lockHere(paths, action, name, options, io, why) {
|
|
130
131
|
const checkout = await gitToplevel(io.cwd);
|
|
131
132
|
if (checkout === null)
|
|
132
133
|
return notBrokered(`${why}, and this isn't a checkout to take a file lock in`);
|
|
133
134
|
let profile;
|
|
134
135
|
try {
|
|
135
|
-
profile =
|
|
136
|
+
profile = profileHere(checkout, paths);
|
|
136
137
|
}
|
|
137
|
-
catch {
|
|
138
|
-
return notBrokered(`${why}, and ${checkout} has no readable ${
|
|
138
|
+
catch (error) {
|
|
139
|
+
return notBrokered(`${why}, and ${checkout} has no readable profile: ${profileProblem(error)}`);
|
|
139
140
|
}
|
|
140
141
|
const given = options.owner?.trim();
|
|
141
142
|
// Status needs no owner; the others take the checkout's item, and refuse without one.
|
|
@@ -158,9 +159,7 @@ async function lockHere(action, name, options, io, why) {
|
|
|
158
159
|
io.out(JSON.stringify(answer, null, 2));
|
|
159
160
|
return 0;
|
|
160
161
|
}
|
|
161
|
-
// Nothing brokered: none runs, an older one has no broker, or it refused
|
|
162
|
-
// registered project, no free slot). The caller keeps its own scheme, as ATK's
|
|
163
|
-
// scripts/dev-ports.mjs does on any exit but 0.
|
|
162
|
+
// Nothing brokered: none runs, an older one has no broker, or it refused.
|
|
164
163
|
function notBrokered(why) {
|
|
165
164
|
throw new ConductorError(`not brokered: ${why}`, ['nothing was brokered']);
|
|
166
165
|
}
|
package/build/broker-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broker-cli.js","sourceRoot":"","sources":["../src/broker-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAoB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"broker-cli.js","sourceRoot":"","sources":["../src/broker-cli.ts"],"names":[],"mappings":"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"}
|
package/build/broker.js
CHANGED
|
@@ -1,83 +1,65 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
-
import { connect } from 'node:net';
|
|
2
|
+
import { connect, createServer } from 'node:net';
|
|
3
3
|
import { ConductorError } from "./errors.js";
|
|
4
4
|
import { samePath } from "./paths.js";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
//
|
|
9
|
-
// server ports, so two projects' worktrees never serve on the same port, and named locks such as
|
|
10
|
-
// chrome, so verify skills of different projects take turns with the one browser.
|
|
5
|
+
import { ACTIVE_STATUSES } from "./store.js";
|
|
6
|
+
// The broker shares what every project on the machine uses (design note, sections 3 and 12; v2,
|
|
7
|
+
// section 2): dev server ports, so two worktrees of any projects never serve on the same port, and
|
|
8
|
+
// named locks such as chrome, so verify skills of different projects take turns with the one browser.
|
|
11
9
|
// A holder keeps a lock by acquiring it again; one it hasn't acquired for this long is free to take
|
|
12
10
|
// over. The same rule as the work-issue helper's file lock.
|
|
13
11
|
export const LOCK_STALE_MS = 30 * 60_000;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
// One assignment at a time: each waits on port probes, and two at once could pick the same slot.
|
|
12
|
+
export function broker({ exists = existsSync, free = portFree, now = () => new Date(), pool, store, }) {
|
|
13
|
+
// One assignment at a time: each waits on port probes, and two at once could pick the same port.
|
|
17
14
|
let assigning = Promise.resolve();
|
|
18
|
-
|
|
15
|
+
const serially = (task) => {
|
|
16
|
+
const next = assigning.then(task);
|
|
17
|
+
assigning = next.catch(() => { });
|
|
18
|
+
return next;
|
|
19
|
+
};
|
|
20
|
+
// Frees the ports of worktrees whose directory is gone, such as one /worktree-gc removed. Not a
|
|
21
|
+
// worker's in flight: a launch takes its ports before `git worktree add` makes the directory.
|
|
19
22
|
const sweep = () => {
|
|
20
23
|
for (const held of store.portAssignments())
|
|
21
|
-
if (!
|
|
24
|
+
if (!live(held))
|
|
22
25
|
freePorts(store, held.worktree, 'worktree gone');
|
|
23
26
|
return store.portAssignments();
|
|
24
27
|
};
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
28
|
+
const live = (held) => exists(held.worktree) ||
|
|
29
|
+
store.listWorkers(ACTIVE_STATUSES).some((w) => w.worktree !== null && samePath(w.worktree, held.worktree));
|
|
30
|
+
// A port per name: the pool's first ones that no assignment in `held` has and that are free now.
|
|
31
|
+
const pick = async (names, held) => {
|
|
32
|
+
const taken = new Set(held.flatMap((a) => Object.values(a.ports)));
|
|
33
|
+
const ports = {};
|
|
34
|
+
let port = pool.first;
|
|
35
|
+
for (const name of names) {
|
|
36
|
+
while (port <= pool.last && (taken.has(port) || !(await free(port))))
|
|
37
|
+
port++;
|
|
38
|
+
if (port > pool.last) {
|
|
39
|
+
throw new ConductorError(`no free port left in ${pool.first}-${pool.last} for "${name}"`, [
|
|
40
|
+
'`conduct ports` lists the assignments, and a removed worktree frees its ports; ports.first and ports.last in config.json set the pool',
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
ports[name] = port++;
|
|
44
|
+
}
|
|
45
|
+
return ports;
|
|
46
|
+
};
|
|
47
|
+
const assign = async (worktree, project, names) => {
|
|
48
|
+
const held = sweep().find((a) => samePath(a.worktree, worktree));
|
|
38
49
|
if (held) {
|
|
39
|
-
|
|
40
|
-
if (held.slot <= profile.ports.maxSlot && samePorts(held.ports, slotPorts(profile, held.slot)))
|
|
50
|
+
if (sameNames(held.ports, names))
|
|
41
51
|
return held;
|
|
42
52
|
freePorts(store, held.worktree, 'profile changed');
|
|
43
|
-
prefer ??= held.slot;
|
|
44
53
|
}
|
|
45
|
-
const
|
|
46
|
-
if (
|
|
47
|
-
|
|
48
|
-
const assignment = store.savePorts({
|
|
49
|
-
store.appendEvent({ data: {
|
|
54
|
+
const ports = await pick(names, store.portAssignments());
|
|
55
|
+
if (names.length === 0)
|
|
56
|
+
return { assignedAt: now().toISOString(), ports, project, worktree };
|
|
57
|
+
const assignment = store.savePorts({ ports, project, worktree });
|
|
58
|
+
store.appendEvent({ data: { ports, worktree }, kind: 'ports.assigned', project });
|
|
50
59
|
return assignment;
|
|
51
60
|
};
|
|
52
|
-
// The first slot of 1..maxSlot whose ports nobody has and nothing listens on, `prefer` first.
|
|
53
|
-
// `held`: the worktrees' assignments.
|
|
54
|
-
const freeSlot = async (profile, prefer, held) => {
|
|
55
|
-
// Every main checkout's ports, and every worktree's.
|
|
56
|
-
const taken = new Set([
|
|
57
|
-
...store.listProjects().flatMap((p) => (p.profile ? Object.values(basePorts(p.profile)) : [])),
|
|
58
|
-
...held.flatMap((a) => Object.values(a.ports)),
|
|
59
|
-
]);
|
|
60
|
-
const slots = Array.from({ length: profile.ports.maxSlot }, (_, i) => i + 1);
|
|
61
|
-
const order = prefer !== undefined && slots.includes(prefer) ? [prefer, ...slots.filter((s) => s !== prefer)] : slots;
|
|
62
|
-
for (const slot of order) {
|
|
63
|
-
const ports = slotPorts(profile, slot);
|
|
64
|
-
const values = Object.values(ports);
|
|
65
|
-
if (values.some((port) => port > MAX_PORT || taken.has(port)))
|
|
66
|
-
continue;
|
|
67
|
-
// The preferred slot is the one the checkout already serves on (its own scheme gave it), so
|
|
68
|
-
// its own dev servers may be what listens there.
|
|
69
|
-
if (slot !== prefer && (await Promise.all(values.map(listening))).some(Boolean))
|
|
70
|
-
continue;
|
|
71
|
-
return { ports, slot };
|
|
72
|
-
}
|
|
73
|
-
return null;
|
|
74
|
-
};
|
|
75
61
|
return {
|
|
76
|
-
assignPorts: (
|
|
77
|
-
const next = assigning.then(() => assign(path, prefer));
|
|
78
|
-
assigning = next.catch(() => { });
|
|
79
|
-
return next;
|
|
80
|
-
},
|
|
62
|
+
assignPorts: (worktree, project, names) => serially(() => assign(worktree, project, names)),
|
|
81
63
|
lock: (name, action, owner) => {
|
|
82
64
|
const current = store.getLock(name);
|
|
83
65
|
const verdict = lockVerdict(current, owner, now());
|
|
@@ -113,19 +95,9 @@ export function broker({ exists = existsSync, listening = portListening, now = (
|
|
|
113
95
|
},
|
|
114
96
|
locks: () => store.listLocks(),
|
|
115
97
|
portAssignments: sweep,
|
|
116
|
-
// After the assignments in flight, so it sees the
|
|
98
|
+
// After the assignments in flight, so it sees the ports they took. It writes nothing: a gone
|
|
117
99
|
// worktree's ports count as free, as the next sweep makes them.
|
|
118
|
-
previewPorts: (
|
|
119
|
-
const next = assigning.then(async () => {
|
|
120
|
-
const held = store.portAssignments().filter((a) => exists(a.worktree));
|
|
121
|
-
const free = await freeSlot(profile, undefined, held);
|
|
122
|
-
if (free === null)
|
|
123
|
-
throw noSlot(profile, `a new ${profile.name} worktree`);
|
|
124
|
-
return free;
|
|
125
|
-
});
|
|
126
|
-
assigning = next.catch(() => { });
|
|
127
|
-
return next;
|
|
128
|
-
},
|
|
100
|
+
previewPorts: (names) => serially(() => pick(names, store.portAssignments().filter(live))),
|
|
129
101
|
};
|
|
130
102
|
}
|
|
131
103
|
// Frees the ports of a worktree (a retired worker's, or one whose directory is gone).
|
|
@@ -135,7 +107,7 @@ export function freePorts(store, worktree, reason) {
|
|
|
135
107
|
continue;
|
|
136
108
|
store.deletePorts(held.worktree);
|
|
137
109
|
store.appendEvent({
|
|
138
|
-
data: { ports: held.ports, reason,
|
|
110
|
+
data: { ports: held.ports, reason, worktree: held.worktree },
|
|
139
111
|
kind: 'ports.freed',
|
|
140
112
|
project: held.project,
|
|
141
113
|
});
|
|
@@ -149,6 +121,24 @@ export function lockVerdict(lock, owner, now) {
|
|
|
149
121
|
const since = Date.parse(lock.since);
|
|
150
122
|
return Number.isNaN(since) || now.getTime() - since > LOCK_STALE_MS ? 'stale' : 'held';
|
|
151
123
|
}
|
|
124
|
+
// True when the port can be bound on IPv4 loopback: not in use, and not in a range the OS reserves
|
|
125
|
+
// (Windows excludes ranges for Hyper-V and WSL, where a dev server would fail with EACCES).
|
|
126
|
+
export async function portBinds(port) {
|
|
127
|
+
return new Promise((done) => {
|
|
128
|
+
const server = createServer();
|
|
129
|
+
server.once('error', () => done(false));
|
|
130
|
+
server.listen({ exclusive: true, host: '127.0.0.1', port }, () => server.close(() => done(true)));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// The environment that hands a worktree its ports: CONDUCTOR_PORT_<NAME> for each, such as
|
|
134
|
+
// CONDUCTOR_PORT_WEB=41000.
|
|
135
|
+
export function portEnv(ports) {
|
|
136
|
+
return Object.fromEntries(Object.entries(ports).map(([name, port]) => [`CONDUCTOR_PORT_${name.toUpperCase()}`, String(port)]));
|
|
137
|
+
}
|
|
138
|
+
// Nothing listens on the port, on either loopback, and it binds.
|
|
139
|
+
export async function portFree(port) {
|
|
140
|
+
return !(await portListening(port)) && (await portBinds(port));
|
|
141
|
+
}
|
|
152
142
|
// True when something accepts connections on the port, on IPv4 or IPv6 loopback.
|
|
153
143
|
export async function portListening(port) {
|
|
154
144
|
const probe = (host) => new Promise((done) => {
|
|
@@ -172,23 +162,7 @@ export function releaseLocks(store, holder, reason) {
|
|
|
172
162
|
store.appendEvent({ data: { holder, reason }, kind: 'lock.released', subject: lock.name });
|
|
173
163
|
}
|
|
174
164
|
}
|
|
175
|
-
function
|
|
176
|
-
return
|
|
177
|
-
'`conduct ports` lists the assignments; a removed worktree frees its slot',
|
|
178
|
-
]);
|
|
179
|
-
}
|
|
180
|
-
function profileOf(project) {
|
|
181
|
-
if (project.profile)
|
|
182
|
-
return project.profile;
|
|
183
|
-
throw new ConductorError(`project ${project.name}'s stored profile is invalid: ${project.problem ?? 'unknown'}`, [
|
|
184
|
-
`the daemon reads ${project.profilePath} again when it starts or the file is saved`,
|
|
185
|
-
]);
|
|
186
|
-
}
|
|
187
|
-
function samePorts(a, b) {
|
|
188
|
-
return Object.keys(a).length === Object.keys(b).length && Object.entries(b).every(([name, port]) => a[name] === port);
|
|
189
|
-
}
|
|
190
|
-
// A worktree's ports at slot N: each of the profile's base ports + N.
|
|
191
|
-
function slotPorts(profile, slot) {
|
|
192
|
-
return Object.fromEntries(Object.entries(basePorts(profile)).map(([name, port]) => [name, port + slot]));
|
|
165
|
+
function sameNames(ports, names) {
|
|
166
|
+
return Object.keys(ports).length === names.length && names.every((name) => Object.hasOwn(ports, name));
|
|
193
167
|
}
|
|
194
168
|
//# sourceMappingURL=broker.js.map
|
package/build/broker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../src/broker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../src/broker.ts"],"names":[],"mappings":"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"}
|
package/build/claude.js
CHANGED
|
@@ -25,20 +25,31 @@ export class SessionGone extends ConductorError {
|
|
|
25
25
|
this.handle = handle;
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
+
// `claude --bg` refused the directory because Claude Code doesn't trust its repository (ATK-571).
|
|
29
|
+
// Its message names the directory, which for a worker is a worktree its failed launch removes.
|
|
30
|
+
export class WorkspaceUntrusted extends ConductorError {
|
|
31
|
+
constructor(output) {
|
|
32
|
+
super('Claude Code does not trust the workspace', [output]);
|
|
33
|
+
this.name = 'WorkspaceUntrusted';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
28
36
|
export function claudeCli() {
|
|
29
37
|
// Resolves to stdout, and stderr after it: the CLI prints its notes (such as a copy started) there.
|
|
30
38
|
const claude = async (args, cwd, timeoutMs = 120_000) => {
|
|
31
39
|
const result = await run('claude', args, { cwd, timeoutMs });
|
|
32
|
-
if (result.code !== 0)
|
|
33
|
-
|
|
40
|
+
if (result.code !== 0) {
|
|
41
|
+
const output = outputOf(result, 500);
|
|
42
|
+
if (untrusted(result.stdout + result.stderr))
|
|
43
|
+
throw new WorkspaceUntrusted(output);
|
|
44
|
+
throw new ConductorError(`claude ${args[0]} failed`, [output]);
|
|
45
|
+
}
|
|
34
46
|
return { all: result.stdout + result.stderr, stdout: result.stdout };
|
|
35
47
|
};
|
|
36
48
|
return {
|
|
37
49
|
// Only stdout is JSON; a notice on stderr must not break the listing.
|
|
38
50
|
agents: async () => parseAgents((await claude(['agents', '--json', '--all'], undefined, 60_000)).stdout),
|
|
39
51
|
launch: async (request) => {
|
|
40
|
-
|
|
41
|
-
const output = (await claude(launchArgs(request), request.cwd, 10 * 60_000)).all;
|
|
52
|
+
const output = (await claude(launchArgs(request), request.cwd, 2 * 60_000)).all;
|
|
42
53
|
const handle = parseHandle(output);
|
|
43
54
|
if (!handle)
|
|
44
55
|
throw new ConductorError('claude --bg printed no session id', [output.trim().slice(-500)]);
|
|
@@ -50,13 +61,37 @@ export function claudeCli() {
|
|
|
50
61
|
},
|
|
51
62
|
rm: (handle) => onSession('rm', handle),
|
|
52
63
|
stop: (handle) => onSession('stop', handle),
|
|
64
|
+
trusts: async (cwd, name) => {
|
|
65
|
+
let output;
|
|
66
|
+
try {
|
|
67
|
+
output = (await claude(['--bg', '-n', name], cwd)).all;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error instanceof WorkspaceUntrusted)
|
|
71
|
+
return { trusted: false };
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
const session = parseHandle(output);
|
|
75
|
+
if (!session)
|
|
76
|
+
throw new ConductorError('claude --bg printed no session id', [output.trim().slice(-500)]);
|
|
77
|
+
try {
|
|
78
|
+
await onSession('rm', session);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (!(error instanceof SessionGone)) {
|
|
82
|
+
const removeError = error instanceof ConductorError ? [error.message, ...error.details].join(': ') : String(error);
|
|
83
|
+
return { removeError, session, trusted: true };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { removeError: null, session, trusted: true };
|
|
87
|
+
},
|
|
53
88
|
};
|
|
54
89
|
}
|
|
55
90
|
// The session's process exists. `state: "done"` only means the turn ended.
|
|
56
91
|
export function isLive(session) {
|
|
57
92
|
return session.pid !== undefined || isStarting(session);
|
|
58
93
|
}
|
|
59
|
-
// Listed as working before it has a pid: `claude --bg` is still
|
|
94
|
+
// Listed as working before it has a pid: `claude --bg` is still starting it.
|
|
60
95
|
export function isStarting(session) {
|
|
61
96
|
return session.pid === undefined && session.state === 'working';
|
|
62
97
|
}
|
|
@@ -68,8 +103,6 @@ export function isStarting(session) {
|
|
|
68
103
|
export function launchArgs(request) {
|
|
69
104
|
return [
|
|
70
105
|
'--bg',
|
|
71
|
-
'--worktree',
|
|
72
|
-
request.worktree,
|
|
73
106
|
'-n',
|
|
74
107
|
request.name,
|
|
75
108
|
'--plugin-dir',
|
|
@@ -111,6 +144,11 @@ export function permissionPrompt(session) {
|
|
|
111
144
|
? (session.waitingFor ?? null)
|
|
112
145
|
: null;
|
|
113
146
|
}
|
|
147
|
+
// What to do about an untrusted project root. Trust is kept per repository, so a root trusted once
|
|
148
|
+
// covers every worktree made from it.
|
|
149
|
+
export function trustStep(root) {
|
|
150
|
+
return `run \`claude\` in ${root} once and accept the trust prompt (that trusts every worktree of it)`;
|
|
151
|
+
}
|
|
114
152
|
// The turn ended and nothing holds the session: no tool running, no prompt open, no Monitor armed
|
|
115
153
|
// (an armed Monitor reads busy). Only `status` says so. `state` is the agent view's label for how
|
|
116
154
|
// the work is going, taken from the last reply: a probe that answered an event with "I'm still
|
|
@@ -118,6 +156,11 @@ export function permissionPrompt(session) {
|
|
|
118
156
|
export function turnEnded(session) {
|
|
119
157
|
return session.pid !== undefined && session.status === 'idle';
|
|
120
158
|
}
|
|
159
|
+
// `claude --bg`'s refusal: `Workspace not trusted. Run \`claude\` in <cwd> once and accept the trust
|
|
160
|
+
// prompt, then retry.`
|
|
161
|
+
export function untrusted(output) {
|
|
162
|
+
return output.includes('Workspace not trusted');
|
|
163
|
+
}
|
|
121
164
|
async function onSession(command, handle) {
|
|
122
165
|
const result = await run('claude', [command, handle]);
|
|
123
166
|
if (result.code === 0)
|
package/build/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEzC,qGAAqG;AACrG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,WAAW,CAAC;IAC9C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,8FAA8F;IAC9F,uFAAuF;IACvF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,yFAAyF;IACzF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
|