@detergent-software/conductor 3.0.0-dev.4 → 3.0.0-dev.41
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 +352 -0
- package/README.md +274 -124
- 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 +15 -10
- package/build/broker-cli.js.map +1 -1
- package/build/broker.js +1 -1
- package/build/broker.js.map +1 -1
- package/build/claude.js +48 -2
- package/build/claude.js.map +1 -1
- package/build/cli.js +225 -71
- 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 +140 -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 +43 -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 +57 -66
- 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 +237 -82
- package/build/help.js.map +1 -1
- package/build/history.js +10 -4
- package/build/history.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/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 +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 +57 -39
- 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 +4 -3
- package/build/lib/providers/index.js.map +1 -1
- package/build/lib/providers/npm/stage.js +28 -5
- 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 +131 -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 +323 -0
- package/build/npm-reads.js.map +1 -0
- 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 +107 -51
- package/build/profile.js.map +1 -1
- package/build/project-check-cli.js +19 -19
- package/build/project-check-cli.js.map +1 -1
- package/build/project-check.js +194 -108
- 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 +104 -47
- 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 +89 -13
- 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 -5
- 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 +44 -20
- package/build/watchers/ado.js.map +1 -1
- package/build/watchers/github.js +21 -6
- 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/npm.js +6 -4
- package/build/watchers/npm.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 +46 -6
- package/plugin/hooks/register.tsx +41 -2
- 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
|
@@ -6,13 +6,16 @@ const distTags = z.record(z.string(), z.string());
|
|
|
6
6
|
// npm's staged publishing: what a release run staged (its logs, newest first, through its CI), and
|
|
7
7
|
// whether a version is on the registry yet. After an approve, the registry can answer 404 for 15 s
|
|
8
8
|
// or more (ATK-225), so a false here isn't final. A caller that only reads the registry (the npm
|
|
9
|
-
// wait) needs no CI.
|
|
10
|
-
|
|
9
|
+
// wait) needs no CI. `registry` names the registry a package is read from (registryFor over npm's
|
|
10
|
+
// settings), npmjs by default.
|
|
11
|
+
export function npmStage({ ci, fetch: fetcher = globalThis.fetch, registry = () => NPM_REGISTRY, }) {
|
|
11
12
|
const encoded = (pkg) => pkg.replace('/', '%2f');
|
|
13
|
+
// A mirror's registry can carry a path and a trailing slash (https://mirror.example/npm/).
|
|
14
|
+
const base = async (pkg) => (await registry(pkg)).replace(/\/+$/, '');
|
|
12
15
|
return {
|
|
13
16
|
// A few bytes from the dist-tags endpoint, so a stage approved a moment ago shows on the next look.
|
|
14
17
|
distTags: async (pkg) => {
|
|
15
|
-
const response = await fetcher(`${
|
|
18
|
+
const response = await fetcher(`${await base(pkg)}/-/package/${encoded(pkg)}/dist-tags`, {
|
|
16
19
|
cache: 'no-store',
|
|
17
20
|
headers: { accept: 'application/json', 'cache-control': 'no-cache' },
|
|
18
21
|
signal: AbortSignal.timeout(20_000),
|
|
@@ -35,7 +38,7 @@ export function npmStage({ ci, fetch: fetcher = globalThis.fetch, registry = NPM
|
|
|
35
38
|
},
|
|
36
39
|
published: async (pkg, version) => {
|
|
37
40
|
try {
|
|
38
|
-
const response = await fetcher(`${
|
|
41
|
+
const response = await fetcher(`${await base(pkg)}/${encoded(pkg)}/${encodeURIComponent(version)}`, {
|
|
39
42
|
cache: 'no-store',
|
|
40
43
|
headers: { accept: 'application/json' },
|
|
41
44
|
signal: AbortSignal.timeout(20_000),
|
|
@@ -68,6 +71,8 @@ export function npmStage({ ci, fetch: fetcher = globalThis.fetch, registry = NPM
|
|
|
68
71
|
// and stage a merge before the merge's own run starts. Once that stage is approved, the merge's run
|
|
69
72
|
// prints "<package>@<version> is already published", with no stage of its own. A merge with no
|
|
70
73
|
// releasable commits prints the same line for the previous version, so the note says how to tell.
|
|
74
|
+
// A run whose base moved on to newer commits that touch the package releases nothing and names the
|
|
75
|
+
// commit whose run releases them with its own (ATK-505).
|
|
71
76
|
export function parseStageLine(text) {
|
|
72
77
|
const log = text ?? '';
|
|
73
78
|
const fresh = /\+ (@[\w.-]+\/[\w.-]+)@(\S+) \(staged with id ([0-9a-f-]{36})\)/.exec(log);
|
|
@@ -80,14 +85,32 @@ export function parseStageLine(text) {
|
|
|
80
85
|
version: match[2],
|
|
81
86
|
};
|
|
82
87
|
}
|
|
88
|
+
const deferred = /(@[\w.-]+\/[\w.-]+) released nothing in this run \(package\.json holds (\S+)\): deferred to the run for ([0-9a-f]{7,40});/.exec(log);
|
|
89
|
+
if (deferred?.[1] && deferred[2] && deferred[3]) {
|
|
90
|
+
const sha = deferred[3].slice(0, 8);
|
|
91
|
+
return {
|
|
92
|
+
deferredTo: deferred[3],
|
|
93
|
+
note: `this run released nothing: the base had newer commits that touch the package by then, and the run for ${sha} releases them with this one. Its stage is the merge's (conduct runs ${sha}); confirm with git tag --contains <merge> once it has released`,
|
|
94
|
+
package: deferred[1],
|
|
95
|
+
stageId: null,
|
|
96
|
+
version: deferred[2],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
83
99
|
const published = /(@[\w.-]+\/[\w.-]+)@(\S+) is already published; nothing to stage\./.exec(log);
|
|
84
100
|
if (!published?.[1] || !published[2])
|
|
85
101
|
return null;
|
|
86
102
|
return {
|
|
87
|
-
note: 'already on npm when this run reached its stage step, so nothing to approve. It carries the merge only when a release tag of this version contains it (git tag --contains <merge>):
|
|
103
|
+
note: 'already on npm when this run reached its stage step, so nothing to approve. It carries the merge only when a release tag of this version contains it (git tag --contains <merge>): another run released it, or the merge had nothing to release',
|
|
88
104
|
package: published[1],
|
|
89
105
|
stageId: null,
|
|
90
106
|
version: published[2],
|
|
91
107
|
};
|
|
92
108
|
}
|
|
109
|
+
// The registry npm would read a package from, given npm's settings (`npm config list --json`): its
|
|
110
|
+
// scope's `@<scope>:registry`, then `registry`, then npmjs (ATK-561).
|
|
111
|
+
export function registryFor(config, pkg) {
|
|
112
|
+
const scope = /^(@[^/]+)\//.exec(pkg)?.[1];
|
|
113
|
+
const chosen = [scope ? config[`${scope}:registry`] : undefined, config.registry].find((value) => typeof value === 'string' && value !== '');
|
|
114
|
+
return chosen ?? NPM_REGISTRY;
|
|
115
|
+
}
|
|
93
116
|
//# sourceMappingURL=stage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../../src/lib/providers/npm/stage.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAEzD,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAElD,mGAAmG;AACnG,mGAAmG;AACnG,iGAAiG;AACjG,
|
|
1
|
+
{"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../../src/lib/providers/npm/stage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// GENERATED from packages/providers by `pnpm sync-conductor`. Do not edit.
|
|
2
|
+
// How long something ran, in seconds to a tenth, from the ISO times a CI gives; null without both,
|
|
3
|
+
// or for a finish before the start (a CI's placeholder time).
|
|
4
|
+
export function secondsBetween(started, finished) {
|
|
5
|
+
if (!started || !finished)
|
|
6
|
+
return null;
|
|
7
|
+
const ms = Date.parse(finished) - Date.parse(started);
|
|
8
|
+
return Number.isFinite(ms) && ms >= 0 ? Math.round(ms / 100) / 10 : null;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../../src/lib/providers/timing.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,mGAAmG;AACnG,8DAA8D;AAC9D,MAAM,UAAU,cAAc,CAAC,OAAkC,EAAE,QAAmC;IACpG,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
// How long a failed build queued again counts as pending while the PR still shows the failed run.
|
|
2
|
+
// ADO starts the new build within seconds, so a failure that outlasts this is the PR's again.
|
|
3
|
+
export const REQUEUE_GRACE_MS = 15 * 60_000;
|
|
1
4
|
// The PR's required builds and checks as one answer once none of them runs, or null while one does
|
|
2
5
|
// (or none has reported yet). Only current ones count; a policy that isn't a build (reviewers,
|
|
3
|
-
// comments) isn't a check. All of them expired is its own answer.
|
|
4
|
-
|
|
6
|
+
// comments) isn't a check. All of them expired is its own answer. With the PR's threads, a failed
|
|
7
|
+
// build a Requeue note queued again runs, as in prVerdict.
|
|
8
|
+
export function checksSettled(checks, { now = Date.now(), threads = [] } = {}) {
|
|
9
|
+
const queuedAgain = queuedAgainBy(threads, now);
|
|
5
10
|
const builds = checks.filter((c) => c.required && c.kind !== 'policy' && c.current);
|
|
6
11
|
const live = builds.filter((c) => c.state !== 'expired');
|
|
7
|
-
if (builds.length === 0 || live.some((c) => c.state === 'pending'))
|
|
12
|
+
if (builds.length === 0 || live.some((c) => c.state === 'pending' || queuedAgain(c)))
|
|
8
13
|
return null;
|
|
9
14
|
if (live.length === 0)
|
|
10
15
|
return { state: 'expired' };
|
|
@@ -26,7 +31,10 @@ export function needsAnswer(thread) {
|
|
|
26
31
|
// waiting, with what it waits on.
|
|
27
32
|
// Waiting lists ADO builds that only expired, to queue again, but only when nothing else is pending,
|
|
28
33
|
// so a PR waiting days on a review doesn't rebuild every 12 hours.
|
|
29
|
-
|
|
34
|
+
// A failed build a Requeue note queued again is pending, not failed, for REQUEUE_GRACE_MS after the
|
|
35
|
+
// note, while the PR still shows its failed run: the new run's own failure is build-failed at once,
|
|
36
|
+
// as is a GitHub check of the same run that finished after the note (the re-run's attempt).
|
|
37
|
+
export function prVerdict(pr, { autoMergeExpected = false, now = Date.now() } = {}) {
|
|
30
38
|
if (pr.state === 'merged')
|
|
31
39
|
return { mergeCommit: pr.mergeCommit, outcome: 'merged' };
|
|
32
40
|
if (pr.state === 'closed')
|
|
@@ -50,8 +58,9 @@ export function prVerdict(pr, { autoMergeExpected = false } = {}) {
|
|
|
50
58
|
reviewers: against.map((r) => ({ at: r.at, name: r.by, ...(r.vote === undefined ? {} : { vote: r.vote }) })),
|
|
51
59
|
};
|
|
52
60
|
}
|
|
61
|
+
const queuedAgain = queuedAgainBy(pr.threads, now);
|
|
53
62
|
const required = pr.checks.filter((c) => c.required);
|
|
54
|
-
const failed = required.filter((c) => c.kind !== 'policy' && c.state === 'failed' && c.current);
|
|
63
|
+
const failed = required.filter((c) => c.kind !== 'policy' && c.state === 'failed' && c.current && !queuedAgain(c));
|
|
55
64
|
if (failed.length > 0) {
|
|
56
65
|
return { builds: failed.map(failedBuild), outcome: 'build-failed' };
|
|
57
66
|
}
|
|
@@ -70,7 +79,7 @@ export function prVerdict(pr, { autoMergeExpected = false } = {}) {
|
|
|
70
79
|
...unsettled.map((c) => ({
|
|
71
80
|
name: c.name,
|
|
72
81
|
...(c.policy === undefined ? {} : { policy: c.policy }),
|
|
73
|
-
status: c.status,
|
|
82
|
+
status: queuedAgain(c) ? `queued again (run ${c.run} failed)` : c.status,
|
|
74
83
|
...(c.type === undefined ? {} : { type: c.type }),
|
|
75
84
|
...(c.state === 'expired' ? { expired: true } : {}),
|
|
76
85
|
})),
|
|
@@ -86,6 +95,23 @@ export function prVerdict(pr, { autoMergeExpected = false } = {}) {
|
|
|
86
95
|
: [];
|
|
87
96
|
return { outcome: 'waiting', pending, requeue };
|
|
88
97
|
}
|
|
98
|
+
// The failed builds the PR's Requeue notes queued again, oldest note first.
|
|
99
|
+
export function requeuedBuilds(threads) {
|
|
100
|
+
return threads.flatMap((t) => {
|
|
101
|
+
if (t.notePhase !== 'Requeue')
|
|
102
|
+
return [];
|
|
103
|
+
// The note that opened the thread, not a reply after it.
|
|
104
|
+
const { at, heading } = t.opening ?? { at: t.at, heading: t.excerpt.split(/\r?\n/)[0] ?? '' };
|
|
105
|
+
const found = /\brun: (\d+) \((.*)\) at ([0-9a-f]{7,40})\s*$/i.exec(heading);
|
|
106
|
+
if (!found?.[1] || found[2] === undefined || !found[3])
|
|
107
|
+
return [];
|
|
108
|
+
return [{ at, build: found[2], head: found[3].toLowerCase(), run: Number(found[1]) }];
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// The heading of the note `conduct land --requeue` posts before it queues a failed build again.
|
|
112
|
+
export function requeueHeading(prefix, build, head) {
|
|
113
|
+
return `## ${prefix}Requeue · run: ${build.run} (${build.name ?? 'a build'}) at ${head}`;
|
|
114
|
+
}
|
|
89
115
|
function failedBuild(c) {
|
|
90
116
|
return {
|
|
91
117
|
name: c.name,
|
|
@@ -95,4 +121,19 @@ function failedBuild(c) {
|
|
|
95
121
|
url: c.url,
|
|
96
122
|
};
|
|
97
123
|
}
|
|
124
|
+
// Whether a check is a failed build a Requeue note queued again under REQUEUE_GRACE_MS ago. By
|
|
125
|
+
// run, from its newest note. A GitHub re-run keeps the run's id, so a check that finished after the
|
|
126
|
+
// note is the new attempt's result, not the failure it queued again.
|
|
127
|
+
function queuedAgainBy(threads, now) {
|
|
128
|
+
const again = new Map();
|
|
129
|
+
for (const r of requeuedBuilds(threads)) {
|
|
130
|
+
const at = Date.parse(r.at ?? '') || 0;
|
|
131
|
+
if (now - at < REQUEUE_GRACE_MS)
|
|
132
|
+
again.set(r.run, Math.max(at, again.get(r.run) ?? 0));
|
|
133
|
+
}
|
|
134
|
+
return (c) => {
|
|
135
|
+
const noted = c.state === 'failed' && c.run !== null ? again.get(c.run) : undefined;
|
|
136
|
+
return noted !== undefined && !(Date.parse(c.finished ?? '') > noted);
|
|
137
|
+
};
|
|
138
|
+
}
|
|
98
139
|
//# sourceMappingURL=pr.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../../../src/lib/providers/verdicts/pr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../../../src/lib/providers/verdicts/pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,13 @@ export const stem = (file) => (file ?? '').replace(/^.*\//, '').replace(/\.ya?ml
|
|
|
7
7
|
export function answersTo(pipeline, name) {
|
|
8
8
|
return [pipeline.file, stem(pipeline.file), pipeline.name].some((key) => key?.toLowerCase() === name.toLowerCase());
|
|
9
9
|
}
|
|
10
|
+
// Whether a not-queued run's batch still waits: the run ahead of it goes, or ended under SETTLE_MS
|
|
11
|
+
// ago (Azure DevOps lists the batch's run seconds after it ends).
|
|
12
|
+
export function heldBack(run, now) {
|
|
13
|
+
if (run.state !== 'not-queued' || run.behind === undefined)
|
|
14
|
+
return false;
|
|
15
|
+
return run.behind.finished === null || now - Date.parse(run.behind.finished) < SETTLE_MS;
|
|
16
|
+
}
|
|
10
17
|
// The pipelines `--for` names, each answered to by exactly one; throws on a name no pipeline, or
|
|
11
18
|
// more than one, answers to.
|
|
12
19
|
export function pipelinesNamed(names, pipelines) {
|
|
@@ -38,8 +45,9 @@ export function releasedRuns(runs, releases) {
|
|
|
38
45
|
// trigger, so nothing left means nothing to wait for, at once. Without that (GitHub Actions), no run
|
|
39
46
|
// at all waits out the grace period first. A pipeline that should have run and hasn't, or whose
|
|
40
47
|
// trigger couldn't be read, waits out the grace period too (ADO can list a run ten minutes after
|
|
41
|
-
// the merge).
|
|
42
|
-
//
|
|
48
|
+
// the merge). One whose batch waits behind a run still going (`behind`) waits as long as that run
|
|
49
|
+
// does, and SETTLE_MS after (heldBack). Once a run has turned up, the rest of the merge's runs get SETTLE_MS (or the grace period,
|
|
50
|
+
// when shorter) to queue. With `only` (`--for` names), the outcome comes from those alone.
|
|
43
51
|
export function runsVerdict({ graceMs, mergedAt, now, only = null, runs, triggersKnown, }) {
|
|
44
52
|
const listed = runs.filter((r) => r.state !== 'not-triggered');
|
|
45
53
|
const named = (r) => (only ?? []).some((name) => answersTo(r.pipeline, name));
|
|
@@ -51,6 +59,8 @@ export function runsVerdict({ graceMs, mergedAt, now, only = null, runs, trigger
|
|
|
51
59
|
outcome = 'waiting-for-approval';
|
|
52
60
|
else if (has('queued') || has('running'))
|
|
53
61
|
outcome = 'waiting';
|
|
62
|
+
else if (watched.some((r) => heldBack(r, now)))
|
|
63
|
+
outcome = 'waiting';
|
|
54
64
|
else if ((has('not-queued') || has('unknown')) && age < graceMs)
|
|
55
65
|
outcome = 'waiting';
|
|
56
66
|
else if (watched.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../../src/lib/providers/verdicts/runs.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC;AAYpC,iGAAiG;AACjG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAmB,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAExG,kFAAkF;AAClF,2DAA2D;AAC3D,MAAM,UAAU,SAAS,CAAC,QAAkB,EAAE,IAAY;IACxD,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACtH,CAAC;AAED,iGAAiG;AACjG,6BAA6B;AAC7B,MAAM,UAAU,cAAc,CAAC,KAAwB,EAAE,SAA8B;IACrF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,KAAK,GAAG,SAAS;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACxB,IAAI,EAAE;aACN,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,KAAK,CAAC,MAAM,KAAK,CAAC;YAChB,CAAC,CAAC,SAAS,IAAI,yDAAyD,KAAK,EAAE;YAC/E,CAAC,CAAC,SAAS,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,wCAAwC,CACrG,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iGAAiG;AACjG,sEAAsE;AACtE,MAAM,UAAU,YAAY,CAC1B,IAA4B,EAC5B,QAAsD;IAEtD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QAC/G,OAAO,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,EAAE;AACF,qGAAqG;AACrG,qGAAqG;AACrG,gGAAgG;AAChG,iGAAiG;AACjG,
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../../src/lib/providers/verdicts/runs.ts"],"names":[],"mappings":"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"}
|
package/build/logins.js
CHANGED
|
@@ -4,13 +4,19 @@ import { loginText } from "./credentials.js";
|
|
|
4
4
|
// resolve its `login` inbox item (inbox.ts) and fire rules on the first.
|
|
5
5
|
// The credentials' onChange: records each change, until the daemon stops.
|
|
6
6
|
export function loginEvents({ log, stopped, store, }) {
|
|
7
|
-
return ({ account, error, kind, project }) => {
|
|
7
|
+
return ({ account, error, kind, organization, project }) => {
|
|
8
8
|
if (stopped())
|
|
9
9
|
return;
|
|
10
|
-
const data = {
|
|
10
|
+
const data = {
|
|
11
|
+
account: account.id,
|
|
12
|
+
command: account.command,
|
|
13
|
+
label: account.label,
|
|
14
|
+
...(organization === null ? {} : { organization }),
|
|
15
|
+
provider: account.provider,
|
|
16
|
+
};
|
|
11
17
|
if (kind === 'lost') {
|
|
12
18
|
store.appendEvent({ data: { ...data, error }, kind: 'provider.login-failed', project });
|
|
13
|
-
log.log('warn', loginText(account, project), { error });
|
|
19
|
+
log.log('warn', loginText(account, project, organization), { error });
|
|
14
20
|
}
|
|
15
21
|
else {
|
|
16
22
|
store.appendEvent({ data, kind: 'provider.login-restored', project });
|
|
@@ -18,15 +24,16 @@ export function loginEvents({ log, stopped, store, }) {
|
|
|
18
24
|
}
|
|
19
25
|
};
|
|
20
26
|
}
|
|
21
|
-
// Every `intervalMs`, each lost account is probed again, so its item resolves once
|
|
27
|
+
// Every `intervalMs`, each lost account is probed again, so its item resolves once the operator signs in,
|
|
22
28
|
// with nothing else asking that provider.
|
|
23
29
|
export function loginReprobe({ credentials, intervalMs, log, }) {
|
|
24
30
|
let timer;
|
|
25
31
|
let probing;
|
|
26
32
|
const pass = () => {
|
|
27
33
|
probing ??= (async () => {
|
|
28
|
-
|
|
29
|
-
|
|
34
|
+
// A machine token's spell is asked on its own organization, which a project check may have named.
|
|
35
|
+
for (const { account, organization, project } of credentials.lost()) {
|
|
36
|
+
const { error } = await credentials.probe(account.provider, project, { organization });
|
|
30
37
|
if (error !== null)
|
|
31
38
|
log.log('info', 'a lost login still fails', { account: account.id, error, provider: account.provider });
|
|
32
39
|
}
|
package/build/logins.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logins.js","sourceRoot":"","sources":["../src/logins.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,kGAAkG;AAClG,+FAA+F;AAC/F,yEAAyE;AAEzE,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,EAC1B,GAAG,EACH,OAAO,EACP,KAAK,GAKN;IACC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"logins.js","sourceRoot":"","sources":["../src/logins.ts"],"names":[],"mappings":"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"}
|