@polderlabs/bizar-omp 0.4.7 → 0.4.9

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 (69) hide show
  1. package/README.md +52 -3
  2. package/dist/cli/agents-ink.d.ts.map +1 -1
  3. package/dist/cli/agents-ink.js +73 -37
  4. package/dist/cli/agents-ink.js.map +1 -1
  5. package/dist/cli/agents.d.ts.map +1 -1
  6. package/dist/cli/agents.js +15 -13
  7. package/dist/cli/agents.js.map +1 -1
  8. package/dist/cli/directory-selector.d.ts.map +1 -1
  9. package/dist/cli/directory-selector.js +3 -1
  10. package/dist/cli/directory-selector.js.map +1 -1
  11. package/dist/cli/doctor.d.ts +6 -0
  12. package/dist/cli/doctor.d.ts.map +1 -1
  13. package/dist/cli/doctor.js +17 -1
  14. package/dist/cli/doctor.js.map +1 -1
  15. package/dist/cli/main.js +0 -0
  16. package/dist/cli/omb-daemon.d.ts +2 -0
  17. package/dist/cli/omb-daemon.d.ts.map +1 -0
  18. package/dist/cli/omb-daemon.js +113 -0
  19. package/dist/cli/omb-daemon.js.map +1 -0
  20. package/dist/cli/omb-dashboard.d.ts +12 -0
  21. package/dist/cli/omb-dashboard.d.ts.map +1 -0
  22. package/dist/cli/omb-dashboard.js +103 -0
  23. package/dist/cli/omb-dashboard.js.map +1 -0
  24. package/dist/cli/omb.js +8 -0
  25. package/dist/cli/omb.js.map +1 -1
  26. package/dist/cli/omp-theme.d.ts +2 -2
  27. package/dist/cli/omp-theme.d.ts.map +1 -1
  28. package/dist/cli/omp-theme.js +4 -2
  29. package/dist/cli/omp-theme.js.map +1 -1
  30. package/dist/cli/process.d.ts.map +1 -1
  31. package/dist/cli/process.js +5 -1
  32. package/dist/cli/process.js.map +1 -1
  33. package/dist/cli/setup-ui.js +1 -1
  34. package/dist/cli/setup-ui.js.map +1 -1
  35. package/dist/extension.d.ts.map +1 -1
  36. package/dist/extension.js +51 -0
  37. package/dist/extension.js.map +1 -1
  38. package/dist/omp/daemon-service.d.ts +24 -0
  39. package/dist/omp/daemon-service.d.ts.map +1 -0
  40. package/dist/omp/daemon-service.js +272 -0
  41. package/dist/omp/daemon-service.js.map +1 -0
  42. package/dist/omp/daemon.d.ts +48 -0
  43. package/dist/omp/daemon.d.ts.map +1 -0
  44. package/dist/omp/daemon.js +193 -0
  45. package/dist/omp/daemon.js.map +1 -0
  46. package/dist/omp/dashboard-html.d.ts +9 -0
  47. package/dist/omp/dashboard-html.d.ts.map +1 -0
  48. package/dist/omp/dashboard-html.js +594 -0
  49. package/dist/omp/dashboard-html.js.map +1 -0
  50. package/dist/omp/model-role-assignment.d.ts +3 -0
  51. package/dist/omp/model-role-assignment.d.ts.map +1 -1
  52. package/dist/omp/model-role-assignment.js +28 -6
  53. package/dist/omp/model-role-assignment.js.map +1 -1
  54. package/dist/omp/omb-sessions.d.ts +47 -2
  55. package/dist/omp/omb-sessions.d.ts.map +1 -1
  56. package/dist/omp/omb-sessions.js +236 -108
  57. package/dist/omp/omb-sessions.js.map +1 -1
  58. package/dist/omp/session-activity.d.ts +71 -0
  59. package/dist/omp/session-activity.d.ts.map +1 -0
  60. package/dist/omp/session-activity.js +361 -0
  61. package/dist/omp/session-activity.js.map +1 -0
  62. package/dist/omp/tmux.d.ts +24 -0
  63. package/dist/omp/tmux.d.ts.map +1 -1
  64. package/dist/omp/tmux.js +168 -49
  65. package/dist/omp/tmux.js.map +1 -1
  66. package/docs/compatibility/baseline.json +1 -1
  67. package/docs/releases/0.4.8.md +5 -0
  68. package/docs/releases/0.4.9.md +6 -0
  69. package/package.json +1 -1
@@ -0,0 +1,193 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, openSync, closeSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ export const DEFAULT_DAEMON_PORT = 46740;
6
+ export function daemonStateDir(env = process.env) {
7
+ const base = env.XDG_STATE_HOME || join(env.HOME || homedir(), ".local", "state");
8
+ return join(base, "bizar-omp", "daemon");
9
+ }
10
+ export function daemonLockPath(env = process.env) {
11
+ return join(daemonStateDir(env), "daemon.json");
12
+ }
13
+ export function daemonLogPath(env = process.env) {
14
+ return join(daemonStateDir(env), "daemon.log");
15
+ }
16
+ export function daemonSnapshotPath(env = process.env) {
17
+ return join(daemonStateDir(env), "snapshot.json");
18
+ }
19
+ /** Validate a lock payload; anything malformed reads as no daemon. */
20
+ function parseLock(raw) {
21
+ try {
22
+ const value = JSON.parse(raw);
23
+ const pid = Number(value.pid);
24
+ const port = Number(value.port);
25
+ const token = typeof value.token === "string" ? value.token : "";
26
+ const startedAt = Number(value.startedAt);
27
+ const exe = typeof value.exe === "string" ? value.exe : "";
28
+ if (!Number.isInteger(pid) || pid <= 0)
29
+ return undefined;
30
+ if (!Number.isInteger(port) || port <= 0 || port > 65535)
31
+ return undefined;
32
+ if (!token)
33
+ return undefined;
34
+ if (!Number.isFinite(startedAt))
35
+ return undefined;
36
+ if (!exe)
37
+ return undefined;
38
+ return { pid, port, token, startedAt, exe };
39
+ }
40
+ catch {
41
+ return undefined;
42
+ }
43
+ }
44
+ function processAlive(pid) {
45
+ try {
46
+ // Signal 0 probes liveness without delivering anything. A zombie child
47
+ // still answers, so ownership is verified separately via /proc cmdline.
48
+ process.kill(pid, 0);
49
+ return true;
50
+ }
51
+ catch (error) {
52
+ return error.code === "EPERM";
53
+ }
54
+ }
55
+ function processCommand(pid) {
56
+ try {
57
+ return readFileSync(join("/proc", String(pid), "cmdline"), "utf8").replace(/\0/g, " ").trim();
58
+ }
59
+ catch {
60
+ return undefined;
61
+ }
62
+ }
63
+ function processMatchesDaemon(info) {
64
+ const cmdline = processCommand(info.pid);
65
+ if (cmdline === undefined)
66
+ return false;
67
+ // The daemon runs as `node <dist>/cli/omb.js daemon run`; accept either the
68
+ // recorded entry script or the recognizable argv so intermediate launcher
69
+ // renames do not false-positive as a foreign process.
70
+ return cmdline.includes("omb.js daemon run") || cmdline.includes(info.exe);
71
+ }
72
+ /** Read the daemon lock and classify it as running or stale. */
73
+ export function readDaemonStatus(env = process.env) {
74
+ const path = daemonLockPath(env);
75
+ if (!existsSync(path))
76
+ return { state: "stopped" };
77
+ const info = parseLock(readFileSync(path, "utf8"));
78
+ // An unreadable lock reads as stopped; the file stays so a concurrent
79
+ // writer is not clobbered mid-start.
80
+ if (!info)
81
+ return { state: "stopped" };
82
+ if (!processAlive(info.pid)) {
83
+ rmSync(path, { force: true });
84
+ return { state: "stale", daemon: info, staleReason: "process-exited" };
85
+ }
86
+ if (!processMatchesDaemon(info)) {
87
+ // The recorded daemon is gone and the PID was reused by a foreign
88
+ // process. Drop our lock; never signal a process we do not own.
89
+ rmSync(path, { force: true });
90
+ return { state: "stale", daemon: info, staleReason: "process-mismatch" };
91
+ }
92
+ return { state: "running", daemon: info };
93
+ }
94
+ /** Write the daemon cache snapshot; kept small because it is a cache only. */
95
+ export function writeSnapshot(env, snapshot) {
96
+ mkdirSync(daemonStateDir(env), { recursive: true, mode: 0o700 });
97
+ writeFileSync(daemonSnapshotPath(env), `${JSON.stringify(snapshot, null, 2)}\n`, { mode: 0o600 });
98
+ }
99
+ /** Record a running daemon so other processes can discover and verify it. */
100
+ export function writeDaemonLock(env, info) {
101
+ mkdirSync(daemonStateDir(env), { recursive: true, mode: 0o700 });
102
+ writeFileSync(daemonLockPath(env), `${JSON.stringify(info, null, 2)}\n`, { mode: 0o600 });
103
+ }
104
+ export function clearDaemonLock(env = process.env) {
105
+ rmSync(daemonLockPath(env), { force: true });
106
+ }
107
+ export function readSnapshot(env = process.env) {
108
+ try {
109
+ const value = JSON.parse(readFileSync(daemonSnapshotPath(env), "utf8"));
110
+ return Array.isArray(value.sessions) ? value : undefined;
111
+ }
112
+ catch {
113
+ return undefined;
114
+ }
115
+ }
116
+ /** Minimal deferred: avoids depending on a lib target that may not include ES2024. */
117
+ export function deferred() {
118
+ let resolve;
119
+ let reject;
120
+ const promise = new Promise((res, rej) => { resolve = res; reject = rej; });
121
+ return { promise, resolve, reject };
122
+ }
123
+ export class DaemonError extends Error {
124
+ }
125
+ function delay(ms) {
126
+ const { promise, resolve } = deferred();
127
+ setTimeout(() => resolve(), ms);
128
+ return promise;
129
+ }
130
+ /**
131
+ * Spawn the detached daemon child (`omb daemon run`) and wait until it
132
+ * reports a live lock. Returns the recorded daemon info.
133
+ */
134
+ export async function startDaemon(env = process.env) {
135
+ const existing = readDaemonStatus(env);
136
+ if (existing.state === "running" && existing.daemon) {
137
+ throw new DaemonError(`daemon already running (pid ${existing.daemon.pid}, port ${existing.daemon.port})`);
138
+ }
139
+ mkdirSync(daemonStateDir(env), { recursive: true, mode: 0o700 });
140
+ const entry = process.argv[1];
141
+ if (!entry)
142
+ throw new DaemonError("cannot determine omb entry script for daemon launch");
143
+ const log = openSync(daemonLogPath(env), "a");
144
+ const child = spawn(process.execPath, [entry, "daemon", "run"], {
145
+ cwd: env.HOME || homedir(),
146
+ env,
147
+ detached: true,
148
+ stdio: ["ignore", log, log],
149
+ });
150
+ closeSync(log);
151
+ child.unref();
152
+ const deadline = Date.now() + 10_000;
153
+ while (Date.now() < deadline) {
154
+ const status = readDaemonStatus(env);
155
+ if (status.state === "running" && status.daemon)
156
+ return status.daemon;
157
+ await delay(100);
158
+ }
159
+ throw new DaemonError(`daemon did not become ready; see ${daemonLogPath(env)}`);
160
+ }
161
+ /** Ask the running daemon to exit, then wait for the lock to disappear. */
162
+ export async function stopDaemon(env = process.env) {
163
+ const status = readDaemonStatus(env);
164
+ if (status.state !== "running" || !status.daemon)
165
+ return "not-running";
166
+ const { pid, port, token } = status.daemon;
167
+ try {
168
+ const response = await fetch(`http://127.0.0.1:${port}/stop`, {
169
+ method: "POST",
170
+ headers: { authorization: `Bearer ${token}` },
171
+ signal: AbortSignal.timeout(2_000),
172
+ });
173
+ if (response.status !== 200)
174
+ throw new Error(`status ${response.status}`);
175
+ }
176
+ catch {
177
+ // The listener may already be gone; fall through to lock wait.
178
+ }
179
+ const deadline = Date.now() + 5_000;
180
+ while (Date.now() < deadline) {
181
+ if (readDaemonStatus(env).state === "stopped")
182
+ return "stopped";
183
+ await delay(50);
184
+ }
185
+ // Last resort: the daemon owns nothing but its own process.
186
+ try {
187
+ process.kill(pid, "SIGTERM");
188
+ }
189
+ catch { /* already gone */ }
190
+ rmSync(daemonLockPath(env), { force: true });
191
+ return "stopped";
192
+ }
193
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/omp/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The dashboard ships as one self-contained document: no fonts, scripts, or
3
+ * styles are fetched from the network, so the page works on an air-gapped
4
+ * machine. Theme tokens exist for light and dark; the page follows
5
+ * `prefers-color-scheme` until the operator picks a theme explicitly.
6
+ */
7
+ export declare const DASHBOARD_PATH = "/dash";
8
+ export declare function dashboardPageHtml(): string;
9
+ //# sourceMappingURL=dashboard-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-html.d.ts","sourceRoot":"","sources":["../../src/omp/dashboard-html.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,wBAAgB,iBAAiB,IAAI,MAAM,CAykB1C"}