@oratis/lisa 0.7.0 → 0.9.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.
Files changed (141) hide show
  1. package/dist/autostart/install.d.ts +28 -0
  2. package/dist/autostart/install.d.ts.map +1 -0
  3. package/dist/autostart/install.js +180 -0
  4. package/dist/autostart/install.js.map +1 -0
  5. package/dist/cli.js +49 -1
  6. package/dist/cli.js.map +1 -1
  7. package/dist/heartbeat/install.d.ts.map +1 -1
  8. package/dist/heartbeat/install.js +1 -43
  9. package/dist/heartbeat/install.js.map +1 -1
  10. package/dist/heartbeat/runner.d.ts.map +1 -1
  11. package/dist/heartbeat/runner.js +11 -0
  12. package/dist/heartbeat/runner.js.map +1 -1
  13. package/dist/integrations/aider/observer.d.ts +48 -0
  14. package/dist/integrations/aider/observer.d.ts.map +1 -0
  15. package/dist/integrations/aider/observer.js +196 -0
  16. package/dist/integrations/aider/observer.js.map +1 -0
  17. package/dist/integrations/comparisons.d.ts +23 -0
  18. package/dist/integrations/comparisons.d.ts.map +1 -0
  19. package/dist/integrations/comparisons.js +47 -0
  20. package/dist/integrations/comparisons.js.map +1 -0
  21. package/dist/integrations/github-pr/observer.d.ts +85 -0
  22. package/dist/integrations/github-pr/observer.d.ts.map +1 -0
  23. package/dist/integrations/github-pr/observer.js +261 -0
  24. package/dist/integrations/github-pr/observer.js.map +1 -0
  25. package/dist/integrations/hub.d.ts.map +1 -1
  26. package/dist/integrations/hub.js +10 -0
  27. package/dist/integrations/hub.js.map +1 -1
  28. package/dist/integrations/opencode/observer.d.ts +74 -0
  29. package/dist/integrations/opencode/observer.d.ts.map +1 -0
  30. package/dist/integrations/opencode/observer.js +207 -0
  31. package/dist/integrations/opencode/observer.js.map +1 -0
  32. package/dist/integrations/registry.d.ts.map +1 -1
  33. package/dist/integrations/registry.js +3 -1
  34. package/dist/integrations/registry.js.map +1 -1
  35. package/dist/integrations/scheduled-dispatch.d.ts +42 -0
  36. package/dist/integrations/scheduled-dispatch.d.ts.map +1 -0
  37. package/dist/integrations/scheduled-dispatch.js +140 -0
  38. package/dist/integrations/scheduled-dispatch.js.map +1 -0
  39. package/dist/launchd.d.ts +18 -0
  40. package/dist/launchd.d.ts.map +1 -0
  41. package/dist/launchd.js +60 -0
  42. package/dist/launchd.js.map +1 -0
  43. package/dist/mcp/config.d.ts +4 -0
  44. package/dist/mcp/config.d.ts.map +1 -1
  45. package/dist/mcp/config.js +34 -0
  46. package/dist/mcp/config.js.map +1 -1
  47. package/dist/orchestrator/journal.d.ts +46 -0
  48. package/dist/orchestrator/journal.d.ts.map +1 -0
  49. package/dist/orchestrator/journal.js +82 -0
  50. package/dist/orchestrator/journal.js.map +1 -0
  51. package/dist/orchestrator/recap.d.ts +38 -0
  52. package/dist/orchestrator/recap.d.ts.map +1 -0
  53. package/dist/orchestrator/recap.js +134 -0
  54. package/dist/orchestrator/recap.js.map +1 -0
  55. package/dist/screen_advisor/engine.d.ts +79 -0
  56. package/dist/screen_advisor/engine.d.ts.map +1 -0
  57. package/dist/screen_advisor/engine.js +128 -0
  58. package/dist/screen_advisor/engine.js.map +1 -0
  59. package/dist/soul/lock.d.ts +7 -4
  60. package/dist/soul/lock.d.ts.map +1 -1
  61. package/dist/soul/lock.js +33 -9
  62. package/dist/soul/lock.js.map +1 -1
  63. package/dist/tools/agent_recap.d.ts +21 -0
  64. package/dist/tools/agent_recap.d.ts.map +1 -0
  65. package/dist/tools/agent_recap.js +43 -0
  66. package/dist/tools/agent_recap.js.map +1 -0
  67. package/dist/tools/compare_agents.d.ts +16 -0
  68. package/dist/tools/compare_agents.d.ts.map +1 -0
  69. package/dist/tools/compare_agents.js +145 -0
  70. package/dist/tools/compare_agents.js.map +1 -0
  71. package/dist/tools/dispatch_agent.d.ts +13 -0
  72. package/dist/tools/dispatch_agent.d.ts.map +1 -1
  73. package/dist/tools/dispatch_agent.js +46 -46
  74. package/dist/tools/dispatch_agent.js.map +1 -1
  75. package/dist/tools/exec-util.d.ts +18 -0
  76. package/dist/tools/exec-util.d.ts.map +1 -0
  77. package/dist/tools/exec-util.js +72 -0
  78. package/dist/tools/exec-util.js.map +1 -0
  79. package/dist/tools/github.d.ts +34 -0
  80. package/dist/tools/github.d.ts.map +1 -0
  81. package/dist/tools/github.js +140 -0
  82. package/dist/tools/github.js.map +1 -0
  83. package/dist/tools/github_link.d.ts +36 -0
  84. package/dist/tools/github_link.d.ts.map +1 -0
  85. package/dist/tools/github_link.js +127 -0
  86. package/dist/tools/github_link.js.map +1 -0
  87. package/dist/tools/inspect_agent.d.ts +21 -0
  88. package/dist/tools/inspect_agent.d.ts.map +1 -0
  89. package/dist/tools/inspect_agent.js +87 -0
  90. package/dist/tools/inspect_agent.js.map +1 -0
  91. package/dist/tools/list_agents.d.ts +21 -0
  92. package/dist/tools/list_agents.d.ts.map +1 -0
  93. package/dist/tools/list_agents.js +88 -0
  94. package/dist/tools/list_agents.js.map +1 -0
  95. package/dist/tools/mcp.d.ts +28 -0
  96. package/dist/tools/mcp.d.ts.map +1 -0
  97. package/dist/tools/mcp.js +55 -0
  98. package/dist/tools/mcp.js.map +1 -0
  99. package/dist/tools/npm_info.d.ts +21 -0
  100. package/dist/tools/npm_info.d.ts.map +1 -0
  101. package/dist/tools/npm_info.js +102 -0
  102. package/dist/tools/npm_info.js.map +1 -0
  103. package/dist/tools/pr_status.d.ts +31 -0
  104. package/dist/tools/pr_status.d.ts.map +1 -0
  105. package/dist/tools/pr_status.js +90 -0
  106. package/dist/tools/pr_status.js.map +1 -0
  107. package/dist/tools/registry.d.ts.map +1 -1
  108. package/dist/tools/registry.js +27 -0
  109. package/dist/tools/registry.js.map +1 -1
  110. package/dist/tools/repo_digest.d.ts +33 -0
  111. package/dist/tools/repo_digest.d.ts.map +1 -0
  112. package/dist/tools/repo_digest.js +113 -0
  113. package/dist/tools/repo_digest.js.map +1 -0
  114. package/dist/tools/review_diff.d.ts +28 -0
  115. package/dist/tools/review_diff.d.ts.map +1 -0
  116. package/dist/tools/review_diff.js +68 -0
  117. package/dist/tools/review_diff.js.map +1 -0
  118. package/dist/tools/run_checks.d.ts +15 -0
  119. package/dist/tools/run_checks.d.ts.map +1 -0
  120. package/dist/tools/run_checks.js +117 -0
  121. package/dist/tools/run_checks.js.map +1 -0
  122. package/dist/tools/scheduled_dispatch.d.ts +27 -0
  123. package/dist/tools/scheduled_dispatch.d.ts.map +1 -0
  124. package/dist/tools/scheduled_dispatch.js +57 -0
  125. package/dist/tools/scheduled_dispatch.js.map +1 -0
  126. package/dist/voice/dictation.d.ts +51 -0
  127. package/dist/voice/dictation.d.ts.map +1 -0
  128. package/dist/voice/dictation.js +70 -0
  129. package/dist/voice/dictation.js.map +1 -0
  130. package/dist/web/island.d.ts +1 -1
  131. package/dist/web/island.d.ts.map +1 -1
  132. package/dist/web/island.js +84 -8
  133. package/dist/web/island.js.map +1 -1
  134. package/dist/web/lisa-html.d.ts +1 -1
  135. package/dist/web/lisa-html.d.ts.map +1 -1
  136. package/dist/web/lisa-html.js +80 -13
  137. package/dist/web/lisa-html.js.map +1 -1
  138. package/dist/web/server.d.ts.map +1 -1
  139. package/dist/web/server.js +156 -1
  140. package/dist/web/server.js.map +1 -1
  141. package/package.json +1 -1
@@ -0,0 +1,145 @@
1
+ /**
2
+ * compare_agents (vibe-coding, workflow form) — run the SAME task across two or
3
+ * more agents and compare what each produced, so you can pick the best result.
4
+ *
5
+ * It's a workflow, not a one-shot, because agents run for minutes:
6
+ * start → make an isolated git worktree per agent (off the repo, so they
7
+ * don't clobber each other), launch each agent on the task, record
8
+ * the job. Returns immediately.
9
+ * status → for each agent: live session state + how many files it has changed.
10
+ * collect → diff stat per agent's worktree, side by side, so you choose.
11
+ * cleanup → remove the worktrees + scratch branches once you've picked.
12
+ * list → existing comparison jobs.
13
+ */
14
+ import path from "node:path";
15
+ import { mkdir } from "node:fs/promises";
16
+ import { getCurrentHub } from "../integrations/current-hub.js";
17
+ import { launchAgent } from "./dispatch_agent.js";
18
+ import { runIn, gitRoot } from "./exec-util.js";
19
+ import { loadComparisons, addComparison, getComparison, removeComparison, newJobId, COMPARE_ROOT, } from "../integrations/comparisons.js";
20
+ /** Pure: one line summarising an entry's live status. Exported for tests. */
21
+ export function formatStatusLine(e, state, changed) {
22
+ if (e.launchError)
23
+ return ` ${e.agent}: failed to launch — ${e.launchError}`;
24
+ const st = state ?? "no session yet";
25
+ return ` ${e.agent}: ${st} · ${changed} file(s) changed [${e.branch}]`;
26
+ }
27
+ /** Pure: header line for a job. Exported for tests. */
28
+ export function formatJobHeader(j) {
29
+ const task = j.task.length > 70 ? j.task.slice(0, 67) + "…" : j.task;
30
+ return `compare ${j.id} (${j.entries.length} agents) in ${j.repo}\n task: "${task}"`;
31
+ }
32
+ async function changedCount(worktree, signal) {
33
+ const r = await runIn(worktree, "git", ["-C", worktree, "status", "--porcelain"], { timeoutMs: 8000, signal });
34
+ return r.code === 0 ? r.stdout.split("\n").filter((l) => l.trim()).length : 0;
35
+ }
36
+ export const compareAgentsTool = {
37
+ name: "compare_agents",
38
+ description: "Run the same task across multiple agents in isolated git worktrees and compare results — a " +
39
+ "workflow (agents run for minutes): action:'start' (task + agents, default [claude,codex]) launches " +
40
+ "them; 'status' (id) shows each one's live state + files changed; 'collect' (id) diffs each result " +
41
+ "side by side so you pick a winner; 'cleanup' (id) removes the worktrees; 'list' shows jobs. Use when " +
42
+ "the user wants to try an approach two ways, or isn't sure which agent does better. Spawns agents.",
43
+ inputSchema: {
44
+ type: "object",
45
+ properties: {
46
+ action: { type: "string", enum: ["start", "status", "collect", "cleanup", "list"] },
47
+ task: { type: "string", description: "The shared task to give every agent (for start).", minLength: 1 },
48
+ agents: { type: "array", items: { type: "string", enum: ["claude", "codex", "opencode", "aider"] }, description: "Agents to compare (for start). Default [claude, codex]." },
49
+ cwd: { type: "string", description: "Absolute path in the repo to branch worktrees from (for start). Defaults to current dir." },
50
+ id: { type: "string", description: "Comparison job id (for status/collect/cleanup)." },
51
+ },
52
+ additionalProperties: false,
53
+ },
54
+ async execute(input, ctx) {
55
+ const action = input.action ?? "start";
56
+ if (action === "list") {
57
+ const jobs = await loadComparisons();
58
+ if (jobs.length === 0)
59
+ return "(no comparison jobs)";
60
+ return jobs.map(formatJobHeader).join("\n\n");
61
+ }
62
+ if (action === "start") {
63
+ const task = input.task?.trim();
64
+ if (!task)
65
+ return "(start needs a task)";
66
+ const agents = input.agents && input.agents.length ? Array.from(new Set(input.agents)) : ["claude", "codex"];
67
+ if (agents.length < 2)
68
+ return "(comparing needs at least 2 agents)";
69
+ const cwd = input.cwd && input.cwd.startsWith("/") ? input.cwd : ctx.cwd;
70
+ const repo = await gitRoot(cwd, ctx.signal);
71
+ if (!repo)
72
+ return `(not a git repo: ${cwd} — compare_agents isolates each agent in a git worktree)`;
73
+ const id = newJobId();
74
+ await mkdir(path.join(COMPARE_ROOT, id), { recursive: true });
75
+ const entries = [];
76
+ for (const agent of agents) {
77
+ const branch = `lisa-compare/${id}-${agent}`;
78
+ const worktree = path.join(COMPARE_ROOT, id, agent);
79
+ const wt = await runIn(repo, "git", ["-C", repo, "worktree", "add", "-b", branch, worktree, "HEAD"], { timeoutMs: 20000, signal: ctx.signal });
80
+ if (wt.code !== 0) {
81
+ entries.push({ agent, worktree, branch, launchError: `worktree add failed: ${wt.stderr.trim().slice(0, 120)}` });
82
+ continue;
83
+ }
84
+ const r = await launchAgent(agent, task, worktree, ctx.log);
85
+ entries.push({ agent, worktree, branch, pid: r.pid, launchError: r.error });
86
+ }
87
+ const job = { id, task, repo, createdAt: Date.now(), entries };
88
+ await addComparison(job);
89
+ const launched = entries.filter((e) => !e.launchError).map((e) => e.agent);
90
+ const failed = entries.filter((e) => e.launchError);
91
+ return (`Started comparison ${id}: ${launched.join(" vs ")} on the same task in ${repo}.\n` +
92
+ entries.map((e) => ` ${e.agent} → ${e.launchError ? "FAILED: " + e.launchError : "pid " + e.pid + " in " + e.worktree}`).join("\n") +
93
+ (failed.length ? "" : "") +
94
+ `\n\nThey run in the background. Check progress with compare_agents action:'status' id:'${id}', ` +
95
+ `then action:'collect' id:'${id}' to diff the results, and 'cleanup' when done.`);
96
+ }
97
+ // status / collect / cleanup need a job
98
+ if (!input.id)
99
+ return `(${action} needs an id — from compare_agents action:'list')`;
100
+ const job = await getComparison(input.id);
101
+ if (!job)
102
+ return `(no comparison job matches "${input.id}")`;
103
+ if (action === "status") {
104
+ const hub = getCurrentHub();
105
+ const lines = [formatJobHeader(job)];
106
+ for (const e of job.entries) {
107
+ const session = hub?.list().find((s) => s.cwd === e.worktree);
108
+ const changed = await changedCount(e.worktree, ctx.signal);
109
+ lines.push(formatStatusLine(e, session ? session.state : null, changed));
110
+ }
111
+ return lines.join("\n");
112
+ }
113
+ if (action === "collect") {
114
+ const lines = [formatJobHeader(job), ""];
115
+ for (const e of job.entries) {
116
+ if (e.launchError) {
117
+ lines.push(`── ${e.agent}: (didn't launch: ${e.launchError})`);
118
+ continue;
119
+ }
120
+ const stat = await runIn(e.worktree, "git", ["-C", e.worktree, "diff", "HEAD", "--stat"], { timeoutMs: 10000, signal: ctx.signal });
121
+ // diff HEAD misses untracked new files — list those separately so a
122
+ // brand-new file an agent created isn't invisible in the comparison.
123
+ const st = await runIn(e.worktree, "git", ["-C", e.worktree, "status", "--porcelain"], { timeoutMs: 8000, signal: ctx.signal });
124
+ const untracked = st.code === 0 ? st.stdout.split("\n").filter((l) => l.startsWith("??")).map((l) => l.slice(3).trim()) : [];
125
+ let body = stat.code === 0 && stat.stdout.trim() ? stat.stdout.trim() : "";
126
+ if (untracked.length)
127
+ body += `\n new files: ${untracked.slice(0, 10).join(", ")}${untracked.length > 10 ? ` (+${untracked.length - 10})` : ""}`;
128
+ lines.push(`── ${e.agent} [${e.branch}] ──\n${body.trim() || "(no changes)"}`);
129
+ }
130
+ lines.push("", "Review one in full with review_diff cwd:'<worktree>' target:'head', then cleanup.");
131
+ return lines.join("\n");
132
+ }
133
+ // cleanup
134
+ const errs = [];
135
+ for (const e of job.entries) {
136
+ const rm = await runIn(job.repo, "git", ["-C", job.repo, "worktree", "remove", "--force", e.worktree], { timeoutMs: 15000, signal: ctx.signal });
137
+ if (rm.code !== 0 && !/not a working tree|No such file/i.test(rm.stderr))
138
+ errs.push(`${e.agent}: ${rm.stderr.trim().slice(0, 80)}`);
139
+ await runIn(job.repo, "git", ["-C", job.repo, "branch", "-D", e.branch], { timeoutMs: 8000, signal: ctx.signal });
140
+ }
141
+ await removeComparison(job.id);
142
+ return errs.length ? `Cleaned up ${job.id} with warnings:\n${errs.join("\n")}` : `Cleaned up comparison ${job.id} (worktrees + scratch branches removed).`;
143
+ },
144
+ };
145
+ //# sourceMappingURL=compare_agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare_agents.js","sourceRoot":"","sources":["../../src/tools/compare_agents.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,19 @@ export declare function buildDispatchArgv(agent: DispatchInput["agent"], task: s
33
33
  cmd: string;
34
34
  args: string[];
35
35
  };
36
+ export type DispatchAgentKind = DispatchInput["agent"];
37
+ export interface LaunchResult {
38
+ pid?: number;
39
+ /** Present when the launch failed (binary missing, spawn error). */
40
+ error?: string;
41
+ cmd: string;
42
+ }
43
+ /**
44
+ * Spawn a CLI agent headlessly, detached, and record it in the dispatch ledger.
45
+ * Shared by dispatch_agent (interactive), scheduled_dispatch (heartbeat-timed),
46
+ * and compare_agents (parallel). Never throws — returns {pid} or {error}.
47
+ */
48
+ export declare function launchAgent(agent: DispatchAgentKind, task: string, cwd: string, log?: (m: string) => void): Promise<LaunchResult>;
36
49
  export declare const dispatchAgentTool: ToolDefinition<DispatchInput, string>;
37
50
  export {};
38
51
  //# sourceMappingURL=dispatch_agent.d.ts.map
@@ -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,CA2GnE,CAAC"}
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 { cmd, args } = buildDispatchArgv(input.agent, input.task);
105
- let child;
106
- try {
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":"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"}
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,34 @@
1
+ /**
2
+ * github (integration) — a gh-CLI-backed tool covering the GitHub operations a
3
+ * coding agent / orchestrator actually needs beyond pr_status (list+CI) and
4
+ * github_link (URLs): issues (list/view/create/comment), PRs (view/create/
5
+ * comment/merge), CI runs (list/view), releases. One tool, action-dispatched.
6
+ *
7
+ * Read actions are safe; create/comment/merge are write actions (gated by the
8
+ * host approval layer like any mutating tool). Needs `gh` authenticated.
9
+ */
10
+ import type { ToolDefinition } from "../types.js";
11
+ type GithubAction = "issue_list" | "issue_view" | "issue_create" | "issue_comment" | "pr_view" | "pr_create" | "pr_comment" | "pr_merge" | "run_list" | "run_view" | "release_list";
12
+ interface GithubInput {
13
+ action: GithubAction;
14
+ cwd?: string;
15
+ /** Issue / PR / run number (issue_view, pr_view, *_comment, pr_merge, run_view). */
16
+ number?: number;
17
+ title?: string;
18
+ body?: string;
19
+ /** pr_create base branch. */
20
+ base?: string;
21
+ /** issue_list / pr filter state. */
22
+ state?: "open" | "closed" | "all";
23
+ /** pr_merge method. Default squash. */
24
+ merge_method?: "squash" | "merge" | "rebase";
25
+ }
26
+ /** Build the gh argv for an action (without the leading "gh"). Pure + tested. */
27
+ export declare function buildGhArgs(input: GithubInput): {
28
+ args: string[];
29
+ } | {
30
+ error: string;
31
+ };
32
+ export declare const githubTool: ToolDefinition<GithubInput, string>;
33
+ export {};
34
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/tools/github.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,KAAK,YAAY,GACb,YAAY,GAAG,YAAY,GAAG,cAAc,GAAG,eAAe,GAC9D,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,GACnD,UAAU,GAAG,UAAU,GAAG,cAAc,CAAC;AAE7C,UAAU,WAAW;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,uCAAuC;IACvC,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;CAC9C;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CA8CtF;AAsBD,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,WAAW,EAAE,MAAM,CA8C1D,CAAC"}
@@ -0,0 +1,140 @@
1
+ import { runIn, isDir, gitRoot } from "./exec-util.js";
2
+ /** Build the gh argv for an action (without the leading "gh"). Pure + tested. */
3
+ export function buildGhArgs(input) {
4
+ const need = (v, name) => v == null || v === "" ? `${input.action} needs ${name}` : null;
5
+ switch (input.action) {
6
+ case "issue_list":
7
+ return { args: ["issue", "list", "--state", input.state ?? "open", "--limit", "30", "--json", "number,title,state,author,labels"] };
8
+ case "issue_view": {
9
+ const e = need(input.number, "a number");
10
+ if (e)
11
+ return { error: e };
12
+ return { args: ["issue", "view", String(input.number), "--comments"] };
13
+ }
14
+ case "issue_create": {
15
+ const e = need(input.title, "a title");
16
+ if (e)
17
+ return { error: e };
18
+ return { args: ["issue", "create", "--title", input.title, "--body", input.body ?? ""] };
19
+ }
20
+ case "issue_comment": {
21
+ const e = need(input.number, "a number") || need(input.body, "a body");
22
+ if (e)
23
+ return { error: e };
24
+ return { args: ["issue", "comment", String(input.number), "--body", input.body] };
25
+ }
26
+ case "pr_view": {
27
+ const e = need(input.number, "a number");
28
+ if (e)
29
+ return { error: e };
30
+ return { args: ["pr", "view", String(input.number), "--comments"] };
31
+ }
32
+ case "pr_create": {
33
+ const e = need(input.title, "a title");
34
+ if (e)
35
+ return { error: e };
36
+ const args = ["pr", "create", "--title", input.title, "--body", input.body ?? ""];
37
+ if (input.base)
38
+ args.push("--base", input.base);
39
+ return { args };
40
+ }
41
+ case "pr_comment": {
42
+ const e = need(input.number, "a number") || need(input.body, "a body");
43
+ if (e)
44
+ return { error: e };
45
+ return { args: ["pr", "comment", String(input.number), "--body", input.body] };
46
+ }
47
+ case "pr_merge": {
48
+ const e = need(input.number, "a number");
49
+ if (e)
50
+ return { error: e };
51
+ return { args: ["pr", "merge", String(input.number), `--${input.merge_method ?? "squash"}`, "--delete-branch"] };
52
+ }
53
+ case "run_list":
54
+ return { args: ["run", "list", "--limit", "15", "--json", "databaseId,name,status,conclusion,headBranch,event"] };
55
+ case "run_view": {
56
+ const e = need(input.number, "a run id (number)");
57
+ if (e)
58
+ return { error: e };
59
+ return { args: ["run", "view", String(input.number)] };
60
+ }
61
+ case "release_list":
62
+ return { args: ["release", "list", "--limit", "10"] };
63
+ default:
64
+ return { error: `unknown action: ${input.action}` };
65
+ }
66
+ }
67
+ /** Compact a gh --json issue/PR/run array into readable lines. */
68
+ function formatJsonList(action, raw) {
69
+ let arr;
70
+ try {
71
+ arr = JSON.parse(raw);
72
+ }
73
+ catch {
74
+ return raw.trim();
75
+ }
76
+ if (!Array.isArray(arr) || arr.length === 0)
77
+ return "(none)";
78
+ if (action === "issue_list") {
79
+ return arr.map((i) => {
80
+ const labels = (i.labels ?? []).map((l) => l.name).join(", ");
81
+ return `#${i.number} [${i.state}] ${i.title}${labels ? ` (${labels})` : ""} — @${i.author?.login ?? "?"}`;
82
+ }).join("\n");
83
+ }
84
+ if (action === "run_list") {
85
+ return arr.map((r) => {
86
+ const s = r.conclusion || r.status || "?";
87
+ return `${r.databaseId} ${s} · ${r.name} · ${r.headBranch} (${r.event})`;
88
+ }).join("\n");
89
+ }
90
+ return raw.trim();
91
+ }
92
+ export const githubTool = {
93
+ name: "github",
94
+ description: "GitHub operations via gh: issues (issue_list / issue_view / issue_create / issue_comment), " +
95
+ "PRs (pr_view / pr_create / pr_comment / pr_merge), CI (run_list / run_view), releases " +
96
+ "(release_list). For listing open PRs with CI use pr_status; for URLs use github_link. " +
97
+ "create/comment/merge are write actions. Needs `gh` authenticated.",
98
+ inputSchema: {
99
+ type: "object",
100
+ properties: {
101
+ action: {
102
+ type: "string",
103
+ enum: ["issue_list", "issue_view", "issue_create", "issue_comment", "pr_view", "pr_create", "pr_comment", "pr_merge", "run_list", "run_view", "release_list"],
104
+ },
105
+ cwd: { type: "string", description: "Absolute path inside the repo. Defaults to the current directory." },
106
+ number: { type: "integer", description: "Issue / PR number, or run id (per action)." },
107
+ title: { type: "string", description: "For issue_create / pr_create." },
108
+ body: { type: "string", description: "Body for create/comment actions." },
109
+ base: { type: "string", description: "Base branch for pr_create." },
110
+ state: { type: "string", enum: ["open", "closed", "all"], description: "Filter for issue_list (default open)." },
111
+ merge_method: { type: "string", enum: ["squash", "merge", "rebase"], description: "For pr_merge (default squash)." },
112
+ },
113
+ required: ["action"],
114
+ additionalProperties: false,
115
+ },
116
+ async execute(input, ctx) {
117
+ const cwd = input.cwd && input.cwd.startsWith("/") ? input.cwd : ctx.cwd;
118
+ if (!(await isDir(cwd)))
119
+ return `(not a directory: ${cwd})`;
120
+ const root = (await gitRoot(cwd, ctx.signal)) ?? cwd;
121
+ const built = buildGhArgs(input);
122
+ if ("error" in built)
123
+ return `(${built.error})`;
124
+ const r = await runIn(root, "gh", built.args, { timeoutMs: 30000, signal: ctx.signal, maxBytes: 200_000 });
125
+ if (r.spawnError)
126
+ return "(the `gh` CLI isn't installed — needed for GitHub operations. https://cli.github.com)";
127
+ if (r.code !== 0) {
128
+ const e = r.stderr.trim();
129
+ if (/auth|login/i.test(e))
130
+ return "(`gh` isn't authenticated — run `gh auth login`)";
131
+ return `(gh ${input.action} failed: ${e.slice(0, 250) || "unknown error"})`;
132
+ }
133
+ const out = r.stdout.trim();
134
+ if (input.action === "issue_list" || input.action === "run_list") {
135
+ return formatJsonList(input.action, r.stdout) || "(none)";
136
+ }
137
+ return out || "(done)";
138
+ },
139
+ };
140
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/tools/github.ts"],"names":[],"mappings":"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"}