@polderlabs/bizar-omp 0.7.0 → 0.7.1

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 (414) hide show
  1. package/README.md +6 -4
  2. package/dist/cli/agents-ink.d.ts.map +1 -1
  3. package/dist/cli/agents-ink.js +5 -3
  4. package/dist/cli/agents-ink.js.map +1 -1
  5. package/dist/cli/agents.d.ts.map +1 -1
  6. package/dist/cli/agents.js +26 -8
  7. package/dist/cli/agents.js.map +1 -1
  8. package/dist/cli/doctor.d.ts +4 -4
  9. package/dist/cli/main.js +0 -0
  10. package/dist/cli/omb.js +0 -0
  11. package/dist/core/recovery.d.ts.map +1 -1
  12. package/dist/core/recovery.js +10 -5
  13. package/dist/core/recovery.js.map +1 -1
  14. package/dist/core/transitions.d.ts +4 -0
  15. package/dist/core/transitions.d.ts.map +1 -1
  16. package/dist/core/transitions.js +12 -2
  17. package/dist/core/transitions.js.map +1 -1
  18. package/dist/core/types.d.ts +46 -0
  19. package/dist/core/types.d.ts.map +1 -1
  20. package/dist/extension.d.ts +2 -0
  21. package/dist/extension.d.ts.map +1 -1
  22. package/dist/extension.js +174 -16
  23. package/dist/extension.js.map +1 -1
  24. package/dist/omp/compatibility.d.ts +5 -5
  25. package/dist/omp/compatibility.d.ts.map +1 -1
  26. package/dist/omp/compatibility.js +2 -2
  27. package/dist/omp/compatibility.js.map +1 -1
  28. package/dist/omp/daemon-service.d.ts.map +1 -1
  29. package/dist/omp/daemon-service.js +53 -20
  30. package/dist/omp/daemon-service.js.map +1 -1
  31. package/dist/omp/daemon.d.ts.map +1 -1
  32. package/dist/omp/daemon.js +57 -17
  33. package/dist/omp/daemon.js.map +1 -1
  34. package/dist/omp/dashboard-html.js +5 -5
  35. package/dist/omp/dispatch-admission.js +1 -1
  36. package/dist/omp/dispatch-admission.js.map +1 -1
  37. package/dist/omp/model-role-assignment.d.ts +4 -0
  38. package/dist/omp/model-role-assignment.d.ts.map +1 -1
  39. package/dist/omp/model-role-assignment.js +84 -8
  40. package/dist/omp/model-role-assignment.js.map +1 -1
  41. package/dist/omp/omb-sessions.d.ts +22 -7
  42. package/dist/omp/omb-sessions.d.ts.map +1 -1
  43. package/dist/omp/omb-sessions.js +83 -11
  44. package/dist/omp/omb-sessions.js.map +1 -1
  45. package/dist/omp/omb-settings.d.ts +15 -1
  46. package/dist/omp/omb-settings.d.ts.map +1 -1
  47. package/dist/omp/omb-settings.js +107 -31
  48. package/dist/omp/omb-settings.js.map +1 -1
  49. package/dist/omp/rpc.d.ts +8 -0
  50. package/dist/omp/rpc.d.ts.map +1 -1
  51. package/dist/omp/session-activity.d.ts +5 -0
  52. package/dist/omp/session-activity.d.ts.map +1 -1
  53. package/dist/omp/session-activity.js +17 -0
  54. package/dist/omp/session-activity.js.map +1 -1
  55. package/dist/omp/tmux.d.ts.map +1 -1
  56. package/dist/omp/tmux.js +110 -14
  57. package/dist/omp/tmux.js.map +1 -1
  58. package/dist/services/candidate-verify.d.ts.map +1 -1
  59. package/dist/services/candidate-verify.js +44 -1
  60. package/dist/services/candidate-verify.js.map +1 -1
  61. package/dist/services/inspector.d.ts +5 -1
  62. package/dist/services/inspector.d.ts.map +1 -1
  63. package/dist/services/inspector.js +11 -2
  64. package/dist/services/inspector.js.map +1 -1
  65. package/dist/services/native-review-ingest.d.ts +35 -0
  66. package/dist/services/native-review-ingest.d.ts.map +1 -0
  67. package/dist/services/native-review-ingest.js +14 -0
  68. package/dist/services/native-review-ingest.js.map +1 -0
  69. package/dist/tools/integrate.d.ts.map +1 -1
  70. package/dist/tools/integrate.js +13 -0
  71. package/dist/tools/integrate.js.map +1 -1
  72. package/dist/tools/workflow.d.ts +9 -0
  73. package/dist/tools/workflow.d.ts.map +1 -1
  74. package/dist/tools/workflow.js +25 -2
  75. package/dist/tools/workflow.js.map +1 -1
  76. package/docs/compatibility/baseline.json +8 -7
  77. package/docs/compatibility/supported-surfaces.json +2 -1
  78. package/docs/development/ci-release-implementation-guide.md +1259 -0
  79. package/docs/development/contributing-and-releasing.md +117 -0
  80. package/docs/development/omp-compatibility-update-guide.md +117 -0
  81. package/docs/releases/0.7.1.md +15 -0
  82. package/docs/releases/native-stable.md +11 -1
  83. package/docs/releases/npm-publishing.md +23 -4
  84. package/docs/releases/support-matrix.md +1 -1
  85. package/package.json +2 -1
  86. package/rules/oflow-gitlab.md +6 -0
  87. package/skills/oflow-gitlab-context/SKILL.md +49 -0
  88. package/skills/omp-native-development/SKILL.md +1 -1
  89. package/skills/omp-native-development/references/accuracy-and-versioning.md +1 -1
  90. package/skills/omp-native-development/references/source-manifest.json +3 -3
  91. package/dist/src/cli/agents-ink.d.ts +0 -25
  92. package/dist/src/cli/agents-ink.js +0 -517
  93. package/dist/src/cli/agents-ink.js.map +0 -1
  94. package/dist/src/cli/agents.d.ts +0 -14
  95. package/dist/src/cli/agents.js +0 -197
  96. package/dist/src/cli/agents.js.map +0 -1
  97. package/dist/src/cli/directory-selector.d.ts +0 -60
  98. package/dist/src/cli/directory-selector.js +0 -208
  99. package/dist/src/cli/directory-selector.js.map +0 -1
  100. package/dist/src/cli/doctor.d.ts +0 -41
  101. package/dist/src/cli/doctor.js +0 -31
  102. package/dist/src/cli/doctor.js.map +0 -1
  103. package/dist/src/cli/install.d.ts +0 -129
  104. package/dist/src/cli/install.js +0 -164
  105. package/dist/src/cli/install.js.map +0 -1
  106. package/dist/src/cli/main.d.ts +0 -2
  107. package/dist/src/cli/main.js +0 -117
  108. package/dist/src/cli/main.js.map +0 -1
  109. package/dist/src/cli/migrate.d.ts +0 -18
  110. package/dist/src/cli/migrate.js +0 -14
  111. package/dist/src/cli/migrate.js.map +0 -1
  112. package/dist/src/cli/omb-commands.d.ts +0 -29
  113. package/dist/src/cli/omb-commands.js +0 -107
  114. package/dist/src/cli/omb-commands.js.map +0 -1
  115. package/dist/src/cli/omb-daemon.d.ts +0 -2
  116. package/dist/src/cli/omb-daemon.js +0 -135
  117. package/dist/src/cli/omb-daemon.js.map +0 -1
  118. package/dist/src/cli/omb-dashboard.d.ts +0 -12
  119. package/dist/src/cli/omb-dashboard.js +0 -113
  120. package/dist/src/cli/omb-dashboard.js.map +0 -1
  121. package/dist/src/cli/omb-invocation.d.ts +0 -8
  122. package/dist/src/cli/omb-invocation.js +0 -41
  123. package/dist/src/cli/omb-invocation.js.map +0 -1
  124. package/dist/src/cli/omb-runtime.d.ts +0 -41
  125. package/dist/src/cli/omb-runtime.js +0 -371
  126. package/dist/src/cli/omb-runtime.js.map +0 -1
  127. package/dist/src/cli/omb-tray.d.ts +0 -2
  128. package/dist/src/cli/omb-tray.js +0 -38
  129. package/dist/src/cli/omb-tray.js.map +0 -1
  130. package/dist/src/cli/omb.d.ts +0 -2
  131. package/dist/src/cli/omb.js +0 -31
  132. package/dist/src/cli/omb.js.map +0 -1
  133. package/dist/src/cli/omp-theme.d.ts +0 -17
  134. package/dist/src/cli/omp-theme.js +0 -22
  135. package/dist/src/cli/omp-theme.js.map +0 -1
  136. package/dist/src/cli/process.d.ts +0 -6
  137. package/dist/src/cli/process.js +0 -54
  138. package/dist/src/cli/process.js.map +0 -1
  139. package/dist/src/cli/run.d.ts +0 -2
  140. package/dist/src/cli/run.js +0 -5
  141. package/dist/src/cli/run.js.map +0 -1
  142. package/dist/src/cli/setup-ui.d.ts +0 -37
  143. package/dist/src/cli/setup-ui.js +0 -90
  144. package/dist/src/cli/setup-ui.js.map +0 -1
  145. package/dist/src/core/acceptance.d.ts +0 -32
  146. package/dist/src/core/acceptance.js +0 -87
  147. package/dist/src/core/acceptance.js.map +0 -1
  148. package/dist/src/core/errors.d.ts +0 -20
  149. package/dist/src/core/errors.js +0 -30
  150. package/dist/src/core/errors.js.map +0 -1
  151. package/dist/src/core/evidence.d.ts +0 -10
  152. package/dist/src/core/evidence.js +0 -35
  153. package/dist/src/core/evidence.js.map +0 -1
  154. package/dist/src/core/policies.d.ts +0 -10
  155. package/dist/src/core/policies.js +0 -60
  156. package/dist/src/core/policies.js.map +0 -1
  157. package/dist/src/core/recovery.d.ts +0 -6
  158. package/dist/src/core/recovery.js +0 -56
  159. package/dist/src/core/recovery.js.map +0 -1
  160. package/dist/src/core/transitions.d.ts +0 -13
  161. package/dist/src/core/transitions.js +0 -59
  162. package/dist/src/core/transitions.js.map +0 -1
  163. package/dist/src/core/types.d.ts +0 -256
  164. package/dist/src/core/types.js +0 -2
  165. package/dist/src/core/types.js.map +0 -1
  166. package/dist/src/extension.d.ts +0 -60
  167. package/dist/src/extension.js +0 -538
  168. package/dist/src/extension.js.map +0 -1
  169. package/dist/src/index.d.ts +0 -29
  170. package/dist/src/index.js +0 -30
  171. package/dist/src/index.js.map +0 -1
  172. package/dist/src/omp/autonomous-settings.d.ts +0 -14
  173. package/dist/src/omp/autonomous-settings.js +0 -65
  174. package/dist/src/omp/autonomous-settings.js.map +0 -1
  175. package/dist/src/omp/capabilities.d.ts +0 -23
  176. package/dist/src/omp/capabilities.js +0 -6
  177. package/dist/src/omp/capabilities.js.map +0 -1
  178. package/dist/src/omp/compatibility.d.ts +0 -30
  179. package/dist/src/omp/compatibility.js +0 -34
  180. package/dist/src/omp/compatibility.js.map +0 -1
  181. package/dist/src/omp/completion.d.ts +0 -7
  182. package/dist/src/omp/completion.js +0 -10
  183. package/dist/src/omp/completion.js.map +0 -1
  184. package/dist/src/omp/config.d.ts +0 -10
  185. package/dist/src/omp/config.js +0 -14
  186. package/dist/src/omp/config.js.map +0 -1
  187. package/dist/src/omp/context.d.ts +0 -15
  188. package/dist/src/omp/context.js +0 -3
  189. package/dist/src/omp/context.js.map +0 -1
  190. package/dist/src/omp/daemon-service.d.ts +0 -25
  191. package/dist/src/omp/daemon-service.js +0 -483
  192. package/dist/src/omp/daemon-service.js.map +0 -1
  193. package/dist/src/omp/daemon.d.ts +0 -48
  194. package/dist/src/omp/daemon.js +0 -194
  195. package/dist/src/omp/daemon.js.map +0 -1
  196. package/dist/src/omp/dashboard-html.d.ts +0 -3
  197. package/dist/src/omp/dashboard-html.js +0 -419
  198. package/dist/src/omp/dashboard-html.js.map +0 -1
  199. package/dist/src/omp/dispatch-admission.d.ts +0 -2
  200. package/dist/src/omp/dispatch-admission.js +0 -12
  201. package/dist/src/omp/dispatch-admission.js.map +0 -1
  202. package/dist/src/omp/integration-recovery.d.ts +0 -10
  203. package/dist/src/omp/integration-recovery.js +0 -18
  204. package/dist/src/omp/integration-recovery.js.map +0 -1
  205. package/dist/src/omp/isolation-policy.d.ts +0 -14
  206. package/dist/src/omp/isolation-policy.js +0 -9
  207. package/dist/src/omp/isolation-policy.js.map +0 -1
  208. package/dist/src/omp/lifecycle.d.ts +0 -14
  209. package/dist/src/omp/lifecycle.js +0 -14
  210. package/dist/src/omp/lifecycle.js.map +0 -1
  211. package/dist/src/omp/memory.d.ts +0 -16
  212. package/dist/src/omp/memory.js +0 -4
  213. package/dist/src/omp/memory.js.map +0 -1
  214. package/dist/src/omp/model-role-assignment.d.ts +0 -296
  215. package/dist/src/omp/model-role-assignment.js +0 -559
  216. package/dist/src/omp/model-role-assignment.js.map +0 -1
  217. package/dist/src/omp/model-roles.d.ts +0 -19
  218. package/dist/src/omp/model-roles.js +0 -6
  219. package/dist/src/omp/model-roles.js.map +0 -1
  220. package/dist/src/omp/omb-sessions.d.ts +0 -122
  221. package/dist/src/omp/omb-sessions.js +0 -512
  222. package/dist/src/omp/omb-sessions.js.map +0 -1
  223. package/dist/src/omp/omb-settings.d.ts +0 -35
  224. package/dist/src/omp/omb-settings.js +0 -104
  225. package/dist/src/omp/omb-settings.js.map +0 -1
  226. package/dist/src/omp/result-reconciliation.d.ts +0 -2
  227. package/dist/src/omp/result-reconciliation.js +0 -9
  228. package/dist/src/omp/result-reconciliation.js.map +0 -1
  229. package/dist/src/omp/rpc.d.ts +0 -67
  230. package/dist/src/omp/rpc.js +0 -4
  231. package/dist/src/omp/rpc.js.map +0 -1
  232. package/dist/src/omp/run-log.d.ts +0 -25
  233. package/dist/src/omp/run-log.js +0 -24
  234. package/dist/src/omp/run-log.js.map +0 -1
  235. package/dist/src/omp/session-activity.d.ts +0 -70
  236. package/dist/src/omp/session-activity.js +0 -361
  237. package/dist/src/omp/session-activity.js.map +0 -1
  238. package/dist/src/omp/session-controls.d.ts +0 -17
  239. package/dist/src/omp/session-controls.js +0 -14
  240. package/dist/src/omp/session-controls.js.map +0 -1
  241. package/dist/src/omp/tmux.d.ts +0 -89
  242. package/dist/src/omp/tmux.js +0 -445
  243. package/dist/src/omp/tmux.js.map +0 -1
  244. package/dist/src/omp/tray-icons.d.ts +0 -5
  245. package/dist/src/omp/tray-icons.js +0 -78
  246. package/dist/src/omp/tray-icons.js.map +0 -1
  247. package/dist/src/omp/tray.d.ts +0 -23
  248. package/dist/src/omp/tray.js +0 -167
  249. package/dist/src/omp/tray.js.map +0 -1
  250. package/dist/src/services/budget.d.ts +0 -19
  251. package/dist/src/services/budget.js +0 -10
  252. package/dist/src/services/budget.js.map +0 -1
  253. package/dist/src/services/candidate-local.d.ts +0 -13
  254. package/dist/src/services/candidate-local.js +0 -15
  255. package/dist/src/services/candidate-local.js.map +0 -1
  256. package/dist/src/services/candidates.d.ts +0 -20
  257. package/dist/src/services/candidates.js +0 -100
  258. package/dist/src/services/candidates.js.map +0 -1
  259. package/dist/src/services/evidence-bundle.d.ts +0 -17
  260. package/dist/src/services/evidence-bundle.js +0 -21
  261. package/dist/src/services/evidence-bundle.js.map +0 -1
  262. package/dist/src/services/inspector.d.ts +0 -11
  263. package/dist/src/services/inspector.js +0 -6
  264. package/dist/src/services/inspector.js.map +0 -1
  265. package/dist/src/services/lessons.d.ts +0 -13
  266. package/dist/src/services/lessons.js +0 -11
  267. package/dist/src/services/lessons.js.map +0 -1
  268. package/dist/src/services/projection.d.ts +0 -21
  269. package/dist/src/services/projection.js +0 -10
  270. package/dist/src/services/projection.js.map +0 -1
  271. package/dist/src/services/readiness.d.ts +0 -4
  272. package/dist/src/services/readiness.js +0 -35
  273. package/dist/src/services/readiness.js.map +0 -1
  274. package/dist/src/services/recipes.d.ts +0 -15
  275. package/dist/src/services/recipes.js +0 -42
  276. package/dist/src/services/recipes.js.map +0 -1
  277. package/dist/src/services/recovery.d.ts +0 -19
  278. package/dist/src/services/recovery.js +0 -9
  279. package/dist/src/services/recovery.js.map +0 -1
  280. package/dist/src/services/review.d.ts +0 -15
  281. package/dist/src/services/review.js +0 -9
  282. package/dist/src/services/review.js.map +0 -1
  283. package/dist/src/storage/journal-recovery.d.ts +0 -10
  284. package/dist/src/storage/journal-recovery.js +0 -33
  285. package/dist/src/storage/journal-recovery.js.map +0 -1
  286. package/dist/src/storage/journal.d.ts +0 -12
  287. package/dist/src/storage/journal.js +0 -82
  288. package/dist/src/storage/journal.js.map +0 -1
  289. package/dist/src/storage/migrations.d.ts +0 -22
  290. package/dist/src/storage/migrations.js +0 -107
  291. package/dist/src/storage/migrations.js.map +0 -1
  292. package/dist/src/storage/repository-identity.d.ts +0 -11
  293. package/dist/src/storage/repository-identity.js +0 -67
  294. package/dist/src/storage/repository-identity.js.map +0 -1
  295. package/dist/src/storage/resources.d.ts +0 -66
  296. package/dist/src/storage/resources.js +0 -148
  297. package/dist/src/storage/resources.js.map +0 -1
  298. package/dist/src/tools/evidence.d.ts +0 -8
  299. package/dist/src/tools/evidence.js +0 -9
  300. package/dist/src/tools/evidence.js.map +0 -1
  301. package/dist/src/tools/integrate.d.ts +0 -13
  302. package/dist/src/tools/integrate.js +0 -90
  303. package/dist/src/tools/integrate.js.map +0 -1
  304. package/dist/src/tools/result.d.ts +0 -9
  305. package/dist/src/tools/result.js +0 -2
  306. package/dist/src/tools/result.js.map +0 -1
  307. package/dist/src/tools/verify.d.ts +0 -13
  308. package/dist/src/tools/verify.js +0 -61
  309. package/dist/src/tools/verify.js.map +0 -1
  310. package/dist/src/tools/workflow.d.ts +0 -8
  311. package/dist/src/tools/workflow.js +0 -65
  312. package/dist/src/tools/workflow.js.map +0 -1
  313. package/dist/src/workflows/direct.d.ts +0 -9
  314. package/dist/src/workflows/direct.js +0 -2
  315. package/dist/src/workflows/direct.js.map +0 -1
  316. package/dist/src/workflows/implement.d.ts +0 -2
  317. package/dist/src/workflows/implement.js +0 -4
  318. package/dist/src/workflows/implement.js.map +0 -1
  319. package/dist/src/workflows/plan.d.ts +0 -17
  320. package/dist/src/workflows/plan.js +0 -6
  321. package/dist/src/workflows/plan.js.map +0 -1
  322. package/dist/src/workflows/research.d.ts +0 -15
  323. package/dist/src/workflows/research.js +0 -2
  324. package/dist/src/workflows/research.js.map +0 -1
  325. package/dist/src/workflows/review.d.ts +0 -15
  326. package/dist/src/workflows/review.js +0 -2
  327. package/dist/src/workflows/review.js.map +0 -1
  328. package/dist/src/workflows/verify.d.ts +0 -9
  329. package/dist/src/workflows/verify.js +0 -2
  330. package/dist/src/workflows/verify.js.map +0 -1
  331. package/dist/tests/acceptance.test.d.ts +0 -1
  332. package/dist/tests/acceptance.test.js +0 -27
  333. package/dist/tests/acceptance.test.js.map +0 -1
  334. package/dist/tests/agents.test.d.ts +0 -1
  335. package/dist/tests/agents.test.js +0 -369
  336. package/dist/tests/agents.test.js.map +0 -1
  337. package/dist/tests/candidates.test.d.ts +0 -1
  338. package/dist/tests/candidates.test.js +0 -60
  339. package/dist/tests/candidates.test.js.map +0 -1
  340. package/dist/tests/core.test.d.ts +0 -1
  341. package/dist/tests/core.test.js +0 -39
  342. package/dist/tests/core.test.js.map +0 -1
  343. package/dist/tests/daemon.test.d.ts +0 -1
  344. package/dist/tests/daemon.test.js +0 -157
  345. package/dist/tests/daemon.test.js.map +0 -1
  346. package/dist/tests/dashboard.test.d.ts +0 -1
  347. package/dist/tests/dashboard.test.js +0 -414
  348. package/dist/tests/dashboard.test.js.map +0 -1
  349. package/dist/tests/directory-selector.test.d.ts +0 -1
  350. package/dist/tests/directory-selector.test.js +0 -93
  351. package/dist/tests/directory-selector.test.js.map +0 -1
  352. package/dist/tests/doctor.test.d.ts +0 -1
  353. package/dist/tests/doctor.test.js +0 -32
  354. package/dist/tests/doctor.test.js.map +0 -1
  355. package/dist/tests/install.test.d.ts +0 -1
  356. package/dist/tests/install.test.js +0 -101
  357. package/dist/tests/install.test.js.map +0 -1
  358. package/dist/tests/integration.test.d.ts +0 -1
  359. package/dist/tests/integration.test.js +0 -49
  360. package/dist/tests/integration.test.js.map +0 -1
  361. package/dist/tests/journal.test.d.ts +0 -1
  362. package/dist/tests/journal.test.js +0 -50
  363. package/dist/tests/journal.test.js.map +0 -1
  364. package/dist/tests/model-role-assignment.test.d.ts +0 -1
  365. package/dist/tests/model-role-assignment.test.js +0 -294
  366. package/dist/tests/model-role-assignment.test.js.map +0 -1
  367. package/dist/tests/omb-runtime.test.d.ts +0 -1
  368. package/dist/tests/omb-runtime.test.js +0 -554
  369. package/dist/tests/omb-runtime.test.js.map +0 -1
  370. package/dist/tests/omb-session-actions.test.d.ts +0 -1
  371. package/dist/tests/omb-session-actions.test.js +0 -191
  372. package/dist/tests/omb-session-actions.test.js.map +0 -1
  373. package/dist/tests/omb-settings.test.d.ts +0 -1
  374. package/dist/tests/omb-settings.test.js +0 -82
  375. package/dist/tests/omb-settings.test.js.map +0 -1
  376. package/dist/tests/omp-contract.test.d.ts +0 -1
  377. package/dist/tests/omp-contract.test.js +0 -362
  378. package/dist/tests/omp-contract.test.js.map +0 -1
  379. package/dist/tests/process.test.d.ts +0 -1
  380. package/dist/tests/process.test.js +0 -12
  381. package/dist/tests/process.test.js.map +0 -1
  382. package/dist/tests/psmux-windows.test.d.ts +0 -1
  383. package/dist/tests/psmux-windows.test.js +0 -105
  384. package/dist/tests/psmux-windows.test.js.map +0 -1
  385. package/dist/tests/recovery.test.d.ts +0 -1
  386. package/dist/tests/recovery.test.js +0 -9
  387. package/dist/tests/recovery.test.js.map +0 -1
  388. package/dist/tests/resources.test.d.ts +0 -1
  389. package/dist/tests/resources.test.js +0 -55
  390. package/dist/tests/resources.test.js.map +0 -1
  391. package/dist/tests/session-activity.test.d.ts +0 -1
  392. package/dist/tests/session-activity.test.js +0 -159
  393. package/dist/tests/session-activity.test.js.map +0 -1
  394. package/dist/tests/setup-ui.test.d.ts +0 -1
  395. package/dist/tests/setup-ui.test.js +0 -37
  396. package/dist/tests/setup-ui.test.js.map +0 -1
  397. package/dist/tests/storage-integrity.test.d.ts +0 -1
  398. package/dist/tests/storage-integrity.test.js +0 -88
  399. package/dist/tests/storage-integrity.test.js.map +0 -1
  400. package/dist/tests/tmux.test.d.ts +0 -1
  401. package/dist/tests/tmux.test.js +0 -239
  402. package/dist/tests/tmux.test.js.map +0 -1
  403. package/dist/tests/tray.test.d.ts +0 -1
  404. package/dist/tests/tray.test.js +0 -37
  405. package/dist/tests/tray.test.js.map +0 -1
  406. package/dist/tests/verification.test.d.ts +0 -1
  407. package/dist/tests/verification.test.js +0 -61
  408. package/dist/tests/verification.test.js.map +0 -1
  409. package/dist/tests/workflow-features.test.d.ts +0 -1
  410. package/dist/tests/workflow-features.test.js +0 -82
  411. package/dist/tests/workflow-features.test.js.map +0 -1
  412. package/dist/tests/workflow-safety.test.d.ts +0 -1
  413. package/dist/tests/workflow-safety.test.js +0 -57
  414. package/dist/tests/workflow-safety.test.js.map +0 -1
@@ -1,419 +0,0 @@
1
- /** Self-contained, authenticated browser dashboard. */
2
- export const DASHBOARD_PATH = "/dash";
3
- export function dashboardPageHtml() {
4
- return `<!doctype html>
5
- <html lang="en" data-theme="dark">
6
- <head>
7
- <meta charset="utf-8" />
8
- <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover" />
9
- <meta name="color-scheme" content="dark light" />
10
- <meta name="robots" content="noindex" />
11
- <title>Bizar OMP Dashboard</title>
12
- <style>
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; } }
342
- </style>
343
- </head>
344
- <body data-mobile-view="sessions">
345
- <div class="app">
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>
351
- </main>
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>
354
- </div>
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>
359
- <div class="toast hidden" id="toast" role="status" aria-live="polite"></div>
360
- <script>
361
- (function(){"use strict";
362
- var token="",sessions=[],models=[],selectedName="",filter="all",query="",projectsFolder="",runtimeDefaults={model:"",thinking:"",approvalMode:""},refreshTimer,consoleTimer,consoleSessionName="",consoleBusy=false,consoleText="",followConsole=true,THEME_KEY="bizar.dash.theme",SELECTED_KEY="bizar.dash.selected";
363
- function byId(id){return document.getElementById(id)}
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;"})}
365
- function err(error){return error&&error.message?error.message:"Unexpected error"}
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)}
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)}
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})})}
369
- function post(path,body,method){return apiJson(path,{method:method||"POST",body:JSON.stringify(body||{})})}
370
- function epochMs(value){return!value?0:value<100000000000?value*1000:value}
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"}
372
- function date(value){return value?new Date(epochMs(value)).toLocaleString([],{dateStyle:"medium",timeStyle:"short"}):"Unknown"}
373
- function selected(){return sessions.find(function(s){return s.name===selectedName})}
374
- function title(s){return s.displayName||s.id||s.project||s.name}
375
- function available(s){return Boolean(s&&s.state!=="stopped"&&s.hosted!==false)}
376
- function tone(state){return state==="working"||state==="connected"?"dot-ok":state==="error"?"dot-err":state==="waiting"||state==="disconnected"?"dot-warn":"dot-muted"}
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)})}
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))})}
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("")}
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>'}
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")}
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.")}
384
- function render(){renderFilters();renderSessions();renderConversation();renderInspector()}
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)})}
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})}
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)}
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()}
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)})}
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||""}
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()})}
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()})}
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()}
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."})}
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)})}
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)}
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()});
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)});
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()}});
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())})});
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)})});
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)})});
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)})});
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"})}
413
- window.addEventListener("beforeunload",function(){clearInterval(refreshTimer);clearInterval(consoleTimer)});bootstrap();
414
- })();
415
- </script>
416
- </body>
417
- </html>`;
418
- }
419
- //# sourceMappingURL=dashboard-html.js.map
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
1
- import type { DispatchIntent, RouteDecision, TrustPreset, WorkItem, WorkflowRun } from "../core/types.js";
2
- export declare function admitDispatch(run: WorkflowRun, item: WorkItem, decision: RouteDecision, preset: TrustPreset, expectedParentSession?: string): DispatchIntent;
@@ -1,12 +0,0 @@
1
- import { createHash } from "node:crypto";
2
- import { ContractError } from "../core/errors.js";
3
- import { admitIsolation } from "./isolation-policy.js";
4
- import { modelRoleFor } from "./model-roles.js";
5
- export function admitDispatch(run, item, decision, preset, expectedParentSession) {
6
- if (item.lifecycle !== "pending" && item.lifecycle !== "rejected")
7
- throw new ContractError(`Work item ${item.id} is not admissible from ${item.lifecycle}`);
8
- const isolation = admitIsolation({ editing: item.scope.length > 0, preset, isolated: true, apply: false, merge: false });
9
- const idempotencyKey = createHash("sha256").update(`${run.runId}:${item.id}:${item.revision}:${decision.routingId}`).digest("hex").slice(0, 24);
10
- return { id: `dispatch_${idempotencyKey}`, runId: run.runId, runRevision: run.revision, workItemId: item.id, idempotencyKey, expectedParentSession, requestedAgent: item.role, scope: item.scope, acceptanceCriteria: item.acceptanceCriteria, isolation: isolation.isolated ? "required" : "none", apply: false, merge: false, routeClass: decision.routeClass, routeIntent: decision.intent, modelRole: modelRoleFor(decision.routeClass), status: "admitted" };
11
- }
12
- //# sourceMappingURL=dispatch-admission.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dispatch-admission.js","sourceRoot":"","sources":["../../../src/omp/dispatch-admission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,MAAM,UAAU,aAAa,CAAC,GAAgB,EAAE,IAAc,EAAE,QAAuB,EAAE,MAAmB,EAAE,qBAA8B;IAC1I,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,UAAU;QAAE,MAAM,IAAI,aAAa,CAAC,aAAa,IAAI,CAAC,EAAE,2BAA2B,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5J,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACzH,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChJ,OAAO,EAAE,EAAE,EAAE,YAAY,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,qBAAqB,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACpc,CAAC"}
@@ -1,10 +0,0 @@
1
- export type GitRecovery = "clean" | "dirty-parent" | "partial-merge" | "conflict" | "nested-repository" | "unknown";
2
- export declare function classifyGitOutcome(input: {
3
- exitCode: number;
4
- stdout?: string;
5
- stderr?: string;
6
- headChanged: boolean;
7
- indexChanged: boolean;
8
- dirty: boolean;
9
- }): GitRecovery;
10
- export declare function recoveryInstruction(outcome: GitRecovery): string;
@@ -1,18 +0,0 @@
1
- export function classifyGitOutcome(input) {
2
- const text = `${input.stdout ?? ""}\n${input.stderr ?? ""}`.toLowerCase();
3
- if (text.includes("nested repository"))
4
- return "nested-repository";
5
- if (input.exitCode === 0 && !input.dirty)
6
- return "clean";
7
- if (input.headChanged && input.exitCode !== 0)
8
- return "partial-merge";
9
- if (text.includes("conflict") || text.includes("patch failed"))
10
- return "conflict";
11
- if (input.dirty || input.indexChanged)
12
- return "dirty-parent";
13
- return "unknown";
14
- }
15
- export function recoveryInstruction(outcome) {
16
- return ({ clean: "continue with fresh verification", "dirty-parent": "preserve unrelated changes and reconcile before retry", "partial-merge": "inspect HEAD, index, worktree, and retained artifacts before any repair", conflict: "retain the patch and create a new scoped repair assignment", "nested-repository": "stop and qualify nested repository ownership", unknown: "mark the effect unknown and inspect host state" })[outcome];
17
- }
18
- //# sourceMappingURL=integration-recovery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integration-recovery.js","sourceRoot":"","sources":["../../../src/omp/integration-recovery.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,kBAAkB,CAAC,KAA0H;IAC3J,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,KAAK,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1E,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,OAAO,mBAAmB,CAAC;IACnE,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IACzD,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,eAAe,CAAC;IACtE,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,UAAU,CAAC;IAClF,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY;QAAE,OAAO,cAAc,CAAC;IAC7D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACtD,OAAO,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,cAAc,EAAE,uDAAuD,EAAE,eAAe,EAAE,yEAAyE,EAAE,QAAQ,EAAE,4DAA4D,EAAE,mBAAmB,EAAE,8CAA8C,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAC/a,CAAC"}
@@ -1,14 +0,0 @@
1
- import type { TrustPreset } from "../core/types.js";
2
- export interface IsolationRequest {
3
- editing: boolean;
4
- preset: TrustPreset;
5
- isolated: boolean;
6
- apply: boolean;
7
- merge: boolean;
8
- }
9
- export declare function admitIsolation(request: IsolationRequest): {
10
- isolated: boolean;
11
- apply: false;
12
- merge: false;
13
- guarantee: string;
14
- };
@@ -1,9 +0,0 @@
1
- import { ContractError } from "../core/errors.js";
2
- export function admitIsolation(request) {
3
- if (request.editing && request.preset !== "trusted-development" && !request.isolated)
4
- throw new ContractError("Managed editing requires native OMP isolation");
5
- if (request.apply || request.merge)
6
- throw new ContractError("Managed dispatch must capture results without auto-application");
7
- return { isolated: request.editing ? request.isolated : false, apply: false, merge: false, guarantee: request.isolated ? "native-workspace-isolation" : "workflow-scope-only" };
8
- }
9
- //# sourceMappingURL=isolation-policy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"isolation-policy.js","sourceRoot":"","sources":["../../../src/omp/isolation-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIlD,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,MAAM,IAAI,aAAa,CAAC,+CAA+C,CAAC,CAAC;IAC/J,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,aAAa,CAAC,gEAAgE,CAAC,CAAC;IAC9H,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,KAAK,EAAE,KAAc,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC;AACpM,CAAC"}
@@ -1,14 +0,0 @@
1
- import { Journal } from "../storage/journal.js";
2
- import type { ObjectiveContract } from "../core/types.js";
3
- export interface SessionBinding {
4
- journal: Journal;
5
- owner: string;
6
- cwd: string;
7
- }
8
- export declare function bindSession(journal: Journal, ctx: {
9
- cwd?: string;
10
- sessionManager?: {
11
- getSessionFile?: () => string | undefined;
12
- };
13
- }): SessionBinding;
14
- export declare function startObjective(binding: SessionBinding, objective: ObjectiveContract): import("../core/types.js").WorkflowRun;
@@ -1,14 +0,0 @@
1
- import { createRun } from "../core/transitions.js";
2
- import { nativeSessionReference } from "./context.js";
3
- export function bindSession(journal, ctx) {
4
- return { journal, owner: nativeSessionReference(ctx) ?? `session:${ctx.cwd ?? process.cwd()}`, cwd: ctx.cwd ?? process.cwd() };
5
- }
6
- export function startObjective(binding, objective) {
7
- const existing = binding.journal.snapshot().run;
8
- if (existing && !["complete", "failed", "cancelled"].includes(existing.phase))
9
- throw new Error("A non-terminal workflow run already exists");
10
- const run = createRun(binding.cwd, objective, undefined, binding.owner);
11
- binding.journal.create(run);
12
- return run;
13
- }
14
- //# sourceMappingURL=lifecycle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/omp/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAKtD,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,GAAqF;IACjI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,CAAC,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AACjI,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAuB,EAAE,SAA4B;IAClF,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC;IAChD,IAAI,QAAQ,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC7I,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACxE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,16 +0,0 @@
1
- export interface NativeMemory {
2
- retain?(entry: {
3
- key: string;
4
- content: string;
5
- provenance: string;
6
- }): Promise<void>;
7
- recall?(query: string): Promise<Array<{
8
- content: string;
9
- provenance?: string;
10
- }>>;
11
- }
12
- export declare function retainDecision(memory: NativeMemory | undefined, key: string, content: string): Promise<void>;
13
- export declare function recallProject(memory: NativeMemory | undefined, query: string): Promise<never[] | {
14
- content: string;
15
- provenance?: string;
16
- }[]>;