@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.
Files changed (133) hide show
  1. package/README.md +5 -0
  2. package/dist/autostart/install.d.ts +28 -0
  3. package/dist/autostart/install.d.ts.map +1 -0
  4. package/dist/autostart/install.js +180 -0
  5. package/dist/autostart/install.js.map +1 -0
  6. package/dist/cli.js +49 -1
  7. package/dist/cli.js.map +1 -1
  8. package/dist/heartbeat/install.d.ts.map +1 -1
  9. package/dist/heartbeat/install.js +1 -43
  10. package/dist/heartbeat/install.js.map +1 -1
  11. package/dist/heartbeat/runner.d.ts.map +1 -1
  12. package/dist/heartbeat/runner.js +11 -0
  13. package/dist/heartbeat/runner.js.map +1 -1
  14. package/dist/idle/runner.d.ts +12 -0
  15. package/dist/idle/runner.d.ts.map +1 -1
  16. package/dist/idle/runner.js +33 -2
  17. package/dist/idle/runner.js.map +1 -1
  18. package/dist/integrations/aider/observer.d.ts +48 -0
  19. package/dist/integrations/aider/observer.d.ts.map +1 -0
  20. package/dist/integrations/aider/observer.js +196 -0
  21. package/dist/integrations/aider/observer.js.map +1 -0
  22. package/dist/integrations/comparisons.d.ts +23 -0
  23. package/dist/integrations/comparisons.d.ts.map +1 -0
  24. package/dist/integrations/comparisons.js +47 -0
  25. package/dist/integrations/comparisons.js.map +1 -0
  26. package/dist/integrations/dispatch-ledger.d.ts +51 -0
  27. package/dist/integrations/dispatch-ledger.d.ts.map +1 -0
  28. package/dist/integrations/dispatch-ledger.js +106 -0
  29. package/dist/integrations/dispatch-ledger.js.map +1 -0
  30. package/dist/integrations/github-pr/observer.d.ts +85 -0
  31. package/dist/integrations/github-pr/observer.d.ts.map +1 -0
  32. package/dist/integrations/github-pr/observer.js +261 -0
  33. package/dist/integrations/github-pr/observer.js.map +1 -0
  34. package/dist/integrations/hub.d.ts.map +1 -1
  35. package/dist/integrations/hub.js +10 -0
  36. package/dist/integrations/hub.js.map +1 -1
  37. package/dist/integrations/opencode/observer.d.ts +74 -0
  38. package/dist/integrations/opencode/observer.d.ts.map +1 -0
  39. package/dist/integrations/opencode/observer.js +207 -0
  40. package/dist/integrations/opencode/observer.js.map +1 -0
  41. package/dist/integrations/registry.d.ts.map +1 -1
  42. package/dist/integrations/registry.js +3 -1
  43. package/dist/integrations/registry.js.map +1 -1
  44. package/dist/integrations/scheduled-dispatch.d.ts +42 -0
  45. package/dist/integrations/scheduled-dispatch.d.ts.map +1 -0
  46. package/dist/integrations/scheduled-dispatch.js +140 -0
  47. package/dist/integrations/scheduled-dispatch.js.map +1 -0
  48. package/dist/launchd.d.ts +18 -0
  49. package/dist/launchd.d.ts.map +1 -0
  50. package/dist/launchd.js +60 -0
  51. package/dist/launchd.js.map +1 -0
  52. package/dist/orchestrator/journal.d.ts +46 -0
  53. package/dist/orchestrator/journal.d.ts.map +1 -0
  54. package/dist/orchestrator/journal.js +82 -0
  55. package/dist/orchestrator/journal.js.map +1 -0
  56. package/dist/orchestrator/recap.d.ts +38 -0
  57. package/dist/orchestrator/recap.d.ts.map +1 -0
  58. package/dist/orchestrator/recap.js +134 -0
  59. package/dist/orchestrator/recap.js.map +1 -0
  60. package/dist/screen_advisor/engine.d.ts +79 -0
  61. package/dist/screen_advisor/engine.d.ts.map +1 -0
  62. package/dist/screen_advisor/engine.js +128 -0
  63. package/dist/screen_advisor/engine.js.map +1 -0
  64. package/dist/soul/birth.d.ts.map +1 -1
  65. package/dist/soul/birth.js +8 -0
  66. package/dist/soul/birth.js.map +1 -1
  67. package/dist/soul/lock.d.ts +7 -4
  68. package/dist/soul/lock.d.ts.map +1 -1
  69. package/dist/soul/lock.js +33 -9
  70. package/dist/soul/lock.js.map +1 -1
  71. package/dist/tools/agent_recap.d.ts +21 -0
  72. package/dist/tools/agent_recap.d.ts.map +1 -0
  73. package/dist/tools/agent_recap.js +43 -0
  74. package/dist/tools/agent_recap.js.map +1 -0
  75. package/dist/tools/compare_agents.d.ts +16 -0
  76. package/dist/tools/compare_agents.d.ts.map +1 -0
  77. package/dist/tools/compare_agents.js +145 -0
  78. package/dist/tools/compare_agents.js.map +1 -0
  79. package/dist/tools/dispatch_agent.d.ts +13 -0
  80. package/dist/tools/dispatch_agent.d.ts.map +1 -1
  81. package/dist/tools/dispatch_agent.js +49 -37
  82. package/dist/tools/dispatch_agent.js.map +1 -1
  83. package/dist/tools/exec-util.d.ts +18 -0
  84. package/dist/tools/exec-util.d.ts.map +1 -0
  85. package/dist/tools/exec-util.js +72 -0
  86. package/dist/tools/exec-util.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/pr_status.d.ts +31 -0
  96. package/dist/tools/pr_status.d.ts.map +1 -0
  97. package/dist/tools/pr_status.js +90 -0
  98. package/dist/tools/pr_status.js.map +1 -0
  99. package/dist/tools/registry.d.ts.map +1 -1
  100. package/dist/tools/registry.js +26 -0
  101. package/dist/tools/registry.js.map +1 -1
  102. package/dist/tools/repo_digest.d.ts +33 -0
  103. package/dist/tools/repo_digest.d.ts.map +1 -0
  104. package/dist/tools/repo_digest.js +113 -0
  105. package/dist/tools/repo_digest.js.map +1 -0
  106. package/dist/tools/review_diff.d.ts +28 -0
  107. package/dist/tools/review_diff.d.ts.map +1 -0
  108. package/dist/tools/review_diff.js +68 -0
  109. package/dist/tools/review_diff.js.map +1 -0
  110. package/dist/tools/run_checks.d.ts +15 -0
  111. package/dist/tools/run_checks.d.ts.map +1 -0
  112. package/dist/tools/run_checks.js +117 -0
  113. package/dist/tools/run_checks.js.map +1 -0
  114. package/dist/tools/scheduled_dispatch.d.ts +27 -0
  115. package/dist/tools/scheduled_dispatch.d.ts.map +1 -0
  116. package/dist/tools/scheduled_dispatch.js +57 -0
  117. package/dist/tools/scheduled_dispatch.js.map +1 -0
  118. package/dist/tools/signal_agent.d.ts +36 -0
  119. package/dist/tools/signal_agent.d.ts.map +1 -0
  120. package/dist/tools/signal_agent.js +140 -0
  121. package/dist/tools/signal_agent.js.map +1 -0
  122. package/dist/web/island.d.ts +1 -1
  123. package/dist/web/island.d.ts.map +1 -1
  124. package/dist/web/island.js +139 -27
  125. package/dist/web/island.js.map +1 -1
  126. package/dist/web/lisa-html.d.ts +1 -1
  127. package/dist/web/lisa-html.d.ts.map +1 -1
  128. package/dist/web/lisa-html.js +132 -4
  129. package/dist/web/lisa-html.js.map +1 -1
  130. package/dist/web/server.d.ts.map +1 -1
  131. package/dist/web/server.js +190 -0
  132. package/dist/web/server.js.map +1 -1
  133. 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,kBAQzC,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"}
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"}
@@ -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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAe7E;0EAC0E;AAC1E,MAAM,CAAC,MAAM,2BAA2B,GAAuB;IAC7D,YAAY,EAAE;QACZ,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAChC,wEAAwE;QACxE,mEAAmE;QACnE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;KAC1B;IACD,UAAU,EAAE,UAAU;CACvB,CAAC;AAIF,MAAM,OAAO,eAAgB,SAAQ,YAAY;IACvC,SAAS,GAAoB,EAAE,CAAC;IACvB,GAAG,CAAqB;IACxB,GAAG,CAAM;IAClB,OAAO,GAAG,KAAK,CAAC;IAEP,gBAAgB,CAAU;IAE3C,YAAY,GAAuB,EAAE,OAAkD,EAAE;QACvF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClC,0EAA0E;QAC1E,wDAAwD;QACxD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,gBAAgB;YAAE,MAAM,2BAA2B,EAAE,CAAC;QAE/D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAClE,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK;gBAAE,SAAS;YACtC,yDAAyD;YACzD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAClE,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,+BAA+B,IAAI,yBAAyB,UAAU,GAAG,CAAC,CAAC;YACtF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,2DAA2D;gBAC3D,IAAI,CAAC,GAAG,CAAC,+BAA+B,IAAI,aAAc,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,MAAM,GAAG,GAAmB,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,mCAAmC;IACnC,WAAW,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACtD,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY;IAEZ,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,2BAA2B,CAAC;IACrC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgC,CAAC;QAC9D,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,2BAA2B,CAAC,YAAY;YAC7E,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,2BAA2B,CAAC,UAAU;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,2BAA2B,CAAC;IACrC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"hub.js","sourceRoot":"","sources":["../../src/integrations/hub.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAe7E;0EAC0E;AAC1E,MAAM,CAAC,MAAM,2BAA2B,GAAuB;IAC7D,YAAY,EAAE;QACZ,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAChC,wEAAwE;QACxE,mEAAmE;QACnE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QACzB,0EAA0E;QAC1E,wDAAwD;QACxD,2EAA2E;QAC3E,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC/B,sEAAsE;QACtE,iDAAiD;QACjD,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC5B,mEAAmE;QACnE,uEAAuE;QACvE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;KAC1B;IACD,UAAU,EAAE,UAAU;CACvB,CAAC;AAIF,MAAM,OAAO,eAAgB,SAAQ,YAAY;IACvC,SAAS,GAAoB,EAAE,CAAC;IACvB,GAAG,CAAqB;IACxB,GAAG,CAAM;IAClB,OAAO,GAAG,KAAK,CAAC;IAEP,gBAAgB,CAAU;IAE3C,YAAY,GAAuB,EAAE,OAAkD,EAAE;QACvF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClC,0EAA0E;QAC1E,wDAAwD;QACxD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,gBAAgB;YAAE,MAAM,2BAA2B,EAAE,CAAC;QAE/D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAClE,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK;gBAAE,SAAS;YACtC,yDAAyD;YACzD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAClE,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,+BAA+B,IAAI,yBAAyB,UAAU,GAAG,CAAC,CAAC;YACtF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,2DAA2D;gBAC3D,IAAI,CAAC,GAAG,CAAC,+BAA+B,IAAI,aAAc,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,MAAM,GAAG,GAAmB,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,mCAAmC;IACnC,WAAW,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACtD,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY;IAEZ,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,2BAA2B,CAAC;IACrC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgC,CAAC;QAC9D,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,2BAA2B,CAAC,YAAY;YAC7E,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,2BAA2B,CAAC,UAAU;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,2BAA2B,CAAC;IACrC,CAAC;AACH,CAAC"}
@@ -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"}