@polderlabs/bizar-omp 0.6.1 → 0.6.3

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 (403) hide show
  1. package/README.md +59 -2
  2. package/dist/cli/agents-ink.d.ts.map +1 -1
  3. package/dist/cli/agents-ink.js +11 -10
  4. package/dist/cli/agents-ink.js.map +1 -1
  5. package/dist/cli/agents.d.ts +1 -0
  6. package/dist/cli/agents.d.ts.map +1 -1
  7. package/dist/cli/agents.js +11 -0
  8. package/dist/cli/agents.js.map +1 -1
  9. package/dist/cli/directory-selector.d.ts +36 -0
  10. package/dist/cli/directory-selector.d.ts.map +1 -1
  11. package/dist/cli/directory-selector.js +25 -0
  12. package/dist/cli/directory-selector.js.map +1 -1
  13. package/dist/cli/main.js +0 -0
  14. package/dist/cli/omb-commands.d.ts +30 -0
  15. package/dist/cli/omb-commands.d.ts.map +1 -0
  16. package/dist/cli/omb-commands.js +109 -0
  17. package/dist/cli/omb-commands.js.map +1 -0
  18. package/dist/cli/omb-daemon.d.ts +1 -0
  19. package/dist/cli/omb-daemon.d.ts.map +1 -1
  20. package/dist/cli/omb-daemon.js +15 -1
  21. package/dist/cli/omb-daemon.js.map +1 -1
  22. package/dist/cli/omb-dashboard.d.ts +1 -1
  23. package/dist/cli/omb-dashboard.d.ts.map +1 -1
  24. package/dist/cli/omb-dashboard.js +2 -1
  25. package/dist/cli/omb-dashboard.js.map +1 -1
  26. package/dist/cli/omb-runtime.d.ts +42 -0
  27. package/dist/cli/omb-runtime.d.ts.map +1 -0
  28. package/dist/cli/omb-runtime.js +507 -0
  29. package/dist/cli/omb-runtime.js.map +1 -0
  30. package/dist/cli/omb-tray.d.ts +3 -0
  31. package/dist/cli/omb-tray.d.ts.map +1 -0
  32. package/dist/cli/omb-tray.js +44 -0
  33. package/dist/cli/omb-tray.js.map +1 -0
  34. package/dist/cli/omb.js +8 -33
  35. package/dist/cli/omb.js.map +1 -1
  36. package/dist/extension.d.ts +2 -1
  37. package/dist/extension.d.ts.map +1 -1
  38. package/dist/extension.js +160 -33
  39. package/dist/extension.js.map +1 -1
  40. package/dist/omp/daemon-service.d.ts.map +1 -1
  41. package/dist/omp/daemon-service.js +6 -3
  42. package/dist/omp/daemon-service.js.map +1 -1
  43. package/dist/omp/daemon.d.ts +1 -0
  44. package/dist/omp/daemon.d.ts.map +1 -1
  45. package/dist/omp/daemon.js +1 -1
  46. package/dist/omp/daemon.js.map +1 -1
  47. package/dist/omp/dashboard-html.d.ts.map +1 -1
  48. package/dist/omp/dashboard-html.js +360 -38
  49. package/dist/omp/dashboard-html.js.map +1 -1
  50. package/dist/omp/model-role-assignment.d.ts +166 -1
  51. package/dist/omp/model-role-assignment.d.ts.map +1 -1
  52. package/dist/omp/model-role-assignment.js +393 -4
  53. package/dist/omp/model-role-assignment.js.map +1 -1
  54. package/dist/omp/omb-sessions.d.ts +44 -0
  55. package/dist/omp/omb-sessions.d.ts.map +1 -1
  56. package/dist/omp/omb-sessions.js +160 -52
  57. package/dist/omp/omb-sessions.js.map +1 -1
  58. package/dist/omp/omb-settings.d.ts +16 -0
  59. package/dist/omp/omb-settings.d.ts.map +1 -1
  60. package/dist/omp/omb-settings.js +55 -3
  61. package/dist/omp/omb-settings.js.map +1 -1
  62. package/dist/omp/run-log.d.ts +26 -0
  63. package/dist/omp/run-log.d.ts.map +1 -0
  64. package/dist/omp/run-log.js +24 -0
  65. package/dist/omp/run-log.js.map +1 -0
  66. package/dist/omp/tmux.d.ts +38 -2
  67. package/dist/omp/tmux.d.ts.map +1 -1
  68. package/dist/omp/tmux.js +231 -46
  69. package/dist/omp/tmux.js.map +1 -1
  70. package/dist/omp/tray.d.ts +2 -0
  71. package/dist/omp/tray.d.ts.map +1 -1
  72. package/dist/omp/tray.js +31 -5
  73. package/dist/omp/tray.js.map +1 -1
  74. package/dist/src/cli/agents-ink.d.ts +25 -0
  75. package/dist/src/cli/agents-ink.js +517 -0
  76. package/dist/src/cli/agents-ink.js.map +1 -0
  77. package/dist/src/cli/agents.d.ts +14 -0
  78. package/dist/src/cli/agents.js +197 -0
  79. package/dist/src/cli/agents.js.map +1 -0
  80. package/dist/src/cli/directory-selector.d.ts +60 -0
  81. package/dist/src/cli/directory-selector.js +208 -0
  82. package/dist/src/cli/directory-selector.js.map +1 -0
  83. package/dist/src/cli/doctor.d.ts +41 -0
  84. package/dist/src/cli/doctor.js +31 -0
  85. package/dist/src/cli/doctor.js.map +1 -0
  86. package/dist/src/cli/install.d.ts +129 -0
  87. package/dist/src/cli/install.js +164 -0
  88. package/dist/src/cli/install.js.map +1 -0
  89. package/dist/src/cli/main.d.ts +2 -0
  90. package/dist/src/cli/main.js +117 -0
  91. package/dist/src/cli/main.js.map +1 -0
  92. package/dist/src/cli/migrate.d.ts +18 -0
  93. package/dist/src/cli/migrate.js +14 -0
  94. package/dist/src/cli/migrate.js.map +1 -0
  95. package/dist/src/cli/omb-commands.d.ts +29 -0
  96. package/dist/src/cli/omb-commands.js +107 -0
  97. package/dist/src/cli/omb-commands.js.map +1 -0
  98. package/dist/src/cli/omb-daemon.d.ts +2 -0
  99. package/dist/src/cli/omb-daemon.js +135 -0
  100. package/dist/src/cli/omb-daemon.js.map +1 -0
  101. package/dist/src/cli/omb-dashboard.d.ts +12 -0
  102. package/dist/src/cli/omb-dashboard.js +113 -0
  103. package/dist/src/cli/omb-dashboard.js.map +1 -0
  104. package/dist/src/cli/omb-invocation.d.ts +8 -0
  105. package/dist/src/cli/omb-invocation.js +41 -0
  106. package/dist/src/cli/omb-invocation.js.map +1 -0
  107. package/dist/src/cli/omb-runtime.d.ts +41 -0
  108. package/dist/src/cli/omb-runtime.js +371 -0
  109. package/dist/src/cli/omb-runtime.js.map +1 -0
  110. package/dist/src/cli/omb-tray.d.ts +2 -0
  111. package/dist/src/cli/omb-tray.js +38 -0
  112. package/dist/src/cli/omb-tray.js.map +1 -0
  113. package/dist/src/cli/omb.d.ts +2 -0
  114. package/dist/src/cli/omb.js +31 -0
  115. package/dist/src/cli/omb.js.map +1 -0
  116. package/dist/src/cli/omp-theme.d.ts +17 -0
  117. package/dist/src/cli/omp-theme.js +22 -0
  118. package/dist/src/cli/omp-theme.js.map +1 -0
  119. package/dist/src/cli/process.d.ts +6 -0
  120. package/dist/src/cli/process.js +54 -0
  121. package/dist/src/cli/process.js.map +1 -0
  122. package/dist/src/cli/run.d.ts +2 -0
  123. package/dist/src/cli/run.js +5 -0
  124. package/dist/src/cli/run.js.map +1 -0
  125. package/dist/src/cli/setup-ui.d.ts +37 -0
  126. package/dist/src/cli/setup-ui.js +90 -0
  127. package/dist/src/cli/setup-ui.js.map +1 -0
  128. package/dist/src/core/acceptance.d.ts +32 -0
  129. package/dist/src/core/acceptance.js +87 -0
  130. package/dist/src/core/acceptance.js.map +1 -0
  131. package/dist/src/core/errors.d.ts +20 -0
  132. package/dist/src/core/errors.js +30 -0
  133. package/dist/src/core/errors.js.map +1 -0
  134. package/dist/src/core/evidence.d.ts +10 -0
  135. package/dist/src/core/evidence.js +35 -0
  136. package/dist/src/core/evidence.js.map +1 -0
  137. package/dist/src/core/policies.d.ts +10 -0
  138. package/dist/src/core/policies.js +60 -0
  139. package/dist/src/core/policies.js.map +1 -0
  140. package/dist/src/core/recovery.d.ts +6 -0
  141. package/dist/src/core/recovery.js +56 -0
  142. package/dist/src/core/recovery.js.map +1 -0
  143. package/dist/src/core/transitions.d.ts +13 -0
  144. package/dist/src/core/transitions.js +59 -0
  145. package/dist/src/core/transitions.js.map +1 -0
  146. package/dist/src/core/types.d.ts +256 -0
  147. package/dist/src/core/types.js +2 -0
  148. package/dist/src/core/types.js.map +1 -0
  149. package/dist/src/extension.d.ts +60 -0
  150. package/dist/src/extension.js +538 -0
  151. package/dist/src/extension.js.map +1 -0
  152. package/dist/src/index.d.ts +29 -0
  153. package/dist/src/index.js +30 -0
  154. package/dist/src/index.js.map +1 -0
  155. package/dist/src/omp/autonomous-settings.d.ts +14 -0
  156. package/dist/src/omp/autonomous-settings.js +65 -0
  157. package/dist/src/omp/autonomous-settings.js.map +1 -0
  158. package/dist/src/omp/capabilities.d.ts +23 -0
  159. package/dist/src/omp/capabilities.js +6 -0
  160. package/dist/src/omp/capabilities.js.map +1 -0
  161. package/dist/src/omp/compatibility.d.ts +30 -0
  162. package/dist/src/omp/compatibility.js +34 -0
  163. package/dist/src/omp/compatibility.js.map +1 -0
  164. package/dist/src/omp/completion.d.ts +7 -0
  165. package/dist/src/omp/completion.js +10 -0
  166. package/dist/src/omp/completion.js.map +1 -0
  167. package/dist/src/omp/config.d.ts +10 -0
  168. package/dist/src/omp/config.js +14 -0
  169. package/dist/src/omp/config.js.map +1 -0
  170. package/dist/src/omp/context.d.ts +15 -0
  171. package/dist/src/omp/context.js +3 -0
  172. package/dist/src/omp/context.js.map +1 -0
  173. package/dist/src/omp/daemon-service.d.ts +25 -0
  174. package/dist/src/omp/daemon-service.js +483 -0
  175. package/dist/src/omp/daemon-service.js.map +1 -0
  176. package/dist/src/omp/daemon.d.ts +48 -0
  177. package/dist/src/omp/daemon.js +194 -0
  178. package/dist/src/omp/daemon.js.map +1 -0
  179. package/dist/src/omp/dashboard-html.d.ts +3 -0
  180. package/dist/src/omp/dashboard-html.js +419 -0
  181. package/dist/src/omp/dashboard-html.js.map +1 -0
  182. package/dist/src/omp/dispatch-admission.d.ts +2 -0
  183. package/dist/src/omp/dispatch-admission.js +12 -0
  184. package/dist/src/omp/dispatch-admission.js.map +1 -0
  185. package/dist/src/omp/integration-recovery.d.ts +10 -0
  186. package/dist/src/omp/integration-recovery.js +18 -0
  187. package/dist/src/omp/integration-recovery.js.map +1 -0
  188. package/dist/src/omp/isolation-policy.d.ts +14 -0
  189. package/dist/src/omp/isolation-policy.js +9 -0
  190. package/dist/src/omp/isolation-policy.js.map +1 -0
  191. package/dist/src/omp/lifecycle.d.ts +14 -0
  192. package/dist/src/omp/lifecycle.js +14 -0
  193. package/dist/src/omp/lifecycle.js.map +1 -0
  194. package/dist/src/omp/memory.d.ts +16 -0
  195. package/dist/src/omp/memory.js +4 -0
  196. package/dist/src/omp/memory.js.map +1 -0
  197. package/dist/src/omp/model-role-assignment.d.ts +296 -0
  198. package/dist/src/omp/model-role-assignment.js +559 -0
  199. package/dist/src/omp/model-role-assignment.js.map +1 -0
  200. package/dist/src/omp/model-roles.d.ts +19 -0
  201. package/dist/src/omp/model-roles.js +6 -0
  202. package/dist/src/omp/model-roles.js.map +1 -0
  203. package/dist/src/omp/omb-sessions.d.ts +122 -0
  204. package/dist/src/omp/omb-sessions.js +512 -0
  205. package/dist/src/omp/omb-sessions.js.map +1 -0
  206. package/dist/src/omp/omb-settings.d.ts +35 -0
  207. package/dist/src/omp/omb-settings.js +104 -0
  208. package/dist/src/omp/omb-settings.js.map +1 -0
  209. package/dist/src/omp/result-reconciliation.d.ts +2 -0
  210. package/dist/src/omp/result-reconciliation.js +9 -0
  211. package/dist/src/omp/result-reconciliation.js.map +1 -0
  212. package/dist/src/omp/rpc.d.ts +67 -0
  213. package/dist/src/omp/rpc.js +4 -0
  214. package/dist/src/omp/rpc.js.map +1 -0
  215. package/dist/src/omp/run-log.d.ts +25 -0
  216. package/dist/src/omp/run-log.js +24 -0
  217. package/dist/src/omp/run-log.js.map +1 -0
  218. package/dist/src/omp/session-activity.d.ts +70 -0
  219. package/dist/src/omp/session-activity.js +361 -0
  220. package/dist/src/omp/session-activity.js.map +1 -0
  221. package/dist/src/omp/session-controls.d.ts +17 -0
  222. package/dist/src/omp/session-controls.js +14 -0
  223. package/dist/src/omp/session-controls.js.map +1 -0
  224. package/dist/src/omp/tmux.d.ts +89 -0
  225. package/dist/src/omp/tmux.js +445 -0
  226. package/dist/src/omp/tmux.js.map +1 -0
  227. package/dist/src/omp/tray-icons.d.ts +5 -0
  228. package/dist/src/omp/tray-icons.js +78 -0
  229. package/dist/src/omp/tray-icons.js.map +1 -0
  230. package/dist/src/omp/tray.d.ts +23 -0
  231. package/dist/src/omp/tray.js +167 -0
  232. package/dist/src/omp/tray.js.map +1 -0
  233. package/dist/src/services/budget.d.ts +19 -0
  234. package/dist/src/services/budget.js +10 -0
  235. package/dist/src/services/budget.js.map +1 -0
  236. package/dist/src/services/candidate-local.d.ts +13 -0
  237. package/dist/src/services/candidate-local.js +15 -0
  238. package/dist/src/services/candidate-local.js.map +1 -0
  239. package/dist/src/services/candidates.d.ts +20 -0
  240. package/dist/src/services/candidates.js +100 -0
  241. package/dist/src/services/candidates.js.map +1 -0
  242. package/dist/src/services/evidence-bundle.d.ts +17 -0
  243. package/dist/src/services/evidence-bundle.js +21 -0
  244. package/dist/src/services/evidence-bundle.js.map +1 -0
  245. package/dist/src/services/inspector.d.ts +11 -0
  246. package/dist/src/services/inspector.js +6 -0
  247. package/dist/src/services/inspector.js.map +1 -0
  248. package/dist/src/services/lessons.d.ts +13 -0
  249. package/dist/src/services/lessons.js +11 -0
  250. package/dist/src/services/lessons.js.map +1 -0
  251. package/dist/src/services/projection.d.ts +21 -0
  252. package/dist/src/services/projection.js +10 -0
  253. package/dist/src/services/projection.js.map +1 -0
  254. package/dist/src/services/readiness.d.ts +4 -0
  255. package/dist/src/services/readiness.js +35 -0
  256. package/dist/src/services/readiness.js.map +1 -0
  257. package/dist/src/services/recipes.d.ts +15 -0
  258. package/dist/src/services/recipes.js +42 -0
  259. package/dist/src/services/recipes.js.map +1 -0
  260. package/dist/src/services/recovery.d.ts +19 -0
  261. package/dist/src/services/recovery.js +9 -0
  262. package/dist/src/services/recovery.js.map +1 -0
  263. package/dist/src/services/review.d.ts +15 -0
  264. package/dist/src/services/review.js +9 -0
  265. package/dist/src/services/review.js.map +1 -0
  266. package/dist/src/storage/journal-recovery.d.ts +10 -0
  267. package/dist/src/storage/journal-recovery.js +33 -0
  268. package/dist/src/storage/journal-recovery.js.map +1 -0
  269. package/dist/src/storage/journal.d.ts +12 -0
  270. package/dist/src/storage/journal.js +82 -0
  271. package/dist/src/storage/journal.js.map +1 -0
  272. package/dist/src/storage/migrations.d.ts +22 -0
  273. package/dist/src/storage/migrations.js +107 -0
  274. package/dist/src/storage/migrations.js.map +1 -0
  275. package/dist/src/storage/repository-identity.d.ts +11 -0
  276. package/dist/src/storage/repository-identity.js +67 -0
  277. package/dist/src/storage/repository-identity.js.map +1 -0
  278. package/dist/src/storage/resources.d.ts +66 -0
  279. package/dist/src/storage/resources.js +148 -0
  280. package/dist/src/storage/resources.js.map +1 -0
  281. package/dist/src/tools/evidence.d.ts +8 -0
  282. package/dist/src/tools/evidence.js +9 -0
  283. package/dist/src/tools/evidence.js.map +1 -0
  284. package/dist/src/tools/integrate.d.ts +13 -0
  285. package/dist/src/tools/integrate.js +90 -0
  286. package/dist/src/tools/integrate.js.map +1 -0
  287. package/dist/src/tools/result.d.ts +9 -0
  288. package/dist/src/tools/result.js +2 -0
  289. package/dist/src/tools/result.js.map +1 -0
  290. package/dist/src/tools/verify.d.ts +13 -0
  291. package/dist/src/tools/verify.js +61 -0
  292. package/dist/src/tools/verify.js.map +1 -0
  293. package/dist/src/tools/workflow.d.ts +8 -0
  294. package/dist/src/tools/workflow.js +65 -0
  295. package/dist/src/tools/workflow.js.map +1 -0
  296. package/dist/src/workflows/direct.d.ts +9 -0
  297. package/dist/src/workflows/direct.js +2 -0
  298. package/dist/src/workflows/direct.js.map +1 -0
  299. package/dist/src/workflows/implement.d.ts +2 -0
  300. package/dist/src/workflows/implement.js +4 -0
  301. package/dist/src/workflows/implement.js.map +1 -0
  302. package/dist/src/workflows/plan.d.ts +17 -0
  303. package/dist/src/workflows/plan.js +6 -0
  304. package/dist/src/workflows/plan.js.map +1 -0
  305. package/dist/src/workflows/research.d.ts +15 -0
  306. package/dist/src/workflows/research.js +2 -0
  307. package/dist/src/workflows/research.js.map +1 -0
  308. package/dist/src/workflows/review.d.ts +15 -0
  309. package/dist/src/workflows/review.js +2 -0
  310. package/dist/src/workflows/review.js.map +1 -0
  311. package/dist/src/workflows/verify.d.ts +9 -0
  312. package/dist/src/workflows/verify.js +2 -0
  313. package/dist/src/workflows/verify.js.map +1 -0
  314. package/dist/tests/acceptance.test.d.ts +1 -0
  315. package/dist/tests/acceptance.test.js +27 -0
  316. package/dist/tests/acceptance.test.js.map +1 -0
  317. package/dist/tests/agents.test.d.ts +1 -0
  318. package/dist/tests/agents.test.js +369 -0
  319. package/dist/tests/agents.test.js.map +1 -0
  320. package/dist/tests/candidates.test.d.ts +1 -0
  321. package/dist/tests/candidates.test.js +60 -0
  322. package/dist/tests/candidates.test.js.map +1 -0
  323. package/dist/tests/core.test.d.ts +1 -0
  324. package/dist/tests/core.test.js +39 -0
  325. package/dist/tests/core.test.js.map +1 -0
  326. package/dist/tests/daemon.test.d.ts +1 -0
  327. package/dist/tests/daemon.test.js +157 -0
  328. package/dist/tests/daemon.test.js.map +1 -0
  329. package/dist/tests/dashboard.test.d.ts +1 -0
  330. package/dist/tests/dashboard.test.js +414 -0
  331. package/dist/tests/dashboard.test.js.map +1 -0
  332. package/dist/tests/directory-selector.test.d.ts +1 -0
  333. package/dist/tests/directory-selector.test.js +93 -0
  334. package/dist/tests/directory-selector.test.js.map +1 -0
  335. package/dist/tests/doctor.test.d.ts +1 -0
  336. package/dist/tests/doctor.test.js +32 -0
  337. package/dist/tests/doctor.test.js.map +1 -0
  338. package/dist/tests/install.test.d.ts +1 -0
  339. package/dist/tests/install.test.js +101 -0
  340. package/dist/tests/install.test.js.map +1 -0
  341. package/dist/tests/integration.test.d.ts +1 -0
  342. package/dist/tests/integration.test.js +49 -0
  343. package/dist/tests/integration.test.js.map +1 -0
  344. package/dist/tests/journal.test.d.ts +1 -0
  345. package/dist/tests/journal.test.js +50 -0
  346. package/dist/tests/journal.test.js.map +1 -0
  347. package/dist/tests/model-role-assignment.test.d.ts +1 -0
  348. package/dist/tests/model-role-assignment.test.js +294 -0
  349. package/dist/tests/model-role-assignment.test.js.map +1 -0
  350. package/dist/tests/omb-runtime.test.d.ts +1 -0
  351. package/dist/tests/omb-runtime.test.js +554 -0
  352. package/dist/tests/omb-runtime.test.js.map +1 -0
  353. package/dist/tests/omb-session-actions.test.d.ts +1 -0
  354. package/dist/tests/omb-session-actions.test.js +191 -0
  355. package/dist/tests/omb-session-actions.test.js.map +1 -0
  356. package/dist/tests/omb-settings.test.d.ts +1 -0
  357. package/dist/tests/omb-settings.test.js +82 -0
  358. package/dist/tests/omb-settings.test.js.map +1 -0
  359. package/dist/tests/omp-contract.test.d.ts +1 -0
  360. package/dist/tests/omp-contract.test.js +362 -0
  361. package/dist/tests/omp-contract.test.js.map +1 -0
  362. package/dist/tests/process.test.d.ts +1 -0
  363. package/dist/tests/process.test.js +12 -0
  364. package/dist/tests/process.test.js.map +1 -0
  365. package/dist/tests/psmux-windows.test.d.ts +1 -0
  366. package/dist/tests/psmux-windows.test.js +105 -0
  367. package/dist/tests/psmux-windows.test.js.map +1 -0
  368. package/dist/tests/recovery.test.d.ts +1 -0
  369. package/dist/tests/recovery.test.js +9 -0
  370. package/dist/tests/recovery.test.js.map +1 -0
  371. package/dist/tests/resources.test.d.ts +1 -0
  372. package/dist/tests/resources.test.js +55 -0
  373. package/dist/tests/resources.test.js.map +1 -0
  374. package/dist/tests/session-activity.test.d.ts +1 -0
  375. package/dist/tests/session-activity.test.js +159 -0
  376. package/dist/tests/session-activity.test.js.map +1 -0
  377. package/dist/tests/setup-ui.test.d.ts +1 -0
  378. package/dist/tests/setup-ui.test.js +37 -0
  379. package/dist/tests/setup-ui.test.js.map +1 -0
  380. package/dist/tests/storage-integrity.test.d.ts +1 -0
  381. package/dist/tests/storage-integrity.test.js +88 -0
  382. package/dist/tests/storage-integrity.test.js.map +1 -0
  383. package/dist/tests/tmux.test.d.ts +1 -0
  384. package/dist/tests/tmux.test.js +239 -0
  385. package/dist/tests/tmux.test.js.map +1 -0
  386. package/dist/tests/tray.test.d.ts +1 -0
  387. package/dist/tests/tray.test.js +37 -0
  388. package/dist/tests/tray.test.js.map +1 -0
  389. package/dist/tests/verification.test.d.ts +1 -0
  390. package/dist/tests/verification.test.js +61 -0
  391. package/dist/tests/verification.test.js.map +1 -0
  392. package/dist/tests/workflow-features.test.d.ts +1 -0
  393. package/dist/tests/workflow-features.test.js +82 -0
  394. package/dist/tests/workflow-features.test.js.map +1 -0
  395. package/dist/tests/workflow-safety.test.d.ts +1 -0
  396. package/dist/tests/workflow-safety.test.js +57 -0
  397. package/dist/tests/workflow-safety.test.js.map +1 -0
  398. package/docs/compatibility/baseline.json +1 -1
  399. package/docs/decisions/console-handoff.md +5 -0
  400. package/docs/releases/0.6.2.md +32 -0
  401. package/docs/releases/0.6.3.md +27 -0
  402. package/package.json +1 -1
  403. package/skills/bizar-omp/SKILL.md +2 -1
@@ -7,38 +7,355 @@ export function dashboardPageHtml() {
7
7
  <meta charset="utf-8" />
8
8
  <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover" />
9
9
  <meta name="color-scheme" content="dark light" />
10
+ <meta name="robots" content="noindex" />
10
11
  <title>Bizar OMP Dashboard</title>
11
12
  <style>
12
- :root{color-scheme:dark;--canvas:#090b0e;--surface:#0f1216;--raised:#151a20;--active:#172531;--border:#2d3742;--strong:#435262;--text:#ecf2f8;--muted:#91a0af;--faint:#667481;--accent:#00b4ff;--accent-ink:#001a25;--success:#57d38c;--warning:#f2bd62;--danger:#ff6b75;--focus:#8ad9ff;--shadow:0 18px 48px #00000047;--sans:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;--mono:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace}
13
- html[data-theme="light"]{color-scheme:light;--canvas:#eef3f7;--surface:#fff;--raised:#f7fafc;--active:#e4f5fc;--border:#c9d5df;--strong:#91a5b5;--text:#15212b;--muted:#526472;--faint:#738492;--accent:#007eb5;--accent-ink:#fff;--success:#187b45;--warning:#8b5a00;--danger:#bd2634;--focus:#005d86;--shadow:0 18px 48px #25384829}
14
- *{box-sizing:border-box}html,body{width:100%;min-height:100%}body{margin:0;overflow:hidden;background:var(--canvas);color:var(--text);font:14px/1.45 var(--sans)}button,input,textarea,select{font:inherit;color:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.5}:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.hidden{display:none!important}.app{height:100dvh;display:grid;grid-template-rows:64px minmax(0,1fr)}
15
- .masthead{display:flex;align-items:center;gap:16px;min-width:0;padding:0 18px;border-bottom:1px solid var(--border);background:var(--surface);z-index:5}.brand{display:flex;align-items:center;gap:11px;min-width:190px}.brand-mark{width:30px;height:30px;display:grid;place-items:center;border:1px solid var(--strong);border-radius:7px;color:var(--accent);font:700 19px/1 var(--mono)}.brand-name{font-weight:720;letter-spacing:-.02em}.eyebrow{color:var(--muted);font:600 10px/1.2 var(--mono);letter-spacing:.14em;text-transform:uppercase}.daemon-state{display:flex;align-items:center;gap:8px;min-width:0;color:var(--muted);font-size:12px}.daemon-state span:last-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status-dot{width:8px;height:8px;flex:0 0 auto;border-radius:50%;background:var(--faint);box-shadow:0 0 0 3px color-mix(in srgb,var(--faint) 16%,transparent)}.status-dot.live{background:var(--success);box-shadow:0 0 0 3px color-mix(in srgb,var(--success) 16%,transparent)}.status-dot.warn{background:var(--warning);box-shadow:0 0 0 3px color-mix(in srgb,var(--warning) 16%,transparent)}.masthead-actions{margin-left:auto;display:flex;align-items:center;gap:8px}
16
- .button{min-height:38px;border:1px solid var(--border);border-radius:7px;background:var(--raised);color:var(--text);padding:0 13px;display:inline-flex;align-items:center;justify-content:center;gap:8px;font-weight:620}.button:hover:not(:disabled){border-color:var(--strong);background:var(--active)}.button.primary{border-color:var(--accent);background:var(--accent);color:var(--accent-ink)}.button.primary:hover:not(:disabled){filter:brightness(1.08)}.button.danger{color:var(--danger)}.button.ghost{background:transparent}.button.icon{width:40px;padding:0;font:700 15px/1 var(--mono)}
17
- .workspace{min-height:0;display:grid;grid-template-columns:290px minmax(420px,1fr) 280px}.panel{min-width:0;min-height:0;background:var(--surface)}.session-panel{display:flex;flex-direction:column;border-right:1px solid var(--border)}.conversation-panel{display:grid;grid-template-rows:auto minmax(0,1fr) auto;background:var(--canvas)}.inspector-panel{overflow:auto;border-left:1px solid var(--border)}.panel-head{min-height:72px;padding:15px 16px 13px;border-bottom:1px solid var(--border)}.panel-title{display:flex;align-items:center;gap:9px;margin:3px 0 0;font-weight:700}.count{min-width:24px;padding:2px 7px;border-radius:999px;background:var(--raised);color:var(--muted);text-align:center;font:600 11px/1.5 var(--mono)}
18
- .search-wrap{padding:12px 12px 8px}.search,.field-input,.field-textarea{width:100%;border:1px solid var(--border);border-radius:7px;background:var(--raised);color:var(--text);padding:10px 11px}.search::placeholder,.field-input::placeholder,.field-textarea::placeholder{color:var(--faint)}.filters{display:flex;gap:6px;padding:0 12px 10px;overflow-x:auto;scrollbar-width:none}.filter{min-height:30px;white-space:nowrap;border:1px solid transparent;border-radius:999px;background:transparent;color:var(--muted);padding:0 9px;font-size:12px}.filter:hover,.filter.active{border-color:var(--border);background:var(--raised);color:var(--text)}.session-list{min-height:0;overflow-y:auto;padding:4px 8px 16px}.workspace-label{padding:13px 8px 6px;color:var(--faint);font:650 10px/1.2 var(--mono);letter-spacing:.1em;text-transform:uppercase;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-row{width:100%;min-height:62px;display:grid;grid-template-columns:10px minmax(0,1fr);gap:10px;align-items:start;border:1px solid transparent;border-radius:7px;background:transparent;color:inherit;padding:10px 9px;text-align:left}.session-row:hover{background:var(--raised)}.session-row.selected{border-color:color-mix(in srgb,var(--accent) 55%,var(--border));background:var(--active)}.session-row .status-dot{margin-top:6px;width:7px;height:7px}.session-name{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:670}.session-meta{display:flex;gap:7px;margin-top:4px;color:var(--muted);font:11px/1.3 var(--mono)}.empty{padding:26px 18px;color:var(--muted);text-align:center}.empty strong{display:block;margin-bottom:6px;color:var(--text)}
19
- .conversation-head{min-height:72px;display:flex;align-items:center;gap:14px;padding:12px 18px;border-bottom:1px solid var(--border);background:var(--surface)}.conversation-identity{min-width:0}.conversation-title{margin:2px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:17px;letter-spacing:-.015em}.conversation-actions{margin-left:auto;display:flex;gap:7px}.state-label{display:inline-flex;align-items:center;gap:7px;color:var(--muted);font:600 11px/1.2 var(--mono);text-transform:uppercase;letter-spacing:.08em}.console-wrap{min-height:0;position:relative;overflow:hidden;padding:12px}.console{width:100%;height:100%;margin:0;overflow:auto;border:1px solid var(--border);border-radius:8px;background:#080a0d;color:#dce7ef;padding:16px 18px 32px;white-space:pre-wrap;overflow-wrap:anywhere;font:12.5px/1.55 var(--mono);tab-size:2;scrollbar-color:#34404b #080a0d}html[data-theme="light"] .console{background:#17212a;color:#eaf2f7;border-color:#263745}.console-state{height:100%;display:grid;place-items:center;color:#8fa0ad;text-align:center}.console-state strong{display:block;color:#eaf2f7;margin-bottom:5px}.follow-button{position:absolute;right:28px;bottom:26px;min-height:34px;border:1px solid #3d4e5d;border-radius:999px;background:#17212a;color:#eaf2f7;padding:0 12px;box-shadow:var(--shadow)}
20
- .composer{border-top:1px solid var(--border);background:var(--surface);padding:12px 16px 14px}.composer-box{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:9px;align-items:end;border:1px solid var(--strong);border-radius:9px;background:var(--raised);padding:8px}.composer textarea{min-height:50px;max-height:160px;resize:vertical;border:0;outline:0;background:transparent;padding:7px 8px;line-height:1.45}.composer-meta{display:flex;justify-content:space-between;gap:10px;margin-top:7px;color:var(--faint);font-size:11px}.inspector-section{padding:18px 16px;border-bottom:1px solid var(--border)}.inspector-section h2{margin:0 0 13px;font-size:13px}.detail-list{display:grid;gap:13px;margin:0}.detail-list dt{margin-bottom:4px;color:var(--faint);font:600 10px/1.2 var(--mono);letter-spacing:.1em;text-transform:uppercase}.detail-list dd{margin:0;overflow-wrap:anywhere;color:var(--muted)}.mono{font-family:var(--mono);font-size:12px}.action-stack{display:grid;gap:8px}.action-stack .button{width:100%;justify-content:flex-start}.mobile-nav{display:none}
21
- dialog{width:min(520px,calc(100vw - 28px));max-height:min(760px,calc(100dvh - 28px));padding:0;overflow:auto;border:1px solid var(--strong);border-radius:10px;background:var(--surface);color:var(--text);box-shadow:var(--shadow)}dialog::backdrop{background:#030609ad;backdrop-filter:blur(2px)}.dialog-head{display:flex;align-items:flex-start;gap:16px;padding:19px 20px 15px;border-bottom:1px solid var(--border)}.dialog-head h2{margin:2px 0 0;font-size:17px}.dialog-head .button{margin-left:auto}.dialog-body{display:grid;gap:17px;padding:18px 20px}.dialog-foot{display:flex;justify-content:flex-end;gap:9px;padding:14px 20px 19px;border-top:1px solid var(--border)}.field{display:grid;gap:7px}.field-label{font-weight:650}.field-help{color:var(--muted);font-size:12px}.field-textarea{min-height:96px;resize:vertical}.setting-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px;align-items:center;padding:3px 0}.setting-row strong{display:block;margin-bottom:3px}.setting-row span{color:var(--muted);font-size:12px}.switch{width:46px;height:26px;position:relative;display:inline-flex}.switch input{position:absolute;opacity:0}.switch-track{width:46px;height:26px;border:1px solid var(--strong);border-radius:999px;background:var(--raised)}.switch-track::after{content:"";position:absolute;width:18px;height:18px;left:4px;top:4px;border-radius:50%;background:var(--muted);transition:transform .15s,background .15s}.switch input:checked+.switch-track{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 30%,var(--surface))}.switch input:checked+.switch-track::after{transform:translateX(20px);background:var(--accent)}.switch input:focus-visible+.switch-track{outline:2px solid var(--focus);outline-offset:2px}.toast{position:fixed;z-index:30;right:18px;bottom:18px;max-width:min(420px,calc(100vw - 36px));border:1px solid var(--strong);border-left:3px solid var(--success);border-radius:8px;background:var(--raised);padding:12px 14px;box-shadow:var(--shadow)}.toast.error{border-left-color:var(--danger)}
22
- @media(max-width:1099px) and (min-width:761px){.workspace{grid-template-columns:270px minmax(0,1fr);overflow:auto}.conversation-panel{min-height:calc(100dvh - 64px)}.inspector-panel{grid-column:2;border-left:0;border-top:1px solid var(--border);overflow:visible}}
23
- @media(max-width:760px){.app{grid-template-rows:58px minmax(0,1fr) 62px}.masthead{padding:0 12px;gap:10px}.brand{min-width:0}.brand-copy .eyebrow,.daemon-state,#theme-toggle{display:none}.masthead-actions .button{min-height:44px}#new-session-top{width:44px;padding:0;font-size:0}#new-session-top::before{content:"+";font:700 20px/1 var(--sans)}.workspace{display:block;min-height:0;overflow:hidden}.panel{height:100%;border:0}body[data-mobile-view="sessions"] .conversation-panel,body[data-mobile-view="sessions"] .inspector-panel,body[data-mobile-view="chat"] .session-panel,body[data-mobile-view="chat"] .inspector-panel,body[data-mobile-view="details"] .session-panel,body[data-mobile-view="details"] .conversation-panel{display:none}.conversation-head{min-height:66px;padding:10px 12px}.conversation-actions .button:not(.icon){display:none}.console-wrap{padding:8px}.console{padding:13px 12px 28px;font-size:12px}.composer{padding:9px 9px calc(10px + env(safe-area-inset-bottom))}.composer-box{grid-template-columns:minmax(0,1fr) 52px}.composer .button{min-height:44px;padding:0 10px}.composer-meta span:last-child{display:none}.mobile-nav{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--border);background:var(--surface);padding-bottom:env(safe-area-inset-bottom)}.mobile-nav button{min-height:54px;border:0;border-top:2px solid transparent;background:transparent;color:var(--muted);font-weight:650}.mobile-nav button.active{border-top-color:var(--accent);color:var(--text);background:var(--active)}dialog{width:100vw;max-width:none;height:100dvh;max-height:none;border:0;border-radius:0}.dialog-head .button,.dialog-foot .button{min-height:44px}.dialog-foot{padding-bottom:calc(19px + env(safe-area-inset-bottom))}.toast{right:10px;bottom:calc(72px + env(safe-area-inset-bottom));max-width:calc(100vw - 20px)}}
24
- .field-select{width:100%;border:1px solid var(--border);border-radius:7px;background:var(--raised);color:var(--text);padding:10px 11px}.runtime-grid{display:grid;grid-template-columns:minmax(0,1.5fr) repeat(2,minmax(0,1fr));gap:10px;padding:13px;border:1px solid var(--border);border-radius:8px;background:var(--canvas)}.runtime-heading{grid-column:1/-1}.runtime-note{grid-column:1/-1;color:var(--muted);font-size:12px}@media(max-width:760px){.runtime-grid{grid-template-columns:1fr}.runtime-heading,.runtime-note{grid-column:1}}
25
- @media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;transition:none!important}}
13
+ :root {
14
+ color-scheme: dark;
15
+ --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
16
+ --radius: 14px;
17
+ --track: 0.14em;
18
+ }
19
+ html[data-theme="dark"] {
20
+ color-scheme: dark;
21
+ --bg: #07080a;
22
+ --bg-glow: radial-gradient(1200px 600px at 78% -12%, rgba(255, 46, 166, 0.16), transparent 60%),
23
+ radial-gradient(900px 500px at 8% 0%, rgba(0, 180, 255, 0.10), transparent 55%);
24
+ --panel: #0f1116;
25
+ --panel-2: #14171d;
26
+ --panel-invert: #f4f5f7;
27
+ --text-invert: #0b0c10;
28
+ --line: #232833;
29
+ --text: #e7e9ee;
30
+ --muted: #8b93a3;
31
+ --accent: #ff2ea6;
32
+ --accent-2: #00b4ff;
33
+ --ok: #5fd68a;
34
+ --warn: #ffb347;
35
+ --err: #ff5f6d;
36
+ --shadow: none;
37
+ --shadow-overlay: 0 10px 30px rgba(0, 0, 0, 0.28);
38
+ }
39
+ html[data-theme="light"] {
40
+ color-scheme: 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
+ --shadow-overlay: 0 10px 30px rgba(20, 22, 26, 0.14);
57
+ }
58
+ * { box-sizing: border-box; }
59
+ html, body { width: 100%; height: 100%; }
60
+ body {
61
+ margin: 0;
62
+ overflow: hidden;
63
+ background: var(--bg);
64
+ background-image: var(--bg-glow);
65
+ background-attachment: fixed;
66
+ color: var(--text);
67
+ font-family: var(--mono);
68
+ font-size: 14px;
69
+ line-height: 1.45;
70
+ -webkit-font-smoothing: antialiased;
71
+ }
72
+ a { color: var(--accent-2); }
73
+ button, input, textarea, select { font: inherit; color: inherit; }
74
+ button { cursor: pointer; }
75
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
76
+ .hidden { display: none !important; }
77
+ .mono { font-family: var(--mono); }
78
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
79
+ ::-webkit-scrollbar-track { background: transparent; }
80
+ ::-webkit-scrollbar-thumb { background: var(--line); border-radius: 999px; }
81
+ .app { height: 100dvh; display: grid; grid-template-rows: auto minmax(0, 1fr) auto auto; }
82
+ .bar {
83
+ display: flex; align-items: center; justify-content: space-between; gap: 16px;
84
+ padding: 18px 28px; border-bottom: 1px solid var(--line);
85
+ position: sticky; top: 0; z-index: 5;
86
+ background: color-mix(in srgb, var(--bg) 88%, transparent);
87
+ backdrop-filter: blur(10px);
88
+ }
89
+ .brand { display: flex; align-items: center; gap: 10px; font-size: 12px; letter-spacing: var(--track); text-transform: uppercase; }
90
+ .brand-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 12px var(--accent); flex: none; }
91
+ .brand-name { font-weight: 700; }
92
+ .brand-sub { color: var(--muted); }
93
+ .bar-right { display: flex; align-items: center; gap: 10px; }
94
+ .chip {
95
+ display: inline-flex; align-items: center; gap: 7px;
96
+ border: 1px solid var(--line); border-radius: 999px;
97
+ padding: 5px 12px; font-size: 10px; letter-spacing: var(--track); text-transform: uppercase;
98
+ color: var(--muted); background: var(--panel); white-space: nowrap;
99
+ }
100
+ .state-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--muted); flex: none; }
101
+ .dot-ok { background: var(--ok); box-shadow: 0 0 10px var(--ok); }
102
+ .dot-warn { background: var(--warn); }
103
+ .dot-err { background: var(--err); }
104
+ .dot-muted { background: var(--muted); }
105
+ .btn {
106
+ border: 1px solid var(--line); background: var(--panel); color: var(--text);
107
+ border-radius: var(--radius); padding: 8px 13px;
108
+ font-family: var(--mono); font-size: 10px; letter-spacing: var(--track); text-transform: uppercase; cursor: pointer;
109
+ }
110
+ .btn:hover { border-color: var(--accent); color: var(--accent); }
111
+ .btn.primary { border-color: var(--accent); color: var(--accent); }
112
+ .btn.primary:hover { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent); }
113
+ .btn.danger { border-color: var(--err); color: var(--err); }
114
+ .btn.danger:hover { border-color: var(--err); color: var(--err); background: color-mix(in srgb, var(--err) 10%, transparent); }
115
+ .btn.ghost { background: transparent; color: var(--muted); }
116
+ .btn.ghost:hover { color: var(--accent); }
117
+ .btn.icon { padding: 8px 11px; }
118
+ .btn:disabled { opacity: 0.45; cursor: not-allowed; }
119
+ .panes {
120
+ display: grid; min-height: 0;
121
+ grid-template-columns: minmax(240px, 300px) minmax(0, 1fr) minmax(256px, 320px);
122
+ }
123
+ .pane { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
124
+ .pane + .pane { border-left: 1px solid var(--line); }
125
+ .pane-head {
126
+ display: flex; align-items: baseline; justify-content: space-between; gap: 8px;
127
+ padding: 16px 16px 12px; border-bottom: 1px solid var(--line);
128
+ }
129
+ .label { font-size: 10px; letter-spacing: var(--track); text-transform: uppercase; color: var(--muted); }
130
+ .pane-title { display: inline-flex; align-items: center; gap: 8px; font-size: 12px; letter-spacing: var(--track); text-transform: uppercase; }
131
+ .count {
132
+ border: 1px solid var(--line); border-radius: 999px; padding: 1px 8px;
133
+ background: var(--panel); font-size: 10px; letter-spacing: var(--track); color: var(--muted);
134
+ }
135
+ .card {
136
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
137
+ padding: 12px 16px; box-shadow: var(--shadow);
138
+ }
139
+ .card.invert { background: var(--panel-invert); border-color: var(--panel-invert); color: var(--text-invert); }
140
+ .card.invert .label { color: color-mix(in srgb, var(--text-invert) 62%, transparent); }
141
+ .search-wrap { padding: 12px 16px 8px; }
142
+ input, textarea, select {
143
+ font-family: var(--mono); font-size: 13px; color: var(--text); background: var(--panel-2);
144
+ border: 1px solid var(--line); border-radius: var(--radius); padding: 8px 11px; width: 100%;
145
+ }
146
+ input:focus, textarea:focus, select:focus { outline: 1px solid var(--accent); outline-offset: 1px; border-color: var(--accent); }
147
+ textarea { min-height: 64px; resize: vertical; }
148
+ .field-input, .field-select, .field-textarea { font-family: var(--mono); }
149
+ .field-select { width: auto; min-width: 150px; }
150
+ .field-textarea { min-height: 62px; resize: vertical; }
151
+ .filters { display: flex; gap: 8px; flex-wrap: wrap; padding: 0 16px 12px; }
152
+ .filter {
153
+ border: 1px solid var(--line); background: var(--panel); color: var(--muted);
154
+ border-radius: 999px; padding: 5px 12px; font-family: var(--mono); font-size: 10px;
155
+ letter-spacing: 0.12em; text-transform: uppercase; cursor: pointer;
156
+ }
157
+ .filter:hover { border-color: var(--accent); color: var(--accent); }
158
+ .filter.active { color: var(--text); border-color: var(--accent); }
159
+ .session-list { flex: 1; min-height: 0; overflow-y: auto; padding: 8px 16px 16px; }
160
+ .workspace-label {
161
+ padding: 0 0 8px; border-bottom: 1px solid var(--line); margin: 8px 0 12px;
162
+ font-size: 11px; color: var(--muted); word-break: break-all;
163
+ }
164
+ .session-row {
165
+ display: grid; grid-template-columns: 12px minmax(0, 1fr); gap: 12px; align-items: center;
166
+ width: 100%; text-align: left; padding: 10px 14px; margin-bottom: 8px;
167
+ color: var(--text);
168
+ }
169
+ .session-row:hover { border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); }
170
+ .session-row.selected { border-color: var(--accent); background: var(--panel-2); }
171
+ .session-name { display: block; font-size: 13px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
172
+ .session-meta {
173
+ display: flex; gap: 8px; margin-top: 4px; font-size: 10px; color: var(--muted);
174
+ letter-spacing: var(--track); text-transform: uppercase;
175
+ }
176
+ .empty {
177
+ border: 1px dashed var(--line); border-radius: var(--radius); padding: 34px 24px;
178
+ text-align: center; color: var(--muted); font-size: 12px;
179
+ }
180
+ .empty strong {
181
+ display: block; margin-bottom: 8px; color: var(--text);
182
+ font-size: 10px; letter-spacing: var(--track); text-transform: uppercase;
183
+ }
184
+ .notice {
185
+ border: 1px solid var(--err); border-radius: var(--radius); padding: 11px 14px;
186
+ color: var(--err); background: color-mix(in srgb, var(--err) 8%, transparent); font-size: 12px;
187
+ }
188
+ .notice strong { display: block; margin-bottom: 4px; font-size: 10px; letter-spacing: var(--track); text-transform: uppercase; }
189
+ .conversation-head {
190
+ display: flex; align-items: center; justify-content: space-between; gap: 16px;
191
+ padding: 16px 24px; border-bottom: 1px solid var(--line);
192
+ }
193
+ .conversation-identity { min-width: 0; }
194
+ .state-label {
195
+ display: inline-flex; align-items: center; gap: 8px;
196
+ font-size: 10px; letter-spacing: var(--track); text-transform: uppercase; color: var(--muted);
197
+ }
198
+ .conversation-title {
199
+ margin: 4px 0 0; font-size: 16px; font-weight: 650;
200
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
201
+ }
202
+ .conversation-actions { display: flex; gap: 8px; flex: none; }
203
+ .console-wrap { position: relative; flex: 1; min-height: 0; display: flex; }
204
+ .console {
205
+ margin: 0; flex: 1; min-height: 0; overflow: auto; padding: 16px 24px;
206
+ font-family: var(--mono); font-size: 12px; line-height: 1.5; tab-size: 2;
207
+ white-space: pre-wrap; word-break: break-word;
208
+ }
209
+ .console-state { display: block; color: var(--muted); font-size: 12px; }
210
+ .console-state strong {
211
+ display: block; margin-bottom: 8px; color: var(--text);
212
+ font-size: 10px; letter-spacing: var(--track); text-transform: uppercase;
213
+ }
214
+ .follow-button {
215
+ position: absolute; right: 16px; bottom: 16px; display: inline-flex; align-items: center;
216
+ border: 1px solid var(--accent); background: var(--panel); color: var(--accent);
217
+ border-radius: 999px; padding: 8px 13px; font-family: var(--mono); font-size: 10px;
218
+ letter-spacing: var(--track); text-transform: uppercase; cursor: pointer;
219
+ box-shadow: var(--shadow-overlay);
220
+ }
221
+ .composer { display: grid; gap: 10px; padding: 14px 24px 16px; border-top: 1px solid var(--line); }
222
+ .composer-box { display: flex; gap: 8px; align-items: flex-end; }
223
+ .composer-box textarea { flex: 1; min-height: 48px; max-height: 168px; }
224
+ .composer-meta {
225
+ display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
226
+ font-size: 10px; letter-spacing: var(--track); text-transform: uppercase; color: var(--muted);
227
+ }
228
+ .composer-runtime { display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; }
229
+ .composer-runtime .field { display: grid; gap: 3px; }
230
+ .composer-runtime .field-label { font-size: 9px; }
231
+ .composer-runtime select { width: auto; min-width: 132px; padding: 6px 9px; font-size: 11px; }
232
+ #inspector { flex: 1; min-height: 0; overflow-y: auto; padding: 16px 24px 24px; }
233
+ .inspector-section { margin-bottom: 24px; }
234
+ .inspector-section h2 {
235
+ margin: 0 0 12px; padding-bottom: 8px; border-bottom: 1px solid var(--line);
236
+ font-size: 10px; letter-spacing: var(--track); text-transform: uppercase; color: var(--muted);
237
+ }
238
+ .detail-list { margin: 0; display: grid; gap: 12px; }
239
+ .detail-list > div { display: grid; gap: 4px; min-width: 0; }
240
+ .detail-list dt { font-size: 10px; letter-spacing: var(--track); text-transform: uppercase; color: var(--muted); }
241
+ .detail-list dd { margin: 0; font-size: 12px; word-break: break-all; }
242
+ .action-stack { display: grid; gap: 8px; }
243
+ .action-stack .btn { width: 100%; }
244
+ dialog {
245
+ border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel);
246
+ color: var(--text); padding: 0; width: min(560px, 92vw); font-family: var(--mono);
247
+ box-shadow: var(--shadow-overlay);
248
+ }
249
+ dialog::backdrop { background: rgba(4, 5, 8, 0.62); }
250
+ .dialog-head {
251
+ display: flex; align-items: flex-start; justify-content: space-between; gap: 16px;
252
+ padding: 16px 24px 0;
253
+ }
254
+ .dialog-head h2 { margin: 4px 0 0; font-size: 15px; font-weight: 650; }
255
+ .dialog-body { display: grid; gap: 16px; padding: 16px 24px; max-height: 68vh; overflow-y: auto; }
256
+ .dialog-foot { display: flex; justify-content: flex-end; gap: 8px; padding: 8px 24px 16px; }
257
+ .field { display: grid; gap: 8px; }
258
+ .field-label { font-size: 10px; letter-spacing: var(--track); text-transform: uppercase; color: var(--muted); }
259
+ .field-help, .runtime-note { margin: 0; font-size: 11px; color: var(--muted); }
260
+ .runtime-grid {
261
+ display: grid; gap: 16px; padding: 16px;
262
+ grid-template-columns: repeat(auto-fit, minmax(152px, 1fr));
263
+ }
264
+ .runtime-heading { grid-column: 1 / -1; display: grid; gap: 4px; }
265
+ .runtime-heading strong { font-size: 10px; letter-spacing: var(--track); text-transform: uppercase; }
266
+ .runtime-note { grid-column: 1 / -1; }
267
+ .setting-row {
268
+ display: flex; align-items: center; justify-content: space-between; gap: 16px;
269
+ }
270
+ .setting-row > span { font-size: 11px; color: var(--muted); text-transform: none; letter-spacing: 0.01em; }
271
+ .setting-row strong {
272
+ display: block; margin-bottom: 4px; color: var(--text);
273
+ font-size: 10px; letter-spacing: var(--track); text-transform: uppercase;
274
+ }
275
+ .switch { position: relative; flex: none; display: inline-block; width: 40px; height: 24px; }
276
+ .switch input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; }
277
+ .switch-track {
278
+ display: block; width: 40px; height: 24px; border-radius: 999px;
279
+ border: 1px solid var(--line); background: var(--panel-2);
280
+ }
281
+ .switch-track::after {
282
+ content: ""; position: absolute; top: 4px; left: 4px; width: 16px; height: 16px;
283
+ border-radius: 50%; background: var(--muted); transition: transform 0.14s ease, background 0.14s ease;
284
+ }
285
+ .switch input:checked + .switch-track { border-color: var(--accent); }
286
+ .switch input:checked + .switch-track::after { transform: translateX(16px); background: var(--accent); }
287
+ .switch input:focus-visible + .switch-track { outline: 2px solid var(--accent); outline-offset: 2px; }
288
+ .toast {
289
+ position: fixed; right: 22px; bottom: 22px; max-width: 460px; z-index: 20;
290
+ background: var(--panel); border: 1px solid var(--accent); border-radius: var(--radius);
291
+ padding: 11px 14px; font-size: 12px; box-shadow: var(--shadow-overlay);
292
+ }
293
+ .toast.error { border-color: var(--err); color: var(--err); }
294
+ .mobile-nav { display: none; border-top: 1px solid var(--line); background: var(--panel); }
295
+ .mobile-nav button {
296
+ flex: 1; border: 0; background: transparent; color: var(--muted);
297
+ padding: 12px 8px; font-family: var(--mono); font-size: 10px;
298
+ letter-spacing: var(--track); text-transform: uppercase;
299
+ }
300
+ .mobile-nav button.active { color: var(--accent); }
301
+ footer {
302
+ display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap;
303
+ padding: 10px 28px; border-top: 1px solid var(--line);
304
+ color: var(--muted); font-size: 10px; letter-spacing: var(--track); text-transform: uppercase;
305
+ }
306
+ @media (max-width: 1099px) {
307
+ .panes { grid-template-columns: minmax(224px, 288px) minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) auto; }
308
+ .detail-pane {
309
+ grid-column: 1 / -1; border-left: 0; border-top: 1px solid var(--line);
310
+ max-height: 40vh;
311
+ }
312
+ }
313
+ @media (max-width: 759px) {
314
+ .panes { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); }
315
+ .pane { display: none; }
316
+ .pane + .pane { border-left: 0; }
317
+ .detail-pane { grid-column: auto; border-top: 0; max-height: none; }
318
+ body[data-mobile-view="sessions"] .rail { display: flex; }
319
+ body[data-mobile-view="chat"] .console-pane { display: flex; }
320
+ body[data-mobile-view="details"] .detail-pane { display: flex; }
321
+ .mobile-nav { display: flex; position: sticky; bottom: 0; }
322
+ .bar { flex-wrap: wrap; padding: 14px 16px; }
323
+ .bar-right { flex-wrap: wrap; justify-content: flex-end; }
324
+ .brand-sub { display: none; }
325
+ .conversation-head, .composer, #inspector { padding-left: 16px; padding-right: 16px; }
326
+ .console { padding: 16px; }
327
+ .composer-runtime { width: 100%; }
328
+ .composer-runtime .field { flex: 1; min-width: 116px; }
329
+ .composer-runtime select { width: 100%; min-width: 0; }
330
+ dialog {
331
+ width: 100vw; max-width: none; height: 100dvh; max-height: none;
332
+ border: 0; border-radius: 0; padding-bottom: env(safe-area-inset-bottom, 0px);
333
+ }
334
+ .dialog-body { max-height: none; }
335
+ footer { display: none; }
336
+ }
337
+ @media (pointer: coarse) {
338
+ .btn, .filter, .mobile-nav button, input, select { min-height: 44px; }
339
+ .composer-runtime select { min-height: 44px; }
340
+ }
341
+ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { scroll-behavior: auto !important; transition: none !important; } }
26
342
  </style>
27
343
  </head>
28
344
  <body data-mobile-view="sessions">
29
345
  <div class="app">
30
- <header class="masthead"><div class="brand"><div class="brand-mark" aria-hidden="true">π</div><div class="brand-copy"><div class="brand-name">Bizar OMP</div><div class="eyebrow">OMB DASHBOARD</div></div></div><div class="daemon-state" id="daemon-state"><span class="status-dot"></span><span>Connecting to local daemon</span></div><div class="masthead-actions"><button class="button ghost" id="theme-toggle" type="button">Light theme</button><button class="button icon" id="settings-open" type="button" aria-label="Open settings" title="Settings">⚙</button><button class="button primary" id="new-session-top" type="button">New session</button></div></header>
31
- <main class="workspace">
32
- <aside class="panel session-panel" aria-label="Sessions"><div class="panel-head"><div class="eyebrow">Workspace</div><div class="panel-title">Sessions <span class="count" id="session-count">0</span></div></div><div class="search-wrap"><input class="search" id="session-search" type="search" placeholder="Find a session" aria-label="Find a session" /></div><div class="filters" id="filters" aria-label="Filter sessions"></div><div class="session-list" id="session-list"><div class="empty"><strong>Loading sessions</strong>Reading the local daemon snapshot.</div></div></aside>
33
- <section class="panel conversation-panel" aria-label="Session chat"><header class="conversation-head"><div class="conversation-identity"><div class="state-label" id="session-state"><span class="status-dot"></span><span>No session selected</span></div><h1 class="conversation-title" id="conversation-title">Choose a session</h1></div><div class="conversation-actions"><button class="button ghost" id="console-refresh" type="button" disabled>Refresh</button><button class="button" id="attach-top" type="button" disabled>Open terminal</button></div></header><div class="console-wrap"><pre class="console" id="console" tabindex="0" aria-label="Live session console"><span class="console-state"><span><strong>No session open</strong>Select a session to read its live console and send a message.</span></span></pre><button class="follow-button hidden" id="console-follow" type="button">Jump to latest</button></div><form class="composer" id="composer"><div class="composer-box"><textarea id="composer-input" placeholder="Send a message to the selected session" aria-label="Message" disabled></textarea><button class="button primary" id="composer-send" type="submit" disabled>Send</button></div><div class="composer-meta"><span id="composer-status">Select a live session to begin.</span><span>Ctrl Enter to send</span></div></form></section>
34
- <aside class="panel inspector-panel" aria-label="Session details"><div class="panel-head"><div class="eyebrow">Selected session</div><div class="panel-title">Details</div></div><div id="inspector"><div class="empty"><strong>Nothing selected</strong>Session identity and controls appear here.</div></div></aside>
346
+ <header class="bar"><div class="brand"><span class="brand-dot" aria-hidden="true"></span><span class="brand-name">Bizar OMP</span><span class="brand-sub">OMB DASHBOARD</span></div><div class="bar-right"><span class="chip" id="daemon-state"><span class="state-dot"></span><span>Connecting to local daemon</span></span><button class="btn ghost" id="theme-toggle" type="button">Light theme</button><button class="btn ghost" id="settings-open" type="button" title="Settings">Settings</button><button class="btn primary" id="new-session-top" type="button">New session</button></div></header>
347
+ <main class="panes">
348
+ <aside class="pane rail" aria-label="Sessions"><div class="pane-head"><span class="label">Workspace</span><span class="pane-title">Sessions <span class="count" id="session-count">0</span></span></div><div class="search-wrap"><input class="search" id="session-search" type="search" placeholder="Find a session" aria-label="Find a session" /></div><div class="filters" id="filters" aria-label="Filter sessions"></div><div class="session-list" id="session-list"><div class="empty"><strong>Loading sessions</strong>Reading the local daemon snapshot.</div></div></aside>
349
+ <section class="pane console-pane" aria-label="Session chat"><header class="conversation-head"><div class="conversation-identity"><div class="state-label" id="session-state"><span class="state-dot"></span><span>No session selected</span></div><h1 class="conversation-title" id="conversation-title">Choose a session</h1></div><div class="conversation-actions"><button class="btn ghost" id="console-refresh" type="button" disabled>Refresh</button><button class="btn" id="attach-top" type="button" disabled>Open terminal</button></div></header><div class="console-wrap"><pre class="console" id="console" tabindex="0" aria-label="Live session console"><span class="console-state"><span><strong>No session open</strong>Select a session to read its live console and send a message.</span></span></pre><button class="follow-button hidden" id="console-follow" type="button">Jump to latest</button></div><form class="composer" id="composer"><div class="composer-box"><textarea id="composer-input" placeholder="Send a message to the selected session" aria-label="Message" disabled></textarea><button class="btn primary" id="composer-send" type="submit" disabled>Send</button></div><div class="composer-meta"><span id="composer-status" role="status">Select a live session to begin.</span><div class="composer-runtime" role="group" aria-label="Launch defaults"><label class="field"><span class="field-label">Model</span><select class="field-select" id="composer-model" aria-describedby="composer-runtime-hint"><option value="">OMP default</option></select></label><label class="field"><span class="field-label">Effort</span><select class="field-select" id="composer-thinking" aria-describedby="composer-runtime-hint"><option value="">OMP default</option><option>off</option><option>minimal</option><option>low</option><option>medium</option><option>high</option><option>xhigh</option><option>max</option><option>auto</option></select></label><label class="field"><span class="field-label">Permissions</span><select class="field-select" id="composer-permission" aria-describedby="composer-runtime-hint"><option value="">OMP default</option><option value="always-ask">Always ask</option><option value="write">Allow workspace writes</option><option value="yolo">Auto approve all</option></select></label></div><span>Ctrl Enter to send</span></div><p class="runtime-note" id="composer-runtime-hint">Launch defaults for sessions the dashboard starts: model, effort, and permission mode. Sessions that are already running keep their own runtime.</p></form></section>
350
+ <aside class="pane detail-pane" aria-label="Session details"><div class="pane-head"><span class="label">Selected session</span><span class="pane-title">Details</span></div><div id="inspector"><div class="empty"><strong>Nothing selected</strong>Session identity and controls appear here.</div></div></aside>
35
351
  </main>
36
352
  <nav class="mobile-nav" aria-label="Dashboard views"><button type="button" data-view="sessions" class="active">Sessions</button><button type="button" data-view="chat">Chat</button><button type="button" data-view="details">Details</button></nav>
353
+ <footer><span>Bizar OMP &middot; localhost only &middot; token gated</span><span>PolderLabs</span></footer>
37
354
  </div>
38
- <dialog id="create-dialog" aria-labelledby="create-title"><form method="dialog"><div class="dialog-head"><div><div class="eyebrow">Launch</div><h2 id="create-title">New session</h2></div><button class="button icon ghost" value="cancel" aria-label="Close">×</button></div><div class="dialog-body"><label class="field"><span class="field-label">Project directory</span><input class="field-input" id="create-cwd" list="workspace-list" placeholder="/path/to/project" autocomplete="off" required /><span class="field-help">Must be an existing directory on this machine.</span></label><datalist id="workspace-list"></datalist><label class="field"><span class="field-label">First message</span><textarea class="field-textarea" id="create-task" placeholder="Describe the work for this session"></textarea></label><label class="field"><span class="field-label">Session label</span><input class="field-input" id="create-id" placeholder="Optional, for example review" autocomplete="off" /></label><section class="runtime-grid" aria-labelledby="runtime-title"><div class="runtime-heading"><div class="eyebrow">Session runtime</div><strong id="runtime-title">Model and permissions</strong></div><label class="field"><span class="field-label">Model</span><select class="field-select" id="create-model"><option value="">OMP default</option></select></label><label class="field"><span class="field-label">Thinking</span><select class="field-select" id="create-thinking"><option value="">OMP default</option><option>off</option><option>minimal</option><option>low</option><option>medium</option><option>high</option><option>xhigh</option><option>max</option><option>auto</option></select></label><label class="field"><span class="field-label">Permissions</span><select class="field-select" id="create-permission"><option value="">OMP default</option><option value="always-ask">Always ask</option><option value="write">Allow workspace writes</option><option value="yolo">Auto approve all</option></select></label><div class="runtime-note" id="model-status">Loading models from OMP.</div></section></div><div class="dialog-foot"><button class="button" value="cancel">Cancel</button><button class="button primary" value="create">Create session</button></div></form></dialog>
39
- <dialog id="rename-dialog" aria-labelledby="rename-title"><form method="dialog"><div class="dialog-head"><div><div class="eyebrow">Identity</div><h2 id="rename-title">Rename session</h2></div><button class="button icon ghost" value="cancel" aria-label="Close">×</button></div><div class="dialog-body"><label class="field"><span class="field-label">Session label</span><input class="field-input" id="rename-id" autocomplete="off" required /></label></div><div class="dialog-foot"><button class="button" value="cancel">Cancel</button><button class="button primary" value="rename">Rename</button></div></form></dialog>
40
- <dialog id="stop-dialog" aria-labelledby="stop-title"><form method="dialog"><div class="dialog-head"><div><div class="eyebrow">Destructive action</div><h2 id="stop-title">Stop session</h2></div><button class="button icon ghost" value="cancel" aria-label="Close">×</button></div><div class="dialog-body"><p id="stop-text" style="margin:0">This ends the tmux session and its agent work.</p></div><div class="dialog-foot"><button class="button" value="cancel">Keep running</button><button class="button danger" value="stop">Stop session</button></div></form></dialog>
41
- <dialog id="settings-dialog" aria-labelledby="settings-title"><form method="dialog"><div class="dialog-head"><div><div class="eyebrow">Configuration</div><h2 id="settings-title">Dashboard settings</h2></div><button class="button icon ghost" value="cancel" aria-label="Close">×</button></div><div class="dialog-body"><label class="field"><span class="field-label">Projects folder</span><input class="field-input" id="setting-projects" placeholder="/path/to/projects" autocomplete="off" /><span class="field-help">Pre-fills the project directory when creating a session.</span></label><section class="runtime-grid" aria-labelledby="defaults-title"><div class="runtime-heading"><div class="eyebrow">New session defaults</div><strong id="defaults-title">Runtime controls</strong></div><label class="field"><span class="field-label">Model</span><select class="field-select" id="setting-model"><option value="">OMP default</option></select></label><label class="field"><span class="field-label">Thinking</span><select class="field-select" id="setting-thinking"><option value="">OMP default</option><option>off</option><option>minimal</option><option>low</option><option>medium</option><option>high</option><option>xhigh</option><option>max</option><option>auto</option></select></label><label class="field"><span class="field-label">Permissions</span><select class="field-select" id="setting-permission"><option value="">OMP default</option><option value="always-ask">Always ask</option><option value="write">Allow workspace writes</option><option value="yolo">Auto approve all</option></select></label><div class="runtime-note">Applied when the dashboard creates a session. Existing sessions keep their current runtime.</div></section><label class="setting-row"><span><strong>Attach latest session</strong>Reconnect plain omb launches to the latest live session.</span><span class="switch"><input id="setting-attach" type="checkbox" /><span class="switch-track"></span></span></label><label class="setting-row"><span><strong>Mouse forwarding</strong>Enable scrolling and pointer events in OMP tmux sessions.</span><span class="switch"><input id="setting-mouse" type="checkbox" /><span class="switch-track"></span></span></label><label class="setting-row"><span><strong>Show stopped sessions</strong>Include recent stopped work in the session rail.</span><span class="switch"><input id="setting-stopped" type="checkbox" /><span class="switch-track"></span></span></label><label class="setting-row"><span><strong>System tray</strong>Keep native quick access available when supported.</span><span class="switch"><input id="setting-tray" type="checkbox" /><span class="switch-track"></span></span></label><div class="field-help" id="settings-status" role="status">Changes are stored in your Bizar OMP configuration.</div></div><div class="dialog-foot"><button class="button" value="cancel">Cancel</button><button class="button primary" value="save">Save settings</button></div></form></dialog>
355
+ <dialog id="create-dialog" aria-labelledby="create-title"><form method="dialog"><div class="dialog-head"><div><div class="label">Launch</div><h2 id="create-title">New session</h2></div><button class="btn icon ghost" value="cancel" aria-label="Close">×</button></div><div class="dialog-body"><label class="field"><span class="field-label">Project directory</span><input class="field-input" id="create-cwd" list="workspace-list" placeholder="/path/to/project" autocomplete="off" required /><span class="field-help">Must be an existing directory on this machine.</span></label><datalist id="workspace-list"></datalist><label class="field"><span class="field-label">First message</span><textarea class="field-textarea" id="create-task" placeholder="Describe the work for this session"></textarea></label><label class="field"><span class="field-label">Session label</span><input class="field-input" id="create-id" placeholder="Optional, for example review" autocomplete="off" /></label><section class="runtime-grid" aria-labelledby="runtime-title"><div class="runtime-heading"><div class="label">Session runtime</div><strong id="runtime-title">Model and permissions</strong></div><label class="field"><span class="field-label">Model</span><select class="field-select" id="create-model"><option value="">OMP default</option></select></label><label class="field"><span class="field-label">Thinking</span><select class="field-select" id="create-thinking"><option value="">OMP default</option><option>off</option><option>minimal</option><option>low</option><option>medium</option><option>high</option><option>xhigh</option><option>max</option><option>auto</option></select></label><label class="field"><span class="field-label">Permissions</span><select class="field-select" id="create-permission"><option value="">OMP default</option><option value="always-ask">Always ask</option><option value="write">Allow workspace writes</option><option value="yolo">Auto approve all</option></select></label><div class="runtime-note" id="model-status">Loading models from OMP.</div></section></div><div class="dialog-foot"><button class="btn" value="cancel">Cancel</button><button class="btn primary" value="create">Create session</button></div></form></dialog>
356
+ <dialog id="rename-dialog" aria-labelledby="rename-title"><form method="dialog"><div class="dialog-head"><div><div class="label">Identity</div><h2 id="rename-title">Rename session</h2></div><button class="btn icon ghost" value="cancel" aria-label="Close">×</button></div><div class="dialog-body"><label class="field"><span class="field-label">Session label</span><input class="field-input" id="rename-id" autocomplete="off" required /></label></div><div class="dialog-foot"><button class="btn" value="cancel">Cancel</button><button class="btn primary" value="rename">Rename</button></div></form></dialog>
357
+ <dialog id="stop-dialog" aria-labelledby="stop-title"><form method="dialog"><div class="dialog-head"><div><div class="label">Destructive action</div><h2 id="stop-title">Stop session</h2></div><button class="btn icon ghost" value="cancel" aria-label="Close">×</button></div><div class="dialog-body"><p id="stop-text" style="margin:0">This ends the tmux session and its agent work.</p></div><div class="dialog-foot"><button class="btn" value="cancel">Keep running</button><button class="btn danger" value="stop">Stop session</button></div></form></dialog>
358
+ <dialog id="settings-dialog" aria-labelledby="settings-title"><form method="dialog"><div class="dialog-head"><div><div class="label">Configuration</div><h2 id="settings-title">Dashboard settings</h2></div><button class="btn icon ghost" value="cancel" aria-label="Close">×</button></div><div class="dialog-body"><label class="field"><span class="field-label">Projects folder</span><input class="field-input" id="setting-projects" placeholder="/path/to/projects" autocomplete="off" /><span class="field-help">Pre-fills the project directory when creating a session.</span></label><label class="card setting-row"><span><strong>Attach latest session</strong>Reconnect plain omb launches to the latest live session.</span><span class="switch"><input id="setting-attach" type="checkbox" /><span class="switch-track"></span></span></label><label class="card setting-row"><span><strong>Mouse forwarding</strong>Enable scrolling and pointer events in OMP tmux sessions.</span><span class="switch"><input id="setting-mouse" type="checkbox" /><span class="switch-track"></span></span></label><label class="card setting-row"><span><strong>Show stopped sessions</strong>Include recent stopped work in the session rail.</span><span class="switch"><input id="setting-stopped" type="checkbox" /><span class="switch-track"></span></span></label><label class="card setting-row"><span><strong>System tray</strong>Keep native quick access available when supported.</span><span class="switch"><input id="setting-tray" type="checkbox" /><span class="switch-track"></span></span></label><div class="field-help" id="settings-status" role="status">Changes are stored in your Bizar OMP configuration.</div></div><div class="dialog-foot"><button class="btn" value="cancel">Cancel</button><button class="btn primary" value="save">Save settings</button></div></form></dialog>
42
359
  <div class="toast hidden" id="toast" role="status" aria-live="polite"></div>
43
360
  <script>
44
361
  (function(){"use strict";
@@ -46,7 +363,7 @@ var token="",sessions=[],models=[],selectedName="",filter="all",query="",project
46
363
  function byId(id){return document.getElementById(id)}
47
364
  function esc(value){return String(value==null?"":value).replace(/[&<>"']/g,function(c){if(c==="&")return"&amp;";if(c==="<")return"&lt;";if(c===">")return"&gt;";if(c.charCodeAt(0)===34)return"&quot;";return"&#39;"})}
48
365
  function err(error){return error&&error.message?error.message:"Unexpected error"}
49
- function toast(message,isError){var n=byId("toast");n.textContent=message;n.classList.toggle("error",Boolean(isError));n.classList.remove("hidden");clearTimeout(n._hide);n._hide=setTimeout(function(){n.classList.add("hidden")},4800)}
366
+ function toast(message,isError){var n=byId("toast");n.textContent=message;n.setAttribute("role",isError?"alert":"status");n.setAttribute("aria-live",isError?"assertive":"polite");n.classList.toggle("error",Boolean(isError));n.classList.remove("hidden");clearTimeout(n._hide);n._hide=setTimeout(function(){n.classList.add("hidden")},4800)}
50
367
  function api(path,options){var next=options||{};next.headers=Object.assign({authorization:"Bearer "+token,"content-type":"application/json"},next.headers||{});return fetch(path,next)}
51
368
  function apiJson(path,options){return api(path,options).then(function(response){return response.json().catch(function(){return{}}).then(function(body){if(!response.ok)throw new Error(body.error||("Request failed with "+response.status));return body})})}
52
369
  function post(path,body,method){return apiJson(path,{method:method||"POST",body:JSON.stringify(body||{})})}
@@ -54,40 +371,45 @@ function epochMs(value){return!value?0:value<100000000000?value*1000:value}
54
371
  function age(value){var d=Math.max(0,Date.now()-epochMs(value));if(!value)return"unknown";if(d<60000)return"now";if(d<3600000)return Math.floor(d/60000)+"m";if(d<86400000)return Math.floor(d/3600000)+"h";return Math.floor(d/86400000)+"d"}
55
372
  function date(value){return value?new Date(epochMs(value)).toLocaleString([],{dateStyle:"medium",timeStyle:"short"}):"Unknown"}
56
373
  function selected(){return sessions.find(function(s){return s.name===selectedName})}
57
- function title(s){return s.id||s.project||s.name}
374
+ function title(s){return s.displayName||s.id||s.project||s.name}
58
375
  function available(s){return Boolean(s&&s.state!=="stopped"&&s.hosted!==false)}
59
- function tone(state){return state==="working"||state==="connected"?"live":state==="waiting"||state==="disconnected"?"warn":""}
376
+ function tone(state){return state==="working"||state==="connected"?"dot-ok":state==="error"?"dot-err":state==="waiting"||state==="disconnected"?"dot-warn":"dot-muted"}
60
377
  function mobile(view){document.body.setAttribute("data-mobile-view",view);document.querySelectorAll("[data-view]").forEach(function(b){b.classList.toggle("active",b.dataset.view===view)})}
61
- function visible(){var needle=query.toLowerCase();return sessions.filter(function(s){return(filter==="all"||s.state===filter)&&(!needle||[s.name,s.id,s.project,s.cwd,s.state].join(" ").toLowerCase().includes(needle))})}
378
+ function visible(){var needle=query.toLowerCase();return sessions.filter(function(s){return(filter==="all"||s.state===filter)&&(!needle||[s.displayName,s.name,s.id,s.project,s.cwd,s.state].join(" ").toLowerCase().includes(needle))})}
62
379
  function renderFilters(){var counts={};sessions.forEach(function(s){counts[s.state]=(counts[s.state]||0)+1});var keys=["all"].concat(Object.keys(counts).sort());byId("filters").innerHTML=keys.map(function(key){var count=key==="all"?sessions.length:counts[key];return'<button type="button" class="filter'+(filter===key?' active':'')+'" data-filter="'+esc(key)+'">'+esc(key)+" "+count+"</button>"}).join("")}
63
- function renderSessions(){var list=visible(),target=byId("session-list");byId("session-count").textContent=String(sessions.length);if(!list.length){target.innerHTML='<div class="empty"><strong>'+(sessions.length?"No matching sessions":"No sessions yet")+'</strong>'+(sessions.length?"Change the search or state filter.":"Create a session to start work from the dashboard.")+"</div>";return}var groups={};list.forEach(function(s){var key=s.cwd||s.project||"Unknown workspace";(groups[key]=groups[key]||[]).push(s)});target.innerHTML=Object.keys(groups).sort().map(function(workspace){return'<div class="workspace-label" title="'+esc(workspace)+'">'+esc(workspace)+"</div>"+groups[workspace].map(function(s){return'<button type="button" class="session-row'+(s.name===selectedName?' selected':'')+'" data-session="'+esc(s.name)+'"><span class="status-dot '+tone(s.state)+'"></span><span><span class="session-name">'+esc(title(s))+'</span><span class="session-meta"><span>'+esc(s.state)+'</span><span>·</span><span>'+esc(age(s.lastAttachedAt||s.createdAt))+"</span></span></span></button>"}).join("")}).join("")}
64
- function renderInspector(){var s=selected(),target=byId("inspector");if(!s){target.innerHTML='<div class="empty"><strong>Nothing selected</strong>Session identity and controls appear here.</div>';return}var activity=s.activity&&s.activity.label?s.activity.label:"No structured activity";target.innerHTML='<section class="inspector-section"><h2>Session</h2><dl class="detail-list"><div><dt>Status</dt><dd><span class="state-label"><span class="status-dot '+tone(s.state)+'"></span><span>'+esc(s.state)+'</span></span></dd></div><div><dt>Activity</dt><dd>'+esc(activity)+'</dd></div><div><dt>Workspace</dt><dd class="mono">'+esc(s.cwd)+'</dd></div><div><dt>Session id</dt><dd class="mono">'+esc(s.name)+'</dd></div><div><dt>Created</dt><dd>'+esc(date(s.createdAt))+'</dd></div><div><dt>Last attached</dt><dd>'+esc(date(s.lastAttachedAt))+'</dd></div></dl></section><section class="inspector-section"><h2>Actions</h2><div class="action-stack"><button class="button" type="button" data-action="attach"'+(available(s)?'':' disabled')+'>Open in terminal</button><button class="button" type="button" data-action="rename"'+(available(s)?'':' disabled')+'>Rename session</button><button class="button danger" type="button" data-action="stop"'+(available(s)?'':' disabled')+'>Stop session</button></div></section>'}
380
+ function renderSessions(){var list=visible(),target=byId("session-list");byId("session-count").textContent=String(sessions.length);if(!list.length){target.innerHTML='<div class="empty"><strong>'+(sessions.length?"No matching sessions":"No sessions yet")+'</strong>'+(sessions.length?"Change the search or state filter.":"Create a session to start work from the dashboard.")+"</div>";return}var groups={};list.forEach(function(s){var key=s.cwd||s.project||"Unknown workspace";(groups[key]=groups[key]||[]).push(s)});target.innerHTML=Object.keys(groups).sort().map(function(workspace){return'<div class="workspace-label" title="'+esc(workspace)+'">'+esc(workspace)+"</div>"+groups[workspace].map(function(s){return'<button type="button" class="card session-row'+(s.name===selectedName?' selected':'')+'" data-session="'+esc(s.name)+'"><span class="state-dot '+tone(s.state)+'"></span><span><span class="session-name">'+esc(title(s))+'</span><span class="session-meta"><span>'+esc(s.state)+'</span><span>·</span><span>'+esc(age(s.lastAttachedAt||s.createdAt))+"</span></span></span></button>"}).join("")}).join("")}
381
+ function renderInspector(){var s=selected(),target=byId("inspector");if(!s){target.innerHTML='<div class="empty"><strong>Nothing selected</strong>Session identity and controls appear here.</div>';return}var activity=s.activity&&s.activity.label?s.activity.label:"No structured activity";target.innerHTML='<section class="inspector-section"><h2>Session</h2><dl class="detail-list"><div><dt>Status</dt><dd><span class="state-label"><span class="state-dot '+tone(s.state)+'"></span><span>'+esc(s.state)+'</span></span></dd></div><div><dt>Activity</dt><dd>'+esc(activity)+'</dd></div><div><dt>Workspace</dt><dd class="mono">'+esc(s.cwd||s.project||"Unknown workspace")+'</dd></div><div><dt>Session id</dt><dd class="mono">'+esc(s.name)+'</dd></div><div><dt>Created</dt><dd>'+esc(date(s.createdAt))+'</dd></div><div><dt>Last attached</dt><dd>'+esc(date(s.lastAttachedAt))+'</dd></div></dl></section><section class="inspector-section"><h2>Actions</h2><div class="action-stack"><button class="btn" type="button" data-action="attach"'+(available(s)?'':' disabled')+'>Open in terminal</button><button class="btn" type="button" data-action="rename"'+(available(s)?'':' disabled')+'>Rename session</button><button class="btn danger" type="button" data-action="stop"'+(available(s)?'':' disabled')+'>Stop session</button></div></section>'}
65
382
  function consoleState(head,detail){consoleText="";byId("console").innerHTML='<span class="console-state"><span><strong>'+esc(head)+"</strong>"+esc(detail)+"</span></span>";byId("console-follow").classList.add("hidden")}
66
- function renderConversation(){var s=selected(),ok=available(s);byId("conversation-title").textContent=s?title(s):"Choose a session";byId("session-state").innerHTML='<span class="status-dot '+(s?tone(s.state):'')+'"></span><span>'+esc(s?s.state:"No session selected")+'</span>';byId("console-refresh").disabled=!ok;byId("attach-top").disabled=!ok;byId("composer-input").disabled=!ok;byId("composer-send").disabled=!ok;byId("composer-status").textContent=ok?"Input is sent directly to the active tmux pane.":s?"This session has no live console.":"Select a live session to begin.";if(!s)consoleState("No session open","Select a session to read its live console and send a message.");else if(!ok)consoleState("Console unavailable","This session is stopped or no longer has a Bizar-owned tmux host.")}
383
+ function renderConversation(){var s=selected(),ok=available(s);byId("conversation-title").textContent=s?title(s):"Choose a session";byId("session-state").innerHTML='<span class="state-dot '+(s?tone(s.state):'dot-muted')+'"></span><span>'+esc(s?s.state:"No session selected")+'</span>';byId("console-refresh").disabled=!ok;byId("attach-top").disabled=!ok;byId("composer-input").disabled=!ok;byId("composer-send").disabled=!ok;byId("composer-status").textContent=ok?"Input is sent directly to the active tmux pane.":s?"This session has no live console.":"Select a live session to begin.";if(!s)consoleState("No session open","Select a session to read its live console and send a message.");else if(!ok)consoleState("Console unavailable","This session is stopped or no longer has a Bizar-owned tmux host.")}
67
384
  function render(){renderFilters();renderSessions();renderConversation();renderInspector()}
68
- function daemonState(body){var n=byId("daemon-state"),dot=n.querySelector(".status-dot");dot.className="status-dot "+(body.stale?"warn":"live");n.querySelector("span:last-child").textContent=body.scanError?"Scan issue: "+body.scanError:body.stale?"Session data is stale":"Local daemon live · updated "+age(body.collectedAt)}
69
- function refresh(){return apiJson("/sessions").then(function(body){sessions=Array.isArray(body.sessions)?body.sessions:[];if(!selectedName||!sessions.some(function(s){return s.name===selectedName})){var remembered=localStorage.getItem(SELECTED_KEY)||"";selectedName=sessions.some(function(s){return s.name===remembered})?remembered:(sessions[0]?sessions[0].name:"")}daemonState(body);render();if(selectedName)startConsole()}).catch(function(error){var n=byId("daemon-state");n.querySelector(".status-dot").className="status-dot warn";n.querySelector("span:last-child").textContent="Daemon unavailable";toast("Session refresh failed: "+err(error),true)})}
385
+ function daemonState(body){var n=byId("daemon-state"),dot=n.querySelector(".state-dot");dot.className="state-dot "+(body.scanError||body.stale?"dot-warn":"dot-ok");n.querySelector("span:last-child").textContent=body.scanError?"Scan issue: "+body.scanError:body.stale?"Session data is stale":"Local daemon live · updated "+age(body.collectedAt)}
386
+ function refresh(){return apiJson("/sessions").then(function(body){sessions=Array.isArray(body.sessions)?body.sessions:[];if(!selectedName||!sessions.some(function(s){return s.name===selectedName})){var remembered=localStorage.getItem(SELECTED_KEY)||"";selectedName=sessions.some(function(s){return s.name===remembered})?remembered:(sessions[0]?sessions[0].name:"")}daemonState(body);render();if(selectedName)startConsole()}).catch(function(error){var n=byId("daemon-state");n.querySelector(".state-dot").className="state-dot dot-warn";n.querySelector("span:last-child").textContent="Daemon unavailable";toast("Session refresh failed: "+err(error),true)})}
70
387
  function loadConsole(force){var s=selected();if(!available(s)||consoleBusy)return Promise.resolve();consoleBusy=true;if(force||!consoleText)consoleState("Loading console","Capturing the active tmux pane.");return apiJson("/sessions/"+encodeURIComponent(s.name)+"/console").then(function(body){var node=byId("console"),wasNear=followConsole||node.scrollHeight-node.scrollTop-node.clientHeight<80,next=typeof body.text==="string"?body.text:"";consoleText=next;if(next)node.textContent=next;else consoleState("Console is quiet","Waiting for output from this session.");if(wasNear&&next){node.scrollTop=node.scrollHeight;followConsole=true;byId("console-follow").classList.add("hidden")}}).catch(function(error){consoleState("Could not read console",err(error))}).finally(function(){consoleBusy=false})}
71
388
  function startConsole(){var s=selected();if(!available(s)){clearInterval(consoleTimer);consoleSessionName="";return}if(consoleSessionName===s.name&&consoleTimer)return;clearInterval(consoleTimer);consoleSessionName=s.name;void loadConsole(true);consoleTimer=setInterval(function(){void loadConsole(false)},1800)}
72
389
  function choose(name){if(selectedName===name){mobile("chat");return}selectedName=name;localStorage.setItem(SELECTED_KEY,name);consoleText="";render();startConsole();mobile("chat");byId("composer-input").focus()}
73
390
  function attach(){var s=selected();if(!s)return;post("/sessions/"+encodeURIComponent(s.name)+"/attach",{}).then(function(body){if(body.spawned)toast("Opened "+body.terminal);else if(body.command){if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(body.command).catch(function(){});toast("No terminal emulator found. Attach command copied when browser access allowed.",true)}}).catch(function(error){toast("Could not open terminal: "+err(error),true)})}
74
391
  function modelOptions(select,value){var custom=value&&!models.some(function(model){return model.selector===value})?'<option value="'+esc(value)+'">'+esc(value)+"</option>":"";select.innerHTML='<option value="">OMP default</option>'+custom+models.map(function(model){return'<option value="'+esc(model.selector)+'">'+esc(model.name+" · "+model.provider)+'</option>'}).join("");select.value=value||""}
75
- function loadModels(){return apiJson("/models").then(function(body){models=Array.isArray(body.models)?body.models:[];modelOptions(byId("create-model"),runtimeDefaults.model);modelOptions(byId("setting-model"),runtimeDefaults.model);byId("model-status").textContent=models.length?models.length+" available models loaded from OMP.":"OMP returned no available models."}).catch(function(error){byId("model-status").textContent="Model catalog unavailable. OMP default remains available.";models=[]})}
76
- function openCreate(){byId("create-cwd").value=projectsFolder;byId("create-task").value="";byId("create-id").value="";modelOptions(byId("create-model"),runtimeDefaults.model);byId("create-thinking").value=runtimeDefaults.thinking;byId("create-permission").value=runtimeDefaults.approvalMode;byId("create-dialog").showModal();requestAnimationFrame(function(){byId("create-cwd").focus()})}
392
+ var THINKING_LEVELS=["off","minimal","low","medium","high","xhigh","max","auto"],SETTINGS_FIELD={model:"defaultModel",thinking:"defaultThinking",approvalMode:"defaultApprovalMode"};
393
+ function thinkingLevels(selector){var known=models.find(function(model){return model.selector===selector});return known&&Array.isArray(known.thinking)&&known.thinking.length?known.thinking:THINKING_LEVELS}
394
+ function thinkingOptions(select,selector,level){var levels=thinkingLevels(selector),custom=level&&levels.indexOf(level)===-1?'<option value="'+esc(level)+'">'+esc(level)+"</option>":"";select.innerHTML='<option value="">OMP default</option>'+custom+levels.map(function(item){return'<option value="'+esc(item)+'">'+esc(item)+"</option>"}).join("");select.value=level||""}
395
+ function seedRuntime(){modelOptions(byId("composer-model"),runtimeDefaults.model);modelOptions(byId("create-model"),runtimeDefaults.model);thinkingOptions(byId("composer-thinking"),runtimeDefaults.model,runtimeDefaults.thinking);thinkingOptions(byId("create-thinking"),runtimeDefaults.model,runtimeDefaults.thinking);byId("composer-permission").value=runtimeDefaults.approvalMode;byId("create-permission").value=runtimeDefaults.approvalMode}
396
+ function saveRuntime(key,value){if(value===runtimeDefaults[key])return;var payload={};payload[SETTINGS_FIELD[key]]=value;post("/settings",payload,"PATCH").then(loadSettings).then(function(){toast("Launch default saved")}).catch(function(error){seedRuntime();toast("Could not save the launch default: "+err(error),true)})}
397
+ function loadModels(){return apiJson("/models").then(function(body){models=Array.isArray(body.models)?body.models:[];seedRuntime();byId("model-status").textContent=models.length?models.length+" available models loaded from OMP.":"OMP returned no available models."}).catch(function(error){byId("model-status").textContent="Model catalog unavailable. OMP default remains available.";models=[];seedRuntime()})}
398
+ function openCreate(){byId("create-cwd").value=projectsFolder;byId("create-task").value="";byId("create-id").value="";seedRuntime();byId("create-dialog").showModal();requestAnimationFrame(function(){byId("create-cwd").focus()})}
77
399
  function openRename(){var s=selected();if(!s)return;byId("rename-id").value=s.id||"";byId("rename-dialog").showModal();requestAnimationFrame(function(){byId("rename-id").select()})}
78
400
  function openStop(){var s=selected();if(!s)return;byId("stop-text").textContent="Stop "+title(s)+"? This ends its tmux session and agent work.";byId("stop-dialog").showModal()}
79
- function loadSettings(){return apiJson("/settings").then(function(body){var s=body.settings;projectsFolder=s.projectsFolder||"";runtimeDefaults={model:s.defaultModel||"",thinking:s.defaultThinking||"",approvalMode:s.defaultApprovalMode||""};byId("setting-projects").value=projectsFolder;modelOptions(byId("setting-model"),runtimeDefaults.model);byId("setting-thinking").value=runtimeDefaults.thinking;byId("setting-permission").value=runtimeDefaults.approvalMode;byId("setting-attach").checked=Boolean(s.autoAttachLatest);byId("setting-mouse").checked=Boolean(s.mouseScrolling);byId("setting-stopped").checked=Boolean(s.showStoppedSessions);byId("setting-tray").checked=Boolean(s.trayEnabled);byId("settings-status").textContent="Changes are stored in your Bizar OMP configuration."})}
401
+ function loadSettings(){return apiJson("/settings").then(function(body){var s=body.settings||{};projectsFolder=s.projectsFolder||"";runtimeDefaults={model:s.defaultModel||"",thinking:s.defaultThinking||"",approvalMode:s.defaultApprovalMode||""};byId("setting-projects").value=projectsFolder;seedRuntime();byId("setting-attach").checked=Boolean(s.autoAttachLatest);byId("setting-mouse").checked=Boolean(s.mouseScrolling);byId("setting-stopped").checked=Boolean(s.showStoppedSessions);byId("setting-tray").checked=Boolean(s.trayEnabled);byId("settings-status").textContent="Changes are stored in your Bizar OMP configuration."})}
80
402
  function openSettings(){byId("settings-dialog").showModal();byId("settings-status").textContent="Loading settings.";loadSettings().catch(function(error){byId("settings-status").textContent="Could not load settings: "+err(error)})}
81
403
  function theme(value,remember){document.documentElement.setAttribute("data-theme",value);byId("theme-toggle").textContent=value==="dark"?"Light theme":"Dark theme";if(remember)localStorage.setItem(THEME_KEY,value)}
82
404
  document.addEventListener("click",function(event){var target=event.target.closest("button");if(!target)return;if(target.dataset.session)choose(target.dataset.session);if(target.dataset.filter){filter=target.dataset.filter;renderFilters();renderSessions()}if(target.dataset.view)mobile(target.dataset.view);if(target.dataset.action==="attach")attach();if(target.dataset.action==="rename")openRename();if(target.dataset.action==="stop")openStop()});
83
- byId("session-search").addEventListener("input",function(event){query=event.target.value.trim();renderSessions()});byId("new-session-top").addEventListener("click",openCreate);byId("settings-open").addEventListener("click",openSettings);byId("attach-top").addEventListener("click",attach);byId("console-refresh").addEventListener("click",function(){void loadConsole(true)});byId("theme-toggle").addEventListener("click",function(){theme(document.documentElement.getAttribute("data-theme")==="dark"?"light":"dark",true)});
405
+ byId("session-search").addEventListener("input",function(event){query=event.target.value.trim();renderSessions()});byId("new-session-top").addEventListener("click",openCreate);byId("settings-open").addEventListener("click",openSettings);byId("attach-top").addEventListener("click",attach);byId("console-refresh").addEventListener("click",function(){void loadConsole(true)});byId("theme-toggle").addEventListener("click",function(){theme(document.documentElement.getAttribute("data-theme")==="dark"?"light":"dark",true)});byId("composer-model").addEventListener("change",function(event){saveRuntime("model",event.target.value)});byId("composer-thinking").addEventListener("change",function(event){saveRuntime("thinking",event.target.value)});byId("composer-permission").addEventListener("change",function(event){saveRuntime("approvalMode",event.target.value)});
84
406
  byId("console").addEventListener("scroll",function(event){var n=event.target;followConsole=n.scrollHeight-n.scrollTop-n.clientHeight<80;byId("console-follow").classList.toggle("hidden",followConsole)});byId("console-follow").addEventListener("click",function(){var n=byId("console");n.scrollTop=n.scrollHeight;followConsole=true;byId("console-follow").classList.add("hidden")});byId("composer-input").addEventListener("keydown",function(event){if(event.key==="Enter"&&(event.ctrlKey||event.metaKey)){event.preventDefault();byId("composer").requestSubmit()}});
85
407
  byId("composer").addEventListener("submit",function(event){event.preventDefault();var s=selected(),input=byId("composer-input"),message=input.value;if(!s||!message.trim())return;byId("composer-send").disabled=true;byId("composer-status").textContent="Sending to "+title(s)+".";post("/sessions/"+encodeURIComponent(s.name)+"/console",{message:message}).then(function(){input.value="";byId("composer-status").textContent="Sent. Waiting for session output.";followConsole=true;return new Promise(function(resolve){setTimeout(resolve,180)})}).then(function(){return loadConsole(false)}).catch(function(error){byId("composer-status").textContent="Send failed. Your draft is still here.";toast("Message was not sent: "+err(error),true)}).finally(function(){byId("composer-send").disabled=!available(selected())})});
86
408
  byId("create-dialog").addEventListener("close",function(event){if(event.target.returnValue!=="create")return;var cwd=byId("create-cwd").value.trim();if(!cwd)return;post("/sessions/create",{cwd:cwd,task:byId("create-task").value.trim(),sessionId:byId("create-id").value.trim(),model:byId("create-model").value,thinking:byId("create-thinking").value,approvalMode:byId("create-permission").value}).then(function(body){selectedName=body.name||"";toast("Session created in "+cwd);return refresh()}).then(function(){if(selectedName)choose(selectedName)}).catch(function(error){toast("Could not create session: "+err(error),true)})});
87
409
  byId("rename-dialog").addEventListener("close",function(event){var s=selected();if(event.target.returnValue!=="rename"||!s)return;var next=byId("rename-id").value.trim();if(!next)return;post("/sessions/"+encodeURIComponent(s.name)+"/rename",{sessionId:next}).then(function(){selectedName="";toast("Session renamed to "+next);return refresh()}).catch(function(error){toast("Could not rename session: "+err(error),true)})});
88
410
  byId("stop-dialog").addEventListener("close",function(event){var s=selected();if(event.target.returnValue!=="stop"||!s)return;post("/sessions/"+encodeURIComponent(s.name)+"/delete",{}).then(function(){toast("Stopped "+title(s));selectedName="";return refresh()}).catch(function(error){toast("Could not stop session: "+err(error),true)})});
89
- byId("settings-dialog").addEventListener("close",function(event){if(event.target.returnValue!=="save")return;var payload={projectsFolder:byId("setting-projects").value.trim(),defaultModel:byId("setting-model").value,defaultThinking:byId("setting-thinking").value,defaultApprovalMode:byId("setting-permission").value,autoAttachLatest:byId("setting-attach").checked,mouseScrolling:byId("setting-mouse").checked,showStoppedSessions:byId("setting-stopped").checked,trayEnabled:byId("setting-tray").checked};post("/settings",payload,"PATCH").then(function(body){projectsFolder=body.settings.projectsFolder||"";runtimeDefaults={model:body.settings.defaultModel||"",thinking:body.settings.defaultThinking||"",approvalMode:body.settings.defaultApprovalMode||""};toast("Dashboard settings saved");return refresh()}).catch(function(error){toast("Could not save settings: "+err(error),true)})});
90
- function bootstrap(){var remembered=localStorage.getItem(THEME_KEY);theme(remembered==="light"||remembered==="dark"?remembered:matchMedia("(prefers-color-scheme: light)").matches?"light":"dark",false);var code=new URL(location.href).searchParams.get("oc"),auth=code?fetch("/dash/session",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({code:code})}).then(function(response){return response.json().then(function(body){if(!response.ok)throw new Error(body.error||"Access code rejected");return body})}):Promise.reject(new Error("Open the dashboard with omb dashboard --open to obtain a fresh access code."));auth.then(function(body){token=body.token;history.replaceState({},"",location.pathname);return loadSettings()}).then(loadModels).then(refresh).then(function(){refreshTimer=setInterval(function(){void refresh()},5000)}).catch(function(error){byId("session-list").innerHTML='<div class="empty"><strong>Dashboard access failed</strong>'+esc(err(error))+"</div>";consoleState("Dashboard locked",err(error));var n=byId("daemon-state");n.querySelector(".status-dot").className="status-dot warn";n.querySelector("span:last-child").textContent="Authentication required"})}
411
+ byId("settings-dialog").addEventListener("close",function(event){if(event.target.returnValue!=="save")return;var payload={projectsFolder:byId("setting-projects").value.trim(),autoAttachLatest:byId("setting-attach").checked,mouseScrolling:byId("setting-mouse").checked,showStoppedSessions:byId("setting-stopped").checked,trayEnabled:byId("setting-tray").checked};post("/settings",payload,"PATCH").then(function(){return loadSettings()}).then(function(){toast("Dashboard settings saved");return refresh()}).catch(function(error){toast("Could not save settings: "+err(error),true)})});
412
+ function bootstrap(){var remembered=localStorage.getItem(THEME_KEY);theme(remembered==="light"||remembered==="dark"?remembered:matchMedia("(prefers-color-scheme: light)").matches?"light":"dark",false);var code=new URL(location.href).searchParams.get("oc"),auth=code?fetch("/dash/session",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({code:code})}).then(function(response){return response.json().then(function(body){if(!response.ok)throw new Error(body.error||"Access code rejected");return body})}):Promise.reject(new Error("Open the dashboard with omb dashboard --open to obtain a fresh access code."));auth.then(function(body){token=body.token;history.replaceState({},"",location.pathname);return loadSettings()}).then(loadModels).then(refresh).then(function(){refreshTimer=setInterval(function(){void refresh()},5000)}).catch(function(error){byId("session-list").innerHTML='<div class="notice"><strong>Dashboard access failed</strong>'+esc(err(error))+"</div>";consoleState("Dashboard locked",err(error));var n=byId("daemon-state");n.querySelector(".state-dot").className="state-dot dot-warn";n.querySelector("span:last-child").textContent="Authentication required"})}
91
413
  window.addEventListener("beforeunload",function(){clearInterval(refreshTimer);clearInterval(consoleTimer)});bootstrap();
92
414
  })();
93
415
  </script>
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-html.js","sourceRoot":"","sources":["../../src/omp/dashboard-html.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA2FD,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"dashboard-html.js","sourceRoot":"","sources":["../../src/omp/dashboard-html.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6ZD,CAAC;AACT,CAAC"}