@detergent-software/conductor 1.0.0-dev.9 → 1.0.1-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.
Files changed (104) hide show
  1. package/CHANGELOG.md +305 -0
  2. package/README.md +277 -24
  3. package/build/brief-cli.js +68 -0
  4. package/build/brief-cli.js.map +1 -0
  5. package/build/brief.js +211 -0
  6. package/build/brief.js.map +1 -0
  7. package/build/broker-cli.js +126 -0
  8. package/build/broker-cli.js.map +1 -0
  9. package/build/broker.js +154 -0
  10. package/build/broker.js.map +1 -0
  11. package/build/cli.js +442 -132
  12. package/build/cli.js.map +1 -1
  13. package/build/conditions.js +15 -8
  14. package/build/conditions.js.map +1 -1
  15. package/build/config.js +26 -3
  16. package/build/config.js.map +1 -1
  17. package/build/console.js +225 -0
  18. package/build/console.js.map +1 -0
  19. package/build/daemon.js +136 -5
  20. package/build/daemon.js.map +1 -1
  21. package/build/events.js +2 -1
  22. package/build/events.js.map +1 -1
  23. package/build/help.js +448 -0
  24. package/build/help.js.map +1 -0
  25. package/build/history.js +637 -0
  26. package/build/history.js.map +1 -0
  27. package/build/inbox.js +117 -18
  28. package/build/inbox.js.map +1 -1
  29. package/build/manager.js +118 -43
  30. package/build/manager.js.map +1 -1
  31. package/build/notes.js +27 -43
  32. package/build/notes.js.map +1 -1
  33. package/build/notify.js +32 -3
  34. package/build/notify.js.map +1 -1
  35. package/build/overrides.js +83 -0
  36. package/build/overrides.js.map +1 -0
  37. package/build/paths.js +10 -1
  38. package/build/paths.js.map +1 -1
  39. package/build/profile.js +68 -2
  40. package/build/profile.js.map +1 -1
  41. package/build/queue.js +183 -0
  42. package/build/queue.js.map +1 -0
  43. package/build/registry.js +17 -10
  44. package/build/registry.js.map +1 -1
  45. package/build/rule-actions.js +444 -0
  46. package/build/rule-actions.js.map +1 -0
  47. package/build/rule-input.js +17 -0
  48. package/build/rule-input.js.map +1 -0
  49. package/build/rules-service.js +402 -0
  50. package/build/rules-service.js.map +1 -0
  51. package/build/rules.js +850 -0
  52. package/build/rules.js.map +1 -0
  53. package/build/scheduler.js +293 -0
  54. package/build/scheduler.js.map +1 -0
  55. package/build/serve.js +51 -0
  56. package/build/serve.js.map +1 -0
  57. package/build/server.js +244 -7
  58. package/build/server.js.map +1 -1
  59. package/build/spend.js +42 -0
  60. package/build/spend.js.map +1 -1
  61. package/build/store.js +266 -12
  62. package/build/store.js.map +1 -1
  63. package/build/trackers.js +15 -0
  64. package/build/trackers.js.map +1 -0
  65. package/build/upgrade.js +16 -14
  66. package/build/upgrade.js.map +1 -1
  67. package/build/wait.js +3 -9
  68. package/build/wait.js.map +1 -1
  69. package/build/watchers/ado-api.js +55 -0
  70. package/build/watchers/ado-api.js.map +1 -0
  71. package/build/watchers/ado.js +60 -52
  72. package/build/watchers/ado.js.map +1 -1
  73. package/build/watchers/boards-brief.js +63 -0
  74. package/build/watchers/boards-brief.js.map +1 -0
  75. package/build/watchers/boards-queue.js +120 -0
  76. package/build/watchers/boards-queue.js.map +1 -0
  77. package/build/watchers/boards-writes.js +83 -0
  78. package/build/watchers/boards-writes.js.map +1 -0
  79. package/build/watchers/boards.js +271 -0
  80. package/build/watchers/boards.js.map +1 -0
  81. package/build/watchers/conflicts.js +132 -0
  82. package/build/watchers/conflicts.js.map +1 -0
  83. package/build/watchers/github.js +5 -2
  84. package/build/watchers/github.js.map +1 -1
  85. package/build/watchers/index.js +21 -7
  86. package/build/watchers/index.js.map +1 -1
  87. package/build/watchers/linear-api.js +55 -0
  88. package/build/watchers/linear-api.js.map +1 -0
  89. package/build/watchers/linear-labels.js +43 -0
  90. package/build/watchers/linear-labels.js.map +1 -0
  91. package/build/watchers/linear-queue.js +96 -0
  92. package/build/watchers/linear-queue.js.map +1 -0
  93. package/build/watchers/linear.js +18 -16
  94. package/build/watchers/linear.js.map +1 -1
  95. package/build/watchers/source.js +3 -3
  96. package/build/watchers/source.js.map +1 -1
  97. package/build/why.js +78 -0
  98. package/build/why.js.map +1 -0
  99. package/mod/.claude-plugin/plugin.json +1 -1
  100. package/mod/README.md +2 -2
  101. package/mod/hooks/model.ts +135 -8
  102. package/mod/hooks/register.tsx +219 -19
  103. package/mod/types/index.d.ts +6 -0
  104. package/package.json +1 -1
@@ -0,0 +1,83 @@
1
+ import { z } from 'zod';
2
+ import { ConductorError } from "../errors.js";
3
+ import { NotePostError } from "../notes.js";
4
+ import { adoMessage, boardsAsk, expectOk, requireBoard, tagsOf, workItemId } from "./boards.js";
5
+ // The conductor's writes to ADO Boards: phase notes as discussion comments, and a rule's tag edit.
6
+ // Neither takes from the watchers' budget, as Linear's writes don't.
7
+ const created = z.looseObject({ id: z.number() });
8
+ // A note as a markdown discussion comment. A refused request (4xx, or 203, ADO's sign-in page for
9
+ // a token it doesn't take) posted nothing; a lost answer or a 5xx may have posted it.
10
+ export function boardsNotes(options = {}) {
11
+ return {
12
+ comment: async (item, body, profile) => {
13
+ const board = requireBoard(profile);
14
+ const id = itemId(item, board, (message) => new NotePostError(message, 'no'));
15
+ const ask = boardsAsk(options, board, null);
16
+ let answer;
17
+ try {
18
+ answer = await ask(`wit/workItems/${id}/comments?format=markdown`, { body: { text: body }, method: 'POST', version: '7.1-preview.4' });
19
+ }
20
+ catch (error) {
21
+ const message = error instanceof Error ? error.message : String(error);
22
+ // No az token: nothing was sent.
23
+ if (error instanceof ConductorError)
24
+ throw new NotePostError(message, 'no', error.details);
25
+ throw new NotePostError(`Azure DevOps unreachable: ${message}`, 'unknown');
26
+ }
27
+ if (answer.status === 203 || (answer.status >= 400 && answer.status < 500)) {
28
+ throw new NotePostError(`Azure DevOps refused the comment on ${item} (${answer.status}${adoMessage(answer.body)})`, 'no');
29
+ }
30
+ const comment = answer.status >= 200 && answer.status < 300 ? created.safeParse(answer.body).data : undefined;
31
+ if (!comment)
32
+ throw new NotePostError(`Azure DevOps' answer to the comment on ${item} didn't read (${answer.status})`, 'unknown');
33
+ return { id: String(comment.id), url: `${board.base}/_workitems/edit/${id}` };
34
+ },
35
+ };
36
+ }
37
+ const tagged = z.looseObject({ fields: z.record(z.string(), z.unknown()), rev: z.number() });
38
+ // A tag added to or removed from a work item: a patch of `System.Tags` alone, refused by ADO when
39
+ // the item changed since it was read (`test /rev`), so a concurrent edit isn't overwritten.
40
+ export function boardsLabels(options = {}) {
41
+ return {
42
+ label: async (item, label, op, profile) => {
43
+ const board = requireBoard(profile);
44
+ const id = itemId(item, board, (message) => new ConductorError(message));
45
+ const ask = boardsAsk(options, board, null);
46
+ const read = await readTags(ask, id, item);
47
+ const has = read.tags.some((t) => t.toLowerCase() === label.toLowerCase());
48
+ if (has === (op === 'add'))
49
+ return 'already';
50
+ const tags = op === 'add' ? [...read.tags, label] : read.tags.filter((t) => t.toLowerCase() !== label.toLowerCase());
51
+ // `add` on System.Tags merges into the tags there (removing nothing), so a list that replaces
52
+ // them is a `replace`, which needs the field to exist.
53
+ const patch = [
54
+ { op: 'test', path: '/rev', value: read.rev },
55
+ { op: read.tags.length > 0 ? 'replace' : 'add', path: '/fields/System.Tags', value: tags.join('; ') },
56
+ ];
57
+ const answer = await ask(`wit/workitems/${id}`, { body: patch, contentType: 'application/json-patch+json', method: 'PATCH' });
58
+ const failed = `Azure DevOps didn't ${op} the tag "${label}" on ${item}`;
59
+ if (answer.status < 200 || answer.status > 299)
60
+ throw new ConductorError(`${failed} (${answer.status}${adoMessage(answer.body)})`);
61
+ // A patch ADO takes without changing anything still answers 200, so the answer's tags decide.
62
+ const after = tagged.safeParse(answer.body).data;
63
+ const now = tagsOf(after?.fields['System.Tags']).some((t) => t.toLowerCase() === label.toLowerCase());
64
+ if (!after || now !== (op === 'add'))
65
+ throw new ConductorError(`${failed}: its tags are "${String(after?.fields['System.Tags'] ?? '')}"`);
66
+ return op === 'add' ? 'added' : 'removed';
67
+ },
68
+ };
69
+ }
70
+ function itemId(item, board, error) {
71
+ const id = workItemId(item, board);
72
+ if (id === null)
73
+ throw error(`${item} isn't an item of the board keyed ${board.key}, such as ${board.key}-1234`);
74
+ return id;
75
+ }
76
+ async function readTags(ask, id, item) {
77
+ const answer = await ask(`wit/workitems/${id}?fields=System.Tags`);
78
+ if (answer.status === 404)
79
+ throw new ConductorError(`Azure DevOps Boards has no work item ${id} (${item})`);
80
+ const w = tagged.parse(expectOk(answer, `work item ${id}`));
81
+ return { rev: w.rev, tags: tagsOf(w.fields['System.Tags']) };
82
+ }
83
+ //# sourceMappingURL=boards-writes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boards-writes.js","sourceRoot":"","sources":["../../src/watchers/boards-writes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,271 @@
1
+ import { z } from 'zod';
2
+ import { ConductorError } from "../errors.js";
3
+ import { notePrefixes } from "../profile.js";
4
+ import { adoRequest, azToken } from "./ado-api.js";
5
+ import { approvalAfterPlan, phaseOf } from "./linear.js";
6
+ import { perWait, spend, WaitProblem } from "./source.js";
7
+ // State names to types for the Scrum, Agile, Basic and CMMI processes; a profile adds its own.
8
+ const BUILT_IN_STATES = {
9
+ active: 'started',
10
+ approved: 'unstarted',
11
+ closed: 'completed',
12
+ committed: 'started',
13
+ doing: 'started',
14
+ done: 'completed',
15
+ 'in progress': 'started',
16
+ new: 'unstarted',
17
+ proposed: 'unstarted',
18
+ removed: 'canceled',
19
+ resolved: 'started',
20
+ 'to do': 'unstarted',
21
+ };
22
+ export const OPEN_TYPES = new Set(['backlog', 'started', 'unstarted']);
23
+ export const CLOSED_TYPES = new Set(['canceled', 'completed']);
24
+ // ADO's own message in an error answer, as ": <message>", or nothing.
25
+ export function adoMessage(body) {
26
+ const message = z.looseObject({ message: z.string() }).safeParse(body).data?.message;
27
+ return message ? `: ${message}` : '';
28
+ }
29
+ // The profile's board, or null when its tracker isn't ADO Boards.
30
+ export function boardOf(profile) {
31
+ if (profile?.tracker.kind !== 'ado-boards')
32
+ return null;
33
+ const { tracker } = profile;
34
+ const organization = (tracker.organization ?? profile.codeHost.organization).replace(/\/+$/, '');
35
+ const project = tracker.project ?? profile.codeHost.project;
36
+ return {
37
+ areaRoot: tracker.areaRoot ?? project,
38
+ base: `${organization}/${encodeURIComponent(project)}`,
39
+ humanLabel: tracker.humanLabel,
40
+ key: tracker.key,
41
+ organization,
42
+ priority: tracker.priority,
43
+ project,
44
+ query: tracker.query,
45
+ states: Object.fromEntries(Object.entries(tracker.states).map(([name, type]) => [name.toLowerCase(), type])),
46
+ };
47
+ }
48
+ export function boardsAsk({ fetch: fetcher = globalThis.fetch, token = azToken() }, board, budget) {
49
+ return async (path, { organization = false, version = '7.1', ...init } = {}) => {
50
+ if (budget)
51
+ spend(budget);
52
+ const url = `${organization ? board.organization : board.base}/_apis/${path}${path.includes('?') ? '&' : '?'}api-version=${version}`;
53
+ return adoRequest(fetcher, token, url, { ...init, ...(budget ? { onRetry: () => spend(budget) } : {}) });
54
+ };
55
+ }
56
+ // A comment's text: markdown as it is, the web UI's HTML as plain lines.
57
+ export function commentText(text, format) {
58
+ if (!text)
59
+ return '';
60
+ return format?.toLowerCase() === 'html' ? htmlText(text) : text;
61
+ }
62
+ // An answer that has to be 2xx, else an Error naming what was asked: a WaitProblem for a 400 or
63
+ // 404, which asking again won't change (a project or item ADO doesn't have).
64
+ export function expectOk(answer, what) {
65
+ if (answer.status >= 200 && answer.status <= 299)
66
+ return answer.body;
67
+ const message = `Azure DevOps answered ${answer.status} for ${what}${adoMessage(answer.body)}`;
68
+ throw answer.status === 400 || answer.status === 404 ? new WaitProblem(message) : new Error(message);
69
+ }
70
+ // HTML to the text a reader sees: block ends and <br> as new lines, tags dropped, entities decoded.
71
+ export function htmlText(html) {
72
+ return html
73
+ .replace(/<br\s*\/?>/gi, '\n')
74
+ .replace(/<\/(?:blockquote|div|h[1-6]|li|p|pre|tr)>/gi, '\n')
75
+ .replace(/<[^>]*>/g, '')
76
+ .replace(/&nbsp;/g, ' ')
77
+ .replace(/&lt;/g, '<')
78
+ .replace(/&gt;/g, '>')
79
+ .replace(/&quot;/g, '"')
80
+ .replace(/&#(\d+);/g, (_, code) => String.fromCodePoint(Number(code)))
81
+ .replace(/&amp;/g, '&');
82
+ }
83
+ // The state's type, by the profile's map, then the built-in one; null for a state neither knows,
84
+ // which is neither open nor closed, so such an item is never launched or retired.
85
+ export function stateType(state, board) {
86
+ const name = state.toLowerCase();
87
+ return board.states[name] ?? BUILT_IN_STATES[name] ?? null;
88
+ }
89
+ // `System.Tags` ("human; docs") as a list.
90
+ export function tagsOf(tags) {
91
+ return typeof tags === 'string'
92
+ ? tags
93
+ .split(';')
94
+ .map((t) => t.trim())
95
+ .filter((t) => t !== '')
96
+ : [];
97
+ }
98
+ // The work item id of `CAD-1234` on the board keyed CAD, or null for another key.
99
+ export function workItemId(item, board) {
100
+ const match = /^([A-Za-z][A-Za-z0-9]*)-(\d+)$/.exec(item);
101
+ return match?.[1]?.toUpperCase() === board.key && match[2] ? Number(match[2]) : null;
102
+ }
103
+ const BATCH = 200;
104
+ // The work items with these fields (or all of them and their relations, with `relations`), in
105
+ // batches of 200. An id ADO doesn't have is left out.
106
+ export async function readWorkItems(ask, ids, { fields, relations = false }) {
107
+ const found = [];
108
+ for (let at = 0; at < ids.length; at += BATCH) {
109
+ const batch = ids.slice(at, at + BATCH);
110
+ // ADO takes either fields or an expand, not both.
111
+ const body = { errorPolicy: 'Omit', ids: batch, ...(relations ? { $expand: 'Relations' } : { fields }) };
112
+ const answer = expectOk(await ask('wit/workitemsbatch', { body, method: 'POST' }), 'wit/workitemsbatch');
113
+ found.push(...z.object({ value: z.array(workItem.nullable()) }).parse(answer).value.flatMap((w) => (w ? [w] : [])));
114
+ }
115
+ return found;
116
+ }
117
+ export const workItem = z.looseObject({
118
+ fields: z.record(z.string(), z.unknown()),
119
+ id: z.number(),
120
+ relations: z.array(z.looseObject({ rel: z.string(), url: z.string() })).nullish(),
121
+ rev: z.number(),
122
+ });
123
+ const commentPage = z.looseObject({
124
+ comments: z.array(z.looseObject({
125
+ createdBy: z.looseObject({ id: z.string() }).nullish(),
126
+ createdDate: z.string(),
127
+ format: z.string().nullish(),
128
+ id: z.number(),
129
+ isDeleted: z.boolean().optional(),
130
+ text: z.string().nullish(),
131
+ })),
132
+ continuationToken: z.string().nullish(),
133
+ });
134
+ const connection = z.looseObject({ authenticatedUser: z.looseObject({ id: z.string() }) });
135
+ // A work item's discussion comments, oldest first, without deleted ones.
136
+ export async function readComments(ask, id) {
137
+ const comments = [];
138
+ for (let first = true, token = null; first || token; first = false) {
139
+ const path = `wit/workItems/${id}/comments?$top=200${token ? `&continuationToken=${encodeURIComponent(token)}` : ''}`;
140
+ const page = commentPage.parse(expectOk(await ask(path, { version: '7.1-preview.4' }), `the comments of work item ${id}`));
141
+ for (const c of page.comments) {
142
+ if (!c.isDeleted)
143
+ comments.push({ authorId: c.createdBy?.id ?? null, body: commentText(c.text, c.format), createdAt: c.createdDate });
144
+ }
145
+ token = page.continuationToken ?? null;
146
+ }
147
+ return comments;
148
+ }
149
+ // The az login's identity, whose `approve` / `revise:` counts.
150
+ export async function readViewer(ask) {
151
+ return connection.parse(expectOk(await ask('connectionData', { organization: true, version: '7.1-preview' }), 'connectionData')).authenticatedUser.id;
152
+ }
153
+ const WAIT_FIELDS = ['System.Id', 'System.Rev', 'System.State', 'System.Tags', 'System.CommentCount'];
154
+ // The approval and item waits on Boards items, for the ADO source. Each pass reads every waited
155
+ // item of a board in one batch (state, tags, rev, comment count), and reads an item's comments only
156
+ // when a wait needs them and they changed since the last read. State lives in memory.
157
+ export function boardsWaits(options = {}) {
158
+ const boards = new Map();
159
+ return {
160
+ check: async (waits, budget, outcomes) => {
161
+ const byBoard = new Map();
162
+ for (const wait of waits) {
163
+ const c = wait.condition;
164
+ if ((c.kind !== 'approval' && c.kind !== 'item') || c.tracker !== 'ado-boards')
165
+ continue;
166
+ const board = boardOf(wait.profile);
167
+ if (!board) {
168
+ outcomes.set(wait.id, { error: "the project's profile has no ADO Boards tracker" });
169
+ continue;
170
+ }
171
+ // By ADO project and key: two conducted projects can share an ADO project.
172
+ const at = `${board.base} ${board.key}`;
173
+ const group = byBoard.get(at) ?? { board, waits: [] };
174
+ group.waits.push(wait);
175
+ byBoard.set(at, group);
176
+ }
177
+ for (const [base, group] of byBoard) {
178
+ try {
179
+ await checkBoard(base, group, budget, outcomes);
180
+ }
181
+ catch (error) {
182
+ // A board ADO refuses (a 400 or 404: a project or item it doesn't have) is a problem with
183
+ // its waits alone, so the PR and run waits of the same pass go on.
184
+ if (!(error instanceof WaitProblem))
185
+ throw error;
186
+ for (const wait of group.waits)
187
+ if (!outcomes.has(wait.id))
188
+ outcomes.set(wait.id, { error: error.message });
189
+ }
190
+ }
191
+ },
192
+ };
193
+ async function checkBoard(base, group, budget, outcomes) {
194
+ const { board } = group;
195
+ const ask = boardsAsk(options, board, budget);
196
+ const state = boards.get(base) ?? { items: new Map(), viewer: null };
197
+ boards.set(base, state);
198
+ const idOf = new Map(group.waits.map((w) => [w.id, workItemId(itemOf(w), board)]));
199
+ const ids = [...new Set([...idOf.values()].flatMap((id) => (id === null ? [] : [id])))];
200
+ const read = await readWorkItems(ask, ids, { fields: WAIT_FIELDS });
201
+ const seen = new Map(read.map((w) => [w.id, w]));
202
+ // Only the items something waits on are kept, with their comments.
203
+ for (const id of state.items.keys())
204
+ if (!ids.includes(id))
205
+ state.items.delete(id);
206
+ for (const id of ids) {
207
+ const w = seen.get(id);
208
+ if (!w) {
209
+ state.items.delete(id);
210
+ continue;
211
+ }
212
+ const was = state.items.get(id);
213
+ const version = `${w.rev}/${String(w.fields['System.CommentCount'] ?? 0)}`;
214
+ state.items.set(id, {
215
+ comments: was?.comments ?? null,
216
+ readAt: was?.readAt ?? null,
217
+ state: String(w.fields['System.State'] ?? ''),
218
+ tags: tagsOf(w.fields['System.Tags']),
219
+ version,
220
+ });
221
+ }
222
+ const readsNotes = (wait) => wait.condition.kind === 'approval' || (wait.condition.kind === 'item' && wait.condition.field === 'note');
223
+ if (state.viewer === null && group.waits.some((w) => w.condition.kind === 'approval'))
224
+ state.viewer = await readViewer(ask);
225
+ for (const wait of group.waits) {
226
+ const c = wait.condition;
227
+ if (c.kind !== 'approval' && c.kind !== 'item')
228
+ continue;
229
+ await perWait(outcomes, wait.id, async () => {
230
+ const id = idOf.get(wait.id) ?? null;
231
+ if (id === null)
232
+ throw new WaitProblem(`${c.item} isn't an item of the board keyed ${board.key}`);
233
+ const item = state.items.get(id);
234
+ if (!item)
235
+ throw new WaitProblem(`Azure DevOps Boards has no work item ${id} (${c.item})`);
236
+ if (readsNotes(wait) && (item.comments === null || item.readAt !== item.version)) {
237
+ item.comments = await readComments(ask, id);
238
+ item.readAt = item.version;
239
+ }
240
+ const prefixes = notePrefixes(wait.profile);
241
+ if (c.kind === 'approval') {
242
+ const found = approvalAfterPlan(item.comments ?? [], state.viewer, prefixes);
243
+ return found ? `approval ${c.item}: ${found.kind}` : null;
244
+ }
245
+ const value = c.value.toLowerCase();
246
+ if (c.field === 'state') {
247
+ const type = stateType(item.state, board);
248
+ return item.state.toLowerCase() === value || type === value ? `item ${c.item} state ${item.state}` : null;
249
+ }
250
+ if (c.field === 'label') {
251
+ const tag = item.tags.find((t) => t.toLowerCase() === value);
252
+ return tag ? `item ${c.item} labelled ${tag}` : null;
253
+ }
254
+ const note = (item.comments ?? []).map((x) => phaseOf(x.body, prefixes)).find((p) => p?.toLowerCase() === value);
255
+ return note ? `item ${c.item} note ${note}` : null;
256
+ });
257
+ }
258
+ }
259
+ }
260
+ // A ConductorError for a project whose tracker isn't ADO Boards.
261
+ export function requireBoard(profile) {
262
+ const board = boardOf(profile);
263
+ if (!board)
264
+ throw new ConductorError(`project ${profile?.name ?? '?'} has no ADO Boards tracker`);
265
+ return board;
266
+ }
267
+ function itemOf(wait) {
268
+ const c = wait.condition;
269
+ return c.kind === 'approval' || c.kind === 'item' ? c.item : '';
270
+ }
271
+ //# sourceMappingURL=boards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boards.js","sourceRoot":"","sources":["../../src/watchers/boards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ import { ACTIVE_STATUSES } from "../store.js";
2
+ // The wake text for a PR that conflicts with its base branch: the fact, and what the worker does
3
+ // about it (worker protocol v1, as the work skill's `land` outcome `conflicts` says).
4
+ export function conflictLine(pr, base) {
5
+ return `pr ${pr} conflicts with ${base}: merge origin/${base} into the branch (no rebase), resolve, rerun the checks, push and wait on the PR again`;
6
+ }
7
+ // A conflict spell per worker and watched ADO PR, from the first pass that sees `mergeStatus:
8
+ // conflicts` to the first that sees a clean merge (or the PR merged or abandoned). Its first pass
9
+ // wakes the worker once (`pr.conflicted`, and the PR's waits resolved with `conflictLine`); later
10
+ // passes in the spell wake nobody, so a worker that parks again on the conflicted PR without
11
+ // pushing stays parked. A conflict on a new source commit (a push) starts a new spell. A spell that outlives
12
+ // `minutes`, with its wake undelivered or the conflict still seen, is stuck (`pr.conflict-stuck`,
13
+ // once), which raises a `conflict` inbox item. Spells are in memory: a restart starts them over, so
14
+ // a PR still in conflict wakes its worker once more.
15
+ export function conflictSpells({ minutes, now, store }) {
16
+ const spells = new Map();
17
+ const event = (spell, kind, data) => {
18
+ store.appendEvent({
19
+ data: { base: spell.base, name: spell.name, pr: spell.number, repo: spell.repo, url: spell.url, worker: spell.worker, ...data },
20
+ kind,
21
+ project: spell.project,
22
+ subject: spell.item,
23
+ });
24
+ };
25
+ const ageMinutes = (spell) => (now().getTime() - spell.startedAt) / 60_000;
26
+ const stuck = (spell, reason) => {
27
+ const age = ageMinutes(spell);
28
+ if (spell.stuck || age < minutes)
29
+ return;
30
+ spell.stuck = true;
31
+ event(spell, 'pr.conflict-stuck', { minutes: Math.floor(age), reason });
32
+ };
33
+ const clear = (key, by) => {
34
+ const spell = spells.get(key);
35
+ if (!spell)
36
+ return;
37
+ spells.delete(key);
38
+ event(spell, 'pr.conflict-cleared', { by, minutes: Math.floor(ageMinutes(spell)) });
39
+ };
40
+ return {
41
+ observe: (checks, outcomes) => {
42
+ const wake = new Map();
43
+ // A spell is one worker's on one PR: each waiting worker is woken for it.
44
+ const groups = new Map();
45
+ for (const check of checks) {
46
+ const c = check.condition;
47
+ const wait = c.kind === 'pr' && c.host === 'ado' ? store.getWait(check.id) : null;
48
+ const worker = wait ? store.getWorker(wait.worker) : null;
49
+ if (c.kind !== 'pr' || !worker)
50
+ continue;
51
+ const key = `${worker.id} pr:ado:${c.repo}#${c.number}`;
52
+ const group = groups.get(key) ?? { checks: [], worker };
53
+ group.checks.push(check);
54
+ groups.set(key, group);
55
+ }
56
+ for (const [key, { checks: group, worker }] of groups) {
57
+ const found = group.map((check) => ({ check, outcome: outcomes.get(check.id) }));
58
+ const ended = found.flatMap(({ outcome }) => (outcome && 'resolution' in outcome ? (/\b(merged|abandoned)$/.exec(outcome.resolution)?.[1] ?? []) : []));
59
+ if (ended[0] !== undefined) {
60
+ clear(key, ended[0]);
61
+ continue;
62
+ }
63
+ // Every outcome on the PR carries its merge state, a wait that resolved on its own too.
64
+ const merges = found.flatMap(({ outcome }) => (outcome && 'merge' in outcome && outcome.merge ? [outcome.merge] : []));
65
+ const conflict = merges.find((m) => m.conflicts);
66
+ if (!conflict) {
67
+ if (merges.length > 0)
68
+ clear(key, 'merges cleanly');
69
+ continue;
70
+ }
71
+ const open = spells.get(key);
72
+ // A new source commit that still conflicts is the worker's push meeting a base that moved
73
+ // again before ADO said it merged cleanly: a new spell, and a new wake.
74
+ if (open && (open.commit === conflict.commit || conflict.commit === null)) {
75
+ stuck(open, 'still conflicts');
76
+ continue;
77
+ }
78
+ if (open)
79
+ clear(key, 'pushed again');
80
+ const first = group[0];
81
+ if (first?.condition.kind !== 'pr')
82
+ continue;
83
+ // The PR is one read for every wait on it, so the conflict holds for the waits the pass
84
+ // didn't get to as well. A wait that resolved on its own (a comment) carries both facts.
85
+ const line = conflictLine(first.condition.number, conflict.base);
86
+ const woken = found.filter(({ outcome }) => !outcome || !('error' in outcome));
87
+ for (const { check, outcome } of woken) {
88
+ wake.set(check.id, outcome && 'resolution' in outcome ? `${outcome.resolution}; ${line}` : line);
89
+ }
90
+ const spell = {
91
+ base: conflict.base,
92
+ commit: conflict.commit,
93
+ item: worker.item,
94
+ name: worker.name,
95
+ number: first.condition.number,
96
+ project: worker.project,
97
+ repo: first.condition.repo,
98
+ startedAt: now().getTime(),
99
+ stuck: false,
100
+ url: prUrl(first.profile, first.condition.repo, first.condition.number),
101
+ waits: woken.map(({ check }) => check.id),
102
+ worker: worker.id,
103
+ };
104
+ spells.set(key, spell);
105
+ event(spell, 'pr.conflicted', { waits: spell.waits });
106
+ }
107
+ return wake;
108
+ },
109
+ sweep: () => {
110
+ for (const [key, spell] of spells) {
111
+ const worker = store.getWorker(spell.worker);
112
+ if (!worker || !ACTIVE_STATUSES.includes(worker.status)) {
113
+ spells.delete(key);
114
+ continue;
115
+ }
116
+ const undelivered = spell.waits.some((id) => {
117
+ const wait = store.getWait(id);
118
+ return wait !== null && wait.resolvedAt !== null && wait.deliveredAt === null;
119
+ });
120
+ if (undelivered)
121
+ stuck(spell, 'not woken');
122
+ }
123
+ },
124
+ };
125
+ }
126
+ function prUrl(profile, repo, pr) {
127
+ if (profile?.codeHost.kind !== 'ado')
128
+ return null;
129
+ const base = `${profile.codeHost.organization.replace(/\/+$/, '')}/${encodeURIComponent(profile.codeHost.project)}`;
130
+ return `${base}/_git/${encodeURIComponent(repo)}/pullrequest/${pr}`;
131
+ }
132
+ //# sourceMappingURL=conflicts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/watchers/conflicts.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { z } from 'zod';
2
+ import { notePrefixes } from "../profile.js";
2
3
  import { outputOf, run } from "../run.js";
4
+ import { noteHeading } from "./linear.js";
3
5
  import { perPass, perWait, untilSpent, WaitProblem } from "./source.js";
4
6
  const pull = z.looseObject({
5
7
  head: z.looseObject({ sha: z.string() }),
@@ -56,9 +58,10 @@ export function githubSource({ gh = ghApi() } = {}) {
56
58
  const failed = runs.filter((r) => !PASSING.has(r.conclusion ?? '')).map((r) => r.name);
57
59
  return failed.length > 0 ? `${at} checks failed: ${failed.join(', ')}` : `${at} checks passed`;
58
60
  }
59
- const note = `${wait.profile?.skills.work ?? 'work-issue'} · `;
61
+ const notes = notePrefixes(wait.profile);
60
62
  const since = Date.parse(wait.createdAt);
61
- const byPerson = (u, body, when) => u?.type !== 'Bot' && when != null && Date.parse(when) > since && !(body ?? '').replace(/^[#*\s]+/, '').startsWith(note);
63
+ const isNote = (body) => noteHeading(body ?? '', notes) !== null;
64
+ const byPerson = (u, body, when) => u?.type !== 'Bot' && when != null && Date.parse(when) > since && !isNote(body);
62
65
  // The comment lists come oldest first, so they're asked from the wait on (`since`), which
63
66
  // keeps a new comment on the first page. Reviews can't be asked that way; a PR has few.
64
67
  const after = `per_page=100&since=${encodeURIComponent(wait.createdAt)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/watchers/github.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/watchers/github.ts"],"names":[],"mappings":"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"}