@detergent-software/conductor 1.0.0-dev.11 → 1.0.0-dev.12

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.
@@ -0,0 +1,444 @@
1
+ import { z } from 'zod';
2
+ import { ConductorError } from "./errors.js";
3
+ import { PAUSE } from "./overrides.js";
4
+ import { clockFields, describeAction, resolveUntil, selectRules, } from "./rules.js";
5
+ import { localDay } from "./spend.js";
6
+ import { ACTIVE_STATUSES } from "./store.js";
7
+ const GATES = ['plan', 'merge', 'npm-otp'];
8
+ const TICK_SECONDS = 60;
9
+ const MAX_LABELS = 20;
10
+ const autoApprove = z.object({ kind: z.literal('auto-approve'), plan: z.number(), rule: z.string() });
11
+ const noteData = z.looseObject({ kind: z.string().nullable().optional(), phase: z.string(), tier: z.string().optional(), worker: z.number().optional() });
12
+ const workerData = z.looseObject({ kind: z.string().optional(), worker: z.number() });
13
+ const waitData = z.looseObject({ condition: z.string(), wait: z.number(), worker: z.number() });
14
+ const inboxData = z.looseObject({ id: z.number() });
15
+ export function ruleActions(deps) {
16
+ const { inbox, log, manager, notifier, overrides, store } = deps;
17
+ const now = deps.now ?? (() => new Date());
18
+ const tasks = new Set();
19
+ let timer;
20
+ let ticking = null;
21
+ const track = (task) => {
22
+ tasks.add(task);
23
+ void task.finally(() => tasks.delete(task)).catch(() => { });
24
+ };
25
+ const minutesSince = (iso) => Math.max(0, (now().getTime() - Date.parse(iso)) / 60_000);
26
+ // ---------- subjects ----------
27
+ // Read once per event or tick, not once per subject: spend sums scan the spend table.
28
+ const factsNow = () => ({ failed: store.listWorkers(['failed']), open: inbox.open(), spend: store.spendSummary(localDay(now())) });
29
+ const itemFields = (project, item, facts) => {
30
+ if (project === null || item === null)
31
+ return {};
32
+ const queued = store.queueItems(project).find((i) => i.id.toUpperCase() === item.toUpperCase());
33
+ const tier = store.latestTier(project, item);
34
+ const spend = facts.spend.byItem.get(`${project}|${item.toUpperCase()}`);
35
+ return {
36
+ 'item.id': item,
37
+ ...(queued?.area ? { 'item.area': queued.area } : {}),
38
+ ...(queued ? { 'item.labels': queued.labels } : {}),
39
+ ...(queued?.priority === null || queued === undefined ? {} : { 'item.priority': queued.priority }),
40
+ ...(tier === null ? {} : { 'item.tier': tier }),
41
+ ...(spend === undefined ? {} : { 'spend.item': spend }),
42
+ };
43
+ };
44
+ // Earlier tries of the item: launches that failed, and sessions a retry revived.
45
+ const retriesOf = (worker, facts) => {
46
+ const failed = facts.failed.filter((w) => w.project === worker.project && w.item === worker.item && w.id !== worker.id).length;
47
+ const revived = store.ruleEvents(worker.item, 50).filter((e) => e.kind === 'worker.revived' && e.project === worker.project).length;
48
+ return failed + revived;
49
+ };
50
+ const workerFields = (worker, facts) => {
51
+ if (worker === null)
52
+ return {};
53
+ const spend = facts.spend.byWorker.get(worker.id) ?? 0;
54
+ return { ...(worker.phase === null ? {} : { 'worker.phase': worker.phase }), 'spend.worker': spend, 'worker.retries': retriesOf(worker, facts) };
55
+ };
56
+ // A wait by the gate it holds (plan, merge, npm-otp) when an open inbox item has its condition.
57
+ const waitKind = (wait, facts) => facts.open.find((i) => i.condition === wait.condition && GATES.includes(i.kind))?.kind ?? wait.condition.split(':')[0] ?? 'time';
58
+ const base = (target, facts) => ({
59
+ ...clockFields(now()),
60
+ 'notify.profile': notifier.status().profile,
61
+ ...(target.project === null ? {} : { project: target.project }),
62
+ ...itemFields(target.project, target.item, facts),
63
+ ...workerFields(target.worker, facts),
64
+ ...(target.wait ? { 'wait.age': minutesSince(target.wait.createdAt), 'wait.kind': waitKind(target.wait, facts) } : {}),
65
+ ...(target.inbox ? { 'inbox.age': minutesSince(target.inbox.raisedAt), 'inbox.kind': target.inbox.kind } : {}),
66
+ });
67
+ const targetOf = (event, worker) => ({
68
+ inbox: null,
69
+ item: event.subject,
70
+ project: event.project,
71
+ wait: null,
72
+ worker,
73
+ });
74
+ // The rule events a daemon event is, with what they act on; null for one no rule watches.
75
+ const fromEvent = (event, facts) => {
76
+ const worker = (id) => (id === undefined ? null : store.getWorker(id));
77
+ switch (event.kind) {
78
+ case 'inbox.raised': {
79
+ const item = store.getInbox(inboxData.safeParse(event.data).data?.id ?? -1);
80
+ if (!item)
81
+ return null;
82
+ const target = { ...targetOf(event, worker(item.worker ?? undefined)), inbox: item };
83
+ return { events: ['inbox.raised'], fields: base(target, facts), target };
84
+ }
85
+ case 'item.unblocked': {
86
+ const target = targetOf(event, null);
87
+ return { events: ['item.unblocked'], fields: base(target, facts), target };
88
+ }
89
+ case 'note.posted': {
90
+ const data = noteData.safeParse(event.data).data;
91
+ if (!data)
92
+ return null;
93
+ const target = targetOf(event, worker(data.worker));
94
+ const plan = data.phase === 'Plan';
95
+ return {
96
+ events: plan ? ['note', 'plan'] : ['note'],
97
+ fields: {
98
+ ...base(target, facts),
99
+ 'note.phase': data.phase,
100
+ ...(data.kind ? { 'note.kind': data.kind } : {}),
101
+ ...(plan && data.tier ? { 'plan.tier': data.tier } : {}),
102
+ },
103
+ target,
104
+ };
105
+ }
106
+ case 'wait.resolved': {
107
+ const data = waitData.safeParse(event.data).data;
108
+ const wait = data ? store.getWait(data.wait) : null;
109
+ if (!data || !wait)
110
+ return null;
111
+ const target = { ...targetOf(event, worker(data.worker)), wait };
112
+ const comment = /^pr:.+:comment$/.test(data.condition);
113
+ return { events: comment ? ['wait.resolved', 'pr.comment'] : ['wait.resolved'], fields: base(target, facts), target };
114
+ }
115
+ case 'worker.launch-failed':
116
+ case 'worker.retired':
117
+ case 'worker.stalled':
118
+ case 'worker.stopped-unexpectedly': {
119
+ const data = workerData.safeParse(event.data).data;
120
+ const target = targetOf(event, worker(data?.worker));
121
+ if (!data || !target.worker)
122
+ return null;
123
+ const events = event.kind === 'worker.launch-failed' ? ['run.failed']
124
+ : event.kind === 'worker.retired' ? ['worker.exited']
125
+ : event.kind === 'worker.stopped-unexpectedly' ? ['run.failed', 'worker.exited']
126
+ : data.kind === 'permission' ? ['worker.permission']
127
+ : ['worker.idle'];
128
+ return { events, fields: base(target, facts), target };
129
+ }
130
+ default:
131
+ return null;
132
+ }
133
+ };
134
+ // ---------- acting ----------
135
+ // Runs one rule's action and records it; false when it failed. `cause` is the daemon event that
136
+ // fired it (none for a state rule).
137
+ const run = async (rule, action, target, trigger, cause) => {
138
+ const fired = store.appendEvent({
139
+ data: { action: describeAction(action), ...(cause === null ? {} : { cause }), do: rule.text.do, outcome: 'acting', trigger, when: rule.text.when },
140
+ kind: 'rule.fired',
141
+ project: target.project,
142
+ rule: rule.ref,
143
+ subject: target.item,
144
+ });
145
+ try {
146
+ const outcome = await act(rule, action, target, fired);
147
+ store.appendEvent({ data: { cause: fired.id, outcome }, kind: 'rule.done', project: target.project, rule: rule.ref, subject: target.item });
148
+ return true;
149
+ }
150
+ catch (error) {
151
+ const message = error instanceof ConductorError ? [error.message, ...error.details].join(': ') : error instanceof Error ? error.message : String(error);
152
+ store.appendEvent({ data: { cause: fired.id, error: message }, kind: 'rule.failed', project: target.project, rule: rule.ref, subject: target.item });
153
+ log.log('warn', 'a rule action failed', { error: message, rule: rule.ref });
154
+ return false;
155
+ }
156
+ };
157
+ const act = async (rule, action, target, fired) => {
158
+ const by = rule.ref;
159
+ const projectOf = (named) => {
160
+ const project = named ?? target.project;
161
+ if (project === null)
162
+ throw new ConductorError(`${describeAction(action)} needs a project, and its subject has none`);
163
+ return project;
164
+ };
165
+ switch (action.verb) {
166
+ case 'auto-approve': {
167
+ const plan = openPlan(target);
168
+ if (!plan || target.item === null)
169
+ return 'no plan waits in the inbox';
170
+ const at = new Date(now().getTime() + action.afterMinutes * 60_000);
171
+ store.addTodo({ action: JSON.stringify({ kind: 'auto-approve', plan: plan.id, rule: by }), after: at.toISOString(), item: target.item, project: target.project });
172
+ const when = clock(at);
173
+ const pushed = await notifier.announce({ kind: 'plan' }, { item: target.item, project: target.project, text: `${target.item} auto-approves at ${when} unless you revise it` }, by);
174
+ return `auto-approves ${target.item}'s plan at ${when}${pushed === null ? '' : ` (not pushed: ${pushed})`}`;
175
+ }
176
+ case 'escalate':
177
+ store.appendEvent({ data: { cause: fired.id, text: action.text }, kind: 'console.escalated', project: target.project, rule: by, subject: target.item });
178
+ return 'escalated to the console';
179
+ case 'focus': {
180
+ const project = projectOf(action.project);
181
+ overrides.focus(project, { [action.setting]: action.value }, resolveUntil(action.until, now()), by);
182
+ return `focus ${project} ${action.setting} ${action.value}`;
183
+ }
184
+ case 'inbox': {
185
+ // A runaway is the session manager's kind of item: the inbox words it and raises it once.
186
+ if (action.kind === 'runaway' && target.worker) {
187
+ const tokens = store.spendSummary(localDay(now())).byWorker.get(target.worker.id) ?? 0;
188
+ store.appendEvent({ data: { name: target.worker.name, tokens, worker: target.worker.id }, kind: 'worker.runaway', project: target.project, rule: by, subject: target.item });
189
+ return `runaway for ${target.worker.name}`;
190
+ }
191
+ const text = action.text ?? `${target.item ?? target.project ?? 'the conductor'}: ${rule.text.when ?? describeAction(action)} (rule ${by})`;
192
+ const open = inbox.open().find((i) => i.kind === action.kind && i.item === target.item && i.project === target.project && i.text === text);
193
+ if (open)
194
+ return `already in the inbox (#${open.id})`;
195
+ const raised = inbox.raise({ commands: [`conduct why ${fired.id}`], condition: null, item: target.item, kind: action.kind, links: [], project: target.project, text, worker: target.worker?.id ?? null });
196
+ return `raised inbox item ${raised.id}`;
197
+ }
198
+ case 'label': {
199
+ if (target.item === null || target.project === null)
200
+ throw new ConductorError('a label edit needs an item');
201
+ const profile = store.listProjects().find((p) => p.name === target.project)?.profile;
202
+ const label = action.label === 'human' ? (profile?.tracker.humanLabel ?? 'human') : action.label;
203
+ if (labelEdits(target.item) >= MAX_LABELS)
204
+ throw new ConductorError(`${target.item} has had ${MAX_LABELS} label edits from rules today: no more until tomorrow`);
205
+ const done = await deps.labels.label(target.item, label, action.op);
206
+ return `${label} ${done}`;
207
+ }
208
+ case 'launch':
209
+ if (deps.mode !== 'on')
210
+ return `scheduler.mode ${deps.mode}: not done (it launches nothing)`;
211
+ deps.scheduler.nudge();
212
+ return 'the scheduler picks it if slots, Areas, blockers, quiet hours and pauses allow';
213
+ case 'none':
214
+ case 'park':
215
+ case 'resume':
216
+ case 'retire':
217
+ return `${action.verb} is the scheduler's and the session manager's`;
218
+ case 'notify': {
219
+ const why = await notifier.announce(action.channel, { item: target.item, project: target.project, text: action.text ?? `${target.item ?? target.project ?? 'conductor'}: ${rule.text.when ?? ''}` }, by);
220
+ return why === null ? `pushed on ${action.channel}` : `not pushed: ${why}`;
221
+ }
222
+ case 'notify-profile':
223
+ notifier.setProfile(action.profile, action.until === null ? null : resolveUntil(action.until, now()), by);
224
+ return `notification profile ${action.profile}`;
225
+ case 'pause': {
226
+ const project = action.target.kind === 'all' ? null : action.target.kind === 'named' ? action.target.project : target.project;
227
+ overrides.pause(project, action.until === null ? null : resolveUntil(action.until, now()), by);
228
+ return `paused launches in ${project ?? 'every project'}`;
229
+ }
230
+ case 'remind': {
231
+ const item = target.inbox ?? openGate(target);
232
+ if (!item)
233
+ return 'nothing waits in the inbox to remind about';
234
+ const why = await notifier.remindNow(item.id, by);
235
+ return why === null ? `reminded #${item.id}` : `not reminded: ${why}`;
236
+ }
237
+ case 'retry':
238
+ return retry(target, by);
239
+ case 'unpause': {
240
+ const project = action.target.kind === 'all' ? null : action.target.kind === 'named' ? action.target.project : target.project;
241
+ overrides.unpause(project, by);
242
+ return `unpaused launches in ${project ?? 'every project'}`;
243
+ }
244
+ }
245
+ };
246
+ // A failed launch is launched again; a session that stopped unexpectedly is woken with the fact.
247
+ // Once only, whatever the rule says: a second failure stays in the inbox. Like a launch, it starts
248
+ // a session, so it waits for scheduler.mode on.
249
+ const retry = async (target, by) => {
250
+ const { worker } = target;
251
+ if (!worker)
252
+ return 'no worker to retry';
253
+ if (deps.mode !== 'on')
254
+ return `scheduler.mode ${deps.mode}: not retried (it starts no session)`;
255
+ if (retriesOf(worker, factsNow()) > 0)
256
+ return 'retried once already: a second failure stays in the inbox';
257
+ if (worker.status === 'failed') {
258
+ for (const open of inbox.open().filter((i) => i.kind === 'failed' && i.worker === worker.id))
259
+ store.resolveInbox(open.id, `retried by ${by}`);
260
+ const again = manager.launch({ item: worker.item, project: worker.project, ...(worker.probe ? { probe: true } : {}) });
261
+ return `launching ${again.name} again (worker ${again.id})`;
262
+ }
263
+ if (worker.status === 'stopped-unexpectedly') {
264
+ await manager.revive(worker.id, `[conductor] event: session stopped unexpectedly ${clock(new Date(worker.stoppedAt ?? now().toISOString()))}`, by);
265
+ return `revived ${worker.name}`;
266
+ }
267
+ return `${worker.name} is ${worker.status}: nothing to retry`;
268
+ };
269
+ // Label edits a rule made on the item today: a cap, so two rules can't flip a label all day.
270
+ const labelEdits = (item) => store
271
+ .ruleEvents(item, 100)
272
+ .filter((e) => e.kind === 'rule.done' && localDay(new Date(e.at)) === localDay(now()) && /\s(added|removed)$/.test(String(e.data.outcome ?? ''))).length;
273
+ const openPlan = (target) => inbox.open().find((i) => i.kind === 'plan' && i.project === target.project && i.item?.toUpperCase() === target.item?.toUpperCase());
274
+ // The inbox item a wait holds: its gate (plan, merge, npm-otp) or any open item of the worker.
275
+ const openGate = (target) => {
276
+ const open = inbox.open();
277
+ return ((target.wait ? open.find((i) => i.condition === target.wait?.condition) : undefined) ??
278
+ open.find((i) => target.worker !== null && i.worker === target.worker.id) ??
279
+ open.find((i) => i.project === target.project && i.item !== null && i.item === target.item));
280
+ };
281
+ // ---------- event rules ----------
282
+ const onEvent = async (event) => {
283
+ const found = fromEvent(event, factsNow());
284
+ if (!found)
285
+ return;
286
+ const { fired } = selectRules(deps.rules(), { events: found.events, fields: found.fields, project: found.target.project, scope: null });
287
+ for (const { action, rule } of fired) {
288
+ if (['launch', 'none', 'park', 'resume', 'retire'].includes(action.verb) && !(action.verb === 'launch' && found.events.includes('item.unblocked')))
289
+ continue;
290
+ await run(rule, action, found.target, found.events.join(', '), event.id);
291
+ }
292
+ };
293
+ // ---------- state rules ----------
294
+ const stateSubjects = (facts) => {
295
+ const subjects = [];
296
+ const add = (key, scope, target, extra = {}) => {
297
+ subjects.push({ key, subject: { events: [], fields: { ...base(target, facts), ...extra }, project: target.project, scope }, target });
298
+ };
299
+ const { spend } = facts;
300
+ const none = { inbox: null, item: null, project: null, wait: null, worker: null };
301
+ add('machine', 'machine', none, { 'spend.today': spend.today });
302
+ for (const p of store.listProjects().filter((p) => p.enabled)) {
303
+ add(`project:${p.name}`, 'project', { ...none, project: p.name }, { 'spend.project': spend.byProjectToday.get(p.name) ?? 0, 'spend.today': spend.today });
304
+ }
305
+ const workers = store.listWorkers(ACTIVE_STATUSES).filter((w) => !w.probe);
306
+ for (const w of workers)
307
+ add(`worker:${w.id}`, 'worker', { ...none, item: w.item, project: w.project, worker: w });
308
+ for (const wait of store.openWaits()) {
309
+ const w = workers.find((x) => x.id === wait.worker);
310
+ if (w)
311
+ add(`wait:${wait.id}`, 'wait', { ...none, item: w.item, project: w.project, wait, worker: w });
312
+ }
313
+ for (const i of facts.open)
314
+ add(`inbox:${i.id}`, 'inbox', { ...none, inbox: i, item: i.item, project: i.project, worker: i.worker === null ? null : store.getWorker(i.worker) });
315
+ return subjects;
316
+ };
317
+ const tickOnce = async () => {
318
+ const rules = deps.rules();
319
+ const holding = new Set();
320
+ for (const { key, subject, target } of stateSubjects(factsNow())) {
321
+ const { fired } = selectRules(rules, subject);
322
+ for (const ref of new Set(fired.map((f) => f.rule.ref)))
323
+ holding.add(`${ref}\n${key}`);
324
+ for (const { action, rule } of fired) {
325
+ const held = `${rule.ref}|${describeAction(action)}`;
326
+ if (!store.holdRule(held, key))
327
+ continue;
328
+ // One that failed (Linear down, a push refused) is tried again on the next tick.
329
+ if (!(await run(rule, action, target, `state of ${key}`, null)))
330
+ store.releaseRule(held, key);
331
+ }
332
+ }
333
+ // A rule that stopped holding fires again next time; a pause it held without an end lifts.
334
+ const released = new Set();
335
+ for (const { rule: held, subject: key } of store.ruleStates()) {
336
+ const [ref = '', action = ''] = held.split('|');
337
+ if (holding.has(`${ref}\n${key}`))
338
+ continue;
339
+ store.releaseRule(held, key);
340
+ if (action.startsWith('pause') && !action.includes(' until ') && !action.includes(' for '))
341
+ released.add(held);
342
+ }
343
+ for (const held of released)
344
+ liftPauses(held);
345
+ await dueTodos();
346
+ };
347
+ // Lifts the open-ended pauses a state rule set, except where it still holds: a pause of every
348
+ // project while any subject holds, one project's while a subject of that project does.
349
+ const liftPauses = (held) => {
350
+ const [ref = ''] = held.split('|');
351
+ const still = store.ruleStates().filter((s) => s.rule === held);
352
+ const projects = new Set(still.map((s) => projectOfKey(s.subject)));
353
+ for (const o of store.liveOverrides()) {
354
+ if (o.kind !== PAUSE || o.value !== 'on' || o.setBy !== ref)
355
+ continue;
356
+ if (o.project === null ? still.length > 0 : projects.has(o.project))
357
+ continue;
358
+ overrides.unpause(o.project, ref);
359
+ store.appendEvent({ data: { reason: `${ref} no longer holds` }, kind: 'rule.released', project: o.project, rule: ref });
360
+ }
361
+ };
362
+ // The project a state rule's subject belongs to: its own, its worker's, its wait's worker's.
363
+ const projectOfKey = (key) => {
364
+ const [kind = '', id = ''] = key.split(':');
365
+ switch (kind) {
366
+ case 'inbox':
367
+ return store.getInbox(Number(id))?.project ?? null;
368
+ case 'project':
369
+ return key.slice('project:'.length);
370
+ case 'wait': {
371
+ const wait = store.getWait(Number(id));
372
+ return wait ? (store.getWorker(wait.worker)?.project ?? null) : null;
373
+ }
374
+ case 'worker':
375
+ return store.getWorker(Number(id))?.project ?? null;
376
+ default:
377
+ return null;
378
+ }
379
+ };
380
+ // Auto-approvals at their deadline: the plan still waits (no revise answered it, no newer Plan).
381
+ const dueTodos = async () => {
382
+ for (const todo of store.dueTodos(now().toISOString())) {
383
+ store.finishTodo(todo.id);
384
+ const parsed = autoApprove.safeParse(safeJson(todo.action));
385
+ if (!parsed.success)
386
+ continue;
387
+ const plan = inbox.open().find((i) => i.id === parsed.data.plan);
388
+ const target = { inbox: plan ?? null, item: todo.item, project: todo.project, wait: null, worker: null };
389
+ if (!plan) {
390
+ store.appendEvent({ data: { outcome: 'the plan was answered or replaced first: not approved' }, kind: 'rule.done', project: todo.project, rule: parsed.data.rule, subject: todo.item });
391
+ continue;
392
+ }
393
+ const deadline = clock(new Date(todo.after));
394
+ try {
395
+ await inbox.answer(plan.id, { action: 'approve', text: `auto-approved by the conductor: rule "${parsed.data.rule}", no revise by ${deadline}` });
396
+ store.appendEvent({ data: { outcome: `approved ${todo.item ?? ''}'s plan` }, kind: 'rule.done', project: target.project, rule: parsed.data.rule, subject: target.item });
397
+ }
398
+ catch (error) {
399
+ const message = error instanceof Error ? error.message : String(error);
400
+ store.appendEvent({ data: { error: message }, kind: 'rule.failed', project: target.project, rule: parsed.data.rule, subject: target.item });
401
+ }
402
+ }
403
+ };
404
+ const tick = () => {
405
+ ticking ??= tickOnce()
406
+ .catch((error) => log.log('error', 'the rules tick failed', { error: String(error) }))
407
+ .finally(() => (ticking = null));
408
+ return ticking;
409
+ };
410
+ return {
411
+ idle: async () => {
412
+ while (tasks.size > 0 || ticking)
413
+ await Promise.allSettled([...tasks, ticking]);
414
+ },
415
+ observe: (event) => {
416
+ // Its own events and the rule events the scheduler records are no rule's trigger.
417
+ if (event.kind.startsWith('rule.'))
418
+ return;
419
+ track(onEvent(event).catch((error) => log.log('error', 'rule actions failed on an event', { error: String(error), event: event.id })));
420
+ },
421
+ start: () => {
422
+ timer = setInterval(() => void tick(), (deps.tickSeconds ?? TICK_SECONDS) * 1000);
423
+ timer.unref();
424
+ },
425
+ stop: async () => {
426
+ clearInterval(timer);
427
+ await Promise.allSettled([...tasks, ticking]);
428
+ },
429
+ tick,
430
+ };
431
+ }
432
+ // HH:MM, local.
433
+ function clock(at) {
434
+ return `${String(at.getHours()).padStart(2, '0')}:${String(at.getMinutes()).padStart(2, '0')}`;
435
+ }
436
+ function safeJson(text) {
437
+ try {
438
+ return JSON.parse(text);
439
+ }
440
+ catch {
441
+ return null;
442
+ }
443
+ }
444
+ //# sourceMappingURL=rule-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-actions.js","sourceRoot":"","sources":["../src/rule-actions.ts"],"names":[],"mappings":"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"}
package/build/rules.js CHANGED
@@ -652,7 +652,6 @@ function checkAction(action, events, scope) {
652
652
  throw new RuleSyntaxError(`do: ${action.verb} acts on ${what}, which this rule's when doesn't give it`);
653
653
  };
654
654
  const ITEM_EVENTS = ['inbox.raised', 'item.closed', 'item.unblocked', 'note', 'plan', 'pr.comment', 'queue.pick', 'run.failed', 'wait.resolved', 'worker.exited', 'worker.idle', 'worker.permission', 'worker.waiting'];
655
- const WORKER_EVENTS = ['note', 'plan', 'pr.comment', 'run.failed', 'wait.resolved', 'worker.exited', 'worker.idle', 'worker.permission', 'worker.waiting'];
656
655
  switch (action.verb) {
657
656
  case 'auto-approve':
658
657
  return on(['plan'], [], 'a plan (the plan event)');
@@ -660,11 +659,14 @@ function checkAction(action, events, scope) {
660
659
  return on(ITEM_EVENTS, ['wait', 'inbox', 'worker'], 'an item');
661
660
  case 'launch':
662
661
  return on(['item.unblocked', 'queue.pick'], [], 'a queued item (queue.pick or item.unblocked); the scheduler still checks slots, Areas, blockers and quiet hours');
662
+ // The session manager parks a worker whose turn ended while it waits, and resumes it when a
663
+ // wait resolves; it asks the rules then, and at no other time.
663
664
  case 'park':
664
- case 'resume':
665
- return on(WORKER_EVENTS, ['wait', 'worker'], 'a worker');
665
+ return on(['worker.waiting'], [], 'a worker whose turn ended while it waits (worker.waiting)');
666
666
  case 'remind':
667
667
  return on(['inbox.raised', 'worker.idle', 'worker.permission'], ['wait', 'inbox'], 'an open inbox item or wait');
668
+ case 'resume':
669
+ return on(['pr.comment', 'wait.resolved'], [], 'a worker whose wait resolved (wait.resolved or pr.comment)');
668
670
  case 'retire':
669
671
  // Retiring removes a worktree, so only an item that is closed may cause it; it still refuses unfinished work.
670
672
  return on(['item.closed'], [], 'a closed item (item.closed): the conductor retires only finished work');