@log0u7/opencode-mesh 0.1.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 (64) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/LICENSE +201 -0
  3. package/README.md +88 -0
  4. package/dist/index.d.ts +15 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +15 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/lib/client.d.ts +10 -0
  9. package/dist/lib/client.d.ts.map +1 -0
  10. package/dist/lib/client.js +26 -0
  11. package/dist/lib/client.js.map +1 -0
  12. package/dist/lib/db.d.ts +7 -0
  13. package/dist/lib/db.d.ts.map +1 -0
  14. package/dist/lib/db.js +55 -0
  15. package/dist/lib/db.js.map +1 -0
  16. package/dist/lib/discovery.d.ts +27 -0
  17. package/dist/lib/discovery.d.ts.map +1 -0
  18. package/dist/lib/discovery.js +63 -0
  19. package/dist/lib/discovery.js.map +1 -0
  20. package/dist/lib/identity.d.ts +15 -0
  21. package/dist/lib/identity.d.ts.map +1 -0
  22. package/dist/lib/identity.js +63 -0
  23. package/dist/lib/identity.js.map +1 -0
  24. package/dist/lib/locks.d.ts +17 -0
  25. package/dist/lib/locks.d.ts.map +1 -0
  26. package/dist/lib/locks.js +39 -0
  27. package/dist/lib/locks.js.map +1 -0
  28. package/dist/lib/mail.d.ts +11 -0
  29. package/dist/lib/mail.d.ts.map +1 -0
  30. package/dist/lib/mail.js +42 -0
  31. package/dist/lib/mail.js.map +1 -0
  32. package/dist/lib/peers.d.ts +31 -0
  33. package/dist/lib/peers.d.ts.map +1 -0
  34. package/dist/lib/peers.js +95 -0
  35. package/dist/lib/peers.js.map +1 -0
  36. package/dist/lib/serve.d.ts +12 -0
  37. package/dist/lib/serve.d.ts.map +1 -0
  38. package/dist/lib/serve.js +165 -0
  39. package/dist/lib/serve.js.map +1 -0
  40. package/dist/lib/spawn.d.ts +33 -0
  41. package/dist/lib/spawn.d.ts.map +1 -0
  42. package/dist/lib/spawn.js +130 -0
  43. package/dist/lib/spawn.js.map +1 -0
  44. package/dist/lib/sqlite.d.ts +9 -0
  45. package/dist/lib/sqlite.d.ts.map +1 -0
  46. package/dist/lib/sqlite.js +63 -0
  47. package/dist/lib/sqlite.js.map +1 -0
  48. package/dist/lib/workers.d.ts +29 -0
  49. package/dist/lib/workers.d.ts.map +1 -0
  50. package/dist/lib/workers.js +74 -0
  51. package/dist/lib/workers.js.map +1 -0
  52. package/dist/lib/worktree.d.ts +30 -0
  53. package/dist/lib/worktree.d.ts.map +1 -0
  54. package/dist/lib/worktree.js +43 -0
  55. package/dist/lib/worktree.js.map +1 -0
  56. package/dist/plugin.d.ts +3 -0
  57. package/dist/plugin.d.ts.map +1 -0
  58. package/dist/plugin.js +310 -0
  59. package/dist/plugin.js.map +1 -0
  60. package/dist/types/peer.d.ts +26 -0
  61. package/dist/types/peer.d.ts.map +1 -0
  62. package/dist/types/peer.js +2 -0
  63. package/dist/types/peer.js.map +1 -0
  64. package/package.json +61 -0
@@ -0,0 +1,130 @@
1
+ import { spawn } from "node:child_process";
2
+ import { appendFileSync, mkdirSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import {} from "./db.js";
5
+ import { setWorkerSession, setWorkerStatus, upsertWorker } from "./workers.js";
6
+ // Real adapter used by the plugin: node child_process wrapped to the minimal
7
+ // SpawnedProcess surface (works under Bun's node compat at runtime).
8
+ export function nodeSpawn(argv) {
9
+ const child = spawn(argv[0] ?? "", argv.slice(1), {
10
+ stdio: ["ignore", "pipe", "pipe"],
11
+ });
12
+ const pid = child.pid ?? -1;
13
+ return {
14
+ pid,
15
+ stdout: {
16
+ on: (event, listener) => {
17
+ child.stdout?.on(event, (chunk) => listener(chunk.toString("utf8")));
18
+ },
19
+ },
20
+ on: (event, listener) => {
21
+ child.on(event, (code) => listener(code));
22
+ },
23
+ kill: (signal) => {
24
+ child.kill((signal ?? "SIGTERM"));
25
+ },
26
+ };
27
+ }
28
+ const LIVE_PROCESSES = new Map();
29
+ // Headless worker: one prompt in an isolated worktree, tracked by pid and log.
30
+ export function runWorker(db, dataDir, input) {
31
+ const argv = buildArgv(input);
32
+ const proc = input.spawnFn(argv);
33
+ mkdirSync(join(dataDir, "workers"), { recursive: true });
34
+ const worker = upsertWorker(db, {
35
+ task: input.task,
36
+ worktree_path: input.worktree_path,
37
+ branch: input.branch,
38
+ pid: proc.pid,
39
+ });
40
+ let sawSessionId = false;
41
+ proc.stdout.on("data", (chunk) => {
42
+ appendFileSync(logPath(dataDir, worker.id), chunk);
43
+ if (!sawSessionId) {
44
+ const sessionId = parseSessionId(chunk);
45
+ if (sessionId) {
46
+ sawSessionId = true;
47
+ setWorkerSession(db, worker.id, sessionId);
48
+ }
49
+ }
50
+ });
51
+ proc.on("exit", (code) => {
52
+ LIVE_PROCESSES.delete(worker.id);
53
+ setWorkerStatus(db, worker.id, code === 0 ? "completed" : "failed", { exit_code: code });
54
+ });
55
+ LIVE_PROCESSES.set(worker.id, proc);
56
+ input.onSpawned?.(worker, proc);
57
+ return worker;
58
+ }
59
+ // Stop a running worker. The default kill sends SIGTERM to the recorded pid;
60
+ // killFn is an injection seam for tests.
61
+ export function stopWorker(db, id, options = {}) {
62
+ const worker = db && liveWorker(id);
63
+ if (!worker) {
64
+ throw new Error(`worker ${id} is not running`);
65
+ }
66
+ const kill = options.killFn ?? defaultKill;
67
+ kill(worker.id, "SIGTERM");
68
+ // Registry is authoritative: remove the process entry even if the OS takes
69
+ // time to reap the process (or a test fake ignores the signal).
70
+ LIVE_PROCESSES.delete(id);
71
+ setWorkerStatus(db, id, "stopped", { exit_code: null });
72
+ return true;
73
+ }
74
+ export function defaultKill(id, signal) {
75
+ const proc = LIVE_PROCESSES.get(id);
76
+ proc?.kill(signal);
77
+ }
78
+ // Terminate every live worker: used by the plugin's dispose so a stopped
79
+ // opencode session never leaves orphan processes behind.
80
+ export function stopAllWorkers(db, options = {}) {
81
+ for (const id of [...LIVE_PROCESSES.keys()]) {
82
+ try {
83
+ stopWorker(db, id, options);
84
+ }
85
+ catch {
86
+ // Worker may have exited between snapshot and stop: nothing to do.
87
+ }
88
+ }
89
+ }
90
+ export function liveWorkerIds() {
91
+ return [...LIVE_PROCESSES.keys()];
92
+ }
93
+ function buildArgv(input) {
94
+ const argv = ["opencode", "run", "--dir", input.worktree_path, "--format", "json"];
95
+ if (input.model !== undefined) {
96
+ argv.push("--model", input.model);
97
+ }
98
+ // Workers must execute, never plan: build is the safe default agent.
99
+ argv.push("--agent", input.agent ?? "build");
100
+ if (input.auto !== false) {
101
+ argv.push("--auto");
102
+ }
103
+ argv.push(input.task);
104
+ return argv;
105
+ }
106
+ function parseSessionId(chunk) {
107
+ for (const line of chunk.split("\n")) {
108
+ const trimmed = line.trim();
109
+ if (trimmed.length === 0 || !trimmed.startsWith("{")) {
110
+ continue;
111
+ }
112
+ try {
113
+ const parsed = JSON.parse(trimmed);
114
+ if (typeof parsed.sessionID === "string" && parsed.sessionID.length > 0) {
115
+ return parsed.sessionID;
116
+ }
117
+ }
118
+ catch {
119
+ // Partial or non-JSON line: try the next one.
120
+ }
121
+ }
122
+ return null;
123
+ }
124
+ function logPath(dataDir, id) {
125
+ return join(dataDir, "workers", `${id}.log`);
126
+ }
127
+ function liveWorker(id) {
128
+ return LIVE_PROCESSES.has(id) ? { id } : null;
129
+ }
130
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/lib/spawn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface SqliteConn {
2
+ all<T = unknown>(sql: string, params?: unknown[]): T[];
3
+ get<T = unknown>(sql: string, params?: unknown[]): T | null;
4
+ run(sql: string, params?: unknown[]): void;
5
+ exec(sql: string): void;
6
+ close(): void;
7
+ }
8
+ export declare function openSqlite(path: string): SqliteConn;
9
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/lib/sqlite.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;IACvD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACf;AAmFD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAiBnD"}
@@ -0,0 +1,63 @@
1
+ function createPreparedConn(db) {
2
+ return {
3
+ all(sql, params) {
4
+ const stmt = db.prepare(sql);
5
+ return stmt.all(...(params ?? []));
6
+ },
7
+ get(sql, params) {
8
+ const stmt = db.prepare(sql);
9
+ return stmt.get(...(params ?? [])) ?? null;
10
+ },
11
+ run(sql, params) {
12
+ const stmt = db.prepare(sql);
13
+ stmt.run(...(params ?? []));
14
+ },
15
+ exec(sql) {
16
+ db.exec(sql);
17
+ },
18
+ close() {
19
+ db.close();
20
+ },
21
+ };
22
+ }
23
+ function createBunConn(db) {
24
+ return {
25
+ all(sql, params) {
26
+ return db.query(sql).all(...(params ?? []));
27
+ },
28
+ get(sql, params) {
29
+ return db.query(sql).get(...(params ?? [])) ?? null;
30
+ },
31
+ run(sql, params) {
32
+ db.run(sql, params ?? []);
33
+ },
34
+ exec(sql) {
35
+ db.run(sql);
36
+ },
37
+ close() {
38
+ db.close();
39
+ },
40
+ };
41
+ }
42
+ let BunSqliteEngine = null;
43
+ try {
44
+ const specifier = "bun:sqlite";
45
+ BunSqliteEngine = (await import(specifier));
46
+ }
47
+ catch {
48
+ BunSqliteEngine = null;
49
+ }
50
+ export function openSqlite(path) {
51
+ const globalRuntime = globalThis;
52
+ if (globalRuntime.Bun?.sqlite?.Database) {
53
+ return createBunConn(new globalRuntime.Bun.sqlite.Database(path));
54
+ }
55
+ if (BunSqliteEngine) {
56
+ return createBunConn(new BunSqliteEngine.Database(path));
57
+ }
58
+ // node:sqlite ships with Node >= 22.5; require keeps non-node runtimes from
59
+ // failing at module load and gives tests a clear error if the engine is absent.
60
+ const { DatabaseSync } = require("node:sqlite");
61
+ return createPreparedConn(new DatabaseSync(path));
62
+ }
63
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/lib/sqlite.ts"],"names":[],"mappings":"AA8BA,SAAS,kBAAkB,CAAC,EAAsB;IAChD,OAAO;QACL,GAAG,CAAc,GAAW,EAAE,MAAkB;YAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAQ,CAAC;QAC5C,CAAC;QACD,GAAG,CAAc,GAAW,EAAE,MAAkB;YAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAmB,IAAI,IAAI,CAAC;QAChE,CAAC;QACD,GAAG,CAAC,GAAW,EAAE,MAAkB;YACjC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,GAAW;YACd,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EAAqB;IAC1C,OAAO;QACL,GAAG,CAAc,GAAW,EAAE,MAAkB;YAC9C,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAQ,CAAC;QACrD,CAAC;QACD,GAAG,CAAc,GAAW,EAAE,MAAkB;YAC9C,OAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAmB,IAAI,IAAI,CAAC;QACzE,CAAC;QACD,GAAG,CAAC,GAAW,EAAE,MAAkB;YACjC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,GAAW;YACd,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;QACD,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAUD,IAAI,eAAe,GAAyB,IAAI,CAAC;AACjD,IAAI,CAAC;IACH,MAAM,SAAS,GAAG,YAAY,CAAC;IAC/B,eAAe,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAkB,CAAC;AAC/D,CAAC;AAAC,MAAM,CAAC;IACP,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,aAAa,GAAG,UAErB,CAAC;IAEF,IAAI,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACxC,OAAO,aAAa,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,aAAa,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,4EAA4E;IAC5E,gFAAgF;IAChF,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,aAAa,CAAsB,CAAC;IACrE,OAAO,kBAAkB,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { MeshDb } from "./db.js";
2
+ export type WorkerStatus = "running" | "completed" | "failed" | "stopped";
3
+ export type Worker = {
4
+ id: string;
5
+ task: string;
6
+ worktree_path: string;
7
+ branch: string;
8
+ pid: number | null;
9
+ session_id: string | null;
10
+ status: WorkerStatus;
11
+ exit_code: number | null;
12
+ started_at: number;
13
+ finished_at: number | null;
14
+ };
15
+ export declare function upsertWorker(db: MeshDb, input: {
16
+ id?: string;
17
+ task: string;
18
+ worktree_path: string;
19
+ branch: string;
20
+ pid: number | null;
21
+ }): Worker;
22
+ export declare function getWorker(db: MeshDb, id: string): Worker | null;
23
+ export declare function listWorkers(db: MeshDb): Worker[];
24
+ export declare function setWorkerSession(db: MeshDb, id: string, sessionId: string): void;
25
+ export declare function setWorkerStatus(db: MeshDb, id: string, status: WorkerStatus, options?: {
26
+ exit_code?: number | null;
27
+ }): void;
28
+ export declare function deleteWorker(db: MeshDb, id: string): boolean;
29
+ //# sourceMappingURL=workers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../src/lib/workers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1E,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAiBF,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC9F,MAAM,CAsBR;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAIhD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAEhF;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC1C,IAAI,CAmBN;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAG5D"}
@@ -0,0 +1,74 @@
1
+ import { randomUUID } from "node:crypto";
2
+ const TERMINAL_STATUSES = new Set(["completed", "failed", "stopped"]);
3
+ export function upsertWorker(db, input) {
4
+ const id = input.id ?? randomUUID();
5
+ const now = Date.now();
6
+ db.conn.run(`INSERT INTO workers (id, task, worktree_path, branch, pid, session_id, status, exit_code, started_at, finished_at)
7
+ VALUES (?, ?, ?, ?, ?, NULL, 'running', NULL, ?, NULL)`, [id, input.task, input.worktree_path, input.branch, input.pid, now]);
8
+ return {
9
+ id,
10
+ task: input.task,
11
+ worktree_path: input.worktree_path,
12
+ branch: input.branch,
13
+ pid: input.pid,
14
+ session_id: null,
15
+ status: "running",
16
+ exit_code: null,
17
+ started_at: now,
18
+ finished_at: null,
19
+ };
20
+ }
21
+ export function getWorker(db, id) {
22
+ const row = db.conn.get("SELECT * FROM workers WHERE id = ?", [id]);
23
+ return row ? rowToWorker(row) : null;
24
+ }
25
+ export function listWorkers(db) {
26
+ return db.conn
27
+ .all("SELECT * FROM workers ORDER BY started_at DESC, rowid DESC")
28
+ .map(rowToWorker);
29
+ }
30
+ export function setWorkerSession(db, id, sessionId) {
31
+ db.conn.run("UPDATE workers SET session_id = ? WHERE id = ?", [sessionId, id]);
32
+ }
33
+ export function setWorkerStatus(db, id, status, options = {}) {
34
+ const existing = getWorker(db, id);
35
+ if (!existing) {
36
+ throw new Error(`unknown worker: ${id}`);
37
+ }
38
+ if (TERMINAL_STATUSES.has(existing.status)) {
39
+ throw new Error(`worker ${id} is in terminal state ${existing.status}; refusing transition to ${status}`);
40
+ }
41
+ const finished = TERMINAL_STATUSES.has(status) ? Date.now() : null;
42
+ const exitCode = "exit_code" in options ? (options.exit_code ?? null) : null;
43
+ db.conn.run("UPDATE workers SET status = ?, exit_code = ?, finished_at = ? WHERE id = ?", [
44
+ status,
45
+ exitCode,
46
+ finished,
47
+ id,
48
+ ]);
49
+ }
50
+ export function deleteWorker(db, id) {
51
+ db.conn.run("DELETE FROM workers WHERE id = ?", [id]);
52
+ return (db.conn.get("SELECT changes() AS changes")?.changes ?? 0) > 0;
53
+ }
54
+ function rowToWorker(row) {
55
+ return {
56
+ id: row.id,
57
+ task: row.task,
58
+ worktree_path: row.worktree_path,
59
+ branch: row.branch,
60
+ pid: row.pid,
61
+ session_id: row.session_id,
62
+ status: statusFromRow(row.status),
63
+ exit_code: row.exit_code,
64
+ started_at: row.started_at,
65
+ finished_at: row.finished_at,
66
+ };
67
+ }
68
+ function statusFromRow(raw) {
69
+ if (raw === "completed" || raw === "failed" || raw === "stopped") {
70
+ return raw;
71
+ }
72
+ return "running";
73
+ }
74
+ //# sourceMappingURL=workers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers.js","sourceRoot":"","sources":["../../src/lib/workers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ type WorktreeInfo = {
2
+ name: string;
3
+ branch?: string;
4
+ directory: string;
5
+ };
6
+ export type WorktreeClient = {
7
+ worktree: {
8
+ create(parameters: {
9
+ worktreeCreateInput?: {
10
+ name?: string;
11
+ };
12
+ }): Promise<unknown>;
13
+ remove(parameters: {
14
+ worktreeRemoveInput: {
15
+ directory: string;
16
+ };
17
+ }): Promise<unknown>;
18
+ };
19
+ };
20
+ export type WorktreeFactory = (baseUrl: string, directory: string, fetchOverride?: typeof fetch) => WorktreeClient;
21
+ export declare const defaultWorktreeFactory: WorktreeFactory;
22
+ export declare function extractClientFetch(pluginClient: unknown): typeof fetch | undefined;
23
+ export declare function createWorkerWorktree(client: WorktreeClient, input: {
24
+ name?: string;
25
+ }): Promise<WorktreeInfo>;
26
+ export declare function removeWorkerWorktree(client: WorktreeClient, input: {
27
+ directory: string;
28
+ }): Promise<boolean>;
29
+ export {};
30
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/lib/worktree.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAIF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE;QACR,MAAM,CAAC,UAAU,EAAE;YAAE,mBAAmB,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAClF,MAAM,CAAC,UAAU,EAAE;YAAE,mBAAmB,EAAE;gBAAE,SAAS,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACtF,CAAC;CACH,CAAC;AAOF,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,OAAO,KAAK,KACzB,cAAc,CAAC;AAEpB,eAAO,MAAM,sBAAsB,EAAE,eAKJ,CAAC;AAMlC,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,KAAK,GAAG,SAAS,CAUlF;AAWD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACvB,OAAO,CAAC,YAAY,CAAC,CAKvB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,OAAO,CAAC,CAKlB"}
@@ -0,0 +1,43 @@
1
+ import { createOpencodeClient } from "@opencode-ai/sdk/v2";
2
+ export const defaultWorktreeFactory = (baseUrl, directory, fetchOverride) => createOpencodeClient({
3
+ baseUrl,
4
+ directory,
5
+ ...(fetchOverride ? { fetch: fetchOverride } : {}),
6
+ });
7
+ // In `opencode run` (in-process server) the plugin's own v1 client carries the
8
+ // custom fetch that routes to the embedded server; reuse it so our v2 client
9
+ // reaches /experimental/worktree without a real TCP listener. The v1 client
10
+ // stores the HeyApi core client as `_client` (TS-protected, reachable at runtime).
11
+ export function extractClientFetch(pluginClient) {
12
+ try {
13
+ const inner = pluginClient
14
+ ._client;
15
+ const config = inner?.getConfig?.();
16
+ const fetchFn = config?.fetch;
17
+ return typeof fetchFn === "function" ? fetchFn : undefined;
18
+ }
19
+ catch {
20
+ return undefined;
21
+ }
22
+ }
23
+ function unwrap(envelope, fallback) {
24
+ const parsed = (envelope ?? {});
25
+ if (parsed.error) {
26
+ const detail = parsed.error.data?.message ?? parsed.error.message ?? fallback;
27
+ throw new Error(`worktree API error: ${detail}`);
28
+ }
29
+ return parsed.data;
30
+ }
31
+ export async function createWorkerWorktree(client, input) {
32
+ const envelope = await client.worktree.create({
33
+ worktreeCreateInput: input.name !== undefined ? { name: input.name } : {},
34
+ });
35
+ return unwrap(envelope, "worktree create failed");
36
+ }
37
+ export async function removeWorkerWorktree(client, input) {
38
+ const envelope = await client.worktree.remove({
39
+ worktreeRemoveInput: { directory: input.directory },
40
+ });
41
+ return unwrap(envelope, "worktree remove failed");
42
+ }
43
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/lib/worktree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AA4B3D,MAAM,CAAC,MAAM,sBAAsB,GAAoB,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,CAC3F,oBAAoB,CAAC;IACnB,OAAO;IACP,SAAS;IACT,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACnD,CAA8B,CAAC;AAElC,+EAA+E;AAC/E,6EAA6E;AAC7E,4EAA4E;AAC5E,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,YAAqB;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,GAAI,YAA6E;aACzF,OAAO,CAAC;QACX,MAAM,MAAM,GAAG,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,CAAC;QAC9B,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAI,QAAiB,EAAE,QAAgB;IACpD,MAAM,MAAM,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAgB,CAAC;IAC/C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC,IAAS,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAsB,EACtB,KAAwB;IAExB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,mBAAmB,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;KAC1E,CAAC,CAAC;IACH,OAAO,MAAM,CAAe,QAAQ,EAAE,wBAAwB,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAsB,EACtB,KAA4B;IAE5B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,mBAAmB,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE;KACpD,CAAC,CAAC;IACH,OAAO,MAAM,CAAU,QAAQ,EAAE,wBAAwB,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from "@opencode-ai/plugin";
2
+ export declare const MeshPlugin: Plugin;
3
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAyCzD,eAAO,MAAM,UAAU,EAAE,MAwTxB,CAAC"}