@polderlabs/bizar-omp 0.4.8 → 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 (64) 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 +54 -18
  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/process.d.ts.map +1 -1
  27. package/dist/cli/process.js +5 -1
  28. package/dist/cli/process.js.map +1 -1
  29. package/dist/cli/setup-ui.js +1 -1
  30. package/dist/cli/setup-ui.js.map +1 -1
  31. package/dist/extension.d.ts.map +1 -1
  32. package/dist/extension.js +51 -0
  33. package/dist/extension.js.map +1 -1
  34. package/dist/omp/daemon-service.d.ts +24 -0
  35. package/dist/omp/daemon-service.d.ts.map +1 -0
  36. package/dist/omp/daemon-service.js +272 -0
  37. package/dist/omp/daemon-service.js.map +1 -0
  38. package/dist/omp/daemon.d.ts +48 -0
  39. package/dist/omp/daemon.d.ts.map +1 -0
  40. package/dist/omp/daemon.js +193 -0
  41. package/dist/omp/daemon.js.map +1 -0
  42. package/dist/omp/dashboard-html.d.ts +9 -0
  43. package/dist/omp/dashboard-html.d.ts.map +1 -0
  44. package/dist/omp/dashboard-html.js +594 -0
  45. package/dist/omp/dashboard-html.js.map +1 -0
  46. package/dist/omp/model-role-assignment.d.ts +3 -0
  47. package/dist/omp/model-role-assignment.d.ts.map +1 -1
  48. package/dist/omp/model-role-assignment.js +28 -6
  49. package/dist/omp/model-role-assignment.js.map +1 -1
  50. package/dist/omp/omb-sessions.d.ts +47 -2
  51. package/dist/omp/omb-sessions.d.ts.map +1 -1
  52. package/dist/omp/omb-sessions.js +236 -108
  53. package/dist/omp/omb-sessions.js.map +1 -1
  54. package/dist/omp/session-activity.d.ts +71 -0
  55. package/dist/omp/session-activity.d.ts.map +1 -0
  56. package/dist/omp/session-activity.js +361 -0
  57. package/dist/omp/session-activity.js.map +1 -0
  58. package/dist/omp/tmux.d.ts +24 -0
  59. package/dist/omp/tmux.d.ts.map +1 -1
  60. package/dist/omp/tmux.js +168 -49
  61. package/dist/omp/tmux.js.map +1 -1
  62. package/docs/compatibility/baseline.json +1 -1
  63. package/docs/releases/0.4.9.md +6 -0
  64. package/package.json +1 -1
@@ -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"}
@@ -0,0 +1,594 @@
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 const DASHBOARD_PATH = "/dash";
8
+ export function dashboardPageHtml() {
9
+ return `<!doctype html>
10
+ <html lang="en" data-theme="dark">
11
+ <head>
12
+ <meta charset="utf-8" />
13
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
14
+ <meta name="color-scheme" content="dark light" />
15
+ <meta name="robots" content="noindex" />
16
+ <title>Bizar OMB Dashboard</title>
17
+ <style>
18
+ :root {
19
+ --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
20
+ --radius: 14px;
21
+ }
22
+ html[data-theme="dark"] {
23
+ --bg: #07080a;
24
+ --bg-glow: radial-gradient(1200px 600px at 78% -12%, rgba(255, 46, 166, 0.16), transparent 60%),
25
+ radial-gradient(900px 500px at 8% 0%, rgba(0, 180, 255, 0.10), transparent 55%);
26
+ --panel: #0f1116;
27
+ --panel-2: #14171d;
28
+ --panel-invert: #f4f5f7;
29
+ --text-invert: #0b0c10;
30
+ --line: #232833;
31
+ --text: #e7e9ee;
32
+ --muted: #8b93a3;
33
+ --accent: #ff2ea6;
34
+ --accent-2: #00b4ff;
35
+ --ok: #5fd68a;
36
+ --warn: #ffb347;
37
+ --err: #ff5f6d;
38
+ --shadow: none;
39
+ }
40
+ html[data-theme="light"] {
41
+ --bg: #efedE7;
42
+ --bg-glow: linear-gradient(180deg, rgba(255, 255, 255, 0.75), transparent 320px);
43
+ --panel: #fbfaf7;
44
+ --panel-2: #f3f0ea;
45
+ --panel-invert: #111214;
46
+ --text-invert: #f6f6f4;
47
+ --line: #ddd8ce;
48
+ --text: #14161a;
49
+ --muted: #6b6f7a;
50
+ --accent: #cf0d77;
51
+ --accent-2: #0a6ed1;
52
+ --ok: #1f9d55;
53
+ --warn: #a86400;
54
+ --err: #c81e2b;
55
+ --shadow: 0 1px 2px rgba(20, 22, 26, 0.05);
56
+ }
57
+ * { box-sizing: border-box; }
58
+ body {
59
+ margin: 0;
60
+ min-height: 100vh;
61
+ background: var(--bg);
62
+ background-image: var(--bg-glow);
63
+ background-attachment: fixed;
64
+ color: var(--text);
65
+ font-family: var(--mono);
66
+ font-size: 14px;
67
+ line-height: 1.45;
68
+ -webkit-font-smoothing: antialiased;
69
+ }
70
+ a { color: var(--accent-2); }
71
+ .bar {
72
+ display: flex; align-items: center; justify-content: space-between; gap: 16px;
73
+ padding: 18px 28px; border-bottom: 1px solid var(--line);
74
+ position: sticky; top: 0; z-index: 5;
75
+ background: color-mix(in srgb, var(--bg) 88%, transparent);
76
+ backdrop-filter: blur(10px);
77
+ }
78
+ .brand { display: flex; align-items: center; gap: 10px; letter-spacing: 0.14em; font-size: 12px; }
79
+ .brand-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 12px var(--accent); }
80
+ .brand-name { font-weight: 700; }
81
+ .brand-sub { color: var(--muted); }
82
+ .bar-right { display: flex; align-items: center; gap: 10px; }
83
+ .chip {
84
+ display: inline-flex; align-items: center; gap: 7px;
85
+ border: 1px solid var(--line); border-radius: 999px;
86
+ padding: 5px 12px; font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase;
87
+ color: var(--muted); background: var(--panel);
88
+ }
89
+ .chip .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--muted); }
90
+ .chip.live { color: var(--text); }
91
+ .chip.live .dot { background: var(--ok); box-shadow: 0 0 10px var(--ok); }
92
+ .chip.down .dot { background: var(--err); box-shadow: 0 0 10px var(--err); }
93
+ .chip.button { cursor: pointer; font-family: var(--mono); color: var(--text); }
94
+ .chip.button:hover { border-color: var(--accent); color: var(--accent); }
95
+ main { max-width: 1240px; margin: 0 auto; padding: 26px 28px 64px; }
96
+ .muted { color: var(--muted); }
97
+ .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(168px, 1fr)); gap: 14px; margin-bottom: 22px; }
98
+ .card {
99
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
100
+ padding: 16px 18px; box-shadow: var(--shadow);
101
+ }
102
+ .card.invert { background: var(--panel-invert); border-color: var(--panel-invert); color: var(--text-invert); }
103
+ .card.invert .label { color: color-mix(in srgb, var(--text-invert) 62%, transparent); }
104
+ .label { font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--muted); }
105
+ .value { font-size: 40px; font-weight: 700; letter-spacing: 0.01em; font-variant-numeric: tabular-nums; line-height: 1.1; margin-top: 8px; }
106
+ .sub { font-size: 11px; color: var(--muted); margin-top: 6px; }
107
+ .toolbar { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin-bottom: 18px; }
108
+ .filters { display: flex; gap: 8px; flex-wrap: wrap; }
109
+ .filter {
110
+ border: 1px solid var(--line); background: var(--panel); color: var(--muted);
111
+ border-radius: 999px; padding: 6px 13px; font-family: var(--mono); font-size: 10px;
112
+ letter-spacing: 0.12em; text-transform: uppercase; cursor: pointer;
113
+ }
114
+ .filter[aria-pressed="true"] { color: var(--text); border-color: var(--accent); }
115
+ .toolbar-right { display: flex; align-items: center; gap: 14px; }
116
+ .btn {
117
+ border: 1px solid var(--line); background: var(--panel); color: var(--text);
118
+ border-radius: 10px; padding: 7px 12px; font-family: var(--mono); font-size: 10px;
119
+ letter-spacing: 0.12em; text-transform: uppercase; cursor: pointer;
120
+ }
121
+ .btn:hover { border-color: var(--accent); }
122
+ .btn.primary { border-color: var(--accent); color: var(--accent); }
123
+ .btn.danger { border-color: var(--err); color: var(--err); }
124
+ .btn:disabled { opacity: 0.45; cursor: not-allowed; }
125
+ .notice {
126
+ border: 1px solid var(--err); border-radius: 10px; padding: 11px 14px; margin-bottom: 16px;
127
+ color: var(--err); background: color-mix(in srgb, var(--err) 8%, transparent); font-size: 12px;
128
+ }
129
+ .hidden { display: none !important; }
130
+ .workspace { margin-bottom: 22px; }
131
+ .workspace-head {
132
+ display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
133
+ padding: 0 4px 9px; border-bottom: 1px solid var(--line); margin-bottom: 10px;
134
+ }
135
+ .workspace-path { font-size: 12px; word-break: break-all; }
136
+ .workspace-path b { color: var(--accent-2); font-weight: 400; }
137
+ .session {
138
+ display: grid; grid-template-columns: 12px minmax(0, 1fr) 96px auto; gap: 14px;
139
+ align-items: center; padding: 12px 16px; margin-bottom: 8px;
140
+ background: var(--panel); border: 1px solid var(--line); border-radius: 12px;
141
+ }
142
+ .session:hover { border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); }
143
+ .state-dot { width: 9px; height: 9px; border-radius: 50%; }
144
+ .dot-ok { background: var(--ok); box-shadow: 0 0 10px var(--ok); }
145
+ .dot-warn { background: var(--warn); }
146
+ .dot-err { background: var(--err); }
147
+ .dot-muted { background: var(--muted); }
148
+ .session-title { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
149
+ .session-meta { font-size: 11px; color: var(--muted); margin-top: 3px; overflow-wrap: anywhere; }
150
+ .session-age { font-size: 11px; color: var(--muted); text-align: right; font-variant-numeric: tabular-nums; }
151
+ .session-actions { display: flex; gap: 8px; }
152
+ .session-actions .btn { padding: 5px 10px; }
153
+ .empty { border: 1px dashed var(--line); border-radius: 12px; padding: 34px; text-align: center; color: var(--muted); }
154
+ footer { max-width: 1240px; margin: 0 auto; padding: 0 28px 40px; color: var(--muted); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
155
+ dialog {
156
+ border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel); color: var(--text);
157
+ padding: 0; width: min(520px, 92vw); font-family: var(--mono);
158
+ }
159
+ dialog::backdrop { background: rgba(4, 5, 8, 0.62); }
160
+ .dialog-head { padding: 16px 18px 0; font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--muted); }
161
+ .dialog-body { padding: 14px 18px; display: grid; gap: 12px; }
162
+ .field { display: grid; gap: 6px; }
163
+ .field span { font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); }
164
+ input, textarea, select {
165
+ font-family: var(--mono); font-size: 13px; color: var(--text); background: var(--panel-2);
166
+ border: 1px solid var(--line); border-radius: 9px; padding: 9px 11px; width: 100%;
167
+ }
168
+ input:focus, textarea:focus, select:focus { outline: 1px solid var(--accent); border-color: var(--accent); }
169
+ textarea { min-height: 62px; resize: vertical; }
170
+ .dialog-foot { display: flex; justify-content: flex-end; gap: 10px; padding: 4px 18px 18px; }
171
+ .toast {
172
+ position: fixed; right: 22px; bottom: 22px; max-width: 460px; z-index: 20;
173
+ background: var(--panel); border: 1px solid var(--accent); border-radius: 10px;
174
+ padding: 11px 14px; font-size: 12px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.28);
175
+ }
176
+ @media (max-width: 760px) {
177
+ .session { grid-template-columns: 12px minmax(0, 1fr); }
178
+ .session-age, .session-actions { grid-column: 2; text-align: left; }
179
+ .session-actions { flex-wrap: wrap; }
180
+ }
181
+ </style>
182
+ </head>
183
+ <body>
184
+ <header class="bar">
185
+ <div class="brand">
186
+ <span class="brand-dot"></span>
187
+ <span class="brand-name">BIZAR</span>
188
+ <span class="brand-sub">OMB DASHBOARD</span>
189
+ </div>
190
+ <div class="bar-right">
191
+ <span class="chip" id="link-chip"><span class="dot"></span><span id="link-text">CONNECTING</span></span>
192
+ <button class="chip button" id="theme-toggle" type="button" title="Switch theme">LIGHT</button>
193
+ </div>
194
+ </header>
195
+ <main>
196
+ <section class="stats" id="stats"></section>
197
+ <section class="toolbar">
198
+ <div class="filters" id="filters"></div>
199
+ <div class="toolbar-right">
200
+ <span class="muted" id="updated" style="font-size:11px"></span>
201
+ <button class="btn primary" id="create-open" type="button">+ New session</button>
202
+ </div>
203
+ </section>
204
+ <div class="notice hidden" id="notice"></div>
205
+ <section id="workspaces"></section>
206
+ </main>
207
+ <footer>
208
+ <span>Bizar OMB &middot; localhost only &middot; token gated</span>
209
+ <span>PolderLabs</span>
210
+ </footer>
211
+
212
+ <dialog id="create-dialog">
213
+ <form method="dialog">
214
+ <div class="dialog-head">New session</div>
215
+ <div class="dialog-body">
216
+ <label class="field"><span>Project directory</span>
217
+ <input id="create-cwd" list="workspace-list" placeholder="/path/to/project" autocomplete="off" />
218
+ <datalist id="workspace-list"></datalist>
219
+ </label>
220
+ <label class="field"><span>Task (optional)</span>
221
+ <textarea id="create-task" placeholder="What should the agent work on?"></textarea>
222
+ </label>
223
+ <label class="field"><span>Session name (optional)</span>
224
+ <input id="create-id" placeholder="review" autocomplete="off" />
225
+ </label>
226
+ </div>
227
+ <div class="dialog-foot">
228
+ <button class="btn" value="cancel" type="submit">Cancel</button>
229
+ <button class="btn primary" id="create-submit" value="create" type="submit">Create</button>
230
+ </div>
231
+ </form>
232
+ </dialog>
233
+
234
+ <dialog id="rename-dialog">
235
+ <form method="dialog">
236
+ <div class="dialog-head">Rename session</div>
237
+ <div class="dialog-body">
238
+ <label class="field"><span>Session name</span>
239
+ <input id="rename-id" autocomplete="off" />
240
+ </label>
241
+ </div>
242
+ <div class="dialog-foot">
243
+ <button class="btn" value="cancel" type="submit">Cancel</button>
244
+ <button class="btn primary" id="rename-submit" value="rename" type="submit">Rename</button>
245
+ </div>
246
+ </form>
247
+ </dialog>
248
+
249
+ <dialog id="stop-dialog">
250
+ <form method="dialog">
251
+ <div class="dialog-head">Stop session</div>
252
+ <div class="dialog-body">
253
+ <p id="stop-text" style="margin:0">This kills the Bizar tmux session and ends its agent work.</p>
254
+ </div>
255
+ <div class="dialog-foot">
256
+ <button class="btn" value="cancel" type="submit">Cancel</button>
257
+ <button class="btn danger" value="stop" type="submit">Stop session</button>
258
+ </div>
259
+ </form>
260
+ </dialog>
261
+
262
+ <div class="toast hidden" id="toast"></div>
263
+
264
+ <script>
265
+ (function () {
266
+ "use strict";
267
+ var TOKEN_KEY = "bizar.dash.token";
268
+ var THEME_KEY = "bizar.dash.theme";
269
+ var token = sessionStorage.getItem(TOKEN_KEY) || "";
270
+ var sessions = [];
271
+ var projectsFolder = "";
272
+ var filter = "all";
273
+ var timer = null;
274
+ var pending = null;
275
+
276
+ function byId(id) { return document.getElementById(id); }
277
+
278
+ function escapeText(value) {
279
+ return String(value == null ? "" : value)
280
+ .replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
281
+ .replace(/"/g, "&quot;").replace(/'/g, "&#39;");
282
+ }
283
+
284
+ function toast(message, isError) {
285
+ var node = byId("toast");
286
+ node.textContent = message;
287
+ node.style.borderColor = isError ? "var(--err)" : "var(--accent)";
288
+ node.classList.remove("hidden");
289
+ clearTimeout(node._hide);
290
+ node._hide = setTimeout(function () { node.classList.add("hidden"); }, 5200);
291
+ }
292
+
293
+ function notice(message) {
294
+ var node = byId("notice");
295
+ if (!message) { node.classList.add("hidden"); node.textContent = ""; return; }
296
+ node.textContent = message;
297
+ node.classList.remove("hidden");
298
+ }
299
+
300
+ function link(state, text) {
301
+ var chip = byId("link-chip");
302
+ chip.className = "chip" + (state === "live" ? " live" : state === "down" ? " down" : "");
303
+ byId("link-text").textContent = text;
304
+ }
305
+
306
+ function ageFrom(seconds) {
307
+ if (!seconds) return "unknown";
308
+ var delta = Math.max(0, Math.floor(Date.now() / 1000) - seconds);
309
+ if (delta < 60) return delta + "s ago";
310
+ if (delta < 3600) return Math.floor(delta / 60) + "m ago";
311
+ if (delta < 86400) return Math.floor(delta / 3600) + "h ago";
312
+ return Math.floor(delta / 86400) + "d ago";
313
+ }
314
+
315
+ function api(path, options) {
316
+ var init = options || {};
317
+ init.headers = Object.assign({ authorization: "Bearer " + token }, init.headers || {});
318
+ if (init.body) { init.headers["content-type"] = "application/json"; }
319
+ return fetch(path, init);
320
+ }
321
+
322
+ // States are words the daemon chooses; the dashboard must not hardcode a
323
+ // vocabulary it does not own, so unknown states still render sensibly.
324
+ var STATE_TONE = {
325
+ working: "ok", waiting: "warn", connected: "ok", attached: "ok",
326
+ disconnected: "muted", detached: "warn", stopped: "muted", dead: "muted", error: "err"
327
+ };
328
+
329
+ function toneOf(state) { return STATE_TONE[state] || "muted"; }
330
+
331
+ // Known-busy states sort first; anything unfamiliar keeps a stable last place.
332
+ var STATE_RANK = { working: 0, waiting: 1, connected: 2, attached: 2, disconnected: 3, detached: 3, stopped: 4, dead: 4 };
333
+ function rankOf(state) { return STATE_RANK[state] === undefined ? 5 : STATE_RANK[state]; }
334
+
335
+ function statesSeen() {
336
+ var seen = [];
337
+ sessions.forEach(function (session) {
338
+ if (seen.indexOf(session.state) === -1) seen.push(session.state);
339
+ });
340
+ return seen;
341
+ }
342
+
343
+ function titleOf(session) {
344
+ return session.nativeName || session.firstMessage || session.name;
345
+ }
346
+
347
+ /** Secondary line: the tmux identity, minus anything already in the title. */
348
+ function metaOf(session) {
349
+ var slug = (session.project || "session") + "/" + (session.id || "main");
350
+ return session.name === titleOf(session) ? slug : slug + " \\u00b7 " + session.name;
351
+ }
352
+
353
+ function workspaceOf(session) {
354
+ return session.cwd && session.cwd !== "?" ? session.cwd : session.project || "unknown workspace";
355
+ }
356
+
357
+ function visible() {
358
+ if (filter === "all") return sessions;
359
+ return sessions.filter(function (session) { return session.state === filter; });
360
+ }
361
+
362
+ function renderStats() {
363
+ var workspaces = {};
364
+ sessions.forEach(function (s) { workspaces[workspaceOf(s)] = true; });
365
+ var counts = {};
366
+ statesSeen().forEach(function (state) { counts[state] = 0; });
367
+ sessions.forEach(function (session) { counts[session.state] += 1; });
368
+ var cards = [
369
+ { label: "Sessions under management", value: String(sessions.length), sub: Object.keys(workspaces).length + " workspace(s)", invert: true }
370
+ ];
371
+ Object.keys(counts).sort(function (a, b) { return counts[b] - counts[a] || a.localeCompare(b); })
372
+ .forEach(function (state) { cards.push({ label: state, value: String(counts[state]), sub: "sessions" }); });
373
+ byId("stats").innerHTML = cards.map(function (card) {
374
+ return '<article class="card' + (card.invert ? " invert" : "") + '">' +
375
+ '<div class="label">' + escapeText(card.label) + "</div>" +
376
+ '<div class="value">' + escapeText(card.value) + "</div>" +
377
+ '<div class="sub">' + escapeText(card.sub) + "</div></article>";
378
+ }).join("");
379
+ }
380
+
381
+ function renderFilters() {
382
+ var keys = ["all"].concat(statesSeen());
383
+ if (keys.indexOf(filter) === -1) filter = "all";
384
+ var counts = { all: sessions.length };
385
+ sessions.forEach(function (session) { counts[session.state] = (counts[session.state] || 0) + 1; });
386
+ byId("filters").innerHTML = keys.map(function (key) {
387
+ return '<button type="button" class="filter" data-filter="' + escapeText(key) + '" aria-pressed="' +
388
+ (filter === key) + '">' + escapeText(key) + " " + counts[key] + "</button>";
389
+ }).join("");
390
+ }
391
+
392
+ function renderSessions() {
393
+ var target = byId("workspaces");
394
+ var list = visible();
395
+ if (!list.length) {
396
+ target.innerHTML = '<div class="empty">No sessions match this view. Create one with <b>+ New session</b>.</div>';
397
+ return;
398
+ }
399
+ var groups = {};
400
+ var order = [];
401
+ list.forEach(function (session) {
402
+ var key = workspaceOf(session);
403
+ if (!groups[key]) { groups[key] = []; order.push(key); }
404
+ groups[key].push(session);
405
+ });
406
+ order.sort();
407
+ target.innerHTML = order.map(function (key) {
408
+ var rows = groups[key].slice().sort(function (a, b) {
409
+ var left = rankOf(a.state);
410
+ var right = rankOf(b.state);
411
+ return (left - right) || a.name.localeCompare(b.name);
412
+ }).map(function (session) {
413
+ var meta = metaOf(session);
414
+ return '<article class="session" data-name="' + escapeText(session.name) + '">' +
415
+ '<span class="state-dot dot-' + toneOf(session.state) + '" title="' + escapeText(session.state) + '"></span>' +
416
+ "<div>" +
417
+ '<div class="session-title">' + escapeText(titleOf(session)) + "</div>" +
418
+ '<div class="session-meta">' + escapeText(meta) + "</div>" +
419
+ "</div>" +
420
+ '<div class="session-age">' + escapeText(ageFrom(session.lastAttachedAt || session.createdAt)) + "</div>" +
421
+ '<div class="session-actions">' +
422
+ '<button type="button" class="btn" data-action="attach">Attach</button>' +
423
+ '<button type="button" class="btn" data-action="rename">Rename</button>' +
424
+ '<button type="button" class="btn danger" data-action="stop">Stop</button>' +
425
+ "</div>" +
426
+ "</article>";
427
+ }).join("");
428
+ return '<section class="workspace">' +
429
+ '<div class="workspace-head"><span class="workspace-path"><b>' + escapeText(key) + "</b></span>" +
430
+ '<span class="muted" style="font-size:11px">' + groups[key].length + " session(s)</span></div>" +
431
+ rows + "</section>";
432
+ }).join("");
433
+
434
+ var options = order.map(function (key) { return '<option value="' + escapeText(key) + '"></option>'; });
435
+ var datalist = byId("workspace-list");
436
+ datalist.innerHTML = (projectsFolder ? '<option value="' + escapeText(projectsFolder) + '"></option>' : "") + options.join("");
437
+ }
438
+
439
+ function render() {
440
+ renderStats();
441
+ renderFilters();
442
+ renderSessions();
443
+ }
444
+
445
+ function refresh() {
446
+ return api("/sessions").then(function (response) {
447
+ if (response.status === 401) {
448
+ link("down", "LOCKED");
449
+ notice("Dashboard access expired. Run \`omb dashboard\` again to get a fresh link.");
450
+ return;
451
+ }
452
+ if (!response.ok) throw new Error("status " + response.status);
453
+ return response.json().then(function (body) {
454
+ sessions = Array.isArray(body.sessions) ? body.sessions : [];
455
+ link("live", "LIVE");
456
+ notice("");
457
+ byId("updated").textContent = "updated " + new Date().toLocaleTimeString();
458
+ render();
459
+ });
460
+ }).catch(function () {
461
+ link("down", "OFFLINE");
462
+ notice("Daemon unreachable. Sessions keep running in tmux; retrying automatically.");
463
+ });
464
+ }
465
+
466
+ function start() {
467
+ refresh();
468
+ if (timer) clearInterval(timer);
469
+ timer = setInterval(refresh, 3000);
470
+ }
471
+
472
+ function post(path, body) {
473
+ return api(path, { method: "POST", body: JSON.stringify(body || {}) }).then(function (response) {
474
+ return response.json().catch(function () { return {}; }).then(function (payload) {
475
+ if (!response.ok) throw new Error(payload.error || ("status " + response.status));
476
+ return payload;
477
+ });
478
+ });
479
+ }
480
+
481
+ function errorMessage(error) {
482
+ return error && error.message ? error.message : String(error);
483
+ }
484
+
485
+ document.addEventListener("click", function (event) {
486
+ var filterButton = event.target.closest("[data-filter]");
487
+ if (filterButton) { filter = filterButton.getAttribute("data-filter"); render(); return; }
488
+
489
+ var action = event.target.closest("[data-action]");
490
+ if (action) {
491
+ var row = action.closest("[data-name]");
492
+ var name = row.getAttribute("data-name");
493
+ var kind = action.getAttribute("data-action");
494
+ if (kind === "attach") {
495
+ post("/sessions/" + encodeURIComponent(name) + "/attach", {}).then(function (payload) {
496
+ if (payload.spawned) toast("Opening " + payload.terminal + " attached to " + name);
497
+ else toast("No terminal emulator found. Run: " + payload.command, true);
498
+ }).catch(function (error) { toast("Attach failed: " + errorMessage(error), true); });
499
+ } else if (kind === "rename") {
500
+ pending = name;
501
+ byId("rename-id").value = (sessions.find(function (s) { return s.name === name; }) || {}).id || "";
502
+ byId("rename-dialog").showModal();
503
+ } else if (kind === "stop") {
504
+ pending = name;
505
+ byId("stop-text").textContent = "Stop " + name + "? This kills the Bizar tmux session and ends its agent work.";
506
+ byId("stop-dialog").showModal();
507
+ }
508
+ return;
509
+ }
510
+
511
+ if (event.target.id === "theme-toggle") {
512
+ var next = document.documentElement.getAttribute("data-theme") === "dark" ? "light" : "dark";
513
+ applyTheme(next, true);
514
+ return;
515
+ }
516
+ if (event.target.id === "create-open") {
517
+ byId("create-cwd").value = projectsFolder || "";
518
+ byId("create-dialog").showModal();
519
+ }
520
+ });
521
+
522
+ byId("rename-dialog").addEventListener("close", function (event) {
523
+ var name = pending;
524
+ pending = null;
525
+ if (event.target.returnValue !== "rename" || !name) return;
526
+ var nextId = byId("rename-id").value.trim();
527
+ if (!nextId) return;
528
+ post("/sessions/" + encodeURIComponent(name) + "/rename", { sessionId: nextId })
529
+ .then(function () { toast("Renamed " + name + " to " + nextId); return refresh(); })
530
+ .catch(function (error) { toast("Rename failed: " + errorMessage(error), true); });
531
+ });
532
+
533
+ byId("stop-dialog").addEventListener("close", function (event) {
534
+ var name = pending;
535
+ pending = null;
536
+ if (event.target.returnValue !== "stop" || !name) return;
537
+ post("/sessions/" + encodeURIComponent(name) + "/delete", {})
538
+ .then(function () { toast("Stopped " + name); return refresh(); })
539
+ .catch(function (error) { toast("Stop failed: " + errorMessage(error), true); });
540
+ });
541
+
542
+ byId("create-dialog").addEventListener("close", function (event) {
543
+ if (event.target.returnValue !== "create") return;
544
+ var cwd = byId("create-cwd").value.trim();
545
+ if (!cwd) { toast("A project directory is required", true); return; }
546
+ var payload = { cwd: cwd, task: byId("create-task").value.trim(), sessionId: byId("create-id").value.trim() };
547
+ post("/sessions/create", payload)
548
+ .then(function () { toast("Session created in " + cwd); return refresh(); })
549
+ .catch(function (error) { toast("Create failed: " + errorMessage(error), true); });
550
+ });
551
+
552
+ function applyTheme(theme, remember) {
553
+ document.documentElement.setAttribute("data-theme", theme);
554
+ byId("theme-toggle").textContent = theme === "dark" ? "LIGHT" : "DARK";
555
+ if (remember) localStorage.setItem(THEME_KEY, theme);
556
+ }
557
+
558
+ function bootstrap() {
559
+ var stored = localStorage.getItem(THEME_KEY);
560
+ var preferred = window.matchMedia && window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
561
+ applyTheme(stored || preferred, false);
562
+
563
+ var params = new URLSearchParams(window.location.search);
564
+ var code = params.get("oc");
565
+ var auth = code
566
+ ? fetch("/dash/session", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ code: code }) })
567
+ .then(function (response) {
568
+ if (!response.ok) throw new Error("access code rejected");
569
+ return response.json();
570
+ })
571
+ : Promise.resolve({ token: token });
572
+
573
+ auth.then(function (payload) {
574
+ token = payload.token;
575
+ sessionStorage.setItem(TOKEN_KEY, token);
576
+ if (code) window.history.replaceState({}, "", "/dash");
577
+ return api("/projects").then(function (response) { return response.ok ? response.json() : {}; });
578
+ }).then(function (meta) {
579
+ projectsFolder = meta && typeof meta.projectsFolder === "string" ? meta.projectsFolder : "";
580
+ start();
581
+ }).catch(function () {
582
+ link("down", "LOCKED");
583
+ notice("Open this dashboard from the URL printed by \`omb dashboard\`.");
584
+ });
585
+ }
586
+
587
+ bootstrap();
588
+ })();
589
+ </script>
590
+ </body>
591
+ </html>
592
+ `;
593
+ }
594
+ //# sourceMappingURL=dashboard-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-html.js","sourceRoot":"","sources":["../../src/omp/dashboard-html.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAukBR,CAAC;AACF,CAAC"}
@@ -40,6 +40,8 @@ interface RoleProfile {
40
40
  minContextWindow: number;
41
41
  requiresReasoning: boolean;
42
42
  preferDistinctFrom?: string;
43
+ /** "local" biases scoring toward locally hosted models without disqualifying cloud fallbacks. */
44
+ providerPreference?: "local" | "cloud";
43
45
  }
44
46
  /** Native-compatible defaults used until an operator runs model-role assignment. */
45
47
  export declare const BIZAR_MODEL_ROLES: {
@@ -118,6 +120,7 @@ export declare const BIZAR_ROLE_PROFILES: readonly RoleProfile[];
118
120
  * planner instead, so `/bizar-models` does not spend a model turn on research.
119
121
  */
120
122
  export declare const BIZAR_MODEL_ROLE_AGENT_PROMPT: string;
123
+ export declare function isLocalModel(model: AvailableModel): boolean;
121
124
  export declare function planBizarModelRoles(query: ModelQuery): RoleAssignmentPlan;
122
125
  export declare function formatRoleAssignmentPlan(plan: RoleAssignmentPlan): string;
123
126
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"model-role-assignment.d.ts","sourceRoot":"","sources":["../../src/omp/model-role-assignment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-role-assignment.d.ts","sourceRoot":"","sources":["../../src/omp/model-role-assignment.ts"],"names":[],"mappings":"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"}