@oratis/lisa 0.5.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/README.md +5 -0
- 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/idle/runner.d.ts +12 -0
- package/dist/idle/runner.d.ts.map +1 -1
- package/dist/idle/runner.js +33 -2
- package/dist/idle/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/dispatch-ledger.d.ts +51 -0
- package/dist/integrations/dispatch-ledger.d.ts.map +1 -0
- package/dist/integrations/dispatch-ledger.js +106 -0
- package/dist/integrations/dispatch-ledger.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/birth.d.ts.map +1 -1
- package/dist/soul/birth.js +8 -0
- package/dist/soul/birth.js.map +1 -1
- 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 +49 -37
- 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 +26 -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/tools/signal_agent.d.ts +36 -0
- package/dist/tools/signal_agent.d.ts.map +1 -0
- package/dist/tools/signal_agent.js +140 -0
- package/dist/tools/signal_agent.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 +139 -27
- 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 +132 -4
- package/dist/web/lisa-html.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +190 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub PR observer (O4 — class B, cloud/API agent) — proves the integration
|
|
3
|
+
* registry generalizes beyond local file-tailing agents to remote work.
|
|
4
|
+
*
|
|
5
|
+
* A pull request behaves a lot like an autonomous agent session: it has CI
|
|
6
|
+
* "working" on it, it "waits" on review, it "errors" when checks fail, and it
|
|
7
|
+
* "finishes" when merged/closed. This adapter polls the GitHub API via the
|
|
8
|
+
* `gh` CLI and normalizes each PR onto the same AgentSession shape every other
|
|
9
|
+
* observer produces, so the hub / monitor / advisor treat it uniformly.
|
|
10
|
+
*
|
|
11
|
+
* Unlike Claude Code / Codex (which tail JSONL on disk), this is a POLLING
|
|
12
|
+
* observer — it has no files to watch, so it refreshes on an interval and emits
|
|
13
|
+
* sessions whose state changed. That's the point: the AgentObserver contract is
|
|
14
|
+
* agnostic to *how* state is discovered.
|
|
15
|
+
*
|
|
16
|
+
* MODES
|
|
17
|
+
* - cfg.repos = ["owner/repo", …] → `gh pr list -R … ` per repo (rich: also
|
|
18
|
+
* reads check status + review decision).
|
|
19
|
+
* - no repos → `gh search prs --author @me --state open`
|
|
20
|
+
* across all of GitHub (state/draft only; search has no check fields).
|
|
21
|
+
*
|
|
22
|
+
* SAFETY / PRIVACY: only the user's own PR metadata (number, title, branch,
|
|
23
|
+
* state, check/review status) — never diff content or review prose. DISABLED by
|
|
24
|
+
* default; opt in via ~/.lisa/agents.json. Graceful no-op if `gh` is missing or
|
|
25
|
+
* unauthenticated (every fetch failure → empty, never throws into the hub).
|
|
26
|
+
*/
|
|
27
|
+
import { EventEmitter } from "node:events";
|
|
28
|
+
import type { AgentIntegrationConfig, AgentObserver, AgentSession } from "../types.js";
|
|
29
|
+
/** Tolerant shape of a PR as returned by `gh pr list`/`gh search prs --json`. */
|
|
30
|
+
export interface RawPr {
|
|
31
|
+
number: number;
|
|
32
|
+
title?: string;
|
|
33
|
+
state?: string;
|
|
34
|
+
isDraft?: boolean;
|
|
35
|
+
mergedAt?: string | null;
|
|
36
|
+
updatedAt?: string;
|
|
37
|
+
headRefName?: string;
|
|
38
|
+
reviewDecision?: string | null;
|
|
39
|
+
statusCheckRollup?: RawCheck[] | null;
|
|
40
|
+
repository?: {
|
|
41
|
+
nameWithOwner?: string;
|
|
42
|
+
} | null;
|
|
43
|
+
/** Injected by the fetcher for per-repo mode (search mode fills repository). */
|
|
44
|
+
repoFullName?: string;
|
|
45
|
+
}
|
|
46
|
+
interface RawCheck {
|
|
47
|
+
__typename?: string;
|
|
48
|
+
status?: string;
|
|
49
|
+
conclusion?: string;
|
|
50
|
+
state?: string;
|
|
51
|
+
name?: string;
|
|
52
|
+
context?: string;
|
|
53
|
+
}
|
|
54
|
+
/** Reduce a check rollup to one verdict. Pure. */
|
|
55
|
+
export declare function classifyChecks(rollup: RawCheck[] | null | undefined): "failing" | "pending" | "passing" | "none";
|
|
56
|
+
/** Map one PR to the normalized AgentSession. Pure — the unit under test. */
|
|
57
|
+
export declare function mapPrToSession(pr: RawPr): AgentSession;
|
|
58
|
+
export interface GithubPrObserverOptions extends AgentIntegrationConfig {
|
|
59
|
+
/** Override the PR fetcher (tests). */
|
|
60
|
+
fetchPrs?: () => Promise<RawPr[]>;
|
|
61
|
+
/** Poll interval ms. */
|
|
62
|
+
pollMs?: number;
|
|
63
|
+
/** Only surface PRs updated within this many ms. */
|
|
64
|
+
activeWindowMs?: number;
|
|
65
|
+
/** Clock override (tests). */
|
|
66
|
+
now?: () => number;
|
|
67
|
+
}
|
|
68
|
+
export declare class GithubPrObserver extends EventEmitter implements AgentObserver {
|
|
69
|
+
readonly agent = "github-pr";
|
|
70
|
+
private sessions;
|
|
71
|
+
private timer;
|
|
72
|
+
private emitFn;
|
|
73
|
+
private readonly fetcher;
|
|
74
|
+
private readonly pollMs;
|
|
75
|
+
private readonly windowMs;
|
|
76
|
+
private readonly now;
|
|
77
|
+
constructor(cfg: GithubPrObserverOptions);
|
|
78
|
+
start(emit: (s: AgentSession) => void): Promise<void>;
|
|
79
|
+
list(): AgentSession[];
|
|
80
|
+
stop(): Promise<void>;
|
|
81
|
+
/** One refresh cycle — exposed for deterministic tests. */
|
|
82
|
+
poll(): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/integrations/github-pr/observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EACV,sBAAsB,EACtB,aAAa,EACb,YAAY,EAEb,MAAM,aAAa,CAAC;AASrB,iFAAiF;AACjF,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACtC,UAAU,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/C,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,QAAQ;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiBD,kDAAkD;AAClD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,SAAS,GACpC,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAkB5C;AAQD,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,EAAE,EAAE,KAAK,GAAG,YAAY,CA2DtD;AAsDD,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAClC,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,gBAAiB,SAAQ,YAAa,YAAW,aAAa;IACzE,QAAQ,CAAC,KAAK,eAAe;IAC7B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,GAAG,EAAE,uBAAuB;IAWlC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3D,IAAI,IAAI,YAAY,EAAE;IAQhB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,2DAA2D;IACrD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA+B5B"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub PR observer (O4 — class B, cloud/API agent) — proves the integration
|
|
3
|
+
* registry generalizes beyond local file-tailing agents to remote work.
|
|
4
|
+
*
|
|
5
|
+
* A pull request behaves a lot like an autonomous agent session: it has CI
|
|
6
|
+
* "working" on it, it "waits" on review, it "errors" when checks fail, and it
|
|
7
|
+
* "finishes" when merged/closed. This adapter polls the GitHub API via the
|
|
8
|
+
* `gh` CLI and normalizes each PR onto the same AgentSession shape every other
|
|
9
|
+
* observer produces, so the hub / monitor / advisor treat it uniformly.
|
|
10
|
+
*
|
|
11
|
+
* Unlike Claude Code / Codex (which tail JSONL on disk), this is a POLLING
|
|
12
|
+
* observer — it has no files to watch, so it refreshes on an interval and emits
|
|
13
|
+
* sessions whose state changed. That's the point: the AgentObserver contract is
|
|
14
|
+
* agnostic to *how* state is discovered.
|
|
15
|
+
*
|
|
16
|
+
* MODES
|
|
17
|
+
* - cfg.repos = ["owner/repo", …] → `gh pr list -R … ` per repo (rich: also
|
|
18
|
+
* reads check status + review decision).
|
|
19
|
+
* - no repos → `gh search prs --author @me --state open`
|
|
20
|
+
* across all of GitHub (state/draft only; search has no check fields).
|
|
21
|
+
*
|
|
22
|
+
* SAFETY / PRIVACY: only the user's own PR metadata (number, title, branch,
|
|
23
|
+
* state, check/review status) — never diff content or review prose. DISABLED by
|
|
24
|
+
* default; opt in via ~/.lisa/agents.json. Graceful no-op if `gh` is missing or
|
|
25
|
+
* unauthenticated (every fetch failure → empty, never throws into the hub).
|
|
26
|
+
*/
|
|
27
|
+
import { EventEmitter } from "node:events";
|
|
28
|
+
import { execFile } from "node:child_process";
|
|
29
|
+
import { promisify } from "node:util";
|
|
30
|
+
import { registerIntegration } from "../registry.js";
|
|
31
|
+
const pexec = promisify(execFile);
|
|
32
|
+
const POLL_MS_DEFAULT = 90_000;
|
|
33
|
+
const ACTIVE_WINDOW_MS_DEFAULT = 14 * 24 * 60 * 60_000; // 14 days
|
|
34
|
+
const MAX_LISTED = 12;
|
|
35
|
+
const TITLE_MAX = 60;
|
|
36
|
+
const FAIL_CONCLUSIONS = new Set([
|
|
37
|
+
"FAILURE",
|
|
38
|
+
"TIMED_OUT",
|
|
39
|
+
"CANCELLED",
|
|
40
|
+
"ACTION_REQUIRED",
|
|
41
|
+
"STARTUP_FAILURE",
|
|
42
|
+
]);
|
|
43
|
+
const PENDING_STATUSES = new Set([
|
|
44
|
+
"QUEUED",
|
|
45
|
+
"IN_PROGRESS",
|
|
46
|
+
"PENDING",
|
|
47
|
+
"WAITING",
|
|
48
|
+
"REQUESTED",
|
|
49
|
+
]);
|
|
50
|
+
/** Reduce a check rollup to one verdict. Pure. */
|
|
51
|
+
export function classifyChecks(rollup) {
|
|
52
|
+
if (!Array.isArray(rollup) || rollup.length === 0)
|
|
53
|
+
return "none";
|
|
54
|
+
let pending = false;
|
|
55
|
+
for (const c of rollup) {
|
|
56
|
+
const conclusion = (c.conclusion ?? "").toUpperCase();
|
|
57
|
+
const state = (c.state ?? "").toUpperCase();
|
|
58
|
+
const status = (c.status ?? "").toUpperCase();
|
|
59
|
+
if (FAIL_CONCLUSIONS.has(conclusion) || state === "FAILURE" || state === "ERROR") {
|
|
60
|
+
return "failing"; // any failure dominates
|
|
61
|
+
}
|
|
62
|
+
if ((status && status !== "COMPLETED" && PENDING_STATUSES.has(status)) ||
|
|
63
|
+
state === "PENDING") {
|
|
64
|
+
pending = true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return pending ? "pending" : "passing";
|
|
68
|
+
}
|
|
69
|
+
function repoBasename(full) {
|
|
70
|
+
if (!full)
|
|
71
|
+
return "github";
|
|
72
|
+
const parts = full.split("/");
|
|
73
|
+
return parts[parts.length - 1] || full;
|
|
74
|
+
}
|
|
75
|
+
/** Map one PR to the normalized AgentSession. Pure — the unit under test. */
|
|
76
|
+
export function mapPrToSession(pr) {
|
|
77
|
+
const repoFull = pr.repoFullName ?? pr.repository?.nameWithOwner ?? undefined;
|
|
78
|
+
const state = (pr.state ?? "").toUpperCase();
|
|
79
|
+
const title = (pr.title ?? "").trim();
|
|
80
|
+
const shortTitle = title.length > TITLE_MAX ? title.slice(0, TITLE_MAX - 1) + "…" : title;
|
|
81
|
+
const sessionId = `${repoFull ?? "?"}#${pr.number}`;
|
|
82
|
+
const label = `${repoBasename(repoFull)}#${pr.number}${shortTitle ? `: ${shortTitle}` : ""}`;
|
|
83
|
+
const lastMtime = pr.updatedAt ? Date.parse(pr.updatedAt) || 0 : 0;
|
|
84
|
+
let sessionState;
|
|
85
|
+
let reason;
|
|
86
|
+
if (state === "MERGED" || pr.mergedAt) {
|
|
87
|
+
sessionState = "done";
|
|
88
|
+
reason = "merged";
|
|
89
|
+
}
|
|
90
|
+
else if (state === "CLOSED") {
|
|
91
|
+
sessionState = "done";
|
|
92
|
+
reason = "closed";
|
|
93
|
+
}
|
|
94
|
+
else if (pr.isDraft) {
|
|
95
|
+
sessionState = "working";
|
|
96
|
+
reason = "draft";
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const checks = classifyChecks(pr.statusCheckRollup);
|
|
100
|
+
if (checks === "failing") {
|
|
101
|
+
sessionState = "error";
|
|
102
|
+
reason = "checks failing";
|
|
103
|
+
}
|
|
104
|
+
else if (checks === "pending") {
|
|
105
|
+
sessionState = "working";
|
|
106
|
+
reason = "checks running";
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const review = (pr.reviewDecision ?? "").toUpperCase();
|
|
110
|
+
sessionState = "waiting";
|
|
111
|
+
reason =
|
|
112
|
+
review === "CHANGES_REQUESTED"
|
|
113
|
+
? "changes requested"
|
|
114
|
+
: review === "APPROVED"
|
|
115
|
+
? "approved — ready to merge"
|
|
116
|
+
: "awaiting review";
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const session = {
|
|
120
|
+
agent: "github-pr",
|
|
121
|
+
sessionId,
|
|
122
|
+
project: label,
|
|
123
|
+
state: sessionState,
|
|
124
|
+
stateReason: reason,
|
|
125
|
+
lastMtime,
|
|
126
|
+
};
|
|
127
|
+
if (pr.headRefName) {
|
|
128
|
+
session.activity = {
|
|
129
|
+
turnCount: 0,
|
|
130
|
+
lastTools: [],
|
|
131
|
+
filesTouched: [],
|
|
132
|
+
gitBranch: pr.headRefName,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return session;
|
|
136
|
+
}
|
|
137
|
+
/** Run `gh` and return stdout, or null on any failure (missing/unauth/timeout). */
|
|
138
|
+
async function runGh(args) {
|
|
139
|
+
try {
|
|
140
|
+
const { stdout } = await pexec("gh", args, {
|
|
141
|
+
maxBuffer: 8 * 1024 * 1024,
|
|
142
|
+
timeout: 20_000,
|
|
143
|
+
});
|
|
144
|
+
return stdout;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return null; // gh not installed, not authed, rate-limited, etc.
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/** Default fetcher: the user's open PRs, optionally scoped to configured repos. */
|
|
151
|
+
async function ghFetchPrs(cfg) {
|
|
152
|
+
const repos = Array.isArray(cfg.repos)
|
|
153
|
+
? cfg.repos.filter((r) => typeof r === "string")
|
|
154
|
+
: [];
|
|
155
|
+
if (repos.length > 0) {
|
|
156
|
+
const FIELDS = "number,title,state,isDraft,mergedAt,updatedAt,headRefName,reviewDecision,statusCheckRollup";
|
|
157
|
+
const out = [];
|
|
158
|
+
for (const r of repos) {
|
|
159
|
+
const s = await runGh(["pr", "list", "-R", r, "--state", "open", "--limit", "30", "--json", FIELDS]);
|
|
160
|
+
if (!s)
|
|
161
|
+
continue;
|
|
162
|
+
try {
|
|
163
|
+
for (const p of JSON.parse(s)) {
|
|
164
|
+
p.repoFullName = r;
|
|
165
|
+
out.push(p);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
/* skip unparsable repo response */
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return out;
|
|
173
|
+
}
|
|
174
|
+
// Zero-config: open PRs I authored across all of GitHub. Search has no
|
|
175
|
+
// check/review fields, so these map to "awaiting review" / "draft".
|
|
176
|
+
const s = await runGh([
|
|
177
|
+
"search", "prs", "--author", "@me", "--state", "open", "--limit", "30",
|
|
178
|
+
"--json", "number,title,state,isDraft,updatedAt,repository",
|
|
179
|
+
]);
|
|
180
|
+
if (!s)
|
|
181
|
+
return [];
|
|
182
|
+
try {
|
|
183
|
+
return JSON.parse(s);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export class GithubPrObserver extends EventEmitter {
|
|
190
|
+
agent = "github-pr";
|
|
191
|
+
sessions = new Map();
|
|
192
|
+
timer = null;
|
|
193
|
+
emitFn = null;
|
|
194
|
+
fetcher;
|
|
195
|
+
pollMs;
|
|
196
|
+
windowMs;
|
|
197
|
+
now;
|
|
198
|
+
constructor(cfg) {
|
|
199
|
+
super();
|
|
200
|
+
this.fetcher = cfg.fetchPrs ?? (() => ghFetchPrs(cfg));
|
|
201
|
+
this.pollMs = typeof cfg.pollMs === "number" && cfg.pollMs > 0 ? cfg.pollMs : POLL_MS_DEFAULT;
|
|
202
|
+
this.windowMs =
|
|
203
|
+
typeof cfg.activeWindowMs === "number" && cfg.activeWindowMs > 0
|
|
204
|
+
? cfg.activeWindowMs
|
|
205
|
+
: ACTIVE_WINDOW_MS_DEFAULT;
|
|
206
|
+
this.now = cfg.now ?? Date.now;
|
|
207
|
+
}
|
|
208
|
+
async start(emit) {
|
|
209
|
+
this.emitFn = emit;
|
|
210
|
+
await this.poll();
|
|
211
|
+
this.timer = setInterval(() => void this.poll(), this.pollMs);
|
|
212
|
+
this.timer.unref?.(); // never keep the process alive just to poll PRs
|
|
213
|
+
}
|
|
214
|
+
list() {
|
|
215
|
+
const cutoff = this.now() - this.windowMs;
|
|
216
|
+
return [...this.sessions.values()]
|
|
217
|
+
.filter((s) => s.lastMtime >= cutoff)
|
|
218
|
+
.sort((a, b) => b.lastMtime - a.lastMtime)
|
|
219
|
+
.slice(0, MAX_LISTED);
|
|
220
|
+
}
|
|
221
|
+
async stop() {
|
|
222
|
+
if (this.timer)
|
|
223
|
+
clearInterval(this.timer);
|
|
224
|
+
this.timer = null;
|
|
225
|
+
}
|
|
226
|
+
/** One refresh cycle — exposed for deterministic tests. */
|
|
227
|
+
async poll() {
|
|
228
|
+
let prs;
|
|
229
|
+
try {
|
|
230
|
+
prs = await this.fetcher();
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return; // never let a fetch error escape into the hub
|
|
234
|
+
}
|
|
235
|
+
const cutoff = this.now() - this.windowMs;
|
|
236
|
+
const seen = new Set();
|
|
237
|
+
for (const pr of prs) {
|
|
238
|
+
const s = mapPrToSession(pr);
|
|
239
|
+
if (s.lastMtime && s.lastMtime < cutoff)
|
|
240
|
+
continue; // stale PR — ignore
|
|
241
|
+
seen.add(s.sessionId);
|
|
242
|
+
const prev = this.sessions.get(s.sessionId);
|
|
243
|
+
this.sessions.set(s.sessionId, s);
|
|
244
|
+
if (this.emitFn && (!prev || prev.state !== s.state || prev.lastMtime !== s.lastMtime)) {
|
|
245
|
+
this.emitFn(s);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// A PR that dropped out of the open set was merged or closed — emit one
|
|
249
|
+
// final "done" so the advisor can note it, then forget it.
|
|
250
|
+
for (const [id, prev] of [...this.sessions]) {
|
|
251
|
+
if (seen.has(id))
|
|
252
|
+
continue;
|
|
253
|
+
if (this.emitFn && prev.state !== "done") {
|
|
254
|
+
this.emitFn({ ...prev, state: "done", stateReason: "closed/merged", lastMtime: this.now() });
|
|
255
|
+
}
|
|
256
|
+
this.sessions.delete(id);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
registerIntegration("github-pr", (cfg) => new GithubPrObserver(cfg));
|
|
261
|
+
//# sourceMappingURL=observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.js","sourceRoot":"","sources":["../../../src/integrations/github-pr/observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../src/integrations/hub.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EACV,sBAAsB,EAEtB,YAAY,EACZ,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACrD,mEAAmE;IACnE,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;0EAC0E;AAC1E,eAAO,MAAM,2BAA2B,EAAE,
|
|
1
|
+
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../src/integrations/hub.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EACV,sBAAsB,EAEtB,YAAY,EACZ,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACrD,mEAAmE;IACnE,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;0EAC0E;AAC1E,eAAO,MAAM,2BAA2B,EAAE,kBAkBzC,CAAC;AAEF,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAEjC,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;gBAE/B,GAAG,EAAE,kBAAkB,EAAE,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAO;IAUzF,iEAAiE;IAC3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;;OAGG;IACH,IAAI,IAAI,YAAY,EAAE;IAYtB,mCAAmC;IACnC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;CAG3C;AAED,oEAAoE;AACpE,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,kBAAkB,CAAC,CAiB7B"}
|
package/dist/integrations/hub.js
CHANGED
|
@@ -16,6 +16,16 @@ export const DEFAULT_ORCHESTRATOR_CONFIG = {
|
|
|
16
16
|
// Available but off by default — enable in ~/.lisa/agents.json once you
|
|
17
17
|
// use Codex. Graceful no-op if ~/.codex/sessions is absent anyway.
|
|
18
18
|
codex: { enabled: false },
|
|
19
|
+
// Cloud agent: watches your open GitHub PRs (checks / review / merge) via
|
|
20
|
+
// the `gh` CLI. Off by default; opt in, optionally with
|
|
21
|
+
// `{ "enabled": true, "repos": ["owner/repo"] }`. No-op if `gh` is absent.
|
|
22
|
+
"github-pr": { enabled: false },
|
|
23
|
+
// OpenCode: reads its SQLite session DB via the `sqlite3` CLI. Off by
|
|
24
|
+
// default; no-op if sqlite3 or the DB is absent.
|
|
25
|
+
opencode: { enabled: false },
|
|
26
|
+
// Aider has no central store — point it at the dirs you run it in:
|
|
27
|
+
// `{ "enabled": true, "watchRoots": ["~/code/foo"] }`. Off by default.
|
|
28
|
+
aider: { enabled: false },
|
|
19
29
|
},
|
|
20
30
|
visibility: "activity",
|
|
21
31
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub.js","sourceRoot":"","sources":["../../src/integrations/hub.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hub.js","sourceRoot":"","sources":["../../src/integrations/hub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode observer (O3 — local CLI agent, SQLite-backed).
|
|
3
|
+
*
|
|
4
|
+
* Recent OpenCode (≥ ~1.15) stores sessions in a SQLite database at
|
|
5
|
+
* $XDG_DATA_HOME/opencode/opencode.db (≈ ~/.local/share/opencode/opencode.db)
|
|
6
|
+
* — not flat JSONL like Claude Code / Codex. So instead of tailing files this
|
|
7
|
+
* adapter POLLS the DB (read-only) via the system `sqlite3` CLI, which keeps us
|
|
8
|
+
* dependency-free (no sqlite npm package, and `node:sqlite` isn't available on
|
|
9
|
+
* the Node 20/22 we support).
|
|
10
|
+
*
|
|
11
|
+
* State is derived from the `session` row plus its newest `message`:
|
|
12
|
+
* - session.time_archived set → done
|
|
13
|
+
* - session.time_compacting set → working (compacting context)
|
|
14
|
+
* - latest message has `error` → error
|
|
15
|
+
* - latest message role=assistant + time.completed set → waiting (it replied)
|
|
16
|
+
* - latest message role=assistant, not completed → working (mid-turn)
|
|
17
|
+
* - latest message role=user → working (its turn)
|
|
18
|
+
*
|
|
19
|
+
* PRIVACY: only structural fields — session title, directory, token counts,
|
|
20
|
+
* message role/role-timing/error flag. Never message text or tool arguments.
|
|
21
|
+
* DISABLED by default; opt in via ~/.lisa/agents.json. Graceful no-op if
|
|
22
|
+
* `sqlite3` or the DB is absent (every read failure → empty, never throws).
|
|
23
|
+
*/
|
|
24
|
+
import { EventEmitter } from "node:events";
|
|
25
|
+
import type { AgentIntegrationConfig, AgentObserver, AgentSession } from "../types.js";
|
|
26
|
+
/** A row of the adapter's query — session columns + the newest message's data. */
|
|
27
|
+
export interface OpencodeRow {
|
|
28
|
+
id: string;
|
|
29
|
+
directory?: string | null;
|
|
30
|
+
title?: string | null;
|
|
31
|
+
agent?: string | null;
|
|
32
|
+
time_updated?: number | null;
|
|
33
|
+
time_archived?: number | null;
|
|
34
|
+
time_compacting?: number | null;
|
|
35
|
+
tokens_input?: number | null;
|
|
36
|
+
tokens_output?: number | null;
|
|
37
|
+
/** JSON string of the latest message's `data` column, or null. */
|
|
38
|
+
last_msg?: string | null;
|
|
39
|
+
}
|
|
40
|
+
/** Map one query row to the normalized session. Pure — the unit under test. */
|
|
41
|
+
export declare function mapOpencodeSession(row: OpencodeRow): AgentSession;
|
|
42
|
+
interface LastMsg {
|
|
43
|
+
role?: string;
|
|
44
|
+
completed?: boolean;
|
|
45
|
+
error?: boolean;
|
|
46
|
+
errorReason?: string;
|
|
47
|
+
}
|
|
48
|
+
/** Tolerant parse of an OpenCode message `data` JSON blob. */
|
|
49
|
+
export declare function parseLastMessage(raw: string | null | undefined): LastMsg;
|
|
50
|
+
export interface OpencodeObserverOptions extends AgentIntegrationConfig {
|
|
51
|
+
/** Override the row fetcher (tests). */
|
|
52
|
+
fetchRows?: () => Promise<OpencodeRow[]>;
|
|
53
|
+
pollMs?: number;
|
|
54
|
+
activeWindowMs?: number;
|
|
55
|
+
now?: () => number;
|
|
56
|
+
}
|
|
57
|
+
export declare class OpencodeObserver extends EventEmitter implements AgentObserver {
|
|
58
|
+
readonly agent = "opencode";
|
|
59
|
+
private sessions;
|
|
60
|
+
private timer;
|
|
61
|
+
private emitFn;
|
|
62
|
+
private readonly fetcher;
|
|
63
|
+
private readonly pollMs;
|
|
64
|
+
private readonly windowMs;
|
|
65
|
+
private readonly now;
|
|
66
|
+
constructor(cfg: OpencodeObserverOptions);
|
|
67
|
+
start(emit: (s: AgentSession) => void): Promise<void>;
|
|
68
|
+
list(): AgentSession[];
|
|
69
|
+
stop(): Promise<void>;
|
|
70
|
+
/** One refresh cycle — exposed for deterministic tests. */
|
|
71
|
+
poll(): Promise<void>;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/integrations/opencode/observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EACV,sBAAsB,EACtB,aAAa,EACb,YAAY,EAEb,MAAM,aAAa,CAAC;AAQrB,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAWD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CAoDjE;AAED,UAAU,OAAO;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAyBxE;AAyBD,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,gBAAiB,SAAQ,YAAa,YAAW,aAAa;IACzE,QAAQ,CAAC,KAAK,cAAc;IAC5B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,GAAG,EAAE,uBAAuB;IAYlC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3D,IAAI,IAAI,YAAY,EAAE;IAQhB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,2DAA2D;IACrD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}
|