@detergent-software/conductor 1.0.0-dev.2 → 1.0.0-dev.21

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 +170 -0
  2. package/README.md +361 -11
  3. package/build/broker-cli.js +125 -0
  4. package/build/broker-cli.js.map +1 -0
  5. package/build/broker.js +154 -0
  6. package/build/broker.js.map +1 -0
  7. package/build/cli.js +610 -44
  8. package/build/cli.js.map +1 -1
  9. package/build/clock.js +17 -0
  10. package/build/clock.js.map +1 -0
  11. package/build/conditions.js +19 -13
  12. package/build/conditions.js.map +1 -1
  13. package/build/config.js +94 -1
  14. package/build/config.js.map +1 -1
  15. package/build/console.js +99 -0
  16. package/build/console.js.map +1 -0
  17. package/build/credential.js +52 -0
  18. package/build/credential.js.map +1 -0
  19. package/build/daemon.js +153 -2
  20. package/build/daemon.js.map +1 -1
  21. package/build/events.js +106 -0
  22. package/build/events.js.map +1 -0
  23. package/build/history.js +630 -0
  24. package/build/history.js.map +1 -0
  25. package/build/inbox.js +386 -0
  26. package/build/inbox.js.map +1 -0
  27. package/build/manager.js +94 -16
  28. package/build/manager.js.map +1 -1
  29. package/build/mod.js +51 -0
  30. package/build/mod.js.map +1 -0
  31. package/build/note.js +71 -0
  32. package/build/note.js.map +1 -0
  33. package/build/notes.js +172 -0
  34. package/build/notes.js.map +1 -0
  35. package/build/notify.js +422 -0
  36. package/build/notify.js.map +1 -0
  37. package/build/overrides.js +83 -0
  38. package/build/overrides.js.map +1 -0
  39. package/build/paths.js +10 -1
  40. package/build/paths.js.map +1 -1
  41. package/build/profile.js +68 -2
  42. package/build/profile.js.map +1 -1
  43. package/build/pushover.js +67 -0
  44. package/build/pushover.js.map +1 -0
  45. package/build/queue.js +183 -0
  46. package/build/queue.js.map +1 -0
  47. package/build/registry.js +17 -10
  48. package/build/registry.js.map +1 -1
  49. package/build/rule-actions.js +444 -0
  50. package/build/rule-actions.js.map +1 -0
  51. package/build/rule-input.js +17 -0
  52. package/build/rule-input.js.map +1 -0
  53. package/build/rules-service.js +402 -0
  54. package/build/rules-service.js.map +1 -0
  55. package/build/rules.js +850 -0
  56. package/build/rules.js.map +1 -0
  57. package/build/scheduler.js +274 -0
  58. package/build/scheduler.js.map +1 -0
  59. package/build/server.js +294 -0
  60. package/build/server.js.map +1 -1
  61. package/build/spend.js +50 -0
  62. package/build/spend.js.map +1 -1
  63. package/build/store.js +452 -4
  64. package/build/store.js.map +1 -1
  65. package/build/trackers.js +12 -0
  66. package/build/trackers.js.map +1 -0
  67. package/build/upgrade.js +36 -22
  68. package/build/upgrade.js.map +1 -1
  69. package/build/wait.js +35 -41
  70. package/build/wait.js.map +1 -1
  71. package/build/watchers/ado-api.js +55 -0
  72. package/build/watchers/ado-api.js.map +1 -0
  73. package/build/watchers/ado.js +37 -49
  74. package/build/watchers/ado.js.map +1 -1
  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 +267 -0
  80. package/build/watchers/boards.js.map +1 -0
  81. package/build/watchers/github.js +5 -2
  82. package/build/watchers/github.js.map +1 -1
  83. package/build/watchers/index.js +1 -0
  84. package/build/watchers/index.js.map +1 -1
  85. package/build/watchers/linear-api.js +55 -0
  86. package/build/watchers/linear-api.js.map +1 -0
  87. package/build/watchers/linear-key.js +6 -45
  88. package/build/watchers/linear-key.js.map +1 -1
  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 +29 -18
  94. package/build/watchers/linear.js.map +1 -1
  95. package/build/why.js +78 -0
  96. package/build/why.js.map +1 -0
  97. package/mod/.claude-plugin/marketplace.json +6 -0
  98. package/mod/.claude-plugin/plugin.json +7 -0
  99. package/mod/README.md +17 -0
  100. package/mod/hooks/hooks.json +1 -0
  101. package/mod/hooks/model.ts +457 -0
  102. package/mod/hooks/register.tsx +543 -0
  103. package/mod/types/index.d.ts +57 -0
  104. package/package.json +6 -1
package/build/registry.js CHANGED
@@ -2,12 +2,9 @@ import { existsSync, realpathSync } from 'node:fs';
2
2
  import { basename, dirname, join, resolve } from 'node:path';
3
3
  import { ConductorError } from "./errors.js";
4
4
  import { PROFILE_FILE, readProfile } from "./profile.js";
5
- // A project is registered by its main checkout. From the given path this walks up, the way git
6
- // finds .git, to the first directory that holds .claude/conductor.json. A worktree at
7
- // <root>/.claude/worktrees/<name> belongs to <root>, the way scripts/dev-ports.mjs resolves it, so
8
- // `conduct project add .` works from any directory of any checkout. With no profile on the way up,
9
- // the given directory is the answer, and reading its profile says what is missing.
10
- export function projectRoot(path) {
5
+ // The checkout a path is in (a worktree's own directory, or the main checkout) and the project's
6
+ // main checkout, found as projectRoot says.
7
+ export function checkoutOf(path) {
11
8
  let start;
12
9
  try {
13
10
  start = realpathSync.native(resolve(path));
@@ -18,16 +15,26 @@ export function projectRoot(path) {
18
15
  for (let dir = start;; dir = dirname(dir)) {
19
16
  const parent = dirname(dir);
20
17
  if (basename(parent) === 'worktrees' && basename(dirname(parent)) === '.claude')
21
- return dirname(dirname(parent));
18
+ return { checkout: dir, root: dirname(dirname(parent)) };
22
19
  if (existsSync(join(dir, PROFILE_FILE)))
23
- return dir;
20
+ return { checkout: dir, root: dir };
24
21
  if (parent === dir)
25
- return start;
22
+ return { checkout: start, root: start };
26
23
  }
27
24
  }
28
- export function registerProject(store, path) {
25
+ // A project is registered by its main checkout. From the given path this walks up, the way git
26
+ // finds .git, to the first directory that holds .claude/conductor.json. A worktree at
27
+ // <root>/.claude/worktrees/<name> belongs to <root>, the way scripts/dev-ports.mjs resolves it, so
28
+ // `conduct project add .` works from any directory of any checkout. With no profile on the way up,
29
+ // the given directory is the answer, and reading its profile says what is missing.
30
+ export function projectRoot(path) {
31
+ return checkoutOf(path).root;
32
+ }
33
+ // `check` refuses a profile before it is stored: the daemon checks its rules against config.json.
34
+ export function registerProject(store, path, check = () => { }) {
29
35
  const root = projectRoot(path);
30
36
  const { path: profilePath, profile } = readProfile(root);
37
+ check(profile, profilePath);
31
38
  return store.upsertProject({ profile, profilePath, root });
32
39
  }
33
40
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEzD,+FAA+F;AAC/F,sFAAsF;AACtF,mGAAmG;AACnG,mGAAmG;AACnG,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,cAAc,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,IAAI,GAAG,GAAG,KAAK,GAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACjH,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACpD,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,IAAY;IACxD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAgB,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvE,iGAAiG;AACjG,4CAA4C;AAC5C,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,cAAc,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,IAAI,GAAG,GAAG,KAAK,GAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC1I,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC7E,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,+FAA+F;AAC/F,sFAAsF;AACtF,mGAAmG;AACnG,mGAAmG;AACnG,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAC/B,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,eAAe,CAC7B,KAAY,EACZ,IAAY,EACZ,QAAkD,GAAG,EAAE,GAAE,CAAC;IAE1D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACzD,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC"}
@@ -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, profile);
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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"}
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ // A rule as written in ~/.conductor/rules.json or a profile's `rules` (design note, section 9):
3
+ // `when` and `do` in the fixed vocabulary that rules.ts reads. Its own module, so profile.ts can
4
+ // take rules without importing the engine (which imports the store, which imports profile.ts).
5
+ export const ruleIdSchema = z.string().regex(/^[a-z][a-z0-9-]*$/, 'lowercase letters, digits and dashes, starting with a letter');
6
+ export const ruleInputSchema = z.strictObject({
7
+ // One action, or several that fire together.
8
+ do: z.union([z.string().trim().min(1), z.array(z.string().trim().min(1)).min(1)]),
9
+ // A rule with the id of one further down (a machine rule over a default, a project rule over
10
+ // either) replaces it, so a file holds only the differences. `do: "none"` switches one off.
11
+ id: ruleIdSchema.optional(),
12
+ note: z.string().optional(),
13
+ // Left out only by a `do: "none"` rule, which needs no condition to switch a rule off.
14
+ when: z.string().trim().min(1).optional(),
15
+ });
16
+ export const rulesFileSchema = z.array(ruleInputSchema);
17
+ //# sourceMappingURL=rule-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-input.js","sourceRoot":"","sources":["../src/rule-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gGAAgG;AAChG,iGAAiG;AACjG,+FAA+F;AAC/F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,EAAE,8DAA8D,CAAC,CAAC;AAElI,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,YAAY,CAAC;IAC5C,6CAA6C;IAC7C,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,6FAA6F;IAC7F,4FAA4F;IAC5F,EAAE,EAAE,YAAY,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,uFAAuF;IACvF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC"}