@detergent-software/conductor 3.0.0-dev.9 → 3.1.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 +486 -0
- package/README.md +272 -126
- package/build/brief-cli.js +5 -12
- package/build/brief-cli.js.map +1 -1
- package/build/brief.js +4 -3
- package/build/brief.js.map +1 -1
- package/build/broker-cli.js +41 -14
- package/build/broker-cli.js.map +1 -1
- package/build/broker.js +1 -1
- package/build/broker.js.map +1 -1
- package/build/cli.js +226 -64
- 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 +172 -40
- package/build/code-host-cli.js.map +1 -1
- package/build/code-host-service.js +35 -2
- package/build/code-host-service.js.map +1 -1
- package/build/code-host.js +138 -16
- package/build/code-host.js.map +1 -1
- package/build/conditions.js +33 -16
- package/build/conditions.js.map +1 -1
- package/build/config.js +58 -28
- package/build/config.js.map +1 -1
- package/build/console.js +17 -27
- package/build/console.js.map +1 -1
- package/build/credentials.js +86 -54
- package/build/credentials.js.map +1 -1
- package/build/daemon.js +54 -65
- package/build/daemon.js.map +1 -1
- package/build/file-lock.js +155 -40
- package/build/file-lock.js.map +1 -1
- package/build/follow-ups.js +2 -2
- package/build/follow-ups.js.map +1 -1
- package/build/help.js +242 -83
- package/build/help.js.map +1 -1
- package/build/history.js +10 -4
- package/build/history.js.map +1 -1
- package/build/host/attach-clients.js +56 -0
- package/build/host/attach-clients.js.map +1 -0
- 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/launchd.js +118 -0
- package/build/host/launchd.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/startup.js +26 -0
- package/build/host/startup.js.map +1 -0
- package/build/host/systemd.js +91 -0
- package/build/host/systemd.js.map +1 -0
- package/build/host/task-scheduler.js +78 -0
- package/build/host/task-scheduler.js.map +1 -0
- package/build/host/terminal.js +47 -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 +5 -4
- package/build/in-process.js.map +1 -1
- package/build/inbox.js +47 -35
- package/build/inbox.js.map +1 -1
- package/build/init.js +509 -0
- package/build/init.js.map +1 -0
- package/build/landing.js +107 -10
- package/build/landing.js.map +1 -1
- package/build/lib/providers/ado/code-host.js +5 -1
- package/build/lib/providers/ado/code-host.js.map +1 -1
- package/build/lib/providers/ado/pipelines.js +138 -26
- 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/ado/writes.js +17 -2
- package/build/lib/providers/ado/writes.js.map +1 -1
- package/build/lib/providers/github/actions.js +90 -3
- package/build/lib/providers/github/actions.js.map +1 -1
- package/build/lib/providers/github/code-host.js +2 -0
- package/build/lib/providers/github/code-host.js.map +1 -1
- package/build/lib/providers/github/writes.js +25 -2
- package/build/lib/providers/github/writes.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 -1
- 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/pr.js +47 -6
- package/build/lib/providers/verdicts/pr.js.map +1 -1
- package/build/lib/providers/verdicts/runs.js +12 -2
- package/build/lib/providers/verdicts/runs.js.map +1 -1
- package/build/logins.js +13 -6
- package/build/logins.js.map +1 -1
- package/build/manager.js +200 -55
- package/build/manager.js.map +1 -1
- package/build/note.js +5 -15
- package/build/note.js.map +1 -1
- package/build/notes.js +130 -23
- package/build/notes.js.map +1 -1
- package/build/notify.js +104 -42
- package/build/notify.js.map +1 -1
- package/build/npm-reads.js +151 -22
- package/build/npm-reads.js.map +1 -1
- package/build/ownership.js +2 -2
- package/build/paths.js +44 -1
- package/build/paths.js.map +1 -1
- package/build/plugin.js +4 -2
- package/build/plugin.js.map +1 -1
- package/build/profile-fields.js +153 -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 +69 -49
- package/build/profile.js.map +1 -1
- package/build/project-check-cli.js +17 -19
- package/build/project-check-cli.js.map +1 -1
- package/build/project-check.js +166 -104
- package/build/project-check.js.map +1 -1
- package/build/protocol.js +5 -21
- package/build/protocol.js.map +1 -1
- package/build/pushover.js +5 -5
- package/build/pushover.js.map +1 -1
- package/build/queue.js +4 -4
- package/build/queue.js.map +1 -1
- package/build/registry.js +195 -36
- package/build/registry.js.map +1 -1
- package/build/release-kinds.js +34 -0
- package/build/release-kinds.js.map +1 -0
- package/build/rule-actions.js +8 -6
- package/build/rule-actions.js.map +1 -1
- package/build/rules-service.js +83 -44
- package/build/rules-service.js.map +1 -1
- package/build/rules.js +23 -23
- package/build/rules.js.map +1 -1
- package/build/run.js +20 -7
- package/build/run.js.map +1 -1
- package/build/runs.js +218 -68
- package/build/runs.js.map +1 -1
- package/build/scheduler.js +78 -12
- package/build/scheduler.js.map +1 -1
- package/build/search.js +2 -1
- package/build/search.js.map +1 -1
- package/build/server.js +51 -14
- package/build/server.js.map +1 -1
- package/build/spend.js +1 -1
- package/build/spend.js.map +1 -1
- package/build/store.js +79 -20
- package/build/store.js.map +1 -1
- package/build/supervise.js +1 -1
- package/build/supervise.js.map +1 -1
- package/build/timeline.js +104 -0
- package/build/timeline.js.map +1 -0
- package/build/tracker-reads-cli.js +4 -3
- package/build/tracker-reads-cli.js.map +1 -1
- package/build/trackers.js +56 -10
- package/build/trackers.js.map +1 -1
- package/build/train-cli.js +6 -5
- package/build/train-cli.js.map +1 -1
- package/build/train.js +2 -2
- package/build/train.js.map +1 -1
- package/build/upgrade.js +8 -9
- package/build/upgrade.js.map +1 -1
- package/build/wait.js +10 -10
- package/build/wait.js.map +1 -1
- package/build/watchers/ado.js +42 -19
- package/build/watchers/ado.js.map +1 -1
- package/build/watchers/github.js +18 -4
- package/build/watchers/github.js.map +1 -1
- package/build/watchers/index.js +2 -2
- package/build/watchers/index.js.map +1 -1
- package/build/watchers/linear-queue.js +47 -14
- package/build/watchers/linear-queue.js.map +1 -1
- package/build/watchers/linear-writes.js +26 -12
- package/build/watchers/linear-writes.js.map +1 -1
- package/build/watchers/linear.js +2 -2
- package/build/watchers/linear.js.map +1 -1
- package/build/watchers/source.js +5 -1
- package/build/watchers/source.js.map +1 -1
- package/build/webhook.js +80 -0
- package/build/webhook.js.map +1 -0
- package/build/why.js +1 -1
- package/build/why.js.map +1 -1
- package/build/worktrees.js +56 -93
- package/build/worktrees.js.map +1 -1
- package/package.json +61 -61
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/hooks/model.ts +55 -6
- package/plugin/hooks/register.tsx +43 -4
- package/plugin/skills/conductor-console/SKILL.md +26 -27
- package/plugin/skills/work-item/SKILL.md +58 -54
- package/plugin/skills/work-item/trackers/ado-boards.md +2 -2
- package/plugin/skills/work-item/trackers/github-issues.md +1 -1
- package/plugin/skills/work-item/trackers/linear.md +2 -2
- package/plugin/types/index.d.ts +1 -1
- package/protocol/PROTOCOL.md +3 -9
- 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/startup.js +0 -92
- package/build/startup.js.map +0 -1
- package/build/tab.js +0 -32
- package/build/tab.js.map +0 -1
package/build/config.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { isMissing } from "./errors.js";
|
|
4
|
+
import { TERMINALS } from "./host/terminal.js";
|
|
4
5
|
import { parseJsonc } from "./jsonc.js";
|
|
5
|
-
import { renamedHint, renamedTo } from "./protocol.js";
|
|
6
6
|
import { INBOX_KINDS } from "./store.js";
|
|
7
7
|
// Where the notifier sends (design note, section 10): Remote Control through the conductor mod in
|
|
8
|
-
// the console,
|
|
9
|
-
|
|
8
|
+
// the console, Pushover from the daemon, and a webhook (design note v2, section 8) the daemon POSTs
|
|
9
|
+
// each push to as JSON. Teams is ATK-307.
|
|
10
|
+
export const CHANNELS = ['remote-control', 'pushover', 'webhook'];
|
|
11
|
+
export const SCHEDULER_MODES = ['on', 'off'];
|
|
10
12
|
export const DAYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
|
|
11
13
|
// A local time of day, such as 07:00.
|
|
12
14
|
const clockTime = z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, 'a local time as HH:MM, such as 07:00');
|
|
@@ -24,15 +26,7 @@ export const notifyRuleSchema = z.strictObject({
|
|
|
24
26
|
.string()
|
|
25
27
|
.regex(/^([01]\d|2[0-3]):[0-5]\d-([01]\d|2[0-3]):[0-5]\d$/, 'local times as HH:MM-HH:MM, such as 08:00-18:00')
|
|
26
28
|
.optional(),
|
|
27
|
-
kinds: z
|
|
28
|
-
.array(z.enum(INBOX_KINDS, {
|
|
29
|
-
error: (issue) => {
|
|
30
|
-
const word = typeof issue.input === 'string' ? issue.input : undefined;
|
|
31
|
-
return renamedTo(word) === undefined ? undefined : `"${word ?? ''}" is not an inbox kind${renamedHint(word)}`;
|
|
32
|
-
},
|
|
33
|
-
}))
|
|
34
|
-
.min(1)
|
|
35
|
-
.optional(),
|
|
29
|
+
kinds: z.array(z.enum(INBOX_KINDS)).min(1).optional(),
|
|
36
30
|
projects: z.array(z.string().min(1)).min(1).optional(),
|
|
37
31
|
remind: remindSchema.optional(),
|
|
38
32
|
to: z.array(z.enum(CHANNELS)),
|
|
@@ -50,8 +44,8 @@ export const BUILT_IN_PROFILES = {
|
|
|
50
44
|
],
|
|
51
45
|
};
|
|
52
46
|
// The credentials one project's provider calls use (credentials.ts), least privilege first: `token`
|
|
53
|
-
// (Linear's `credential`) names the
|
|
54
|
-
// scoped to this project, and wins over the machine's token and over the CLI login. `tenant` and
|
|
47
|
+
// (Linear's `credential`) names the credential in the machine's secret store (host/secrets.ts) whose
|
|
48
|
+
// password is a token scoped to this project, and wins over the machine's token and over the CLI login. `tenant` and
|
|
55
49
|
// `user` pick the CLI login (az's tenant, gh's account) when there is no token. Each is optional.
|
|
56
50
|
// The tenant reaches `az` through a shell on Windows, so it is a tenant id or domain and nothing else.
|
|
57
51
|
const credentialTarget = z.string().trim().min(1);
|
|
@@ -79,14 +73,12 @@ const projectAccountsSchema = z.strictObject({
|
|
|
79
73
|
// ~/.conductor/config.json: machine settings. Strict, so a misspelt key fails startup instead of
|
|
80
74
|
// being ignored. Rules live beside it, in rules.json (rules-service.ts).
|
|
81
75
|
export const configSchema = z.strictObject({
|
|
82
|
-
//
|
|
83
|
-
|
|
76
|
+
// The projects' clones the daemon owns (clones.ts, design note v2, section 2).
|
|
77
|
+
clones: z
|
|
84
78
|
.strictObject({
|
|
85
|
-
// How often each
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
// notify: only raise the inbox item that says so; off: no check.
|
|
89
|
-
mode: z.enum(['update', 'notify', 'off']).default('update'),
|
|
79
|
+
// How often each clone fetches origin, after which a changed .claude/conductor.json on the base
|
|
80
|
+
// branch is taken. A worktree's create fetches its base branch as well.
|
|
81
|
+
fetchMinutes: z.number().min(1).max(1440).default(10),
|
|
90
82
|
})
|
|
91
83
|
.prefault({}),
|
|
92
84
|
// The inbox (design note, section 7).
|
|
@@ -119,11 +111,11 @@ export const configSchema = z.strictObject({
|
|
|
119
111
|
profiles: z
|
|
120
112
|
.record(z.string().regex(/^[a-z][a-z0-9-]*$/, 'a profile name in lower case, such as away'), z.array(notifyRuleSchema))
|
|
121
113
|
.default({}),
|
|
122
|
-
// The app token and user key are secrets, so they live in
|
|
123
|
-
// password and user name) or in PUSHOVER_TOKEN and PUSHOVER_USER, never here.
|
|
114
|
+
// The app token and user key are secrets, so they live in the machine's secret store (the
|
|
115
|
+
// credential's password and user name) or in PUSHOVER_TOKEN and PUSHOVER_USER, never here.
|
|
124
116
|
pushover: z
|
|
125
117
|
.strictObject({
|
|
126
|
-
// Absent:
|
|
118
|
+
// Absent: conductor-pushover in ~/.conductor, none in a scratch home (pushoverCredential),
|
|
127
119
|
// so a daemon run for a test can't push to the machine's phone (ATK-506).
|
|
128
120
|
credential: z.string().min(1).optional(),
|
|
129
121
|
// Pushover's priority: -2 (no alert) to 1 (high). 2 (emergency) needs receipts, not built.
|
|
@@ -134,11 +126,31 @@ export const configSchema = z.strictObject({
|
|
|
134
126
|
remind: remindSchema.prefault({}),
|
|
135
127
|
// How often reminders, the quiet-hours summary and an expiring profile are checked.
|
|
136
128
|
tickSeconds: z.number().min(1).max(600).default(60),
|
|
129
|
+
// The webhook channel: each push is one POST of JSON to `url` (webhook.ts). `credential` names
|
|
130
|
+
// one in the machine's secret store whose password goes out as a bearer token. Off when absent:
|
|
131
|
+
// a rule that sends to `webhook` then fails, and `conduct notify` says why.
|
|
132
|
+
webhook: z
|
|
133
|
+
.strictObject({
|
|
134
|
+
credential: z.string().min(1).optional(),
|
|
135
|
+
timeoutSeconds: z.number().min(1).max(120).default(15),
|
|
136
|
+
url: z.url({ protocol: /^https?$/ }),
|
|
137
|
+
})
|
|
138
|
+
// The token would cross the network in the clear.
|
|
139
|
+
.refine((w) => w.credential === undefined || w.url.startsWith('https:') || isLoopback(w.url), {
|
|
140
|
+
message: 'a webhook with a credential needs an https URL (or one on this machine)',
|
|
141
|
+
path: ['url'],
|
|
142
|
+
})
|
|
143
|
+
.optional(),
|
|
137
144
|
})
|
|
138
145
|
.prefault({})
|
|
139
146
|
.refine((n) => Object.hasOwn(BUILT_IN_PROFILES, n.profile) || Object.hasOwn(n.profiles, n.profile), {
|
|
140
147
|
message: 'notify.profile names no profile (built in: away, default, focus)',
|
|
141
148
|
path: ['profile'],
|
|
149
|
+
})
|
|
150
|
+
// Pushes to it would fail every time, retried with no end.
|
|
151
|
+
.refine((n) => n.webhook !== undefined || !Object.values(n.profiles).some((p) => p.some((r) => r.to.includes('webhook'))), {
|
|
152
|
+
message: 'a profile sends to webhook, and notify.webhook has no url',
|
|
153
|
+
path: ['webhook'],
|
|
142
154
|
}),
|
|
143
155
|
// The one person this daemon serves (design note v2, section 6): the name messages call them by.
|
|
144
156
|
operator: z.strictObject({ name: z.string().trim().min(1).default('the operator') }).prefault({}),
|
|
@@ -172,9 +184,13 @@ export const configSchema = z.strictObject({
|
|
|
172
184
|
// The daily soft cap of the built-in `daily-cap` rule: past this many tokens today (cache
|
|
173
185
|
// reads aside), across projects, no new launches until tomorrow.
|
|
174
186
|
dailyTokens: z.int().min(1).default(20_000_000),
|
|
175
|
-
// on: launch and retire;
|
|
176
|
-
//
|
|
177
|
-
mode: z
|
|
187
|
+
// on: launch and retire; off: no timed queue, and a queue read on demand (`conduct queue`)
|
|
188
|
+
// logs the picks and does none of them. observe was removed in 3.0.0 (ATK-531).
|
|
189
|
+
mode: z
|
|
190
|
+
.enum(SCHEDULER_MODES, {
|
|
191
|
+
error: (issue) => issue.input === 'observe' ? 'observe was removed: use off, which launches nothing' : undefined,
|
|
192
|
+
})
|
|
193
|
+
.default('on'),
|
|
178
194
|
// Workers running at once across projects; each project's profile sets its own share. It is
|
|
179
195
|
// also the hard limit: no rule or focus gives a project more.
|
|
180
196
|
slots: z.int().min(1).max(16).default(4),
|
|
@@ -210,7 +226,7 @@ export const configSchema = z.strictObject({
|
|
|
210
226
|
conflictMinutes: z.number().positive().max(1440).default(30),
|
|
211
227
|
github: watcher(30, 30),
|
|
212
228
|
health: watcher(30, 30),
|
|
213
|
-
// Linear allows a key 1500 requests an hour, and
|
|
229
|
+
// Linear allows a key 1500 requests an hour, and the scheduler's queue reads use the same key.
|
|
214
230
|
linear: watcher(30, 10),
|
|
215
231
|
// A lost login's re-probe, and `conduct wait login`: each probe asks its provider once or twice.
|
|
216
232
|
login: watcher(60, 30),
|
|
@@ -219,6 +235,16 @@ export const configSchema = z.strictObject({
|
|
|
219
235
|
statsMinutes: z.number().min(1).max(1440).default(10),
|
|
220
236
|
})
|
|
221
237
|
.prefault({}),
|
|
238
|
+
// Workers run headless, as background sessions. `tab` also opens a tab on each launch, attached
|
|
239
|
+
// to the session; `conduct attach` opens one either way. `terminal` is where tabs and the console
|
|
240
|
+
// open (host/terminal.ts): auto is Windows Terminal, iTerm or Terminal on macOS, and tmux elsewhere.
|
|
241
|
+
// Was the profile's `workers.tab` until ATK-529: a machine's choice, not the repo's.
|
|
242
|
+
workers: z
|
|
243
|
+
.strictObject({
|
|
244
|
+
tab: z.boolean().default(false),
|
|
245
|
+
terminal: z.enum(TERMINALS).default('auto'),
|
|
246
|
+
})
|
|
247
|
+
.prefault({}),
|
|
222
248
|
});
|
|
223
249
|
// A missing file means every default; any other read error is a real problem.
|
|
224
250
|
export function loadConfig(file) {
|
|
@@ -236,6 +262,10 @@ export function loadConfig(file) {
|
|
|
236
262
|
export function parseConfig(text, source) {
|
|
237
263
|
return parseJsonc(text, configSchema, source);
|
|
238
264
|
}
|
|
265
|
+
function isLoopback(url) {
|
|
266
|
+
const host = new URL(url).hostname;
|
|
267
|
+
return host === 'localhost' || host === '[::1]' || /^127\.\d+\.\d+\.\d+$/.test(host);
|
|
268
|
+
}
|
|
239
269
|
function watcher(intervalSeconds, perMinute) {
|
|
240
270
|
return z
|
|
241
271
|
.strictObject({
|
package/build/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/build/console.js
CHANGED
|
@@ -7,13 +7,13 @@ import { inboxItemSchema } from "./store.js";
|
|
|
7
7
|
// appends `console.escalated`, and the conductor mod wakes the console's model with it. The console
|
|
8
8
|
// reports back with `console.handled`, whose cause is the escalation, so `conduct why` follows a
|
|
9
9
|
// finding to the rule behind it. An escalation raised while no console was open stays open until a
|
|
10
|
-
// console handles it, and the inbox tells
|
|
10
|
+
// console handles it, and the inbox tells the operator to start one (unattendedEscalations).
|
|
11
11
|
// Older ones are left out: an ask that waited two weeks is stale.
|
|
12
12
|
export const ESCALATION_DAYS = 14;
|
|
13
13
|
// The console skill, as the plugin namespaces it (plugin.ts).
|
|
14
14
|
export const CONSOLE_SKILL = 'conductor:conductor-console';
|
|
15
15
|
export const CONSOLE_WINDOW = 'conductor';
|
|
16
|
-
// How long escalations may wait with no console following the stream before
|
|
16
|
+
// How long escalations may wait with no console following the stream before the operator is told. It
|
|
17
17
|
// outlasts a console's own reconnects: the mod restarts `conduct events` within seconds, and the
|
|
18
18
|
// stream comes back as soon as a restarted daemon listens.
|
|
19
19
|
export const UNATTENDED_GRACE_MS = 30_000;
|
|
@@ -42,7 +42,7 @@ export class NoEscalationError extends ConductorError {
|
|
|
42
42
|
}
|
|
43
43
|
// `conduct console`'s claim on the daemon's gate. With no daemon there is no console stream to
|
|
44
44
|
// double, and an older one (404) can't tell: both go on. A forced start goes on past a daemon that
|
|
45
|
-
// doesn't answer as well, since the console is where
|
|
45
|
+
// doesn't answer as well, since the console is where the operator looks into that.
|
|
46
46
|
export async function claimConsole(paths, force) {
|
|
47
47
|
let answer;
|
|
48
48
|
try {
|
|
@@ -153,30 +153,20 @@ export function consoleGate({ graceMs = CONSOLE_START_GRACE_MS, now = () => Date
|
|
|
153
153
|
},
|
|
154
154
|
};
|
|
155
155
|
}
|
|
156
|
-
//
|
|
157
|
-
// `
|
|
158
|
-
//
|
|
159
|
-
// the
|
|
160
|
-
export function
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
'
|
|
168
|
-
CONSOLE_WINDOW,
|
|
169
|
-
|
|
170
|
-
'--title',
|
|
171
|
-
'conductor console',
|
|
172
|
-
'-d',
|
|
173
|
-
dir,
|
|
174
|
-
nodePath,
|
|
175
|
-
cliPath,
|
|
176
|
-
'console',
|
|
177
|
-
'--here',
|
|
178
|
-
'--force',
|
|
179
|
-
];
|
|
156
|
+
// The console's tab: in the console's folder, running this CLI's `console --here`, which starts
|
|
157
|
+
// `claude` with CONDUCTOR_CONSOLE=1. --force: the command that opens the tab has claimed the start
|
|
158
|
+
// already. A terminal that starts tabs in an environment of its own (macOS, tmux) gets
|
|
159
|
+
// CONDUCTOR_HOME, so the console serves the same daemon as the command that opened it.
|
|
160
|
+
export function consoleTab(dir, nodePath, cliPath, env) {
|
|
161
|
+
const home = env.CONDUCTOR_HOME;
|
|
162
|
+
return {
|
|
163
|
+
command: [nodePath, cliPath, 'console', '--here', '--force'],
|
|
164
|
+
cwd: dir,
|
|
165
|
+
env: home ? { CONDUCTOR_HOME: home } : {},
|
|
166
|
+
hold: false,
|
|
167
|
+
title: 'conductor console',
|
|
168
|
+
window: CONSOLE_WINDOW,
|
|
169
|
+
};
|
|
180
170
|
}
|
|
181
171
|
// `conduct escalations`: each open one with its age, item and rule, then the ask.
|
|
182
172
|
export function escalationLines(escalations, now) {
|
package/build/console.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"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"}
|
package/build/credentials.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import { credentialSaved, readCredential as readWindowsCredential, } from "./credential.js";
|
|
2
1
|
import { ConductorError } from "./errors.js";
|
|
3
|
-
import {
|
|
2
|
+
import { secretStore } from "./host/secrets.js";
|
|
3
|
+
import { adoBasic, adoOrgUrl, NotFound, ProviderError } from "./lib/providers/index.js";
|
|
4
4
|
import { outputOf, run as runCommand } from "./run.js";
|
|
5
5
|
// Each project's credentials (design note v2, section 8): every provider takes the first credential
|
|
6
6
|
// it finds, least privilege first.
|
|
7
|
-
// 1. project-token: a token scoped to the project, in the
|
|
8
|
-
// names (`projects.<name>.ado.token`, `github.token`,
|
|
9
|
-
//
|
|
7
|
+
// 1. project-token: a token scoped to the project, in the machine's secret store (host/secrets.ts)
|
|
8
|
+
// under the credential that machine config names (`projects.<name>.ado.token`, `github.token`,
|
|
9
|
+
// `linear.credential`);
|
|
10
|
+
// 2. machine-token: the machine's own token, from a conductor-only env var or the store
|
|
10
11
|
// (MACHINE_TOKENS), so another tool's env never changes what the conductor signs in as;
|
|
11
12
|
// 3. cli-login: `az` (the project's tenant, else the default account) or `gh` (the project's user,
|
|
12
13
|
// else the active account), last because it usually carries the widest permissions. Linear has
|
|
13
14
|
// none.
|
|
14
15
|
// Found means there: a token that is there but refused is a lost login, never a quiet fall back to a
|
|
15
16
|
// wider credential. A login that stops working is a spell: one `lost` change when it starts, one
|
|
16
|
-
// `restored` when a call or a probe works again.
|
|
17
|
+
// `restored` when a call or a probe works again. The machine's ADO token serves every project
|
|
18
|
+
// without one of its own, in whatever organization, and a PAT is usually scoped to one: its spell
|
|
19
|
+
// is the organization's that refused it, so the projects in the others keep working (ATK-536).
|
|
17
20
|
export const PROVIDERS = ['ado', 'github', 'linear'];
|
|
18
21
|
export const SOURCES = ['project-token', 'machine-token', 'cli-login'];
|
|
19
22
|
// Azure DevOps' resource id, for `az account get-access-token`.
|
|
@@ -21,8 +24,8 @@ const ADO_RESOURCE = '499b84ac-1321-427f-aa17-267ca6975798';
|
|
|
21
24
|
// An az token lasts about an hour, a gh token until it is revoked; both are asked again well before,
|
|
22
25
|
// and a token's credential is read again as often, so a replaced or removed one is seen.
|
|
23
26
|
const TOKEN_MAX_AGE_MS = 20 * 60_000;
|
|
24
|
-
export const LINEAR_CREDENTIAL = '
|
|
25
|
-
// The machine's own token for each provider: the env vars in order, then the
|
|
27
|
+
export const LINEAR_CREDENTIAL = 'conductor-linear';
|
|
28
|
+
// The machine's own token for each provider: the env vars in order, then the store's credential.
|
|
26
29
|
export const MACHINE_TOKENS = {
|
|
27
30
|
ado: { credential: 'conductor-ado', env: ['CONDUCTOR_ADO_TOKEN'] },
|
|
28
31
|
github: { credential: 'conductor-github', env: ['CONDUCTOR_GITHUB_TOKEN'] },
|
|
@@ -35,7 +38,7 @@ const LINEAR_API = 'https://api.linear.app/graphql';
|
|
|
35
38
|
const TIMEOUT_MS = 20_000;
|
|
36
39
|
// A provider call that needs a login it doesn't have. It names the provider, the account and the
|
|
37
40
|
// command that signs in again. `conduct` reserves exit code 5 (LOGIN_NEEDED_EXIT) for worker verbs
|
|
38
|
-
// that hit it;
|
|
41
|
+
// that hit it; every other verb exits 1 for it, as for any ConductorError.
|
|
39
42
|
export class LoginNeeded extends ConductorError {
|
|
40
43
|
account;
|
|
41
44
|
// The message and the command in one line, for a wait's problem (`wait.check-failed`, a local
|
|
@@ -43,21 +46,23 @@ export class LoginNeeded extends ConductorError {
|
|
|
43
46
|
get line() {
|
|
44
47
|
return `${this.message}; to sign in: ${this.account.command}`;
|
|
45
48
|
}
|
|
46
|
-
constructor(account, project, error) {
|
|
47
|
-
super(`${loginText(account, project)}: ${error}`, [`run ${account.command}`]);
|
|
49
|
+
constructor(account, project, error, organization = null) {
|
|
50
|
+
super(`${loginText(account, project, organization)}: ${error}`, [`run ${account.command}`]);
|
|
48
51
|
this.name = 'LoginNeeded';
|
|
49
52
|
this.account = account;
|
|
50
53
|
}
|
|
51
54
|
}
|
|
52
|
-
// "github login lost for
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
// "github login lost for web (gh account contoso-bot)", or with a machine token's organization,
|
|
56
|
+
// "ado login lost for app (CONDUCTOR_ADO_TOKEN on https://dev.azure.com/fabrikam)".
|
|
57
|
+
export function loginText(account, project, organization = null) {
|
|
58
|
+
const on = organization === null ? '' : ` on ${organization}`;
|
|
59
|
+
return `${account.provider} login lost${project === null ? '' : ` for ${project}`} (${account.label}${on})`;
|
|
55
60
|
}
|
|
56
|
-
// The
|
|
57
|
-
//
|
|
61
|
+
// The credential the machine's own token is saved under. For Linear, CONDUCTOR_LINEAR_CREDENTIAL
|
|
62
|
+
// names another.
|
|
58
63
|
export function machineTarget(provider, env) {
|
|
59
64
|
if (provider === 'linear')
|
|
60
|
-
return env.
|
|
65
|
+
return env.CONDUCTOR_LINEAR_CREDENTIAL?.trim() || LINEAR_CREDENTIAL;
|
|
61
66
|
return MACHINE_TOKENS[provider].credential;
|
|
62
67
|
}
|
|
63
68
|
export function providerCredentials(deps) {
|
|
@@ -65,9 +70,7 @@ export function providerCredentials(deps) {
|
|
|
65
70
|
const fetcher = deps.fetch ?? globalThis.fetch;
|
|
66
71
|
const now = deps.now ?? Date.now;
|
|
67
72
|
const exec = deps.run ?? runCommand;
|
|
68
|
-
const
|
|
69
|
-
// A seam that reads credentials but checks none is asked for every target.
|
|
70
|
-
const isSaved = deps.credentialSaved ?? (deps.readCredential ? async () => 'unknown' : credentialSaved);
|
|
73
|
+
const secrets = deps.secrets ?? secretStore();
|
|
71
74
|
const lostNow = new Map();
|
|
72
75
|
// Each identity's authorization (ADO's header value, gh's token, Linear's key) and the source it
|
|
73
76
|
// came from, shared by every project with that identity. The calls that read them name their own
|
|
@@ -77,25 +80,39 @@ export function providerCredentials(deps) {
|
|
|
77
80
|
const linearKeys = new Map();
|
|
78
81
|
const foundAs = new Map();
|
|
79
82
|
const key = (account) => `${account.provider}:${account.id}`;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
// The ADO organization a machine token's spell is kept to: the one the project's calls ask, or the
|
|
84
|
+
// one a probe names. Null for every other account, whose spell is the account's.
|
|
85
|
+
const scopeOf = (account, project, named) => account.provider === 'ado' && account.source === 'machine-token'
|
|
86
|
+
? (named ?? deps.adoOrganization?.(project) ?? null)
|
|
87
|
+
: null;
|
|
88
|
+
const spell = (account, organization) => organization === null ? key(account) : `${key(account)} ${organization}`;
|
|
89
|
+
const failed = (account, project, error, organization = scopeOf(account, project)) => {
|
|
90
|
+
const at = spell(account, organization);
|
|
91
|
+
if (!lostNow.has(at)) {
|
|
92
|
+
lostNow.set(at, { account, error, organization, project });
|
|
93
|
+
deps.onChange?.({ account, error, kind: 'lost', organization, project });
|
|
84
94
|
}
|
|
85
|
-
return new LoginNeeded(account, project, error);
|
|
95
|
+
return new LoginNeeded(account, project, error, organization);
|
|
86
96
|
};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
97
|
+
// A working call ends its own spell. On ADO it also ends the identity's spell on the project's
|
|
98
|
+
// organization: a machine PAT refused there and since removed, so the machine's az login serves it.
|
|
99
|
+
const worked = (account, project, organization = scopeOf(account, project)) => {
|
|
100
|
+
const asked = account.provider === 'ado' ? (organization ?? deps.adoOrganization?.(project) ?? null) : null;
|
|
101
|
+
const spells = new Set([spell(account, asked), spell(account, organization)]);
|
|
102
|
+
for (const at of spells) {
|
|
103
|
+
const ended = lostNow.get(at);
|
|
104
|
+
if (!ended || !lostNow.delete(at))
|
|
105
|
+
continue;
|
|
106
|
+
deps.onChange?.({ account, error: null, kind: 'restored', organization: ended.organization, project });
|
|
107
|
+
}
|
|
91
108
|
};
|
|
92
109
|
// While an account's login is lost, only a probe asks the provider again (the daemon's re-probe,
|
|
93
110
|
// a login wait): every other call fails at once, so a pass with many waits on the account runs
|
|
94
111
|
// no `az`, `gh` or Linear request for it. The re-probe is the spell's back-off.
|
|
95
112
|
const refuseWhileLost = (account, project, probing) => {
|
|
96
|
-
const lost = probing ? undefined : lostNow.get(
|
|
113
|
+
const lost = probing ? undefined : lostNow.get(spell(account, scopeOf(account, project)));
|
|
97
114
|
if (lost)
|
|
98
|
-
throw new LoginNeeded(lost.account, project, lost.error);
|
|
115
|
+
throw new LoginNeeded(lost.account, project, lost.error, lost.organization);
|
|
99
116
|
};
|
|
100
117
|
// The project's credentials as machine config names them, before any is read: its token when it
|
|
101
118
|
// names one, else its CLI login (Linear: the machine's key), with no source yet.
|
|
@@ -103,7 +120,7 @@ export function providerCredentials(deps) {
|
|
|
103
120
|
const entry = project === null ? undefined : deps.projects[project];
|
|
104
121
|
const target = provider === 'linear' ? entry?.linear?.credential : entry?.[provider]?.token;
|
|
105
122
|
if (target !== undefined)
|
|
106
|
-
return tokenAccount(provider, target, target, 'project-token');
|
|
123
|
+
return tokenAccount(secrets, provider, target, target, 'project-token');
|
|
107
124
|
switch (provider) {
|
|
108
125
|
case 'ado': {
|
|
109
126
|
const tenant = entry?.ado?.tenant ?? null;
|
|
@@ -126,7 +143,7 @@ export function providerCredentials(deps) {
|
|
|
126
143
|
case 'linear': {
|
|
127
144
|
const shown = machineTarget('linear', env);
|
|
128
145
|
return {
|
|
129
|
-
command:
|
|
146
|
+
command: secrets.saveCommand(shown, 'linear'),
|
|
130
147
|
id: MACHINE,
|
|
131
148
|
label: `${MACHINE_TOKENS.linear.env.join(', ')} or credential ${shown}`,
|
|
132
149
|
provider,
|
|
@@ -146,7 +163,7 @@ export function providerCredentials(deps) {
|
|
|
146
163
|
const base = configured(provider, project);
|
|
147
164
|
const as = (found) => ({ ...found, id: base.id });
|
|
148
165
|
if (base.source === 'project-token') {
|
|
149
|
-
const got = await read(base.id, env);
|
|
166
|
+
const got = await secrets.read(base.id, env);
|
|
150
167
|
if (!got.found)
|
|
151
168
|
throw failed(base, project, got.reason);
|
|
152
169
|
return { account: base, token: got.credential.secret };
|
|
@@ -165,12 +182,11 @@ export function providerCredentials(deps) {
|
|
|
165
182
|
}
|
|
166
183
|
}
|
|
167
184
|
// The machine's credential is optional: one that isn't saved, or can't be read, is passed over
|
|
168
|
-
// (the cheap
|
|
169
|
-
// after it.
|
|
185
|
+
// (the cheap check first: on Windows it starts no PowerShell). Linear has nothing after it.
|
|
170
186
|
const target = machineTarget(provider, env);
|
|
171
|
-
const stored = as(tokenAccount(provider, target, MACHINE, 'machine-token'));
|
|
172
|
-
const saved = await
|
|
173
|
-
const got = saved === 'missing' ? null : await read(target, env);
|
|
187
|
+
const stored = as(tokenAccount(secrets, provider, target, MACHINE, 'machine-token'));
|
|
188
|
+
const saved = await secrets.saved(target, env);
|
|
189
|
+
const got = saved === 'missing' ? null : await secrets.read(target, env);
|
|
174
190
|
if (got?.found)
|
|
175
191
|
return { account: stored, token: got.credential.secret };
|
|
176
192
|
if (provider === 'linear') {
|
|
@@ -284,12 +300,23 @@ export function providerCredentials(deps) {
|
|
|
284
300
|
};
|
|
285
301
|
const gh = (project) => (path) => ghApi(project, path);
|
|
286
302
|
const ghWrite = (project) => (method, path, body) => ghApi(project, path, { body, method });
|
|
287
|
-
// Another gh command as the project's credential, such as `run view --log-failed`; its output.
|
|
303
|
+
// Another gh command as the project's credential, such as `run view --log-failed`; its output. A
|
|
304
|
+
// 404 is NotFound. Any other failure is a ProviderError, transient when asking again may help (a
|
|
305
|
+
// timeout or kill, a 5xx, a rate limit, the network), so a caller can tell a log GitHub won't give
|
|
306
|
+
// yet ("still in progress") from one worth asking for again. A gh that didn't start is lasting.
|
|
288
307
|
const ghRun = (project) => async (args) => {
|
|
289
308
|
const { result, said } = await ghExec(project, args, { timeoutMs: 120_000 });
|
|
290
|
-
if (result.code
|
|
291
|
-
|
|
292
|
-
|
|
309
|
+
if (result.code === 0)
|
|
310
|
+
return result.stdout;
|
|
311
|
+
const asked = `gh ${args.join(' ')}`;
|
|
312
|
+
if (/HTTP 404/.test(said))
|
|
313
|
+
throw new NotFound(`${asked} failed: ${said}`);
|
|
314
|
+
const http = /HTTP (\d{3})/.exec(said)?.[1];
|
|
315
|
+
const status = http === undefined ? null : Number(http);
|
|
316
|
+
const transient = (result.code === null && !/ENOENT/.test(result.error ?? '')) ||
|
|
317
|
+
(status !== null && (status >= 500 || status === 429)) ||
|
|
318
|
+
/rate limit|abuse detection|error connecting|connection (?:reset|refused)|no such host|timeout|deadline exceeded|unexpected EOF/i.test(said);
|
|
319
|
+
throw new ProviderError(`${asked} failed: ${said}`, { status, transient });
|
|
293
320
|
};
|
|
294
321
|
// The project's Linear key, kept per identity. The key is only returned: never logged, stored or
|
|
295
322
|
// put on a command line.
|
|
@@ -318,10 +345,10 @@ export function providerCredentials(deps) {
|
|
|
318
345
|
},
|
|
319
346
|
worked: () => worked(account('linear', project), project),
|
|
320
347
|
});
|
|
321
|
-
const probe = async (provider, project) => {
|
|
348
|
+
const probe = async (provider, project, { organization } = {}) => {
|
|
322
349
|
try {
|
|
323
350
|
if (provider === 'ado')
|
|
324
|
-
await probeAdo(project);
|
|
351
|
+
await probeAdo(project, organization);
|
|
325
352
|
else if (provider === 'github')
|
|
326
353
|
await ghApi(project, 'user', { probing: true });
|
|
327
354
|
else
|
|
@@ -337,14 +364,14 @@ export function providerCredentials(deps) {
|
|
|
337
364
|
};
|
|
338
365
|
// A fresh ADO credential. az vouches for its own token; a token is asked who it is on the project's
|
|
339
366
|
// organization, which is the only way to learn ADO takes it (it answers 401, or 203 with its
|
|
340
|
-
// sign-in page, when it doesn't).
|
|
341
|
-
const probeAdo = async (project) => {
|
|
367
|
+
// sign-in page, when it doesn't). A check of a profile not stored yet names its organization.
|
|
368
|
+
const probeAdo = async (project, named) => {
|
|
342
369
|
adoTokens.delete(account('ado', project).id);
|
|
343
370
|
const value = await adoToken(project, true, true);
|
|
344
371
|
const which = account('ado', project);
|
|
345
372
|
if (which.source === 'cli-login')
|
|
346
373
|
return;
|
|
347
|
-
const organization = deps.adoOrganization?.(project) ?? null;
|
|
374
|
+
const organization = named ?? deps.adoOrganization?.(project) ?? null;
|
|
348
375
|
if (organization === null)
|
|
349
376
|
throw new Error('no Azure DevOps organization to ask whether it takes the token');
|
|
350
377
|
const response = await fetcher(adoOrgUrl({ organization }, 'connectionData', '7.1-preview'), {
|
|
@@ -352,13 +379,14 @@ export function providerCredentials(deps) {
|
|
|
352
379
|
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
353
380
|
});
|
|
354
381
|
await response.body?.cancel();
|
|
382
|
+
const scope = scopeOf(which, project, organization);
|
|
355
383
|
if (response.status === 401 || response.status === 203) {
|
|
356
384
|
adoTokens.delete(which.id);
|
|
357
|
-
throw failed(which, project, `Azure DevOps refused the token (HTTP ${response.status})
|
|
385
|
+
throw failed(which, project, `Azure DevOps refused the token (HTTP ${response.status})`, scope);
|
|
358
386
|
}
|
|
359
387
|
if (!response.ok)
|
|
360
388
|
throw new Error(`Azure DevOps answered ${response.status}`);
|
|
361
|
-
worked(which, project);
|
|
389
|
+
worked(which, project, scope);
|
|
362
390
|
};
|
|
363
391
|
const probeLinear = async (auth) => {
|
|
364
392
|
const secret = await auth.key(true);
|
|
@@ -383,18 +411,22 @@ export function providerCredentials(deps) {
|
|
|
383
411
|
linear: (project) => linear(project),
|
|
384
412
|
lost: () => [...lostNow.values()],
|
|
385
413
|
probe,
|
|
414
|
+
saveCommand: (provider, target) => secrets.saveCommand(target, tokenUser(provider)),
|
|
386
415
|
};
|
|
387
416
|
}
|
|
388
|
-
// The account of a token in the
|
|
389
|
-
function tokenAccount(provider, target, id, source) {
|
|
390
|
-
const user = provider === 'linear' ? 'linear' : 'pat';
|
|
417
|
+
// The account of a token in the store's credential `target`.
|
|
418
|
+
function tokenAccount(secrets, provider, target, id, source) {
|
|
391
419
|
const whose = source === 'project-token' ? 'project token' : 'machine token';
|
|
392
420
|
return {
|
|
393
|
-
command:
|
|
421
|
+
command: secrets.saveCommand(target, tokenUser(provider)),
|
|
394
422
|
id,
|
|
395
423
|
label: `${whose} in credential ${target}`,
|
|
396
424
|
provider,
|
|
397
425
|
source,
|
|
398
426
|
};
|
|
399
427
|
}
|
|
428
|
+
// The user name a token's credential is saved with.
|
|
429
|
+
function tokenUser(provider) {
|
|
430
|
+
return provider === 'linear' ? 'linear' : 'pat';
|
|
431
|
+
}
|
|
400
432
|
//# sourceMappingURL=credentials.js.map
|