@on-par/factory-core 0.9.28-next.2 → 0.9.28-next.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blockers/declared-prerequisites.d.ts +4 -1
- package/dist/blockers/declared-prerequisites.d.ts.map +1 -1
- package/dist/blockers/declared-prerequisites.js +10 -5
- package/dist/blockers/declared-prerequisites.js.map +1 -1
- package/dist/checkers/app-smoke.d.ts.map +1 -1
- package/dist/checkers/app-smoke.js +4 -1
- package/dist/checkers/app-smoke.js.map +1 -1
- package/dist/checkers/evidence-plan.d.ts +2 -0
- package/dist/checkers/evidence-plan.d.ts.map +1 -1
- package/dist/checkers/evidence-plan.js +13 -6
- package/dist/checkers/evidence-plan.js.map +1 -1
- package/dist/checkers/evidence-selector.d.ts +2 -0
- package/dist/checkers/evidence-selector.d.ts.map +1 -1
- package/dist/checkers/evidence-selector.js +13 -10
- package/dist/checkers/evidence-selector.js.map +1 -1
- package/dist/checkers/evidence-workspace.d.ts +21 -0
- package/dist/checkers/evidence-workspace.d.ts.map +1 -0
- package/dist/checkers/evidence-workspace.js +118 -0
- package/dist/checkers/evidence-workspace.js.map +1 -0
- package/dist/checkers/index.js +1 -1
- package/dist/checkers/index.js.map +1 -1
- package/dist/checkers/internal-exports.d.ts +1 -0
- package/dist/checkers/internal-exports.d.ts.map +1 -1
- package/dist/checkers/internal-exports.js +1 -0
- package/dist/checkers/internal-exports.js.map +1 -1
- package/dist/checkers/resolve-commands.d.ts.map +1 -1
- package/dist/checkers/resolve-commands.js +5 -1
- package/dist/checkers/resolve-commands.js.map +1 -1
- package/dist/config/example.d.ts.map +1 -1
- package/dist/config/example.js +11 -2
- package/dist/config/example.js.map +1 -1
- package/dist/config/index.d.ts +20 -32
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +11 -30
- package/dist/config/index.js.map +1 -1
- package/dist/config/merge-policy.d.ts +36 -0
- package/dist/config/merge-policy.d.ts.map +1 -0
- package/dist/config/merge-policy.js +31 -0
- package/dist/config/merge-policy.js.map +1 -0
- package/dist/config/runtime-config-keys.d.ts.map +1 -1
- package/dist/config/runtime-config-keys.js +1 -0
- package/dist/config/runtime-config-keys.js.map +1 -1
- package/dist/config/tracker-section.d.ts +39 -0
- package/dist/config/tracker-section.d.ts.map +1 -0
- package/dist/config/tracker-section.js +31 -0
- package/dist/config/tracker-section.js.map +1 -0
- package/dist/environment/process-groups.d.ts +5 -0
- package/dist/environment/process-groups.d.ts.map +1 -1
- package/dist/environment/process-groups.js +19 -0
- package/dist/environment/process-groups.js.map +1 -1
- package/dist/events/queue-traits.d.ts +1 -1
- package/dist/events/queue-traits.d.ts.map +1 -1
- package/dist/events/queue-traits.js +5 -1
- package/dist/events/queue-traits.js.map +1 -1
- package/dist/filing/redact.d.ts +1 -0
- package/dist/filing/redact.d.ts.map +1 -1
- package/dist/filing/redact.js +1 -1
- package/dist/filing/redact.js.map +1 -1
- package/dist/harness/opencode-version.d.ts +2 -2
- package/dist/harness/opencode-version.d.ts.map +1 -1
- package/dist/harness/opencode-version.js +3 -3
- package/dist/harness/opencode-version.js.map +1 -1
- package/dist/internal.d.ts +11 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +11 -0
- package/dist/internal.js.map +1 -1
- package/dist/phases/check-evidence.d.ts.map +1 -1
- package/dist/phases/check-evidence.js +5 -1
- package/dist/phases/check-evidence.js.map +1 -1
- package/dist/phases/ship-approval.d.ts +17 -0
- package/dist/phases/ship-approval.d.ts.map +1 -0
- package/dist/phases/ship-approval.js +21 -0
- package/dist/phases/ship-approval.js.map +1 -0
- package/dist/phases/ship-branch-push.d.ts +17 -0
- package/dist/phases/ship-branch-push.d.ts.map +1 -0
- package/dist/phases/ship-branch-push.js +77 -0
- package/dist/phases/ship-branch-push.js.map +1 -0
- package/dist/phases/ship-ci-watch.d.ts +25 -0
- package/dist/phases/ship-ci-watch.d.ts.map +1 -0
- package/dist/phases/ship-ci-watch.js +53 -0
- package/dist/phases/ship-ci-watch.js.map +1 -0
- package/dist/phases/ship-evidence-comment.d.ts +12 -0
- package/dist/phases/ship-evidence-comment.d.ts.map +1 -0
- package/dist/phases/ship-evidence-comment.js +30 -0
- package/dist/phases/ship-evidence-comment.js.map +1 -0
- package/dist/phases/ship-existing-pr.d.ts +11 -0
- package/dist/phases/ship-existing-pr.d.ts.map +1 -0
- package/dist/phases/ship-existing-pr.js +36 -0
- package/dist/phases/ship-existing-pr.js.map +1 -0
- package/dist/phases/ship-finish.d.ts +15 -0
- package/dist/phases/ship-finish.d.ts.map +1 -0
- package/dist/phases/ship-finish.js +69 -0
- package/dist/phases/ship-finish.js.map +1 -0
- package/dist/phases/ship-git-detail.d.ts +31 -0
- package/dist/phases/ship-git-detail.d.ts.map +1 -0
- package/dist/phases/ship-git-detail.js +71 -0
- package/dist/phases/ship-git-detail.js.map +1 -0
- package/dist/phases/ship-git-remote.d.ts +51 -0
- package/dist/phases/ship-git-remote.d.ts.map +1 -0
- package/dist/phases/ship-git-remote.js +70 -0
- package/dist/phases/ship-git-remote.js.map +1 -0
- package/dist/phases/ship-git.d.ts +4 -79
- package/dist/phases/ship-git.d.ts.map +1 -1
- package/dist/phases/ship-git.js +2 -135
- package/dist/phases/ship-git.js.map +1 -1
- package/dist/phases/ship-open-pr.d.ts +19 -0
- package/dist/phases/ship-open-pr.d.ts.map +1 -0
- package/dist/phases/ship-open-pr.js +71 -0
- package/dist/phases/ship-open-pr.js.map +1 -0
- package/dist/phases/ship-options.d.ts +76 -0
- package/dist/phases/ship-options.d.ts.map +1 -0
- package/dist/phases/ship-options.js +4 -0
- package/dist/phases/ship-options.js.map +1 -0
- package/dist/phases/ship-pr-lookup.d.ts +8 -0
- package/dist/phases/ship-pr-lookup.d.ts.map +1 -0
- package/dist/phases/ship-pr-lookup.js +41 -0
- package/dist/phases/ship-pr-lookup.js.map +1 -0
- package/dist/phases/ship-recovery.d.ts +16 -0
- package/dist/phases/ship-recovery.d.ts.map +1 -0
- package/dist/phases/ship-recovery.js +81 -0
- package/dist/phases/ship-recovery.js.map +1 -0
- package/dist/phases/ship-reentry.d.ts +20 -0
- package/dist/phases/ship-reentry.d.ts.map +1 -0
- package/dist/phases/ship-reentry.js +47 -0
- package/dist/phases/ship-reentry.js.map +1 -0
- package/dist/phases/ship-types.d.ts +36 -0
- package/dist/phases/ship-types.d.ts.map +1 -0
- package/dist/phases/ship-types.js +2 -0
- package/dist/phases/ship-types.js.map +1 -0
- package/dist/phases/ship.d.ts +6 -113
- package/dist/phases/ship.d.ts.map +1 -1
- package/dist/phases/ship.js +55 -458
- package/dist/phases/ship.js.map +1 -1
- package/dist/queue/comment-rework-trigger.d.ts +24 -0
- package/dist/queue/comment-rework-trigger.d.ts.map +1 -0
- package/dist/queue/comment-rework-trigger.js +128 -0
- package/dist/queue/comment-rework-trigger.js.map +1 -0
- package/dist/queue/internal-exports.d.ts +2 -0
- package/dist/queue/internal-exports.d.ts.map +1 -1
- package/dist/queue/internal-exports.js +1 -0
- package/dist/queue/internal-exports.js.map +1 -1
- package/dist/queue/lane-discovery-interval.d.ts +6 -0
- package/dist/queue/lane-discovery-interval.d.ts.map +1 -0
- package/dist/queue/lane-discovery-interval.js +9 -0
- package/dist/queue/lane-discovery-interval.js.map +1 -0
- package/dist/queue/linear-queue-backend.d.ts +17 -0
- package/dist/queue/linear-queue-backend.d.ts.map +1 -0
- package/dist/queue/linear-queue-backend.js +42 -0
- package/dist/queue/linear-queue-backend.js.map +1 -0
- package/dist/queue/linear-queue-lifecycle.d.ts +62 -0
- package/dist/queue/linear-queue-lifecycle.d.ts.map +1 -0
- package/dist/queue/linear-queue-lifecycle.js +139 -0
- package/dist/queue/linear-queue-lifecycle.js.map +1 -0
- package/dist/queue/linear-queue.d.ts +51 -0
- package/dist/queue/linear-queue.d.ts.map +1 -0
- package/dist/queue/linear-queue.js +335 -0
- package/dist/queue/linear-queue.js.map +1 -0
- package/dist/queue/queue-backend.d.ts +11 -5
- package/dist/queue/queue-backend.d.ts.map +1 -1
- package/dist/queue/queue-backend.js +8 -3
- package/dist/queue/queue-backend.js.map +1 -1
- package/dist/queue/review-rework-trigger.d.ts +7 -2
- package/dist/queue/review-rework-trigger.d.ts.map +1 -1
- package/dist/queue/review-rework-trigger.js +12 -8
- package/dist/queue/review-rework-trigger.js.map +1 -1
- package/dist/reports/pr-body.d.ts.map +1 -1
- package/dist/reports/pr-body.js +18 -8
- package/dist/reports/pr-body.js.map +1 -1
- package/dist/run/ports.d.ts +10 -0
- package/dist/run/ports.d.ts.map +1 -1
- package/dist/run/ports.js +12 -0
- package/dist/run/ports.js.map +1 -1
- package/dist/run/pr-run-state.d.ts +99 -0
- package/dist/run/pr-run-state.d.ts.map +1 -0
- package/dist/run/pr-run-state.js +235 -0
- package/dist/run/pr-run-state.js.map +1 -0
- package/dist/run/review-rework-cap.d.ts +3 -1
- package/dist/run/review-rework-cap.d.ts.map +1 -1
- package/dist/run/review-rework-cap.js +2 -1
- package/dist/run/review-rework-cap.js.map +1 -1
- package/dist/run/review-rework.d.ts +10 -0
- package/dist/run/review-rework.d.ts.map +1 -1
- package/dist/run/review-rework.js +45 -15
- package/dist/run/review-rework.js.map +1 -1
- package/dist/run/state.d.ts +6 -4
- package/dist/run/state.d.ts.map +1 -1
- package/dist/run/state.js +8 -5
- package/dist/run/state.js.map +1 -1
- package/dist/utils/command-runner.d.ts.map +1 -1
- package/dist/utils/command-runner.js +4 -1
- package/dist/utils/command-runner.js.map +1 -1
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +4 -1
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/in-place.d.ts +24 -0
- package/dist/utils/in-place.d.ts.map +1 -0
- package/dist/utils/in-place.js +105 -0
- package/dist/utils/in-place.js.map +1 -0
- package/dist/work/index.d.ts +2 -2
- package/dist/work/index.d.ts.map +1 -1
- package/dist/work/index.js +4 -2
- package/dist/work/index.js.map +1 -1
- package/dist/work/linear-client.d.ts +21 -0
- package/dist/work/linear-client.d.ts.map +1 -0
- package/dist/work/linear-client.js +69 -0
- package/dist/work/linear-client.js.map +1 -0
- package/dist/work/linear-issue.d.ts +11 -0
- package/dist/work/linear-issue.d.ts.map +1 -0
- package/dist/work/linear-issue.js +69 -0
- package/dist/work/linear-issue.js.map +1 -0
- package/dist/work/linear-preflight.d.ts +21 -0
- package/dist/work/linear-preflight.d.ts.map +1 -0
- package/dist/work/linear-preflight.js +67 -0
- package/dist/work/linear-preflight.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// packages/core/src/queue/comment-rework-trigger.ts — a trusted `/factory rework <feedback>` PR comment queues a review rework on the same PR branch, once per comment id, counted against the review-rework cap (#3882, ADR-0128 trust).
|
|
2
|
+
import { defaultFactoryConfig } from '@on-par/factory-config';
|
|
3
|
+
import { countReviewReworkRuns, parkAtReviewReworkCap } from '../run/review-rework-cap.js';
|
|
4
|
+
import { factoryBranchIssue } from '../utils/index.js';
|
|
5
|
+
import { workKeyFromIssue } from '../work/work-key.js';
|
|
6
|
+
import { isTrustedApprover } from './approval.js';
|
|
7
|
+
import { IN_PROGRESS_LABEL, LANE_LABEL_PREFIX, PARKED_LABEL } from './github-queue.js';
|
|
8
|
+
import { createEnqueuers } from './github-queue-enqueue.js';
|
|
9
|
+
/** The feedback after `/factory rework` (rest of the first non-blank line plus later lines); null when the comment is not the command. */
|
|
10
|
+
export function parseReworkCommand(body) {
|
|
11
|
+
const lines = body.split(/\r?\n/);
|
|
12
|
+
const at = lines.findIndex((line) => line.trim() !== '');
|
|
13
|
+
if (at < 0)
|
|
14
|
+
return null;
|
|
15
|
+
const match = /^\/factory rework(?:\s+|$)/i.exec((lines[at] ?? '').trim());
|
|
16
|
+
if (!match)
|
|
17
|
+
return null;
|
|
18
|
+
const first = (lines[at] ?? '').trim().slice(match[0].length);
|
|
19
|
+
return [first, ...lines.slice(at + 1)].join('\n').trim();
|
|
20
|
+
}
|
|
21
|
+
const errorMessage = (err) => (err instanceof Error ? err.message : String(err));
|
|
22
|
+
async function pollPull(opts, pull, issue) {
|
|
23
|
+
const { github, queue, owner, repo, store } = opts;
|
|
24
|
+
const pending = (await github.listComments(pull.number)).filter((c) => parseReworkCommand(c.body) !== null && !store.has(c.id, 'comment'));
|
|
25
|
+
const trusted = [];
|
|
26
|
+
for (const comment of pending) {
|
|
27
|
+
const ok = await isTrustedApprover(comment.login, {
|
|
28
|
+
owner,
|
|
29
|
+
repo,
|
|
30
|
+
trustedApprovers: opts.trustedApprovers,
|
|
31
|
+
client: opts.permissions,
|
|
32
|
+
});
|
|
33
|
+
if (ok)
|
|
34
|
+
trusted.push(comment);
|
|
35
|
+
}
|
|
36
|
+
const newest = trusted.reduce((a, c) => (a === undefined || c.id > a.id ? c : a), undefined);
|
|
37
|
+
if (newest === undefined)
|
|
38
|
+
return null;
|
|
39
|
+
const reviewIds = trusted.map((c) => c.id);
|
|
40
|
+
const now = (opts.now ?? (() => new Date()))().toISOString();
|
|
41
|
+
const recordAll = (lane, extra) => {
|
|
42
|
+
for (const c of trusted) {
|
|
43
|
+
store.record({
|
|
44
|
+
reviewId: c.id,
|
|
45
|
+
source: 'comment',
|
|
46
|
+
pr: pull.number,
|
|
47
|
+
issue,
|
|
48
|
+
lane,
|
|
49
|
+
reviewer: c.login,
|
|
50
|
+
queuedAt: now,
|
|
51
|
+
...extra,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const result = (outcome, extra = {}) => ({
|
|
56
|
+
pr: pull.number,
|
|
57
|
+
issue,
|
|
58
|
+
outcome,
|
|
59
|
+
reviewIds,
|
|
60
|
+
reviewer: newest.login,
|
|
61
|
+
...extra,
|
|
62
|
+
});
|
|
63
|
+
if ((parseReworkCommand(newest.body) ?? '') === '') {
|
|
64
|
+
await github.postComment(pull.number, 'Factory rework: rejected — add the feedback after `/factory rework`.');
|
|
65
|
+
recordAll('', { cappedAt: now });
|
|
66
|
+
return result('skipped', { detail: 'no feedback' });
|
|
67
|
+
}
|
|
68
|
+
const labels = await queue.getIssueLabels({ owner, repo, issue_number: issue });
|
|
69
|
+
if (labels.includes(IN_PROGRESS_LABEL))
|
|
70
|
+
return result('skipped', { detail: 'claimed' });
|
|
71
|
+
if (labels.includes(PARKED_LABEL))
|
|
72
|
+
return result('skipped', { detail: 'parked' });
|
|
73
|
+
const lanes = labels.filter((l) => l.startsWith(LANE_LABEL_PREFIX)).map((l) => l.slice(LANE_LABEL_PREFIX.length));
|
|
74
|
+
if (lanes.length === 0)
|
|
75
|
+
return result('skipped', { detail: 'no lane label' });
|
|
76
|
+
if (lanes.length > 1)
|
|
77
|
+
return result('skipped', { detail: `several lane labels: ${lanes.join(', ')}` });
|
|
78
|
+
const lane = lanes[0] ?? '';
|
|
79
|
+
const cap = opts.maxRuns ?? defaultFactoryConfig.queue.max_review_rework_runs;
|
|
80
|
+
const key = workKeyFromIssue(issue);
|
|
81
|
+
const count = countReviewReworkRuns(store, key);
|
|
82
|
+
if (count >= cap) {
|
|
83
|
+
// Record first so a park that fails part-way is not commented on again by the next poll.
|
|
84
|
+
recordAll(lane, { cappedAt: now });
|
|
85
|
+
await parkAtReviewReworkCap({
|
|
86
|
+
queue,
|
|
87
|
+
owner,
|
|
88
|
+
repo,
|
|
89
|
+
issue: key,
|
|
90
|
+
pr: pull.number,
|
|
91
|
+
lane,
|
|
92
|
+
branch: pull.headRef,
|
|
93
|
+
cap,
|
|
94
|
+
count,
|
|
95
|
+
reviewIds,
|
|
96
|
+
source: 'comment',
|
|
97
|
+
publishComment: opts.publishParkComment,
|
|
98
|
+
});
|
|
99
|
+
await github.postComment(pull.number, `Factory rework: not queued — #${issue} has used its review-rework limit (${count}/${cap}, queue.max_review_rework_runs). The issue is parked.`);
|
|
100
|
+
return result('capped', { lane, cap, count });
|
|
101
|
+
}
|
|
102
|
+
const [res] = await createEnqueuers(queue, owner, repo).enqueue(lane, [issue]);
|
|
103
|
+
if (res === undefined || res.outcome === 'failed') {
|
|
104
|
+
return result('error', { lane, detail: res?.detail ?? 'enqueue returned nothing' });
|
|
105
|
+
}
|
|
106
|
+
recordAll(lane, {});
|
|
107
|
+
await github.postComment(pull.number, `Factory rework: queued #${issue} on lane '${lane}'. The next run reworks this comment's feedback on \`${pull.headRef}\` and pushes to this PR. No new PR is opened.`);
|
|
108
|
+
return result(res.outcome, { lane });
|
|
109
|
+
}
|
|
110
|
+
export async function pollCommentRework(opts) {
|
|
111
|
+
const results = [];
|
|
112
|
+
const pulls = await opts.github.listOpenPulls();
|
|
113
|
+
for (const pull of pulls) {
|
|
114
|
+
const issue = factoryBranchIssue(pull.headRef, opts.branchPrefix);
|
|
115
|
+
if (issue === null || pull.headRepo !== `${opts.owner}/${opts.repo}`)
|
|
116
|
+
continue;
|
|
117
|
+
try {
|
|
118
|
+
const result = await pollPull(opts, pull, issue);
|
|
119
|
+
if (result)
|
|
120
|
+
results.push(result);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
results.push({ pr: pull.number, issue, outcome: 'error', reviewIds: [], detail: errorMessage(err) });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return results;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=comment-rework-trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-rework-trigger.js","sourceRoot":"","sources":["../../src/queue/comment-rework-trigger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { createOctokitCollaboratorPermissionClient } from './approval.js';
|
|
2
2
|
export { claimIterateCommand, createFileIterateStore, createOctokitIterateGitHub, pollIterateCommands, } from './iterate-command.js';
|
|
3
|
+
export { parseReworkCommand, pollCommentRework } from './comment-rework-trigger.js';
|
|
4
|
+
export type { ReviewReworkSource } from './review-rework-trigger.js';
|
|
3
5
|
export { claimReviewRework, createFileReviewReworkStore, createOctokitReviewReworkGitHub, pollReviewRework, } from './review-rework-trigger.js';
|
|
4
6
|
export * from '../run/review-rework-cap.js';
|
|
5
7
|
export { allProvidersDown, allProvidersDownReleasePayload, PROVIDER_LEVEL_REASONS, stageBlocked, TIMED_BREAKER_REASONS, } from '../run/stage-blocked.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-exports.d.ts","sourceRoot":"","sources":["../../src/queue/internal-exports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yCAAyC,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,+BAA+B,EAC/B,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,8BAA8B,EAC9B,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACpF,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,cAAc,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"internal-exports.d.ts","sourceRoot":"","sources":["../../src/queue/internal-exports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yCAAyC,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,+BAA+B,EAC/B,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,8BAA8B,EAC9B,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACpF,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,cAAc,0BAA0B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Review/approval queue exports re-exported from internal.ts (keeps that file under its max-lines ceiling)
|
|
2
2
|
export { createOctokitCollaboratorPermissionClient } from './approval.js';
|
|
3
3
|
export { claimIterateCommand, createFileIterateStore, createOctokitIterateGitHub, pollIterateCommands, } from './iterate-command.js';
|
|
4
|
+
export { parseReworkCommand, pollCommentRework } from './comment-rework-trigger.js';
|
|
4
5
|
export { claimReviewRework, createFileReviewReworkStore, createOctokitReviewReworkGitHub, pollReviewRework, } from './review-rework-trigger.js';
|
|
5
6
|
export * from '../run/review-rework-cap.js';
|
|
6
7
|
export { allProvidersDown, allProvidersDownReleasePayload, PROVIDER_LEVEL_REASONS, stageBlocked, TIMED_BREAKER_REASONS, } from '../run/stage-blocked.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-exports.js","sourceRoot":"","sources":["../../src/queue/internal-exports.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,OAAO,EAAE,yCAAyC,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,+BAA+B,EAC/B,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,8BAA8B,EAC9B,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,cAAc,0BAA0B,CAAC,CAAC,wCAAwC"}
|
|
1
|
+
{"version":3,"file":"internal-exports.js","sourceRoot":"","sources":["../../src/queue/internal-exports.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,OAAO,EAAE,yCAAyC,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEpF,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,+BAA+B,EAC/B,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,8BAA8B,EAC9B,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,cAAc,0BAA0B,CAAC,CAAC,wCAAwC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FactoryConfig } from '../config/index.js';
|
|
2
|
+
/** Default wait between lane-discovery passes in a running factory run (#3920). */
|
|
3
|
+
export declare const DEFAULT_LANE_DISCOVERY_INTERVAL_MS = 60000;
|
|
4
|
+
/** Milliseconds between lane-discovery passes, from validated config (#3920). */
|
|
5
|
+
export declare function resolveLaneDiscoveryIntervalMs(config: Pick<FactoryConfig, 'queue'>): number;
|
|
6
|
+
//# sourceMappingURL=lane-discovery-interval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane-discovery-interval.d.ts","sourceRoot":"","sources":["../../src/queue/lane-discovery-interval.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,mFAAmF;AACnF,eAAO,MAAM,kCAAkC,QAAS,CAAC;AAEzD,iFAAiF;AACjF,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,MAAM,CAE3F"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// packages/core/src/queue/lane-discovery-interval.ts — how often a running `factory run` discovers new lanes (#3920).
|
|
2
|
+
import { defaultFactoryConfig } from '@on-par/factory-config';
|
|
3
|
+
/** Default wait between lane-discovery passes in a running factory run (#3920). */
|
|
4
|
+
export const DEFAULT_LANE_DISCOVERY_INTERVAL_MS = 60_000;
|
|
5
|
+
/** Milliseconds between lane-discovery passes, from validated config (#3920). */
|
|
6
|
+
export function resolveLaneDiscoveryIntervalMs(config) {
|
|
7
|
+
return config.queue?.discovery_interval_ms ?? defaultFactoryConfig.queue.discovery_interval_ms;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=lane-discovery-interval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane-discovery-interval.js","sourceRoot":"","sources":["../../src/queue/lane-discovery-interval.ts"],"names":[],"mappings":"AAAA,sHAAsH;AAEtH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAI9D,mFAAmF;AACnF,MAAM,CAAC,MAAM,kCAAkC,GAAG,MAAM,CAAC;AAEzD,iFAAiF;AACjF,MAAM,UAAU,8BAA8B,CAAC,MAAoC;IACjF,OAAO,MAAM,CAAC,KAAK,EAAE,qBAAqB,IAAI,oBAAoB,CAAC,KAAK,CAAC,qBAAqB,CAAC;AACjG,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { LinearTrackerConfig } from '../config/tracker-section.js';
|
|
2
|
+
import { type LinearQueueClient } from './linear-queue.js';
|
|
3
|
+
import { type LinearQueueLifecycleClient } from './linear-queue-lifecycle.js';
|
|
4
|
+
import type { QueueBackend } from './queue-backend.js';
|
|
5
|
+
export interface LinearQueueBackendOptions {
|
|
6
|
+
client: LinearQueueClient & LinearQueueLifecycleClient;
|
|
7
|
+
linear: LinearTrackerConfig;
|
|
8
|
+
warn: (msg: string) => void;
|
|
9
|
+
claimantId?: string;
|
|
10
|
+
leaseMs?: number;
|
|
11
|
+
now?: () => number;
|
|
12
|
+
defaultLane?: string;
|
|
13
|
+
}
|
|
14
|
+
/** The one `projects` key mapped to `ghRepo` (case-insensitive); null when none, throws when several. */
|
|
15
|
+
export declare function resolveLinearProjectForRepo(linear: LinearTrackerConfig, ghRepo: string): string | null;
|
|
16
|
+
export declare function createLinearQueueBackend(options: LinearQueueBackendOptions): QueueBackend;
|
|
17
|
+
//# sourceMappingURL=linear-queue-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-queue-backend.d.ts","sourceRoot":"","sources":["../../src/queue/linear-queue-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAA8B,KAAK,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC1G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,iBAAiB,GAAG,0BAA0B,CAAC;IACvD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,yGAAyG;AACzG,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAStG;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,YAAY,CAyBzF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { defaultClaimantId } from './github-queue.js';
|
|
2
|
+
import { createLinearQueue } from './linear-queue.js';
|
|
3
|
+
import { createLinearQueueLifecycle } from './linear-queue-lifecycle.js';
|
|
4
|
+
/** The one `projects` key mapped to `ghRepo` (case-insensitive); null when none, throws when several. */
|
|
5
|
+
export function resolveLinearProjectForRepo(linear, ghRepo) {
|
|
6
|
+
const want = ghRepo.toLowerCase();
|
|
7
|
+
const matches = Object.entries(linear.projects)
|
|
8
|
+
.filter(([, repo]) => repo.toLowerCase() === want)
|
|
9
|
+
.map(([project]) => project);
|
|
10
|
+
if (matches.length > 1) {
|
|
11
|
+
throw new Error(`tracker.linear.projects maps ${ghRepo} from more than one project: ${matches.join(', ')}`);
|
|
12
|
+
}
|
|
13
|
+
return matches[0] ?? null;
|
|
14
|
+
}
|
|
15
|
+
export function createLinearQueueBackend(options) {
|
|
16
|
+
const { client, linear, warn } = options;
|
|
17
|
+
const claimantId = options.claimantId ?? defaultClaimantId();
|
|
18
|
+
const queue = createLinearQueue({ client, linear, claimantId, defaultLane: options.defaultLane });
|
|
19
|
+
const life = createLinearQueueLifecycle({
|
|
20
|
+
client,
|
|
21
|
+
linear,
|
|
22
|
+
warn,
|
|
23
|
+
claimantId,
|
|
24
|
+
leaseMs: options.leaseMs,
|
|
25
|
+
now: options.now,
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
claimNext: async (lane) => {
|
|
29
|
+
const claim = await queue.claimNext(lane);
|
|
30
|
+
if (claim)
|
|
31
|
+
await life.heartbeat(claim.key);
|
|
32
|
+
return claim;
|
|
33
|
+
},
|
|
34
|
+
release: (key, outcome) => life.release(key, outcome),
|
|
35
|
+
heartbeat: life.heartbeat,
|
|
36
|
+
list: queue.list,
|
|
37
|
+
lanes: queue.lanes,
|
|
38
|
+
reap: life.reap,
|
|
39
|
+
pollBlockedParks: async () => [],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=linear-queue-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-queue-backend.js","sourceRoot":"","sources":["../../src/queue/linear-queue-backend.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAA0B,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAmC,MAAM,6BAA6B,CAAC;AAa1G,yGAAyG;AACzG,MAAM,UAAU,2BAA2B,CAAC,MAA2B,EAAE,MAAc;IACrF,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,gCAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,EAAE,CAAC;IAC7D,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAClG,MAAM,IAAI,GAAG,0BAA0B,CAAC;QACtC,MAAM;QACN,MAAM;QACN,IAAI;QACJ,UAAU;QACV,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,OAAO;QACL,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,KAAK;gBAAE,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC;QACrD,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type QueueReleaseOutcome } from './github-queue.js';
|
|
2
|
+
import type { LinearTrackerConfig } from '../config/tracker-section.js';
|
|
3
|
+
import { type WorkKey } from '../work/work-key.js';
|
|
4
|
+
export declare const LINEAR_LEASE_KIND = "factory-claim-lease";
|
|
5
|
+
export interface LinearClaimLease {
|
|
6
|
+
kind: typeof LINEAR_LEASE_KIND;
|
|
7
|
+
claimantId: string;
|
|
8
|
+
/** epoch ms */
|
|
9
|
+
expiresAt: number;
|
|
10
|
+
}
|
|
11
|
+
export interface LinearIssueLabelRef {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
}
|
|
15
|
+
export interface LinearClaimedIssue {
|
|
16
|
+
id: string;
|
|
17
|
+
identifier: string;
|
|
18
|
+
labels: LinearIssueLabelRef[];
|
|
19
|
+
/** The factory-owned lease attachment, when present; metadata is untrusted. */
|
|
20
|
+
lease?: {
|
|
21
|
+
attachmentId: string;
|
|
22
|
+
metadata: unknown;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface LinearQueueLifecycleClient {
|
|
26
|
+
findIssue(identifier: string): Promise<LinearClaimedIssue | null>;
|
|
27
|
+
/** Every issue in the mapped project carrying a factory lease attachment. */
|
|
28
|
+
listLeasedIssues(): Promise<LinearClaimedIssue[]>;
|
|
29
|
+
ensureLabel(name: string): Promise<string>;
|
|
30
|
+
addLabel(issueId: string, labelId: string): Promise<void>;
|
|
31
|
+
removeLabel(issueId: string, labelId: string): Promise<void>;
|
|
32
|
+
moveToState(issueId: string, stateName: string): Promise<void>;
|
|
33
|
+
addComment(issueId: string, body: string): Promise<void>;
|
|
34
|
+
/** Creates or replaces the factory lease attachment on the issue with this metadata. */
|
|
35
|
+
upsertLeaseAttachment(issueId: string, lease: LinearClaimLease): Promise<void>;
|
|
36
|
+
deleteAttachment(attachmentId: string): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export interface LinearStaleClaimRelease {
|
|
39
|
+
key: WorkKey;
|
|
40
|
+
claimantId: string;
|
|
41
|
+
expiresAt: number;
|
|
42
|
+
released: boolean;
|
|
43
|
+
outcome: 'released' | 'failed';
|
|
44
|
+
detail?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface LinearQueueLifecycle {
|
|
47
|
+
release(key: WorkKey, outcome?: QueueReleaseOutcome, reason?: string): Promise<void>;
|
|
48
|
+
heartbeat(key: WorkKey): Promise<boolean>;
|
|
49
|
+
reap(): Promise<LinearStaleClaimRelease[]>;
|
|
50
|
+
}
|
|
51
|
+
export interface LinearQueueLifecycleOptions {
|
|
52
|
+
client: LinearQueueLifecycleClient;
|
|
53
|
+
linear: LinearTrackerConfig;
|
|
54
|
+
/** Receives one line per failed Linear write; required so a failure is never silent. */
|
|
55
|
+
warn: (msg: string) => void;
|
|
56
|
+
claimantId?: string;
|
|
57
|
+
leaseMs?: number;
|
|
58
|
+
now?: () => number;
|
|
59
|
+
}
|
|
60
|
+
export declare function parseLinearClaimLease(metadata: unknown): LinearClaimLease | null;
|
|
61
|
+
export declare function createLinearQueueLifecycle(options: LinearQueueLifecycleOptions): LinearQueueLifecycle;
|
|
62
|
+
//# sourceMappingURL=linear-queue-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-queue-lifecycle.d.ts","sourceRoot":"","sources":["../../src/queue/linear-queue-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// packages/core/src/queue/linear-queue-lifecycle.ts — Linear queue release, park, lease heartbeat and reap (ADR-0173, #3893).
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { claimedByLabel, DEFAULT_CLAIM_LEASE_MS, defaultClaimantId, PARKED_LABEL, } from './github-queue.js';
|
|
4
|
+
import { toWorkKey } from '../work/work-key.js';
|
|
5
|
+
export const LINEAR_LEASE_KIND = 'factory-claim-lease';
|
|
6
|
+
const LeaseSchema = z.object({
|
|
7
|
+
kind: z.literal(LINEAR_LEASE_KIND),
|
|
8
|
+
claimantId: z.string().min(1),
|
|
9
|
+
expiresAt: z.number(),
|
|
10
|
+
});
|
|
11
|
+
export function parseLinearClaimLease(metadata) {
|
|
12
|
+
const parsed = LeaseSchema.safeParse(metadata);
|
|
13
|
+
return parsed.success ? parsed.data : null;
|
|
14
|
+
}
|
|
15
|
+
function messageOf(err) {
|
|
16
|
+
return err instanceof Error ? err.message : String(err);
|
|
17
|
+
}
|
|
18
|
+
export function createLinearQueueLifecycle(options) {
|
|
19
|
+
const { client, linear, warn } = options;
|
|
20
|
+
const claimantId = options.claimantId ?? defaultClaimantId();
|
|
21
|
+
const leaseMs = options.leaseMs ?? DEFAULT_CLAIM_LEASE_MS;
|
|
22
|
+
const now = options.now ?? Date.now;
|
|
23
|
+
const me = claimedByLabel(claimantId);
|
|
24
|
+
let lastError;
|
|
25
|
+
async function attempt(op, identifier, fn) {
|
|
26
|
+
try {
|
|
27
|
+
await fn();
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
lastError = messageOf(err);
|
|
32
|
+
warn(`linear queue: ${op} on ${identifier} failed: ${lastError}`);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function freeClaim(issue, claimLabel, leaseAttachmentId) {
|
|
37
|
+
let ok = true;
|
|
38
|
+
const label = issue.labels.find((l) => l.name === claimLabel);
|
|
39
|
+
if (label)
|
|
40
|
+
ok = (await attempt('claim label removal', issue.identifier, () => client.removeLabel(issue.id, label.id))) && ok;
|
|
41
|
+
if (leaseAttachmentId !== undefined) {
|
|
42
|
+
ok = (await attempt('lease removal', issue.identifier, () => client.deleteAttachment(leaseAttachmentId))) && ok;
|
|
43
|
+
}
|
|
44
|
+
return ok;
|
|
45
|
+
}
|
|
46
|
+
async function release(key, outcome = 'queued', reason) {
|
|
47
|
+
let issue;
|
|
48
|
+
try {
|
|
49
|
+
issue = await client.findIssue(key);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
warn(`linear queue: release of ${key}: lookup failed: ${messageOf(err)}`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!issue) {
|
|
56
|
+
warn(`linear queue: release of ${key}: issue not found`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const target = issue;
|
|
60
|
+
const ownLease = parseLinearClaimLease(target.lease?.metadata)?.claimantId === claimantId;
|
|
61
|
+
const hasLabel = target.labels.some((l) => l.name === me);
|
|
62
|
+
if (!ownLease && !hasLabel)
|
|
63
|
+
return;
|
|
64
|
+
await freeClaim(target, me, ownLease ? target.lease?.attachmentId : undefined);
|
|
65
|
+
switch (outcome) {
|
|
66
|
+
case 'queued':
|
|
67
|
+
await attempt('move to ready', key, () => client.moveToState(target.id, linear.states.ready));
|
|
68
|
+
break;
|
|
69
|
+
case 'parked': {
|
|
70
|
+
await attempt('parked label', key, async () => {
|
|
71
|
+
const labelId = await client.ensureLabel(PARKED_LABEL);
|
|
72
|
+
await client.addLabel(target.id, labelId);
|
|
73
|
+
});
|
|
74
|
+
const body = reason?.trim() ? `Parked by the factory: ${reason}` : 'Parked by the factory (no reason given).';
|
|
75
|
+
await attempt('park comment', key, () => client.addComment(target.id, body));
|
|
76
|
+
await attempt('move to parked', key, () => client.moveToState(target.id, linear.states.parked));
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'done':
|
|
80
|
+
break;
|
|
81
|
+
default: {
|
|
82
|
+
const _never = outcome;
|
|
83
|
+
return _never;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async function heartbeat(key) {
|
|
88
|
+
let issue;
|
|
89
|
+
try {
|
|
90
|
+
issue = await client.findIssue(key);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
warn(`linear queue: heartbeat of ${key}: lookup failed: ${messageOf(err)}`);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
if (!issue || !issue.labels.some((l) => l.name === me))
|
|
97
|
+
return false;
|
|
98
|
+
const target = issue;
|
|
99
|
+
await attempt('lease renew', key, () => client.upsertLeaseAttachment(target.id, { kind: LINEAR_LEASE_KIND, claimantId, expiresAt: now() + leaseMs }));
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
async function reap() {
|
|
103
|
+
let issues;
|
|
104
|
+
try {
|
|
105
|
+
issues = await client.listLeasedIssues();
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
warn(`linear queue: reap listing failed: ${messageOf(err)}`);
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
const rows = [];
|
|
112
|
+
for (const issue of issues) {
|
|
113
|
+
if (!issue.lease)
|
|
114
|
+
continue;
|
|
115
|
+
const lease = parseLinearClaimLease(issue.lease.metadata);
|
|
116
|
+
if (!lease) {
|
|
117
|
+
warn(`linear queue: reap of ${issue.identifier}: malformed lease attachment`);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (lease.expiresAt > now())
|
|
121
|
+
continue;
|
|
122
|
+
lastError = undefined;
|
|
123
|
+
const freed = await freeClaim(issue, claimedByLabel(lease.claimantId), issue.lease.attachmentId);
|
|
124
|
+
const moved = await attempt('move to ready', issue.identifier, () => client.moveToState(issue.id, linear.states.ready));
|
|
125
|
+
const ok = freed && moved;
|
|
126
|
+
rows.push({
|
|
127
|
+
key: toWorkKey(issue.identifier),
|
|
128
|
+
claimantId: lease.claimantId,
|
|
129
|
+
expiresAt: lease.expiresAt,
|
|
130
|
+
released: ok,
|
|
131
|
+
outcome: ok ? 'released' : 'failed',
|
|
132
|
+
...(ok ? {} : { detail: lastError }),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return rows;
|
|
136
|
+
}
|
|
137
|
+
return { release, heartbeat, reap };
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=linear-queue-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-queue-lifecycle.js","sourceRoot":"","sources":["../../src/queue/linear-queue-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { LinearTrackerConfig } from '../config/tracker-section.js';
|
|
2
|
+
import type { QueueBackend } from './queue-backend.js';
|
|
3
|
+
import type { LinearQueueLifecycleClient } from './linear-queue-lifecycle.js';
|
|
4
|
+
export interface LinearQueueLabel {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
/** Parent label (group) name. */
|
|
8
|
+
group?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface LinearQueueIssue {
|
|
11
|
+
id: string;
|
|
12
|
+
identifier: string;
|
|
13
|
+
priority: number;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
stateType: string;
|
|
16
|
+
labels: LinearQueueLabel[];
|
|
17
|
+
}
|
|
18
|
+
export interface LinearQueueClient {
|
|
19
|
+
/** Issues in the mapped project, in the ready state, carrying the ready label. Rejects on any API error. */
|
|
20
|
+
listCandidates(): Promise<LinearQueueIssue[]>;
|
|
21
|
+
/** Fresh label names on one issue. */
|
|
22
|
+
issueLabels(issueId: string): Promise<string[]>;
|
|
23
|
+
/** Id of the team label `name`, creating it when missing. */
|
|
24
|
+
ensureLabel(name: string): Promise<string>;
|
|
25
|
+
addLabel(issueId: string, labelId: string): Promise<void>;
|
|
26
|
+
removeLabel(issueId: string, labelId: string): Promise<void>;
|
|
27
|
+
/** Moves the issue to the team workflow state named `stateName`. */
|
|
28
|
+
moveToState(issueId: string, stateName: string): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export type LinearQueue = Pick<QueueBackend, 'list' | 'claimNext' | 'lanes'>;
|
|
31
|
+
export interface LinearQueueOptions {
|
|
32
|
+
client: LinearQueueClient;
|
|
33
|
+
linear: LinearTrackerConfig;
|
|
34
|
+
claimantId?: string;
|
|
35
|
+
defaultLane?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare const LINEAR_DEFAULT_LANE = "default";
|
|
38
|
+
export declare const LINEAR_LEASE_ATTACHMENT_URL = "https://github.com/on-par/software-factory#claim-lease";
|
|
39
|
+
export declare function isLinearCandidate(issue: LinearQueueIssue, readyLabel: string): boolean;
|
|
40
|
+
export declare function linearLaneOf(issue: LinearQueueIssue, laneLabelGroup: string, defaultLane?: string): string;
|
|
41
|
+
export declare function compareLinearCandidates(a: LinearQueueIssue, b: LinearQueueIssue): number;
|
|
42
|
+
export declare function createLinearQueue(options: LinearQueueOptions): LinearQueue;
|
|
43
|
+
export declare function createLinearQueueGraphqlClient(opts: {
|
|
44
|
+
apiKey: string;
|
|
45
|
+
linear: LinearTrackerConfig;
|
|
46
|
+
project: string;
|
|
47
|
+
fetch?: typeof globalThis.fetch;
|
|
48
|
+
endpoint?: string;
|
|
49
|
+
timeoutMs?: number;
|
|
50
|
+
}): LinearQueueClient & LinearQueueLifecycleClient;
|
|
51
|
+
//# sourceMappingURL=linear-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-queue.d.ts","sourceRoot":"","sources":["../../src/queue/linear-queue.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAwC,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAGpH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AACD,MAAM,WAAW,iBAAiB;IAChC,4GAA4G;IAC5G,cAAc,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC9C,sCAAsC;IACtC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,6DAA6D;IAC7D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,oEAAoE;IACpE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AACD,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,CAAC;AAC7E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,2BAA2B,2DAA2D,CAAC;AAMpG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQtF;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,gBAAgB,EACvB,cAAc,EAAE,MAAM,EACtB,WAAW,GAAE,MAA4B,GACxC,MAAM,CAER;AAaD,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAYxF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CA2C1E;AA0FD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,iBAAiB,GAAG,0BAA0B,CAwKjD"}
|