@oratis/lisa 0.7.0 → 0.8.0
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/dist/autostart/install.d.ts +28 -0
- package/dist/autostart/install.d.ts.map +1 -0
- package/dist/autostart/install.js +180 -0
- package/dist/autostart/install.js.map +1 -0
- package/dist/cli.js +49 -1
- package/dist/cli.js.map +1 -1
- package/dist/heartbeat/install.d.ts.map +1 -1
- package/dist/heartbeat/install.js +1 -43
- package/dist/heartbeat/install.js.map +1 -1
- package/dist/heartbeat/runner.d.ts.map +1 -1
- package/dist/heartbeat/runner.js +11 -0
- package/dist/heartbeat/runner.js.map +1 -1
- package/dist/integrations/aider/observer.d.ts +48 -0
- package/dist/integrations/aider/observer.d.ts.map +1 -0
- package/dist/integrations/aider/observer.js +196 -0
- package/dist/integrations/aider/observer.js.map +1 -0
- package/dist/integrations/comparisons.d.ts +23 -0
- package/dist/integrations/comparisons.d.ts.map +1 -0
- package/dist/integrations/comparisons.js +47 -0
- package/dist/integrations/comparisons.js.map +1 -0
- package/dist/integrations/github-pr/observer.d.ts +85 -0
- package/dist/integrations/github-pr/observer.d.ts.map +1 -0
- package/dist/integrations/github-pr/observer.js +261 -0
- package/dist/integrations/github-pr/observer.js.map +1 -0
- package/dist/integrations/hub.d.ts.map +1 -1
- package/dist/integrations/hub.js +10 -0
- package/dist/integrations/hub.js.map +1 -1
- package/dist/integrations/opencode/observer.d.ts +74 -0
- package/dist/integrations/opencode/observer.d.ts.map +1 -0
- package/dist/integrations/opencode/observer.js +207 -0
- package/dist/integrations/opencode/observer.js.map +1 -0
- package/dist/integrations/registry.d.ts.map +1 -1
- package/dist/integrations/registry.js +3 -1
- package/dist/integrations/registry.js.map +1 -1
- package/dist/integrations/scheduled-dispatch.d.ts +42 -0
- package/dist/integrations/scheduled-dispatch.d.ts.map +1 -0
- package/dist/integrations/scheduled-dispatch.js +140 -0
- package/dist/integrations/scheduled-dispatch.js.map +1 -0
- package/dist/launchd.d.ts +18 -0
- package/dist/launchd.d.ts.map +1 -0
- package/dist/launchd.js +60 -0
- package/dist/launchd.js.map +1 -0
- package/dist/orchestrator/journal.d.ts +46 -0
- package/dist/orchestrator/journal.d.ts.map +1 -0
- package/dist/orchestrator/journal.js +82 -0
- package/dist/orchestrator/journal.js.map +1 -0
- package/dist/orchestrator/recap.d.ts +38 -0
- package/dist/orchestrator/recap.d.ts.map +1 -0
- package/dist/orchestrator/recap.js +134 -0
- package/dist/orchestrator/recap.js.map +1 -0
- package/dist/screen_advisor/engine.d.ts +79 -0
- package/dist/screen_advisor/engine.d.ts.map +1 -0
- package/dist/screen_advisor/engine.js +128 -0
- package/dist/screen_advisor/engine.js.map +1 -0
- package/dist/soul/lock.d.ts +7 -4
- package/dist/soul/lock.d.ts.map +1 -1
- package/dist/soul/lock.js +33 -9
- package/dist/soul/lock.js.map +1 -1
- package/dist/tools/agent_recap.d.ts +21 -0
- package/dist/tools/agent_recap.d.ts.map +1 -0
- package/dist/tools/agent_recap.js +43 -0
- package/dist/tools/agent_recap.js.map +1 -0
- package/dist/tools/compare_agents.d.ts +16 -0
- package/dist/tools/compare_agents.d.ts.map +1 -0
- package/dist/tools/compare_agents.js +145 -0
- package/dist/tools/compare_agents.js.map +1 -0
- package/dist/tools/dispatch_agent.d.ts +13 -0
- package/dist/tools/dispatch_agent.d.ts.map +1 -1
- package/dist/tools/dispatch_agent.js +46 -46
- package/dist/tools/dispatch_agent.js.map +1 -1
- package/dist/tools/exec-util.d.ts +18 -0
- package/dist/tools/exec-util.d.ts.map +1 -0
- package/dist/tools/exec-util.js +72 -0
- package/dist/tools/exec-util.js.map +1 -0
- package/dist/tools/inspect_agent.d.ts +21 -0
- package/dist/tools/inspect_agent.d.ts.map +1 -0
- package/dist/tools/inspect_agent.js +87 -0
- package/dist/tools/inspect_agent.js.map +1 -0
- package/dist/tools/list_agents.d.ts +21 -0
- package/dist/tools/list_agents.d.ts.map +1 -0
- package/dist/tools/list_agents.js +88 -0
- package/dist/tools/list_agents.js.map +1 -0
- package/dist/tools/pr_status.d.ts +31 -0
- package/dist/tools/pr_status.d.ts.map +1 -0
- package/dist/tools/pr_status.js +90 -0
- package/dist/tools/pr_status.js.map +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +19 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/repo_digest.d.ts +33 -0
- package/dist/tools/repo_digest.d.ts.map +1 -0
- package/dist/tools/repo_digest.js +113 -0
- package/dist/tools/repo_digest.js.map +1 -0
- package/dist/tools/review_diff.d.ts +28 -0
- package/dist/tools/review_diff.d.ts.map +1 -0
- package/dist/tools/review_diff.js +68 -0
- package/dist/tools/review_diff.js.map +1 -0
- package/dist/tools/run_checks.d.ts +15 -0
- package/dist/tools/run_checks.d.ts.map +1 -0
- package/dist/tools/run_checks.js +117 -0
- package/dist/tools/run_checks.js.map +1 -0
- package/dist/tools/scheduled_dispatch.d.ts +27 -0
- package/dist/tools/scheduled_dispatch.d.ts.map +1 -0
- package/dist/tools/scheduled_dispatch.js +57 -0
- package/dist/tools/scheduled_dispatch.js.map +1 -0
- package/dist/web/island.d.ts +1 -1
- package/dist/web/island.d.ts.map +1 -1
- package/dist/web/island.js +67 -4
- package/dist/web/island.js.map +1 -1
- package/dist/web/lisa-html.d.ts +1 -1
- package/dist/web/lisa-html.d.ts.map +1 -1
- package/dist/web/lisa-html.js +23 -2
- package/dist/web/lisa-html.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +136 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch_agent.d.ts","sourceRoot":"","sources":["../../src/tools/dispatch_agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,UAAU,aAAa;IACrB,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAoBD,wEAAwE;AACxE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,IAAI,EAAE,MAAM,GACX;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBjC;AAED,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"dispatch_agent.d.ts","sourceRoot":"","sources":["../../src/tools/dispatch_agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,UAAU,aAAa;IACrB,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAoBD,wEAAwE;AACxE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,IAAI,EAAE,MAAM,GACX;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBjC;AAED,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GACxB,OAAO,CAAC,YAAY,CAAC,CAkCvB;AAED,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,aAAa,EAAE,MAAM,CA6DnE,CAAC"}
|
|
@@ -56,6 +56,49 @@ export function buildDispatchArgv(agent, task) {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Spawn a CLI agent headlessly, detached, and record it in the dispatch ledger.
|
|
61
|
+
* Shared by dispatch_agent (interactive), scheduled_dispatch (heartbeat-timed),
|
|
62
|
+
* and compare_agents (parallel). Never throws — returns {pid} or {error}.
|
|
63
|
+
*/
|
|
64
|
+
export async function launchAgent(agent, task, cwd, log) {
|
|
65
|
+
const { cmd, args } = buildDispatchArgv(agent, task);
|
|
66
|
+
let child;
|
|
67
|
+
try {
|
|
68
|
+
child = spawn(cmd, args, { cwd, detached: true, stdio: "ignore" });
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
return { error: `Failed to launch ${agent}: ${err.message}. Is "${cmd}" installed and on PATH?`, cmd };
|
|
72
|
+
}
|
|
73
|
+
const launchError = await new Promise((resolve) => {
|
|
74
|
+
let settled = false;
|
|
75
|
+
child.once("error", (e) => {
|
|
76
|
+
if (settled)
|
|
77
|
+
return;
|
|
78
|
+
settled = true;
|
|
79
|
+
resolve(e.code === "ENOENT" ? `"${cmd}" not found on PATH — is ${agent} installed?` : `launch error: ${e.message}`);
|
|
80
|
+
});
|
|
81
|
+
setTimeout(() => {
|
|
82
|
+
if (settled)
|
|
83
|
+
return;
|
|
84
|
+
settled = true;
|
|
85
|
+
resolve(null);
|
|
86
|
+
}, 150);
|
|
87
|
+
});
|
|
88
|
+
if (launchError)
|
|
89
|
+
return { error: launchError, cmd };
|
|
90
|
+
const pid = child.pid;
|
|
91
|
+
child.unref();
|
|
92
|
+
if (typeof pid === "number") {
|
|
93
|
+
try {
|
|
94
|
+
recordDispatch({ agent, pid, cwd, task });
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
log?.(`[dispatch] ledger write failed (non-fatal): ${err.message}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { pid, cmd };
|
|
101
|
+
}
|
|
59
102
|
export const dispatchAgentTool = {
|
|
60
103
|
name: "dispatch_agent",
|
|
61
104
|
description: "Launch another CLI coding agent (claude, codex, opencode, aider) to work on a task " +
|
|
@@ -101,52 +144,9 @@ export const dispatchAgentTool = {
|
|
|
101
144
|
`Wait for it to finish, pick a different directory, or pass force:true to override.`);
|
|
102
145
|
}
|
|
103
146
|
}
|
|
104
|
-
const {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
child = spawn(cmd, args, {
|
|
108
|
-
cwd,
|
|
109
|
-
detached: true, // survive LISA; the agent runs on its own
|
|
110
|
-
stdio: "ignore",
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
catch (err) {
|
|
114
|
-
return `Failed to launch ${input.agent}: ${err.message}. Is "${cmd}" installed and on PATH?`;
|
|
115
|
-
}
|
|
116
|
-
// If the binary is missing, spawn emits 'error' asynchronously. Surface a
|
|
117
|
-
// useful message in that case rather than silently "succeeding".
|
|
118
|
-
const launchError = await new Promise((resolve) => {
|
|
119
|
-
let settled = false;
|
|
120
|
-
child.once("error", (e) => {
|
|
121
|
-
if (settled)
|
|
122
|
-
return;
|
|
123
|
-
settled = true;
|
|
124
|
-
resolve(e.code === "ENOENT"
|
|
125
|
-
? `"${cmd}" not found on PATH — is ${input.agent} installed?`
|
|
126
|
-
: `launch error: ${e.message}`);
|
|
127
|
-
});
|
|
128
|
-
// Give the spawn a tick to fail fast; if it doesn't, assume it started.
|
|
129
|
-
setTimeout(() => {
|
|
130
|
-
if (settled)
|
|
131
|
-
return;
|
|
132
|
-
settled = true;
|
|
133
|
-
resolve(null);
|
|
134
|
-
}, 150);
|
|
135
|
-
});
|
|
136
|
-
if (launchError)
|
|
137
|
-
return launchError;
|
|
138
|
-
const pid = child.pid;
|
|
139
|
-
child.unref(); // don't keep LISA's event loop alive for it
|
|
140
|
-
// Record it so signal_agent can list/cancel it from a later turn (the
|
|
141
|
-
// detached child outlives this turn's handle). Never fatal to the dispatch.
|
|
142
|
-
if (typeof pid === "number") {
|
|
143
|
-
try {
|
|
144
|
-
recordDispatch({ agent: input.agent, pid, cwd, task: input.task });
|
|
145
|
-
}
|
|
146
|
-
catch (err) {
|
|
147
|
-
ctx.log(`[dispatch] ledger write failed (non-fatal): ${err.message}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
147
|
+
const { pid, error } = await launchAgent(input.agent, input.task, cwd, ctx.log);
|
|
148
|
+
if (error)
|
|
149
|
+
return error;
|
|
150
150
|
ctx.log(`[dispatch] launched ${input.agent} (pid ${pid}) in ${cwd}: ${input.task.slice(0, 80)}`);
|
|
151
151
|
return (`Launched ${input.agent} (pid ${pid}) in ${cwd}.\n` +
|
|
152
152
|
`It's running autonomously and will appear in the agent session monitor. ` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch_agent.js","sourceRoot":"","sources":["../../src/tools/dispatch_agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAUpE;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC,CAAC,kCAAkC;IACzD,MAAM,KAAK,GAAG,GAAG;SACd,IAAI,EAAE;SACN,IAAI,CACH,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CACpE,CAAC;IACJ,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,iBAAiB,CAC/B,KAA6B,EAC7B,IAAY;IAEZ,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAC/C,KAAK,OAAO;YACV,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QAChD,KAAK,UAAU;YACb,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QAClD,KAAK,OAAO;YACV,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,CAAC,CAAC;YACR,uBAAuB;YACvB,MAAM,MAAM,GAAU,KAAK,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch_agent.js","sourceRoot":"","sources":["../../src/tools/dispatch_agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ExecResult {
|
|
2
|
+
code: number | null;
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
timedOut: boolean;
|
|
6
|
+
/** True when the binary itself couldn't be spawned (e.g. not installed). */
|
|
7
|
+
spawnError?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function runIn(cwd: string, cmd: string, args: string[], opts?: {
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
maxBytes?: number;
|
|
13
|
+
}): Promise<ExecResult>;
|
|
14
|
+
/** Validate that `p` is an absolute path to an existing directory. */
|
|
15
|
+
export declare function isDir(p: string): Promise<boolean>;
|
|
16
|
+
/** `git -C <cwd> rev-parse --show-toplevel` → repo root, or null if not a repo. */
|
|
17
|
+
export declare function gitRoot(cwd: string, signal?: AbortSignal): Promise<string | null>;
|
|
18
|
+
//# sourceMappingURL=exec-util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-util.d.ts","sourceRoot":"","sources":["../../src/tools/exec-util.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,KAAK,CACnB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACzE,OAAO,CAAC,UAAU,CAAC,CAoCrB;AAED,sEAAsE;AACtE,wBAAsB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvD;AAED,mFAAmF;AACnF,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOvF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small process-exec helper shared by the repo/PR/check tools. Runs a command
|
|
3
|
+
* in a given directory, captures (capped) output, honours an AbortSignal and a
|
|
4
|
+
* timeout. Never throws — returns a result with the exit code so callers branch
|
|
5
|
+
* on it. Dependency-free (node:child_process only).
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
import { stat } from "node:fs/promises";
|
|
9
|
+
export function runIn(cwd, cmd, args, opts = {}) {
|
|
10
|
+
const cap = opts.maxBytes ?? 64 * 1024;
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
let child;
|
|
13
|
+
try {
|
|
14
|
+
child = spawn(cmd, args, { cwd, signal: opts.signal });
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
resolve({ code: null, stdout: "", stderr: "", timedOut: false, spawnError: String(e.message) });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
let stdout = "";
|
|
21
|
+
let stderr = "";
|
|
22
|
+
let timedOut = false;
|
|
23
|
+
const timer = opts.timeoutMs
|
|
24
|
+
? setTimeout(() => {
|
|
25
|
+
timedOut = true;
|
|
26
|
+
try {
|
|
27
|
+
child.kill("SIGKILL");
|
|
28
|
+
}
|
|
29
|
+
catch { }
|
|
30
|
+
}, opts.timeoutMs)
|
|
31
|
+
: null;
|
|
32
|
+
child.stdout?.on("data", (b) => {
|
|
33
|
+
if (stdout.length < cap)
|
|
34
|
+
stdout += b.toString("utf8");
|
|
35
|
+
});
|
|
36
|
+
child.stderr?.on("data", (b) => {
|
|
37
|
+
if (stderr.length < cap)
|
|
38
|
+
stderr += b.toString("utf8");
|
|
39
|
+
});
|
|
40
|
+
child.on("error", (e) => {
|
|
41
|
+
if (timer)
|
|
42
|
+
clearTimeout(timer);
|
|
43
|
+
resolve({ code: null, stdout, stderr, timedOut, spawnError: String(e.message) });
|
|
44
|
+
});
|
|
45
|
+
child.on("close", (code) => {
|
|
46
|
+
if (timer)
|
|
47
|
+
clearTimeout(timer);
|
|
48
|
+
resolve({ code, stdout, stderr, timedOut });
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** Validate that `p` is an absolute path to an existing directory. */
|
|
53
|
+
export async function isDir(p) {
|
|
54
|
+
if (!p || !p.startsWith("/"))
|
|
55
|
+
return false;
|
|
56
|
+
try {
|
|
57
|
+
return (await stat(p)).isDirectory();
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** `git -C <cwd> rev-parse --show-toplevel` → repo root, or null if not a repo. */
|
|
64
|
+
export async function gitRoot(cwd, signal) {
|
|
65
|
+
const r = await runIn(cwd, "git", ["-C", cwd, "rev-parse", "--show-toplevel"], { timeoutMs: 5000, signal });
|
|
66
|
+
if (r.code === 0) {
|
|
67
|
+
const root = r.stdout.trim();
|
|
68
|
+
return root || null;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=exec-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-util.js","sourceRoot":"","sources":["../../src/tools/exec-util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inspect_agent (vibe-coding) — the deep view of ONE observed session, where
|
|
3
|
+
* list_agents is the one-line-each roster. Full structural activity for the
|
|
4
|
+
* matched session: state + reason, branch, turn count, every tool it has run,
|
|
5
|
+
* every file it has touched, last command, pending permission, error, tokens.
|
|
6
|
+
*
|
|
7
|
+
* PRIVACY: structural metadata only — never conversation content (file PATHS
|
|
8
|
+
* and tool NAMES, not contents). For what a repo actually changed, use
|
|
9
|
+
* repo_digest / review_diff against its cwd.
|
|
10
|
+
*/
|
|
11
|
+
import type { ToolDefinition } from "../types.js";
|
|
12
|
+
import type { AgentSession } from "../integrations/types.js";
|
|
13
|
+
interface InspectInput {
|
|
14
|
+
/** Session id (or a prefix), or a project name, to inspect. */
|
|
15
|
+
target: string;
|
|
16
|
+
}
|
|
17
|
+
/** Pure: full structural detail for one session. Exported for tests. */
|
|
18
|
+
export declare function formatDetail(s: AgentSession, now: number): string;
|
|
19
|
+
export declare const inspectAgentTool: ToolDefinition<InspectInput, string>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=inspect_agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect_agent.d.ts","sourceRoot":"","sources":["../../src/tools/inspect_agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,UAAU,YAAY;IACpB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAUD,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBjE;AAYD,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,YAAY,EAAE,MAAM,CAoCjE,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { getCurrentHub } from "../integrations/current-hub.js";
|
|
2
|
+
function ago(ms, now) {
|
|
3
|
+
const s = Math.max(0, Math.floor((now - ms) / 1000));
|
|
4
|
+
if (s < 60)
|
|
5
|
+
return `${s}s ago`;
|
|
6
|
+
const m = Math.floor(s / 60);
|
|
7
|
+
if (m < 60)
|
|
8
|
+
return `${m}m ago`;
|
|
9
|
+
return `${Math.floor(m / 60)}h ago`;
|
|
10
|
+
}
|
|
11
|
+
/** Pure: full structural detail for one session. Exported for tests. */
|
|
12
|
+
export function formatDetail(s, now) {
|
|
13
|
+
const a = s.activity;
|
|
14
|
+
const lines = [];
|
|
15
|
+
lines.push(`${s.project} · ${s.agent} · ${s.sessionId}`);
|
|
16
|
+
lines.push(` state: ${s.state}${s.stateReason ? ` (${s.stateReason})` : ""} · last active ${ago(s.lastMtime, now)}`);
|
|
17
|
+
if (s.cwd)
|
|
18
|
+
lines.push(` cwd: ${s.cwd}`);
|
|
19
|
+
if (a?.gitBranch)
|
|
20
|
+
lines.push(` branch: ${a.gitBranch}`);
|
|
21
|
+
if (typeof a?.turnCount === "number")
|
|
22
|
+
lines.push(` turns: ${a.turnCount}`);
|
|
23
|
+
if (a?.pendingPermission)
|
|
24
|
+
lines.push(` ⏳ waiting on permission: ${a.pendingPermission}`);
|
|
25
|
+
if (a?.lastCommandName)
|
|
26
|
+
lines.push(` last command: ${a.lastCommandName}`);
|
|
27
|
+
if (a?.lastTools && a.lastTools.length)
|
|
28
|
+
lines.push(` tools: ${a.lastTools.join(" → ")}`);
|
|
29
|
+
if (a?.filesTouched && a.filesTouched.length) {
|
|
30
|
+
lines.push(` files touched (${a.filesTouched.length}):`);
|
|
31
|
+
for (const f of a.filesTouched.slice(0, 15))
|
|
32
|
+
lines.push(` ${f}`);
|
|
33
|
+
if (a.filesTouched.length > 15)
|
|
34
|
+
lines.push(` … +${a.filesTouched.length - 15} more`);
|
|
35
|
+
}
|
|
36
|
+
if (a?.tokens)
|
|
37
|
+
lines.push(` tokens: ${a.tokens.input} in / ${a.tokens.output} out`);
|
|
38
|
+
if (a?.lastError)
|
|
39
|
+
lines.push(` error: ${a.lastError}`);
|
|
40
|
+
return lines.join("\n");
|
|
41
|
+
}
|
|
42
|
+
function matches(s, target) {
|
|
43
|
+
const t = target.toLowerCase();
|
|
44
|
+
return (s.sessionId.toLowerCase().startsWith(t) ||
|
|
45
|
+
s.sessionId.toLowerCase() === t ||
|
|
46
|
+
s.project.toLowerCase() === t ||
|
|
47
|
+
s.project.toLowerCase().includes(t));
|
|
48
|
+
}
|
|
49
|
+
export const inspectAgentTool = {
|
|
50
|
+
name: "inspect_agent",
|
|
51
|
+
description: "Deep-dive one observed agent session (by session id / prefix, or project name): its full " +
|
|
52
|
+
"structural activity — state + reason, git branch, turn count, every tool it ran, all files it " +
|
|
53
|
+
"touched, last command, pending permission, errors, token usage. Use when the user asks 'what is " +
|
|
54
|
+
"<session/project> doing in detail'. list_agents is the roster; this is one session. Structural " +
|
|
55
|
+
"metadata only — never conversation content.",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
type: "object",
|
|
58
|
+
properties: {
|
|
59
|
+
target: { type: "string", description: "Session id (or prefix) or project name to inspect." },
|
|
60
|
+
},
|
|
61
|
+
required: ["target"],
|
|
62
|
+
additionalProperties: false,
|
|
63
|
+
},
|
|
64
|
+
async execute(input) {
|
|
65
|
+
const hub = getCurrentHub();
|
|
66
|
+
if (!hub)
|
|
67
|
+
return "(agent monitoring isn't active — start the web server with `lisa serve --web`)";
|
|
68
|
+
const target = (input.target ?? "").trim();
|
|
69
|
+
if (!target)
|
|
70
|
+
return "(give a session id or project name to inspect)";
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
const all = hub.list();
|
|
73
|
+
const hits = all.filter((s) => matches(s, target));
|
|
74
|
+
if (hits.length === 0) {
|
|
75
|
+
const names = all.map((s) => `${s.project} (${s.sessionId.slice(0, 8)})`).slice(0, 10).join(", ");
|
|
76
|
+
return `(no observed session matches "${target}". Active: ${names || "none"})`;
|
|
77
|
+
}
|
|
78
|
+
if (hits.length > 1) {
|
|
79
|
+
// Disambiguate, but still detail the most recently active one.
|
|
80
|
+
hits.sort((a, b) => b.lastMtime - a.lastMtime);
|
|
81
|
+
const head = `(${hits.length} match "${target}"; showing the most recent — narrow by session id)\n`;
|
|
82
|
+
return head + formatDetail(hits[0], now);
|
|
83
|
+
}
|
|
84
|
+
return formatDetail(hits[0], now);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=inspect_agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect_agent.js","sourceRoot":"","sources":["../../src/tools/inspect_agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_agents (orchestrator OBSERVE — read side) — enumerate the CLI agent
|
|
3
|
+
* sessions LISA is watching (Claude Code, Codex, …) with their structural
|
|
4
|
+
* activity, so she can answer "what are my agents doing right now?" in chat.
|
|
5
|
+
*
|
|
6
|
+
* Fills the gap between:
|
|
7
|
+
* - advise_now — only the relevance-gated *summary* ("10 active, nothing notable")
|
|
8
|
+
* - signal_agent — only LISA's OWN dispatched agents (the user's manual sessions
|
|
9
|
+
* are observed but unreachable there)
|
|
10
|
+
* The sidebar/island already show this data; this exposes it to the chat agent.
|
|
11
|
+
*
|
|
12
|
+
* PRIVACY: structural metadata only — state, project, git branch, tool/command
|
|
13
|
+
* NAMES, file PATHS, counts, error strings. Never a prompt, a reply, or full
|
|
14
|
+
* command arguments. Same boundary the parser privacy tests assert.
|
|
15
|
+
*/
|
|
16
|
+
import type { ToolDefinition } from "../types.js";
|
|
17
|
+
import type { AgentSession } from "../integrations/types.js";
|
|
18
|
+
/** One session → a readable, structural-only line. Pure, for display + tests. */
|
|
19
|
+
export declare function formatSessionLine(s: AgentSession, now: number): string;
|
|
20
|
+
export declare const listAgentsTool: ToolDefinition<Record<string, never>, string>;
|
|
21
|
+
//# sourceMappingURL=list_agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list_agents.d.ts","sourceRoot":"","sources":["../../src/tools/list_agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAoB7D,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBtE;AAED,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CA2BxE,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_agents (orchestrator OBSERVE — read side) — enumerate the CLI agent
|
|
3
|
+
* sessions LISA is watching (Claude Code, Codex, …) with their structural
|
|
4
|
+
* activity, so she can answer "what are my agents doing right now?" in chat.
|
|
5
|
+
*
|
|
6
|
+
* Fills the gap between:
|
|
7
|
+
* - advise_now — only the relevance-gated *summary* ("10 active, nothing notable")
|
|
8
|
+
* - signal_agent — only LISA's OWN dispatched agents (the user's manual sessions
|
|
9
|
+
* are observed but unreachable there)
|
|
10
|
+
* The sidebar/island already show this data; this exposes it to the chat agent.
|
|
11
|
+
*
|
|
12
|
+
* PRIVACY: structural metadata only — state, project, git branch, tool/command
|
|
13
|
+
* NAMES, file PATHS, counts, error strings. Never a prompt, a reply, or full
|
|
14
|
+
* command arguments. Same boundary the parser privacy tests assert.
|
|
15
|
+
*/
|
|
16
|
+
import { getCurrentHub } from "../integrations/current-hub.js";
|
|
17
|
+
const STATE_RANK = {
|
|
18
|
+
error: 0,
|
|
19
|
+
waiting: 1,
|
|
20
|
+
working: 2,
|
|
21
|
+
done: 3,
|
|
22
|
+
idle: 4,
|
|
23
|
+
unknown: 5,
|
|
24
|
+
};
|
|
25
|
+
function ago(ms, now) {
|
|
26
|
+
const d = Math.max(0, now - ms);
|
|
27
|
+
const s = Math.floor(d / 1000);
|
|
28
|
+
if (s < 60)
|
|
29
|
+
return `${s}s`;
|
|
30
|
+
const m = Math.floor(s / 60);
|
|
31
|
+
if (m < 60)
|
|
32
|
+
return `${m}m`;
|
|
33
|
+
return `${Math.floor(m / 60)}h`;
|
|
34
|
+
}
|
|
35
|
+
/** One session → a readable, structural-only line. Pure, for display + tests. */
|
|
36
|
+
export function formatSessionLine(s, now) {
|
|
37
|
+
const a = s.activity;
|
|
38
|
+
const bits = [];
|
|
39
|
+
if (a?.gitBranch)
|
|
40
|
+
bits.push(`@${a.gitBranch}`);
|
|
41
|
+
if (a?.pendingPermission)
|
|
42
|
+
bits.push(`⏳ needs permission: ${a.pendingPermission}`);
|
|
43
|
+
else if (a?.lastCommandName)
|
|
44
|
+
bits.push(`$ ${a.lastCommandName}`);
|
|
45
|
+
else if (a?.lastTools && a.lastTools.length)
|
|
46
|
+
bits.push(a.lastTools.slice(-3).join("→"));
|
|
47
|
+
if (a?.lastError)
|
|
48
|
+
bits.push(`error: ${a.lastError}`);
|
|
49
|
+
if (a?.filesTouched && a.filesTouched.length) {
|
|
50
|
+
const f = a.filesTouched
|
|
51
|
+
.slice(-2)
|
|
52
|
+
.map((p) => p.split("/").pop() ?? p)
|
|
53
|
+
.join(", ");
|
|
54
|
+
bits.push(`files: ${f}`);
|
|
55
|
+
}
|
|
56
|
+
const detail = bits.length ? " · " + bits.join(" · ") : "";
|
|
57
|
+
return `• [${s.state}] ${s.project} (${s.agent}, ${ago(s.lastMtime, now)} ago)${detail}`;
|
|
58
|
+
}
|
|
59
|
+
export const listAgentsTool = {
|
|
60
|
+
name: "list_agents",
|
|
61
|
+
description: "List the CLI agent sessions LISA is observing right now (Claude Code, Codex, …) with their " +
|
|
62
|
+
"structural activity: state (working/waiting/error/idle), project, git branch, last tool/command " +
|
|
63
|
+
"NAME, files touched, pending permission, errors. Use when the user asks what their agents are " +
|
|
64
|
+
"doing, what's running, or 'what is <agent> up to'. Structural metadata only — never conversation " +
|
|
65
|
+
"content; to see what a repo actually changed, read its `git log`. For LISA's OWN dispatched " +
|
|
66
|
+
"agents (start/stop) use signal_agent; for a relevance-gated summary use advise_now.",
|
|
67
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
68
|
+
async execute() {
|
|
69
|
+
const hub = getCurrentHub();
|
|
70
|
+
if (!hub) {
|
|
71
|
+
return "(agent monitoring isn't active — start the web server with `lisa serve --web`)";
|
|
72
|
+
}
|
|
73
|
+
const now = Date.now();
|
|
74
|
+
const sessions = hub.list();
|
|
75
|
+
if (sessions.length === 0)
|
|
76
|
+
return "(no agents are active right now)";
|
|
77
|
+
const sorted = sessions.slice().sort((a, b) => {
|
|
78
|
+
const ra = STATE_RANK[a.state] ?? 9;
|
|
79
|
+
const rb = STATE_RANK[b.state] ?? 9;
|
|
80
|
+
if (ra !== rb)
|
|
81
|
+
return ra - rb;
|
|
82
|
+
return b.lastMtime - a.lastMtime;
|
|
83
|
+
});
|
|
84
|
+
const head = `${sessions.length} agent session(s) observed (structural activity only):`;
|
|
85
|
+
return [head, ...sorted.map((s) => formatSessionLine(s, now))].join("\n");
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=list_agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list_agents.js","sourceRoot":"","sources":["../../src/tools/list_agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pr_status (vibe-coding) — when many agents open many PRs, which are green,
|
|
3
|
+
* which need review, which are failing? Wraps `gh pr list` to surface each open
|
|
4
|
+
* PR's CI rollup + review decision in one glance. Read-only.
|
|
5
|
+
*/
|
|
6
|
+
import type { ToolDefinition } from "../types.js";
|
|
7
|
+
interface PrStatusInput {
|
|
8
|
+
cwd?: string;
|
|
9
|
+
/** Only your own PRs (gh --author @me). Default false = all open PRs. */
|
|
10
|
+
mine?: boolean;
|
|
11
|
+
}
|
|
12
|
+
interface RollupItem {
|
|
13
|
+
conclusion?: string | null;
|
|
14
|
+
status?: string | null;
|
|
15
|
+
state?: string | null;
|
|
16
|
+
}
|
|
17
|
+
interface PR {
|
|
18
|
+
number: number;
|
|
19
|
+
title: string;
|
|
20
|
+
headRefName: string;
|
|
21
|
+
isDraft: boolean;
|
|
22
|
+
reviewDecision?: string | null;
|
|
23
|
+
statusCheckRollup?: RollupItem[] | null;
|
|
24
|
+
}
|
|
25
|
+
/** Pure: reduce a PR's check rollup to one of ✓ / ✗ / ⏳ / – . */
|
|
26
|
+
export declare function summarizeChecks(rollup: RollupItem[] | null | undefined): string;
|
|
27
|
+
/** Pure: one PR → a readable line. Exported for tests. */
|
|
28
|
+
export declare function formatPR(pr: PR): string;
|
|
29
|
+
export declare const prStatusTool: ToolDefinition<PrStatusInput, string>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=pr_status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr_status.d.ts","sourceRoot":"","sources":["../../src/tools/pr_status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,UAAU;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AACD,UAAU,EAAE;IACV,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;CACzC;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAkB/E;AAWD,0DAA0D;AAC1D,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAIvC;AAED,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,aAAa,EAAE,MAAM,CA2C9D,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { runIn, isDir, gitRoot } from "./exec-util.js";
|
|
2
|
+
/** Pure: reduce a PR's check rollup to one of ✓ / ✗ / ⏳ / – . */
|
|
3
|
+
export function summarizeChecks(rollup) {
|
|
4
|
+
if (!rollup || rollup.length === 0)
|
|
5
|
+
return "–";
|
|
6
|
+
let fail = false;
|
|
7
|
+
let pending = false;
|
|
8
|
+
for (const c of rollup) {
|
|
9
|
+
const concl = (c.conclusion ?? "").toUpperCase();
|
|
10
|
+
const state = (c.state ?? "").toUpperCase();
|
|
11
|
+
if (["FAILURE", "ERROR", "CANCELLED", "TIMED_OUT", "ACTION_REQUIRED"].includes(concl) || ["FAILURE", "ERROR"].includes(state)) {
|
|
12
|
+
fail = true;
|
|
13
|
+
}
|
|
14
|
+
else if (concl === "SUCCESS" || state === "SUCCESS") {
|
|
15
|
+
// ok
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
pending = true; // queued / in_progress / pending / expected
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (fail)
|
|
22
|
+
return "✗";
|
|
23
|
+
if (pending)
|
|
24
|
+
return "⏳";
|
|
25
|
+
return "✓";
|
|
26
|
+
}
|
|
27
|
+
function reviewLabel(d) {
|
|
28
|
+
switch ((d ?? "").toUpperCase()) {
|
|
29
|
+
case "APPROVED": return "approved";
|
|
30
|
+
case "CHANGES_REQUESTED": return "changes requested";
|
|
31
|
+
case "REVIEW_REQUIRED": return "needs review";
|
|
32
|
+
default: return "no review";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Pure: one PR → a readable line. Exported for tests. */
|
|
36
|
+
export function formatPR(pr) {
|
|
37
|
+
const draft = pr.isDraft ? " (draft)" : "";
|
|
38
|
+
const title = pr.title.length > 60 ? pr.title.slice(0, 57) + "…" : pr.title;
|
|
39
|
+
return `#${pr.number} ${summarizeChecks(pr.statusCheckRollup)} CI · ${reviewLabel(pr.reviewDecision)} · ${title}${draft} [${pr.headRefName}]`;
|
|
40
|
+
}
|
|
41
|
+
export const prStatusTool = {
|
|
42
|
+
name: "pr_status",
|
|
43
|
+
description: "List the repo's open pull requests with each one's CI status (✓/✗/⏳) and review decision " +
|
|
44
|
+
"(approved / changes requested / needs review). Use when the user asks which PRs are green, " +
|
|
45
|
+
"ready to merge, failing, or waiting on review — handy when several agents have opened PRs. " +
|
|
46
|
+
"Read-only; needs the `gh` CLI (authenticated). mine:true limits to your own PRs.",
|
|
47
|
+
inputSchema: {
|
|
48
|
+
type: "object",
|
|
49
|
+
properties: {
|
|
50
|
+
cwd: { type: "string", description: "Absolute path inside the repo. Defaults to the current directory." },
|
|
51
|
+
mine: { type: "boolean", description: "Only your own PRs (default false = all open)." },
|
|
52
|
+
},
|
|
53
|
+
additionalProperties: false,
|
|
54
|
+
},
|
|
55
|
+
async execute(input, ctx) {
|
|
56
|
+
const cwd = input.cwd && input.cwd.startsWith("/") ? input.cwd : ctx.cwd;
|
|
57
|
+
if (!(await isDir(cwd)))
|
|
58
|
+
return `(not a directory: ${cwd})`;
|
|
59
|
+
const root = (await gitRoot(cwd, ctx.signal)) ?? cwd;
|
|
60
|
+
const args = [
|
|
61
|
+
"pr", "list", "--state", "open", "--limit", "30",
|
|
62
|
+
"--json", "number,title,headRefName,isDraft,reviewDecision,statusCheckRollup",
|
|
63
|
+
];
|
|
64
|
+
if (input.mine)
|
|
65
|
+
args.push("--author", "@me");
|
|
66
|
+
const r = await runIn(root, "gh", args, { timeoutMs: 20000, signal: ctx.signal, maxBytes: 200_000 });
|
|
67
|
+
if (r.spawnError)
|
|
68
|
+
return "(the `gh` CLI isn't installed — needed for PR status. Install: https://cli.github.com)";
|
|
69
|
+
if (r.code !== 0) {
|
|
70
|
+
const e = r.stderr.trim();
|
|
71
|
+
if (/auth|login/i.test(e))
|
|
72
|
+
return "(`gh` isn't authenticated — run `gh auth login`)";
|
|
73
|
+
return `(gh pr list failed: ${e.slice(0, 200) || "is this a GitHub repo?"})`;
|
|
74
|
+
}
|
|
75
|
+
let prs;
|
|
76
|
+
try {
|
|
77
|
+
prs = JSON.parse(r.stdout);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return "(couldn't parse gh output)";
|
|
81
|
+
}
|
|
82
|
+
if (prs.length === 0)
|
|
83
|
+
return "(no open PRs)";
|
|
84
|
+
// failing first, then pending, then the rest
|
|
85
|
+
const rank = (p) => { const s = summarizeChecks(p.statusCheckRollup); return s === "✗" ? 0 : s === "⏳" ? 1 : 2; };
|
|
86
|
+
prs.sort((a, b) => rank(a) - rank(b) || a.number - b.number);
|
|
87
|
+
return `${prs.length} open PR(s):\n` + prs.map(formatPR).join("\n");
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=pr_status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr_status.js","sourceRoot":"","sources":["../../src/tools/pr_status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAwClD,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,mBAAwB,GAAG,cAAc,EAAE,CAoDlF;AAED,eAAO,MAAM,oBAAoB,aAU/B,CAAC;AAEH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAExE"}
|