@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,102 @@
1
+ import { runIn, isDir, gitRoot } from "./exec-util.js";
2
+ /** Pure: format `npm view --json` metadata. Exported for tests. */
3
+ export function formatView(json) {
4
+ let d;
5
+ try {
6
+ d = JSON.parse(json);
7
+ }
8
+ catch {
9
+ return json.trim();
10
+ }
11
+ if (Array.isArray(d))
12
+ d = d[d.length - 1]; // version range → newest match
13
+ const lines = [
14
+ `${d.name}@${d.version}`,
15
+ d.description ? ` ${d.description}` : "",
16
+ d.license ? ` license: ${d.license}` : "",
17
+ d.homepage ? ` homepage: ${d.homepage}` : "",
18
+ d.deprecated ? ` ⚠ DEPRECATED: ${d.deprecated}` : "",
19
+ d.dist?.unpackedSize ? ` size: ${Math.round(d.dist.unpackedSize / 1024)} KB` : "",
20
+ ].filter(Boolean);
21
+ return lines.join("\n");
22
+ }
23
+ /** Pure: format `npm outdated --json`. Exported for tests. */
24
+ export function formatOutdated(json) {
25
+ let d;
26
+ try {
27
+ d = JSON.parse(json || "{}");
28
+ }
29
+ catch {
30
+ return json.trim();
31
+ }
32
+ const names = Object.keys(d);
33
+ if (names.length === 0)
34
+ return "(all dependencies up to date)";
35
+ return `${names.length} outdated:\n` + names.map((n) => ` ${n}: ${d[n].current ?? "?"} → ${d[n].latest ?? "?"}`).join("\n");
36
+ }
37
+ /** Pure: summarise `npm audit --json` (npm v7+ shape). Exported for tests. */
38
+ export function formatAudit(json) {
39
+ let d;
40
+ try {
41
+ d = JSON.parse(json);
42
+ }
43
+ catch {
44
+ return json.trim();
45
+ }
46
+ const v = d?.metadata?.vulnerabilities;
47
+ if (!v)
48
+ return "(no audit data)";
49
+ const total = (v.critical ?? 0) + (v.high ?? 0) + (v.moderate ?? 0) + (v.low ?? 0) + (v.info ?? 0);
50
+ if (total === 0)
51
+ return "(no known vulnerabilities)";
52
+ const parts = ["critical", "high", "moderate", "low", "info"].filter((k) => v[k]).map((k) => `${v[k]} ${k}`);
53
+ return `${total} vulnerabilit${total === 1 ? "y" : "ies"}: ${parts.join(", ")} (run \`npm audit\` for detail)`;
54
+ }
55
+ export const npmInfoTool = {
56
+ name: "npm_info",
57
+ description: "npm registry info: action:'view' (package — latest version, description, license, deprecation), " +
58
+ "'outdated' (which of a repo's dependencies have newer versions), 'audit' (known vulnerabilities in " +
59
+ "a repo). Use when the user asks about a package, whether deps are current, or for a security pass. " +
60
+ "Read-only; no auth; uses the local npm CLI.",
61
+ inputSchema: {
62
+ type: "object",
63
+ properties: {
64
+ action: { type: "string", enum: ["view", "outdated", "audit"] },
65
+ package: { type: "string", description: "Package name (optionally name@range) for action:'view'." },
66
+ cwd: { type: "string", description: "Repo path for outdated/audit. Defaults to current directory." },
67
+ },
68
+ required: ["action"],
69
+ additionalProperties: false,
70
+ },
71
+ async execute(input, ctx) {
72
+ if (input.action === "view") {
73
+ if (!input.package)
74
+ return "(view needs a package name)";
75
+ const r = await runIn(ctx.cwd, "npm", ["view", input.package, "--json"], { timeoutMs: 20000, signal: ctx.signal, maxBytes: 200_000 });
76
+ if (r.spawnError)
77
+ return "(npm isn't installed)";
78
+ if (r.code !== 0)
79
+ return `(npm view failed: ${r.stderr.trim().slice(0, 160) || "no such package?"})`;
80
+ return formatView(r.stdout);
81
+ }
82
+ const cwd = input.cwd && input.cwd.startsWith("/") ? input.cwd : ctx.cwd;
83
+ if (!(await isDir(cwd)))
84
+ return `(not a directory: ${cwd})`;
85
+ const root = (await gitRoot(cwd, ctx.signal)) ?? cwd;
86
+ if (input.action === "outdated") {
87
+ // npm outdated exits non-zero when there ARE outdated deps — that's not an error.
88
+ const r = await runIn(root, "npm", ["outdated", "--json"], { timeoutMs: 60000, signal: ctx.signal, maxBytes: 200_000 });
89
+ if (r.spawnError)
90
+ return "(npm isn't installed)";
91
+ return formatOutdated(r.stdout || "{}");
92
+ }
93
+ // audit
94
+ const r = await runIn(root, "npm", ["audit", "--json"], { timeoutMs: 60000, signal: ctx.signal, maxBytes: 400_000 });
95
+ if (r.spawnError)
96
+ return "(npm isn't installed)";
97
+ if (!r.stdout.trim())
98
+ return `(npm audit produced no output${r.stderr ? ": " + r.stderr.trim().slice(0, 120) : ""})`;
99
+ return formatAudit(r.stdout);
100
+ },
101
+ };
102
+ //# sourceMappingURL=npm_info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm_info.js","sourceRoot":"","sources":["../../src/tools/npm_info.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;AA+BlD,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,CA2ClF;AAED,eAAO,MAAM,oBAAoB,aAS/B,CAAC;AAEH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAExE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA4ClD,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,CAwDlF;AAED,eAAO,MAAM,oBAAoB,aAU/B,CAAC;AAEH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAExE"}
@@ -1,8 +1,21 @@
1
1
  import { memoryTool } from "../memory/tool.js";
2
2
  import { memorySearchTool } from "../memory/search_tool.js";
3
3
  import { adviseNowTool } from "./advise_now.js";
4
+ import { listAgentsTool } from "./list_agents.js";
5
+ import { inspectAgentTool } from "./inspect_agent.js";
6
+ import { repoDigestTool } from "./repo_digest.js";
7
+ import { reviewDiffTool } from "./review_diff.js";
8
+ import { runChecksTool } from "./run_checks.js";
9
+ import { prStatusTool } from "./pr_status.js";
4
10
  import { dispatchAgentTool } from "./dispatch_agent.js";
11
+ import { scheduledDispatchTool } from "./scheduled_dispatch.js";
12
+ import { compareAgentsTool } from "./compare_agents.js";
13
+ import { githubLinkTool } from "./github_link.js";
14
+ import { githubTool } from "./github.js";
15
+ import { npmInfoTool } from "./npm_info.js";
16
+ import { mcpTool } from "./mcp.js";
5
17
  import { signalAgentTool } from "./signal_agent.js";
18
+ import { agentRecapTool } from "./agent_recap.js";
6
19
  import { skillManageTool } from "../skills/tool.js";
7
20
  import { desireCloseTool, desireProgressTool, soulDiffTool, soulFeelTool, soulHistoryTool, soulJournalTool, soulObjectTool, soulPatchTool, soulReadTool, } from "../soul/tools.js";
8
21
  import { speakTool, transcribeTool } from "../voice/tool.js";
@@ -43,9 +56,22 @@ export function buildToolRegistry(opts = {}) {
43
56
  webSearchTool,
44
57
  redeployTool,
45
58
  // Orchestration (docs/ORCHESTRATOR_PLAN.md): observe → advise → dispatch → control.
59
+ listAgentsTool,
60
+ inspectAgentTool,
61
+ repoDigestTool,
62
+ reviewDiffTool,
63
+ runChecksTool,
64
+ prStatusTool,
46
65
  adviseNowTool,
47
66
  dispatchAgentTool,
67
+ scheduledDispatchTool,
68
+ compareAgentsTool,
69
+ githubLinkTool,
70
+ githubTool,
71
+ npmInfoTool,
72
+ mcpTool,
48
73
  signalAgentTool,
74
+ agentRecapTool,
49
75
  ];
50
76
  if (opts.includeVoice) {
51
77
  tools.push(speakTool, transcribeTool);
@@ -71,6 +97,7 @@ export const READ_ONLY_TOOL_NAMES = new Set([
71
97
  "soul_diff",
72
98
  "web_fetch",
73
99
  "web_search",
100
+ "agent_recap",
74
101
  ]);
75
102
  export function readOnlySubset(tools) {
76
103
  return tools.filter((t) => READ_ONLY_TOOL_NAMES.has(t.name));
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * repo_digest (vibe-coding) — "what actually changed?" across the repos your
3
+ * agents are working in. The orchestrator only sees structural activity (tool
4
+ * names, file paths); git is the source of truth for *what was produced*. This
5
+ * wraps git so LISA can answer "what did Claude Code do today" with real
6
+ * commits + working-tree state, per repo.
7
+ *
8
+ * Reads the user's own git repos (content they've asked LISA to look at) — this
9
+ * is separate from the orchestrator's no-conversation-content privacy rule.
10
+ */
11
+ import type { ToolDefinition } from "../types.js";
12
+ interface RepoDigestInput {
13
+ /** Repo path. Omit to digest every repo with an observed agent session. */
14
+ cwd?: string;
15
+ /** git --since value. Default "1 day ago". */
16
+ since?: string;
17
+ }
18
+ export interface RepoDigest {
19
+ root: string;
20
+ branch: string;
21
+ commits: string[];
22
+ dirtyFiles: number;
23
+ diffStat: string;
24
+ ahead: number;
25
+ behind: number;
26
+ since: string;
27
+ error?: string;
28
+ }
29
+ /** Pure: render one repo's digest. Exported for tests. */
30
+ export declare function formatDigest(d: RepoDigest): string;
31
+ export declare const repoDigestTool: ToolDefinition<RepoDigestInput, string>;
32
+ export {};
33
+ //# sourceMappingURL=repo_digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo_digest.d.ts","sourceRoot":"","sources":["../../src/tools/repo_digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,UAAU,eAAe;IACvB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAqBlD;AAoDD,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,eAAe,EAAE,MAAM,CAkClE,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { getCurrentHub } from "../integrations/current-hub.js";
2
+ import { runIn, isDir, gitRoot } from "./exec-util.js";
3
+ /** Pure: render one repo's digest. Exported for tests. */
4
+ export function formatDigest(d) {
5
+ const name = d.root.split("/").pop() || d.root;
6
+ if (d.error)
7
+ return `▸ ${name} — ${d.error}`;
8
+ const lines = [];
9
+ const sync = d.ahead || d.behind
10
+ ? ` (${d.ahead ? "↑" + d.ahead : ""}${d.behind ? "↓" + d.behind : ""} vs upstream)`
11
+ : "";
12
+ lines.push(`▸ ${name} @ ${d.branch}${sync}`);
13
+ if (d.commits.length) {
14
+ lines.push(` commits since ${d.since}:`);
15
+ for (const c of d.commits)
16
+ lines.push(` ${c}`);
17
+ }
18
+ else {
19
+ lines.push(` no commits since ${d.since}`);
20
+ }
21
+ if (d.dirtyFiles > 0) {
22
+ lines.push(` uncommitted: ${d.dirtyFiles} file(s)${d.diffStat ? " · " + d.diffStat : ""}`);
23
+ }
24
+ else {
25
+ lines.push(` working tree clean`);
26
+ }
27
+ return lines.join("\n");
28
+ }
29
+ async function digestRepo(cwd, since, signal) {
30
+ const root = await gitRoot(cwd, signal);
31
+ const base = { root: root ?? cwd, branch: "?", commits: [], dirtyFiles: 0, diffStat: "", ahead: 0, behind: 0, since };
32
+ if (!root)
33
+ return { ...base, error: "not a git repo" };
34
+ const git = (args) => runIn(root, "git", ["-C", root, ...args], { timeoutMs: 8000, signal });
35
+ const branch = await git(["rev-parse", "--abbrev-ref", "HEAD"]);
36
+ base.branch = branch.code === 0 ? branch.stdout.trim() || "?" : "?";
37
+ // Commits across all refs in the window (covers agent worktrees/branches).
38
+ const log = await git(["log", "--all", "--oneline", "--no-decorate", `--since=${since}`, "-n", "25"]);
39
+ if (log.code === 0) {
40
+ base.commits = log.stdout.split("\n").map((l) => l.trim()).filter(Boolean);
41
+ }
42
+ const status = await git(["status", "--porcelain"]);
43
+ if (status.code === 0) {
44
+ base.dirtyFiles = status.stdout.split("\n").filter((l) => l.trim()).length;
45
+ }
46
+ if (base.dirtyFiles > 0) {
47
+ const ds = await git(["diff", "--shortstat"]);
48
+ if (ds.code === 0)
49
+ base.diffStat = ds.stdout.trim();
50
+ }
51
+ const ab = await git(["rev-list", "--left-right", "--count", "@{upstream}...HEAD"]);
52
+ if (ab.code === 0) {
53
+ const m = ab.stdout.trim().split(/\s+/);
54
+ base.behind = parseInt(m[0] ?? "0", 10) || 0;
55
+ base.ahead = parseInt(m[1] ?? "0", 10) || 0;
56
+ }
57
+ return base;
58
+ }
59
+ /** Collect distinct git roots from the observed agent sessions' cwds. */
60
+ async function observedRepoRoots(signal) {
61
+ const hub = getCurrentHub();
62
+ if (!hub)
63
+ return [];
64
+ const cwds = Array.from(new Set(hub.list().map((s) => s.cwd).filter((c) => !!c && c.startsWith("/"))));
65
+ const roots = new Set();
66
+ for (const c of cwds) {
67
+ const r = await gitRoot(c, signal);
68
+ if (r)
69
+ roots.add(r);
70
+ if (roots.size >= 8)
71
+ break;
72
+ }
73
+ return Array.from(roots);
74
+ }
75
+ export const repoDigestTool = {
76
+ name: "repo_digest",
77
+ description: "Summarise what actually changed in a git repo (or, with no cwd, every repo your agents are " +
78
+ "working in): recent commits in a time window, current branch, uncommitted file count + diff " +
79
+ "stat, and ahead/behind vs upstream. Use to answer 'what did <agent> / I do today', 'what's the " +
80
+ "state of <repo>', or before reviewing/merging. Reads git only (no writes). Pair with review_diff " +
81
+ "to see the actual changes and run_checks to verify them.",
82
+ inputSchema: {
83
+ type: "object",
84
+ properties: {
85
+ cwd: { type: "string", description: "Absolute path inside the repo. Omit to digest all repos with an active agent session." },
86
+ since: { type: "string", description: 'git --since window, e.g. "1 day ago", "today", "3 hours ago". Default "1 day ago".' },
87
+ },
88
+ additionalProperties: false,
89
+ },
90
+ async execute(input, ctx) {
91
+ const since = input.since?.trim() || "1 day ago";
92
+ let roots;
93
+ if (input.cwd) {
94
+ if (!(await isDir(input.cwd)))
95
+ return `(not a directory: ${input.cwd})`;
96
+ roots = [input.cwd];
97
+ }
98
+ else {
99
+ roots = await observedRepoRoots(ctx.signal);
100
+ if (roots.length === 0) {
101
+ // Fall back to the current working directory's repo.
102
+ const r = await gitRoot(ctx.cwd, ctx.signal);
103
+ if (r)
104
+ roots = [r];
105
+ }
106
+ }
107
+ if (roots.length === 0)
108
+ return "(no git repos to digest — no active agent sessions and cwd isn't a repo)";
109
+ const digests = await Promise.all(roots.map((r) => digestRepo(r, since, ctx.signal)));
110
+ return digests.map(formatDigest).join("\n\n");
111
+ },
112
+ };
113
+ //# sourceMappingURL=repo_digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo_digest.js","sourceRoot":"","sources":["../../src/tools/repo_digest.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAqBvD,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,CAAa;IACxC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;IAC/C,IAAI,CAAC,CAAC,KAAK;QAAE,OAAO,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GACR,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM;QACjB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe;QACpF,CAAC,CAAC,EAAE,CAAC;IACT,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,KAAa,EAAE,MAAoB;IACxE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAClI,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAEvD,MAAM,GAAG,GAAG,CAAC,IAAc,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvG,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEpE,2EAA2E;IAC3E,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACtG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC7E,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;QAC9C,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACpF,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yEAAyE;AACzE,KAAK,UAAU,iBAAiB,CAAC,MAAoB;IACnD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAC3F,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC;YAAE,MAAM;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAA4C;IACrE,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,6FAA6F;QAC7F,8FAA8F;QAC9F,iGAAiG;QACjG,mGAAmG;QACnG,0DAA0D;IAC5D,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uFAAuF,EAAE;YAC7H,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oFAAoF,EAAE;SAC7H;QACD,oBAAoB,EAAE,KAAK;KAC5B;IACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC;QACjD,IAAI,KAAe,CAAC;QACpB,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAAE,OAAO,qBAAqB,KAAK,CAAC,GAAG,GAAG,CAAC;YACxE,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,qDAAqD;gBACrD,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAI,CAAC;oBAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,0EAA0E,CAAC;QAC1G,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtF,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;CACF,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * review_diff (vibe-coding) — show the actual code changes in a repo (or a PR)
3
+ * so LISA can review an agent's work: spot bugs, risky edits, leftover debug
4
+ * code, missing tests. The natural follow-up to repo_digest ("something
5
+ * changed") and the natural lead-in to run_checks ("does it pass?").
6
+ *
7
+ * Read-only. Diff output is capped so a huge change doesn't blow the context.
8
+ */
9
+ import type { ToolDefinition } from "../types.js";
10
+ interface ReviewDiffInput {
11
+ /** Repo path. Defaults to the current working directory. */
12
+ cwd?: string;
13
+ /**
14
+ * What to diff: "head" (all uncommitted vs HEAD, default), "working"
15
+ * (unstaged only), "staged" (staged only), or any git ref/range
16
+ * (e.g. "main...HEAD", "HEAD~3").
17
+ */
18
+ target?: string;
19
+ /** Review a GitHub PR's diff instead (needs the `gh` CLI). */
20
+ pr?: number;
21
+ /** Max diff lines to return. Default 600. */
22
+ max_lines?: number;
23
+ }
24
+ /** Pure: assemble the stat header + (capped) diff body. Exported for tests. */
25
+ export declare function assembleReview(stat: string, diff: string, maxLines: number): string;
26
+ export declare const reviewDiffTool: ToolDefinition<ReviewDiffInput, string>;
27
+ export {};
28
+ //# sourceMappingURL=review_diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review_diff.d.ts","sourceRoot":"","sources":["../../src/tools/review_diff.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,UAAU,eAAe;IACvB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOnF;AAED,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,eAAe,EAAE,MAAM,CAuClE,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { runIn, isDir, gitRoot } from "./exec-util.js";
2
+ function gitDiffArgs(target) {
3
+ switch (target) {
4
+ case "working":
5
+ return ["diff"];
6
+ case "staged":
7
+ return ["diff", "--cached"];
8
+ case "head":
9
+ case "":
10
+ return ["diff", "HEAD"];
11
+ default:
12
+ return ["diff", target];
13
+ }
14
+ }
15
+ /** Pure: assemble the stat header + (capped) diff body. Exported for tests. */
16
+ export function assembleReview(stat, diff, maxLines) {
17
+ const header = stat.trim() ? stat.trim() : "(no changes)";
18
+ if (!diff.trim())
19
+ return header;
20
+ const lines = diff.split("\n");
21
+ if (lines.length <= maxLines)
22
+ return `${header}\n\n${diff.trimEnd()}`;
23
+ const shown = lines.slice(0, maxLines).join("\n");
24
+ return `${header}\n\n${shown}\n… [diff truncated — ${maxLines} of ${lines.length} lines shown; narrow with target or review per-file]`;
25
+ }
26
+ export const reviewDiffTool = {
27
+ name: "review_diff",
28
+ description: "Show the actual code diff in a repo so you can review it — uncommitted changes vs HEAD by " +
29
+ "default, or working/staged only, or any git ref/range, or a GitHub PR (pr:<n>, needs `gh`). " +
30
+ "Use to review what an agent wrote before committing/merging: bugs, risky edits, debug leftovers, " +
31
+ "missing tests. Read-only; output is capped. Pair with repo_digest (what changed) and run_checks " +
32
+ "(does it pass).",
33
+ inputSchema: {
34
+ type: "object",
35
+ properties: {
36
+ cwd: { type: "string", description: "Absolute path inside the repo. Defaults to the current directory." },
37
+ target: { type: "string", description: '"head" (default, all uncommitted), "working", "staged", or a git ref/range like "main...HEAD".' },
38
+ pr: { type: "integer", description: "Review this GitHub PR's diff instead (needs `gh`)." },
39
+ max_lines: { type: "integer", minimum: 50, maximum: 4000, description: "Max diff lines (default 600)." },
40
+ },
41
+ additionalProperties: false,
42
+ },
43
+ async execute(input, ctx) {
44
+ const cwd = input.cwd && input.cwd.startsWith("/") ? input.cwd : ctx.cwd;
45
+ if (!(await isDir(cwd)))
46
+ return `(not a directory: ${cwd})`;
47
+ const root = await gitRoot(cwd, ctx.signal);
48
+ if (!root)
49
+ return `(not a git repo: ${cwd})`;
50
+ const maxLines = input.max_lines ?? 600;
51
+ if (typeof input.pr === "number") {
52
+ const r = await runIn(root, "gh", ["pr", "diff", String(input.pr)], { timeoutMs: 20000, signal: ctx.signal, maxBytes: 200_000 });
53
+ if (r.spawnError)
54
+ return "(the `gh` CLI isn't installed — needed to fetch PR diffs)";
55
+ if (r.code !== 0)
56
+ return `(gh pr diff ${input.pr} failed: ${r.stderr.trim().slice(0, 200) || "unknown error"})`;
57
+ return assembleReview(`PR #${input.pr} diff`, r.stdout, maxLines);
58
+ }
59
+ const target = (input.target ?? "head").trim();
60
+ const args = gitDiffArgs(target);
61
+ const stat = await runIn(root, "git", ["-C", root, ...args, "--stat"], { timeoutMs: 10000, signal: ctx.signal });
62
+ const diff = await runIn(root, "git", ["-C", root, ...args], { timeoutMs: 15000, signal: ctx.signal, maxBytes: 200_000 });
63
+ if (diff.code !== 0)
64
+ return `(git diff failed: ${diff.stderr.trim().slice(0, 200) || "bad target?"})`;
65
+ return assembleReview(stat.stdout, diff.stdout, maxLines);
66
+ },
67
+ };
68
+ //# sourceMappingURL=review_diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review_diff.js","sourceRoot":"","sources":["../../src/tools/review_diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ interface RunChecksInput {
3
+ cwd?: string;
4
+ /** Subset to run, e.g. ["test","typecheck"]. Omit = all detected. */
5
+ only?: string[];
6
+ }
7
+ export interface DetectedCheck {
8
+ name: string;
9
+ script: string;
10
+ }
11
+ /** Pure: pick which checks to run from a scripts map. Exported for tests. */
12
+ export declare function detectChecks(scripts: Record<string, string>, only?: string[]): DetectedCheck[];
13
+ export declare const runChecksTool: ToolDefinition<RunChecksInput, string>;
14
+ export {};
15
+ //# sourceMappingURL=run_checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_checks.d.ts","sourceRoot":"","sources":["../../src/tools/run_checks.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,UAAU,cAAc;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAiBD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAe9F;AAOD,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,cAAc,EAAE,MAAM,CA8DhE,CAAC"}