@detergent-software/conductor 1.1.0 → 1.2.0-dev.10

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 (60) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +36 -17
  3. package/build/brief-cli.js +2 -0
  4. package/build/brief-cli.js.map +1 -1
  5. package/build/brief.js +13 -0
  6. package/build/brief.js.map +1 -1
  7. package/build/cli.js +196 -40
  8. package/build/cli.js.map +1 -1
  9. package/build/conditions.js +20 -0
  10. package/build/conditions.js.map +1 -1
  11. package/build/daemon.js +20 -7
  12. package/build/daemon.js.map +1 -1
  13. package/build/help.js +16 -3
  14. package/build/help.js.map +1 -1
  15. package/build/history.js +96 -0
  16. package/build/history.js.map +1 -1
  17. package/build/inbox.js +87 -15
  18. package/build/inbox.js.map +1 -1
  19. package/build/manager.js +46 -6
  20. package/build/manager.js.map +1 -1
  21. package/build/note.js +14 -3
  22. package/build/note.js.map +1 -1
  23. package/build/notes.js +80 -6
  24. package/build/notes.js.map +1 -1
  25. package/build/paths.js +2 -0
  26. package/build/paths.js.map +1 -1
  27. package/build/profile.js +8 -0
  28. package/build/profile.js.map +1 -1
  29. package/build/queue.js +67 -14
  30. package/build/queue.js.map +1 -1
  31. package/build/rule-actions.js +144 -25
  32. package/build/rule-actions.js.map +1 -1
  33. package/build/rules-service.js +29 -10
  34. package/build/rules-service.js.map +1 -1
  35. package/build/rules.js +34 -6
  36. package/build/rules.js.map +1 -1
  37. package/build/scheduler.js +93 -12
  38. package/build/scheduler.js.map +1 -1
  39. package/build/server.js +6 -3
  40. package/build/server.js.map +1 -1
  41. package/build/spend.js +13 -8
  42. package/build/spend.js.map +1 -1
  43. package/build/startup.js +30 -16
  44. package/build/startup.js.map +1 -1
  45. package/build/stop-request.js +83 -0
  46. package/build/stop-request.js.map +1 -0
  47. package/build/store.js +68 -2
  48. package/build/store.js.map +1 -1
  49. package/build/supervise.js +153 -0
  50. package/build/supervise.js.map +1 -0
  51. package/build/transcript.js +179 -0
  52. package/build/transcript.js.map +1 -0
  53. package/build/upgrade.js +9 -5
  54. package/build/upgrade.js.map +1 -1
  55. package/build/watchers/linear-queue.js +66 -5
  56. package/build/watchers/linear-queue.js.map +1 -1
  57. package/mod/hooks/model.ts +6 -0
  58. package/mod/hooks/register.tsx +4 -1
  59. package/mod/types/index.d.ts +2 -0
  60. package/package.json +1 -1
@@ -0,0 +1,179 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { z } from 'zod';
3
+ import { tailLines } from "./spend.js";
4
+ // The tool call a permission prompt holds, as a stall names it (ATK-431). `agent` is the subagent
5
+ // that made it, null for the session's own; `denials` counts the auto-mode classifier denials just
6
+ // before it in that transcript.
7
+ export const pendingCallSchema = z.object({
8
+ agent: z.object({ description: z.string().optional(), type: z.string() }).nullable(),
9
+ at: z.string(),
10
+ denials: z.number(),
11
+ detail: z.string(),
12
+ tool: z.string(),
13
+ });
14
+ // How much of a transcript's end is read first, doubled until it holds what's needed.
15
+ const TAIL = 256 * 1024;
16
+ const DETAIL_MAX = 160;
17
+ // The Agent tool waits on its subagent, whose own transcript holds the call that prompted.
18
+ const WAITS_ON_SUBAGENT = new Set(['Agent', 'Task']);
19
+ // Tools auto mode usually allows without its classifier (reads, and edits inside the project), so
20
+ // they don't end a run of denials. A heuristic: an edit outside the project is classified.
21
+ const UNCLASSIFIED = new Set(['Edit', 'Glob', 'Grep', 'NotebookEdit', 'Read', 'TodoWrite', 'Write']);
22
+ const DENIED = 'denied by the Claude Code auto mode classifier';
23
+ // The push goes to a third party, so values that look like credentials are cut from the detail.
24
+ const SECRETS = [
25
+ [/(bearer\s+)[^\s"']+/gi, '$1…'],
26
+ [/((?:token|secret|password|passwd|api[_-]?key|credential)[\w-]*["']?\s*[=:]\s*)("[^"]*"|'[^']*'|\S+)/gi, '$1…'],
27
+ [/\b(?:gh[opsur]_|github_pat_|npm_|sk-|xox[abp]-)[\w-]+/g, '…'],
28
+ [/[A-Za-z0-9+_-]{48,}/g, '…'],
29
+ ];
30
+ const toolUse = z.looseObject({ id: z.string(), input: z.unknown(), name: z.string(), type: z.literal('tool_use') });
31
+ const toolResult = z.looseObject({ content: z.unknown(), tool_use_id: z.string(), type: z.literal('tool_result') });
32
+ const entryLine = z.looseObject({
33
+ message: z.looseObject({ content: z.array(z.unknown()), id: z.string().optional() }),
34
+ timestamp: z.string().optional(),
35
+ type: z.enum(['assistant', 'user']),
36
+ });
37
+ const callInput = z.looseObject({
38
+ command: z.string().optional(),
39
+ file_path: z.string().optional(),
40
+ notebook_path: z.string().optional(),
41
+ path: z.string().optional(),
42
+ pattern: z.string().optional(),
43
+ url: z.string().optional(),
44
+ });
45
+ const agentMeta = z.looseObject({ agentType: z.string(), description: z.string().optional() });
46
+ // Bash `git diff …` in subagent general-purpose (Review the diff), after 2 auto-mode denials.
47
+ export function describePending(call) {
48
+ const agent = call.agent
49
+ ? ` in subagent ${call.agent.type}${call.agent.description ? ` (${call.agent.description})` : ''}`
50
+ : '';
51
+ const denials = call.denials > 0 ? `, after ${call.denials} auto-mode denial${call.denials === 1 ? '' : 's'}` : '';
52
+ const detail = !call.detail ? '' : call.detail.includes('`') ? ` \`\` ${call.detail} \`\`` : ` \`${call.detail}\``;
53
+ return `${call.tool}${detail}${agent}${denials}`;
54
+ }
55
+ // The call a session's permission prompt holds: across its transcripts (its own and its
56
+ // subagents', from `transcriptFiles`), the newest tool call still open that started by `before`,
57
+ // when the prompt was first seen. A call started later is one still running beside the prompt.
58
+ // Within one assistant message whose calls run in turn, it is the first one still open. Null when
59
+ // none is open, or nothing could be read: it only adds to a stall, so it never throws.
60
+ export function pendingCall(files, before) {
61
+ let newest = null;
62
+ for (const file of files) {
63
+ let found;
64
+ try {
65
+ found = pendingIn(file, before);
66
+ }
67
+ catch {
68
+ continue; // a transcript removed or half-written under us
69
+ }
70
+ if (found && (newest === null || found.at > newest.at))
71
+ newest = found;
72
+ }
73
+ return newest;
74
+ }
75
+ function agentOf(file) {
76
+ if (!/[\\/]subagents[\\/][^\\/]+\.jsonl$/.test(file))
77
+ return null;
78
+ const meta = file.replace(/\.jsonl$/, '.meta.json');
79
+ try {
80
+ const parsed = agentMeta.safeParse(JSON.parse(readFileSync(meta, 'utf8')));
81
+ if (parsed.success)
82
+ return { description: parsed.data.description, type: parsed.data.agentType };
83
+ }
84
+ catch {
85
+ // no meta file: still a subagent
86
+ }
87
+ return { type: 'subagent' };
88
+ }
89
+ // The command's first line, or the path or pattern the call is about, short enough for a push.
90
+ function detailOf(input) {
91
+ const parsed = callInput.safeParse(input);
92
+ if (!parsed.success)
93
+ return '';
94
+ const i = parsed.data;
95
+ const text = (i.command ?? i.file_path ?? i.notebook_path ?? i.pattern ?? i.url ?? i.path ?? '').trim();
96
+ const first = (text.split('\n')[0] ?? '').replace(/\s+/g, ' ');
97
+ const line = SECRETS.reduce((s, [pattern, to]) => s.replace(pattern, to), first);
98
+ const cut = line.length > DETAIL_MAX ? `${line.slice(0, DETAIL_MAX - 1)}…` : line;
99
+ return cut === line && text.includes('\n') ? `${line} …` : cut;
100
+ }
101
+ function isDenial(content) {
102
+ const text = typeof content === 'string' ? content : JSON.stringify(content ?? '');
103
+ return text.slice(0, 400).includes(DENIED);
104
+ }
105
+ function pendingIn(file, before) {
106
+ if (!existsSync(file))
107
+ return null;
108
+ for (let tail = TAIL;; tail *= 2) {
109
+ const { bytes, whole } = tailLines(file, tail);
110
+ const { calls, results } = readCalls(bytes.toString('utf8'));
111
+ if (calls.length === 0 && !whole)
112
+ continue;
113
+ // A call left open in a message before the newest answered one (an interrupted turn) waits on
114
+ // nothing now. Its own message's calls can still be open: they run in parallel or in turn.
115
+ // An open Agent call is where its subagent took over.
116
+ const settled = calls.findLast((c) => results.has(c.id) || WAITS_ON_SUBAGENT.has(c.name));
117
+ const from = settled ? calls.findIndex((c) => c.message === settled.message) : 0;
118
+ const open = calls
119
+ .slice(from)
120
+ .filter((c) => !results.has(c.id) && !WAITS_ON_SUBAGENT.has(c.name) && c.at <= before);
121
+ const last = open.at(-1);
122
+ if (!last)
123
+ return null;
124
+ const call = open.find((c) => c.message === last.message) ?? last;
125
+ let denials = 0;
126
+ let ended = false;
127
+ for (const earlier of calls.slice(0, calls.indexOf(call)).reverse()) {
128
+ const result = results.get(earlier.id);
129
+ if (result === undefined || UNCLASSIFIED.has(earlier.name))
130
+ continue;
131
+ if (!result.denied) {
132
+ ended = true;
133
+ break;
134
+ }
135
+ denials += 1;
136
+ }
137
+ // A run of denials that reaches back past the tail: read further for the rest of it.
138
+ if (denials > 0 && !ended && !whole)
139
+ continue;
140
+ return { agent: agentOf(file), at: call.at, denials, detail: detailOf(call.input), tool: call.name };
141
+ }
142
+ }
143
+ function readCalls(text) {
144
+ const calls = [];
145
+ const results = new Map();
146
+ for (const line of text.split('\n')) {
147
+ let parsed;
148
+ try {
149
+ parsed = JSON.parse(line);
150
+ }
151
+ catch {
152
+ continue; // not JSON: skip it, as Claude Code does
153
+ }
154
+ const entry = entryLine.safeParse(parsed);
155
+ if (!entry.success)
156
+ continue;
157
+ const { message, timestamp, type } = entry.data;
158
+ for (const block of message.content) {
159
+ if (type === 'assistant') {
160
+ const use = toolUse.safeParse(block);
161
+ if (use.success)
162
+ calls.push({
163
+ at: timestamp ?? '',
164
+ id: use.data.id,
165
+ input: use.data.input,
166
+ message: message.id ?? use.data.id,
167
+ name: use.data.name,
168
+ });
169
+ }
170
+ else {
171
+ const result = toolResult.safeParse(block);
172
+ if (result.success)
173
+ results.set(result.data.tool_use_id, { denied: isDenial(result.data.content) });
174
+ }
175
+ }
176
+ }
177
+ return { calls, results };
178
+ }
179
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"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"}
package/build/upgrade.js CHANGED
@@ -24,7 +24,7 @@ export function parseTag(tag) {
24
24
  throw new ConductorError(`--tag takes ${TAGS.join(' or ')}, not "${tag}"`);
25
25
  }
26
26
  // Starts the daemon detached and says how: through the logon task when it runs this cli.js, else
27
- // as a detached `conduct serve`. For upgrade's restart and `conduct start`.
27
+ // as a detached `conduct supervise`. For upgrade's restart and `conduct start`.
28
28
  export async function restartDaemon(deps) {
29
29
  if (deps.taskRunsCli()) {
30
30
  try {
@@ -37,12 +37,13 @@ export async function restartDaemon(deps) {
37
37
  }
38
38
  }
39
39
  deps.serveDetached();
40
- return `with conduct serve (pid ${await deps.awaitDaemon()})`;
40
+ return `with conduct supervise (pid ${await deps.awaitDaemon()})`;
41
41
  }
42
42
  // Stop, install, restart. Refuses a linked build, and a tag older than the installed version unless
43
43
  // allowDowngrade, before it touches anything; does nothing when the tag's version is already
44
44
  // installed, and starts the daemon again only if it stopped one: through the logon task when that
45
- // runs this cli.js (a global install keeps the path), else detached.
45
+ // runs this cli.js (a global install keeps the path), else detached. A logon task that still runs
46
+ // the unsupervised `conduct serve` gets a line saying to register it again.
46
47
  export async function upgrade({ allowDowngrade = false, tag }, deps) {
47
48
  const root = await deps.npmRoot();
48
49
  if (!isGlobalInstall(deps.cliPath, root)) {
@@ -93,11 +94,14 @@ export async function upgrade({ allowDowngrade = false, tag }, deps) {
93
94
  if (restartError) {
94
95
  throw new ConductorError(`installed ${deps.installedVersion()}, but the conductor did not start again`, [
95
96
  messageOf(restartError),
96
- 'start it with `conduct serve`',
97
+ 'start it with `conduct start`',
97
98
  ]);
98
99
  }
99
100
  deps.out(`${downgrade ? 'downgraded' : 'upgraded'} ${from} → ${deps.installedVersion()} (from ${chosen})`);
100
- deps.out(restart ? `started the conductor ${restart}` : 'the conductor was not running; start it with `conduct serve`');
101
+ deps.out(restart ? `started the conductor ${restart}` : 'the conductor was not running; start it with `conduct start`');
102
+ if (deps.taskRunsCli() && !deps.taskSupervises()) {
103
+ deps.out(`the "${TASK_NAME}" logon task runs conduct serve, which nothing restarts if it dies: run \`conduct install-startup\` once to supervise it`);
104
+ }
101
105
  // A folder marketplace is read in place, so the mod was replaced with the package.
102
106
  deps.out('if the conductor mod is installed (conduct install-mod), it is the new version too: run /reload-plugins in open Claude sessions');
103
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ const OPEN_TYPES = ['backlog', 'unstarted', 'started'];
7
7
  const CLOSED_TYPES = new Set(['canceled', 'completed', 'duplicate']);
8
8
  const ISSUE_FIELDS = `identifier title priority createdAt state { type } project { name }
9
9
  labels(first: 20) { nodes { name } }
10
- inverseRelations(first: 20) { nodes { type issue { identifier } } }`;
10
+ inverseRelations(first: 20) { nodes { type issue { id identifier state { type } } } }`;
11
11
  const OPEN_ISSUES = `open: issues(first: ${PAGE}, after: $after, filter: { team: { key: { eq: $team } }, state: { type: { in: ${JSON.stringify(OPEN_TYPES)} } } }) {
12
12
  pageInfo { hasNextPage endCursor }
13
13
  nodes { ${ISSUE_FIELDS} }
@@ -23,11 +23,21 @@ export const QUEUE_QUERY = `query Queue($team: String!, $area: String!, $numbers
23
23
  export const OPEN_PAGE_QUERY = `query OpenPage($team: String!, $after: String) {
24
24
  ${OPEN_ISSUES}
25
25
  }`;
26
+ // The comments of these Done blockers that mention the release skill's shipped note: a note that
27
+ // only quotes it (a plan, this conductor's docs) is told apart by isShippedNote.
28
+ export const SHIPPED_QUERY = `query Shipped($ids: [ID!]!, $shipped: String!) {
29
+ issues(first: ${PAGE}, includeArchived: true, filter: { id: { in: $ids } }) {
30
+ nodes { identifier comments(first: 10, filter: { body: { contains: $shipped } }) { nodes { body } } }
31
+ }
32
+ }`;
26
33
  const issueNode = z.object({
27
34
  createdAt: z.string().nullable(),
28
35
  identifier: z.string(),
29
36
  inverseRelations: z.object({
30
- nodes: z.array(z.object({ issue: z.object({ identifier: z.string() }).nullable(), type: z.string() })),
37
+ nodes: z.array(z.object({
38
+ issue: z.object({ id: z.string(), identifier: z.string(), state: z.object({ type: z.string() }) }).nullable(),
39
+ type: z.string(),
40
+ })),
31
41
  }),
32
42
  labels: z.object({ nodes: z.array(z.object({ name: z.string() })) }),
33
43
  priority: z.number().nullable(),
@@ -67,10 +77,56 @@ export function linearQueue(options = {}) {
67
77
  .parse(await post(OPEN_PAGE_QUERY, { after: page.pageInfo.endCursor, team }, budget)).open;
68
78
  pages.push(page);
69
79
  }
70
- return snapshotFrom(first, pages);
80
+ const snapshot = snapshotFrom(first, pages);
81
+ const { releaseWait } = profile.tracker;
82
+ if (!releaseWait)
83
+ return snapshot;
84
+ const nodes = [first.open, ...pages].flatMap((page) => page.nodes);
85
+ const labelled = nodes.filter((n) => n.labels.nodes.some((l) => l.name === releaseWait.label));
86
+ const done = [
87
+ ...new Set(labelled
88
+ .flatMap(blockersOf)
89
+ .filter((b) => b.state.type === 'completed')
90
+ .map((b) => b.id)),
91
+ ];
92
+ const shipped = new Set();
93
+ if (done.length > 0) {
94
+ const answer = shippedAnswer.parse(await post(SHIPPED_QUERY, { ids: done, shipped: releaseWait.shipped }, budget));
95
+ for (const n of answer.issues.nodes)
96
+ if (n.comments.nodes.some((c) => isShippedNote(c.body, releaseWait.shipped)))
97
+ shipped.add(n.identifier);
98
+ }
99
+ return {
100
+ ...snapshot,
101
+ releaseWait: releaseWaitFrom(labelled, releaseWait.label, shipped, new Set(nodes.map((n) => n.identifier))),
102
+ };
71
103
  },
72
104
  };
73
105
  }
106
+ const shippedAnswer = z.object({
107
+ issues: z.object({
108
+ nodes: z.array(z.object({ comments: z.object({ nodes: z.array(z.object({ body: z.string() })) }), identifier: z.string() })),
109
+ }),
110
+ });
111
+ // A comment that is the shipped note: its first line starts with the text, under any Markdown heading
112
+ // or bold (release-atk writes `**release-atk · Shipped**`), not one that only quotes it further on.
113
+ export function isShippedNote(body, shipped) {
114
+ return (body.split('\n', 1)[0] ?? '').replace(/^[\s#*_]+/, '').startsWith(shipped);
115
+ }
116
+ // Each labelled item's blockers, open or closed, and those not yet released: Done with no shipped
117
+ // note, or still open outside the team's open items (another team's), which `blockedBy` doesn't
118
+ // hold. A canceled or duplicate blocker never ships, and holds nothing.
119
+ export function releaseWaitFrom(labelled, label, shipped, open) {
120
+ const cleared = (b) => (b.state.type === 'completed' && shipped.has(b.identifier)) || ['canceled', 'duplicate'].includes(b.state.type);
121
+ return {
122
+ items: Object.fromEntries(labelled.map((n) => {
123
+ const blockers = blockersOf(n);
124
+ const unshipped = blockers.filter((b) => !cleared(b) && !open.has(b.identifier)).map((b) => b.identifier);
125
+ return [n.identifier, { blockers: blockers.length, unshipped }];
126
+ })),
127
+ label,
128
+ };
129
+ }
74
130
  // The snapshot from the Queue query's answer and any later pages of open items. An item's blockers
75
131
  // are the ones still open; an in-flight item the read finds done, canceled or a duplicate is closed.
76
132
  export function snapshotFrom(data, pages = []) {
@@ -85,8 +141,9 @@ export function snapshotFrom(data, pages = []) {
85
141
  const labels = n.labels.nodes.map((l) => l.name);
86
142
  return {
87
143
  area: labels.find((l) => areas.has(l)) ?? null,
88
- // Linear stores "A blocks B" on A; B sees it as an inverse relation.
89
- blockedBy: n.inverseRelations.nodes.flatMap((r) => r.type === 'blocks' && r.issue && open.has(r.issue.identifier) ? [r.issue.identifier] : []),
144
+ blockedBy: blockersOf(n)
145
+ .map((b) => b.identifier)
146
+ .filter((id) => open.has(id)),
90
147
  createdAt: n.createdAt,
91
148
  id: n.identifier,
92
149
  labels,
@@ -99,4 +156,8 @@ export function snapshotFrom(data, pages = []) {
99
156
  projects: data.projects.nodes,
100
157
  };
101
158
  }
159
+ // Each blocker of an item: Linear stores "A blocks B" on A, so B sees it as an inverse relation.
160
+ function blockersOf(node) {
161
+ return node.inverseRelations.nodes.flatMap((r) => (r.type === 'blocks' && r.issue ? [r.issue] : []));
162
+ }
102
163
  //# sourceMappingURL=linear-queue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"linear-queue.js","sourceRoot":"","sources":["../../src/watchers/linear-queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linear-queue.js","sourceRoot":"","sources":["../../src/watchers/linear-queue.ts"],"names":[],"mappings":"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"}
@@ -167,6 +167,11 @@ export function glyph(status: string): string {
167
167
  return '·';
168
168
  }
169
169
 
170
+ // A worker's PR as its row shows it: `#1850`; the expanded row shows the whole ref.
171
+ export function prLabel(pr: null | string): string {
172
+ return pr === null ? '' : `#${pr.slice(pr.lastIndexOf('#') + 1)}`;
173
+ }
174
+
170
175
  // What a worker waits on or does: its open wait, else the session's activity.
171
176
  export function workerDoing(w: ConductorWorker): string {
172
177
  return w.waits[0] ?? w.activity;
@@ -329,6 +334,7 @@ export function parseFleet(body: unknown): ConductorWorker[] | null {
329
334
  item: typeof w.item === 'string' ? w.item : w.name,
330
335
  name: w.name,
331
336
  phase: typeof w.phase === 'string' ? w.phase : null,
337
+ pr: typeof w.pr === 'string' ? w.pr : null,
332
338
  project: typeof w.project === 'string' ? w.project : '?',
333
339
  spendToday: spend,
334
340
  status: w.status,
@@ -27,6 +27,7 @@ import {
27
27
  parseLine,
28
28
  type PingOutcome,
29
29
  pingOutcome,
30
+ prLabel,
30
31
  profileText,
31
32
  projectGroups,
32
33
  type PushOutcome,
@@ -783,7 +784,8 @@ export const register: Register = (on) => {
783
784
  onPress={() => update($, expanded, (name) => (name === w.name ? null : w.name))}
784
785
  plain
785
786
  >
786
- {glyph(w.status)} {w.name} {w.phase ?? ''}{' '}
787
+ {glyph(w.status)} {w.name} {w.phase ?? ''}
788
+ {w.pr === null ? '' : ` ${prLabel(w.pr)}`}{' '}
787
789
  <Text dimColor>
788
790
  {workerDoing(w)} · {age(w.updatedAt, now)} · {tokens(w.spendToday)} tok
789
791
  </Text>
@@ -798,6 +800,7 @@ export const register: Register = (on) => {
798
800
  <Button key={`why-${w.id}`} label='why' onPress={async () => $.ui.toast(await why($, w.item))} />
799
801
  <Text dimColor>
800
802
  {w.status}
803
+ {w.pr === null ? '' : ` · PR ${w.pr}`}
801
804
  {w.waits.length > 0 ? ` · waits on ${w.waits.join(', ')}` : ''}
802
805
  </Text>
803
806
  </Box>
@@ -6,6 +6,8 @@ export type ConductorWorker = {
6
6
  item: string;
7
7
  name: string;
8
8
  phase: string | null;
9
+ // Its PR as the daemon spells it, such as `ado:Emergent.AgenticToolkit#1850`; null before it has one.
10
+ pr: string | null;
9
11
  project: string;
10
12
  spendToday: number;
11
13
  status: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@detergent-software/conductor",
3
- "version": "1.1.0",
3
+ "version": "1.2.0-dev.10",
4
4
  "description": "Conductor: the local daemon that runs conducted projects' work loops (conduct serve) and its conduct CLI.",
5
5
  "type": "module",
6
6
  "bin": {