@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.
- package/CHANGELOG.md +96 -0
- package/README.md +36 -17
- package/build/brief-cli.js +2 -0
- package/build/brief-cli.js.map +1 -1
- package/build/brief.js +13 -0
- package/build/brief.js.map +1 -1
- package/build/cli.js +196 -40
- package/build/cli.js.map +1 -1
- package/build/conditions.js +20 -0
- package/build/conditions.js.map +1 -1
- package/build/daemon.js +20 -7
- package/build/daemon.js.map +1 -1
- package/build/help.js +16 -3
- package/build/help.js.map +1 -1
- package/build/history.js +96 -0
- package/build/history.js.map +1 -1
- package/build/inbox.js +87 -15
- package/build/inbox.js.map +1 -1
- package/build/manager.js +46 -6
- package/build/manager.js.map +1 -1
- package/build/note.js +14 -3
- package/build/note.js.map +1 -1
- package/build/notes.js +80 -6
- package/build/notes.js.map +1 -1
- package/build/paths.js +2 -0
- package/build/paths.js.map +1 -1
- package/build/profile.js +8 -0
- package/build/profile.js.map +1 -1
- package/build/queue.js +67 -14
- package/build/queue.js.map +1 -1
- package/build/rule-actions.js +144 -25
- package/build/rule-actions.js.map +1 -1
- package/build/rules-service.js +29 -10
- package/build/rules-service.js.map +1 -1
- package/build/rules.js +34 -6
- package/build/rules.js.map +1 -1
- package/build/scheduler.js +93 -12
- package/build/scheduler.js.map +1 -1
- package/build/server.js +6 -3
- package/build/server.js.map +1 -1
- package/build/spend.js +13 -8
- package/build/spend.js.map +1 -1
- package/build/startup.js +30 -16
- package/build/startup.js.map +1 -1
- package/build/stop-request.js +83 -0
- package/build/stop-request.js.map +1 -0
- package/build/store.js +68 -2
- package/build/store.js.map +1 -1
- package/build/supervise.js +153 -0
- package/build/supervise.js.map +1 -0
- package/build/transcript.js +179 -0
- package/build/transcript.js.map +1 -0
- package/build/upgrade.js +9 -5
- package/build/upgrade.js.map +1 -1
- package/build/watchers/linear-queue.js +66 -5
- package/build/watchers/linear-queue.js.map +1 -1
- package/mod/hooks/model.ts +6 -0
- package/mod/hooks/register.tsx +4 -1
- package/mod/types/index.d.ts +2 -0
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|
package/build/upgrade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAI5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,CAAC,MAAM,OAAO,GAAG,+BAA+B,CAAC;AACvD,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAU,CAAC;
|
|
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({
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAe,KAAK,EAAE,MAAM,aAAa,CAAC;AAWjD,MAAM,IAAI,GAAG,GAAG,CAAC;AACjB,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AACvD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAErE,MAAM,YAAY,GAAG;;
|
|
1
|
+
{"version":3,"file":"linear-queue.js","sourceRoot":"","sources":["../../src/watchers/linear-queue.ts"],"names":[],"mappings":"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"}
|
package/mod/hooks/model.ts
CHANGED
|
@@ -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,
|
package/mod/hooks/register.tsx
CHANGED
|
@@ -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>
|
package/mod/types/index.d.ts
CHANGED
|
@@ -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